Skip to main content
Glama
Keesan12

MartinLoop — Stop Runaway Loops, Bad Code & Token Waste

MartinLoop

Give coding agents more work. Watch them less. Ship more.

MartinLoop lets you give coding agents real software jobs without babysitting every step.

Your coding agent still writes the code. MartinLoop keeps the job focused, bounded, and accountable — with limits, stop conditions, verification, recovery, and a clear outcome when the run ends.

Trust your coding agents with real work.

Built from thousands of agent runs where the problem was not just intelligence — it was whether you could give the agent a real job and confidently walk away.

Measure your loop tax: npx -y martin-loop@latest audit
Get started: npx -y martin-loop@latest start
Try the demo: npx -y martin-loop@latest demo

License: Apache-2.0 TypeScript Node npm version npm downloads

MartinLoop is part of the NVIDIA Inception program.

Start Here

Audit first — run npx -y martin-loop@latest audit to see how much API-equivalent Claude Code spend went into fix-and-retry loops. Add --offline for zero network access or --share for a shareable summary.

Install / onboard — run npx -y martin-loop@latest start, or install it globally with npm install -g martin-loop@latest.

Governed run — define an objective, verifier, budget, and iteration cap with martin run.

Verifier — completion requires fresh verifier evidence bound to the active run and workspace. A configured verifier proves only the checks it runs; VERIFIED is not a claim that the code is bug-free or automatically safe to merge.

Budget — set a hard spend ceiling with --budget-usd and an attempt ceiling with --max-iterations.

Receipts — inspect the latest result with martin dossier --latest and validate stored integrity with martin runs verify --latest.

Hosted sync (optional) — governed work is local-first. Configure MARTIN_API_TOKEN and MARTIN_TELEMETRY_ENDPOINT, then use martin sync status and martin sync flush to send preserved evidence to a dashboard later. See the quickstart.

MCP — install @martinloop/mcp@latest in a supported host or generate host configuration with martin mcp print-config.

Documentation — continue with the quickstart, CLI reference, or MCP setup.

When --model is provided, MartinLoop passes it through unchanged. Without --model, the authenticated host runtime chooses its own default. MartinLoop does not inject a hidden fallback model.

Related MCP server: Playwright MCP

For AI Agents

MartinLoop is the system around the coding job.

The coding agent still writes the code. MartinLoop keeps the job, limits, verification, recovery, outcome, and history consistent around the work.

Use MartinLoop when a coding task needs:

  • clear job and success criteria

  • preflight readiness before agent spend

  • hard budget and iteration limits

  • allowed or denied edit scope

  • controlled retries and stop conditions

  • independent verifier commands

  • recovery and rollback evidence

  • a finite completion decision

  • run receipts, dossiers, history, failure classification, and post-run analysis

  • one consistent workflow across supported coding-agent runtimes

Canonical lifecycle:

DEFINE
  -> PREFLIGHT
  -> CONTROL
  -> VERIFY
  -> RECOVER
  -> PROVE
  -> ANALYZE

The product-level flow is Definition of Done -> Controlled Run -> Verified Handoff.

For machine-readable context start with llms.txt, llms-full.txt, and MartinLoop for AI Agents.

One System Around the Run

Teams should not need to stitch together a separate script or point tool for every part of coding-agent execution. MartinLoop connects the control path around the agent from preflight through post-run evidence.

Stage

MartinLoop role

Define

Capture the objective, verifier, budget, scope, and finish line.

Preflight

Check readiness and required workflow evidence before agent spend.

Control

Enforce budgets, attempts, path boundaries, policy, and stop conditions while the coding agent works.

Verify

Run configured checks and bind the evidence to the active run and workspace.

Recover

Preserve recovery and rollback state when another attempt or human review is required.

Prove

Produce the authoritative VERIFIED, STOPPED, or NEEDS REVIEW handoff plus receipts.

Analyze

Inspect run history, cost provenance, failure classes, dossiers, and shareable evidence after execution.

MartinLoop does not replace Git, GitHub, CI, dedicated security scanners, observability platforms, code review, or the coding agent itself. It gives those workflows one governed execution record to inspect.

Change the worker. Keep the job.

MartinLoop is model-agnostic by design. The job, limits, verification, recovery, and outcome are separate from the worker underneath.

Native coding-agent CLIs and OpenAI-compatible model runtimes use different execution paths, so MartinLoop only describes a worker as fully supported when that execution path has been publicly released and validated.

Why MartinLoop

AI coding agents can create more software than ever. The problem is trusting them with bigger jobs without turning yourself into their full-time manager.

Agents drift. They retry. They break unrelated things. They say "done" too early. And a run that was supposed to save time can create even more work to review.

MartinLoop keeps the job accountable outside the agent itself: clear boundaries, hard limits, configured checks, recovery information, and an explicit outcome.

The goal is simple:

Give the agent more responsibility without giving it unlimited freedom.

Why Teams Adopt MartinLoop

  • Less babysitting — give agents larger jobs without watching every step.

  • Clear boundaries — keep scope, attempts, and spend inside the limits you set.

  • Checks before "done" — configured verification decides whether the evidence passed.

  • Understand failures — know why the run stopped instead of digging through logs.

  • Recover cleanly — preserve enough evidence to retry, repair, roll back, or hand off.

  • One workflow across agents — keep the job consistent as the worker underneath changes.

More software. Less supervision.

See Your Loop Tax

Before changing your workflow, measure it:

npx -y martin-loop@0.8.10 audit

MartinLoop reads Claude Code session history locally and reports how much API-equivalent agent spend happened inside fix-and-retry loops, how often verifier commands failed, the longest retry chain, and sessions that ended red. Session contents stay local. Use --offline to disable even the public pricing lookup, and --share to create a screenshot-ready SVG plus Markdown summary.

Then put limits around the next run:

npx -y martin-loop@0.8.10 enable --engine codex
npx -y martin-loop@0.8.10 run "<task>" --verify "npm test" --budget-usd 2 --max-iterations 3

2-Minute Install Path

If MartinLoop detects more than one supported coding-agent runtime, save the one you want to use before the first governed run. For example:

npx -y martin-loop@latest enable --engine codex

Replace codex with claude or gemini when that is your intended runtime.

npx -y martin-loop@latest start
npx -y martin-loop@latest demo
cd martin-loop-demo
npm install
npx -y martin-loop@latest run "Summarize the demo workspace and prove tests still pass" --verify "npm test" --budget-usd 2 --max-iterations 1

Quick Start

Try MartinLoop in a disposable demo workspace:

npx -y martin-loop@latest enable --engine codex
npx -y martin-loop@latest start
npx -y martin-loop@latest demo
npx -y martin-loop@latest --version
cd martin-loop-demo
npm install
npx -y martin-loop@latest run "Summarize the demo workspace and prove tests still pass" --verify "npm test" --budget-usd 2 --max-iterations 1
npx -y martin-loop@latest dossier --latest
npx -y martin-loop@latest share --latest

Optional global install:

npm install -g martin-loop
martin-loop --version

If this flow is useful, open an issue with feedback so we can keep improving the public experience.

start prints the first-run guided path. run auto-checks doctor, session-start, and preflight, then executes when the environment is ready. Use --proof only when you intentionally want an explicit no-spend lane.

Inspect-first flow:

npx -y martin-loop@latest enable --engine codex
npx -y martin-loop@latest doctor
npx -y martin-loop@latest session-start
npx -y martin-loop@latest preflight "Summarize the demo workspace and prove tests still pass" --verify "npm test"

share --latest writes three files into the selected run directory under share/: run-receipt.json, run-receipt.md, and proof-card.svg.

Release notes for MartinLoop 0.6.5: MartinLoop 0.6.5.

Release notes for MartinLoop 0.6.6: MartinLoop 0.6.6.

Release notes for MartinLoop 0.6.7: MartinLoop 0.6.7.

Release notes for MartinLoop 0.6.8: MartinLoop 0.6.8.

Release notes for MartinLoop 0.7.0: MartinLoop 0.7.0.

Release notes for MartinLoop 0.7.1: MartinLoop 0.7.1.

Release notes for MartinLoop 0.8.0: MartinLoop 0.8.0.

Release notes for MartinLoop 0.8.1: MartinLoop 0.8.1.

Release notes for MartinLoop 0.8.2: MartinLoop 0.8.2.

Release notes for MartinLoop 0.8.3: MartinLoop 0.8.3.

Release notes for MartinLoop 0.8.4: MartinLoop 0.8.4.

Release notes for MartinLoop 0.8.5: MartinLoop 0.8.5.

Release notes for MartinLoop 0.8.6: MartinLoop 0.8.6.

Release notes for MartinLoop 0.8.7: MartinLoop 0.8.7.

Release notes for MartinLoop 0.8.8: MartinLoop 0.8.8.

Release notes for MartinLoop 0.8.9: MartinLoop 0.8.9.

Release notes for MartinLoop 0.8.10: MartinLoop 0.8.10.

Swarm Mode Demo

Run the deterministic 15-agent launch-board demo without provider calls or spend:

npx -y martin-loop@0.8.10 demo --swarm

The result is local simulation evidence only: it is non-governed, is not persisted to the Swarm run store, and does not evaluate signed receipt integrity. Inspect demo output through the demo --swarm human view or demo --swarm --json, plus the local files created under --dir. Do not use swarm status, swarm inspect, swarm dossier, swarm verify, or swarm share for demo output.

For real persisted Swarm evidence, use swarm plan and swarm run. Their stored runs are the only inputs to swarm status, swarm inspect, swarm dossier, swarm verify, and swarm share.

Model and Engine Support

MartinLoop governs the job independently of the coding worker.

  • Native agent CLIs: Codex, Claude Code, Gemini CLI

  • OpenAI-compatible endpoints: Kimi K2, NVIDIA Nemotron, DeepSeek, Qwen/Qwen Coder, Mistral/Codestral, OpenRouter/Together/Fireworks routes, Ollama, LM Studio, llama.cpp, and other compatible endpoints

  • Use --engine openai for OpenAI-compatible model endpoints.

The worker changes; MartinLoop's budget, scope, verifier, receipt, and integrity contract does not.

More detail: Model and engine support

The Run From Start to Handoff

MartinLoop's terminal presentation is built around the governed lifecycle, not around a single verifier command.

Governed Run Plan shows the configured finish line before work starts, including the task, budget posture, verifier plan, scope, and execution boundaries.

Controlled Run keeps the coding agent working inside those boundaries while MartinLoop tracks attempts, cost, stop conditions, and recovery state.

Verified Handoff closes the loop with one authoritative outcome:

  • VERIFIED when the configured evidence supports the Definition of Done

  • STOPPED when a configured hard boundary ends the run

  • NEEDS REVIEW when completion cannot be established from the available evidence

The handoff can include verifier steps, scope state, attempt count, cost provenance, unresolved evidence, recovery state, receipt integrity, and the next safe action. The exact fields depend on what the run actually established.

Visual Proof

MartinLoop turns an AI coding run into an inspectable execution record: budget used, verifier result, changed files, rollback evidence, and final receipt.

Ungoverned agents can retry until cost and scope drift. MartinLoop adds budget caps, verifier gates, and audit evidence so the run has a clear stop condition.

MartinLoop Arcade

Long governed runs do not have to mean staring at a spinner. In an interactive terminal, MartinLoop Arcade can be offered while the coding agent continues working in the background.

Arcade is presentation-only. It cannot change the agent, budget, verifier, policy decision, run outcome, or receipt evidence. It stays out of JSON, CI, non-interactive, and other machine-readable execution paths.

Use --arcade to offer Arcade immediately for a supported interactive run, or --no-arcade to suppress it for that run.

Proof Receipts

Proof receipts are local share bundles for governed AI coding runs. They show the task, spend, budget, verifier result, receipt integrity, and any evidence boundary that should not be rounded into confidence.

This real governed run spent $0.51 against a $3.00 budget. The verifier passed and the receipt integrity was signed, but the proof stayed at EVIDENCE_BOUNDARY because rollback evidence was not recorded.

Generate your own receipt after a governed run:

npx -y martin-loop@latest run "Summarize the demo workspace and prove tests still pass" --proof --verify "npm test"
npx -y martin-loop@latest runs verify --latest
npx -y martin-loop@latest share --latest

Example receipt files: Markdown and JSON.

Verify the Public Release Yourself

Use this lane from a clean temp directory to verify the public CLI flow exactly as shipped:

npx -y martin-loop@0.8.10 enable --engine codex
npx -y martin-loop@0.8.10 --version
npx -y martin-loop@0.8.10 start
npx -y martin-loop@0.8.10 demo
cd martin-loop-demo
npm install
npx -y martin-loop@0.8.10 run "Summarize the demo workspace and prove tests still pass" --verify "npm test" --budget-usd 2 --max-iterations 1 --json
npx -y martin-loop@0.8.10 dossier --latest --json
npx -y martin-loop@0.8.10 share --latest --json

For deterministic installs, pin the package line (martin-loop@0.8.10) or use martin-loop@latest. Plain npx martin-loop can resolve a stale local cache on some machines.

Expected share bundle outputs:

  • share/run-receipt.json

  • share/run-receipt.md

  • share/proof-card.svg

See It In Action

The point is not that every governed run is always cheaper. The point is that every run becomes inspectable and enforceable: budget policy, verifier result, stop reason, and evidence are explicit.

For a deterministic public repro lane, use the benchmark workspace and compare governed execution to unbounded retry behavior:

  • npx martin-loop bench --suite under-3-challenge

  • npx martin-loop bench --suite ralphy-engineering-50

Ralph-Style Loops

A Ralph-style loop is the failure mode where an AI coding agent keeps trying without knowing when continuing is unsafe, uneconomical, or unlikely to succeed.

MartinLoop keeps the useful part of the loop, then adds brakes:

  • stop before budget overspend

  • classify unsafe or invalid actions before execution

  • write an audit record for every attempt

  • preserve rollback and verifier evidence for review

  • reduce runaway context growth with compact run summaries

Failure Taxonomy (13 Runtime Classes)

When a coding agent fails, "something went wrong" is not useful enough.

MartinLoop classifies runtime failures into 13 canonical classes so a failed run can tell you what happened, what needs attention, and what future runs can learn from.

See the canonical table: Failure Taxonomy (13 Runtime Classes).

What It Does

  • Budget caps stop the next attempt before a configured USD, token, or iteration limit is exceeded.

  • Verifier gates require a real check, such as npm test, before a run can count as complete.

  • Policy checks block unsafe verifier commands, risky path changes, and secret-like task inputs before execution.

  • Failure classification uses canonical runtime classes for triage and reporting. See Failure Taxonomy (13 Runtime Classes).

  • Run receipts capture stop reason, verifier evidence, budget posture, integrity state, and the next safe action.

  • martin share --latest turns the latest governed run into a local share bundle with a redacted JSON receipt, Markdown recap, and proof-card SVG.

  • MCP integration gives hosts one write-capable execution entrypoint plus richer planning, inspection, and review helpers.

How It Works

Layer

Purpose

Task contract

Objective, verifier plan, repo root, allowed paths, denied paths, acceptance criteria, workspace, project, and budget.

Policy and budget

Defaults come from martin.config.yaml; CLI flags can override them. Budget preflight blocks attempts that would exceed policy.

Agent adapters

Claude CLI, Codex CLI, Gemini CLI, and direct-provider adapters normalize execution results.

Safety and verification

Scope checks, verifier command checks, prompt integrity, and grounding decide whether work can continue.

Persistence

JSONL run records, evidence summaries, and repo-backed artifacts make every run inspectable later. Each loop record is locally signed (HMAC, per-runs-root key) and dossier/runs get/runs verify/challenge/badge report an integrity verdict (verified / tamper_detected / unsigned) so post-hoc edits to a record are detectable, not just inspectable.

Trust Boundaries

  • Cost and token outputs always include provenance (actual, calculated, estimated, or unavailable).

  • For Codex specifically, MartinLoop reports authoritative usage only when the host exposes it; otherwise MartinLoop labels usage as estimated and avoids presenting it as settled accounting.

  • Receipt integrity must be verified before a run is treated as trustworthy evidence for external review.

CLI

martin-loop doctor
martin-loop demo
martin-loop session-start [--host <claude|codex|gemini|generic>]
martin-loop phase status|contract|session-start|preflight|run [--execute]
martin-loop preflight <objective> [options]
martin-loop run <objective> [options]
martin-loop bench --suite <suiteId>
martin-loop triage
martin-loop dossier (--latest | --loop-id <id> | --file <path>)
martin-loop runs list|get|attempt|verify ...
martin-loop mcp print-config --host <codex|claude|gemini|cursor|vscode|generic>
martin-loop mcp install --host <codex|claude|gemini|cursor|vscode|generic>
martin-loop mcp verify-install --host <name> [--scope <user|project|local>]
martin-loop mcp rollback --host <name> [--scope <user|project|local>]
martin-loop mcp uninstall --host <name> [--scope <user|project|local>]
martin-loop challenge [--loop-id <id> | --file <path> | --latest]
martin-loop share (--loop-id <id> | --file <path> | --latest) [--out-dir <path>]
martin-loop badge [--format svg|json] [--runs-dir <path>]

Install in VS Code Add to Cursor

Common options:

--budget <n>            Hard cost cap in USD
--budget-usd <n>        Alias for --budget
--soft-limit-usd <n>    Soft budget threshold in USD
--verify <cmd>          Verifier command after each attempt
--proof                 Run verifier-only evidence checks without claiming governed execution
--max-iterations <n>    Maximum number of attempts
--max-tokens <n>        Maximum token budget
--engine <name>         Adapter to use: claude, codex, gemini, or openai
--cwd <path>            Repo root for the run
--allow-path <glob>     Restrict writes to this path pattern; repeatable
--deny-path <glob>      Block this path pattern; repeatable
--runs-dir <path>       Override the local Martin runs root

Examples below use npx martin-loop so they work without a global install. If you install martin-loop globally, the martin alias works too.

Use martin-loop share --latest after dossier when you want a redacted bundle you can hand to another person without sending raw run-store files.

More detail: CLI reference and configuration reference.

Benchmarks

MartinLoop ships a public deterministic benchmark workspace in benchmarks/ plus the installed-package bench command.

From an installed package:

npx martin-loop bench --suite under-3-challenge
npx martin-loop bench --suite ralphy-engineering-50

From a clean public clone:

pnpm install --frozen-lockfile
pnpm bench:build
pnpm bench:eval
pnpm bench:report:ralphy

Equivalent workspace-filter commands:

pnpm --filter @martin/benchmarks build
pnpm --filter @martin/benchmarks test
pnpm --filter @martin/benchmarks eval
pnpm --filter @martin/benchmarks report:ralphy

The installed-package command reads the shipped public fixtures. The repo-clone workflow runs the public benchmark workspace directly.

MCP

Run the standalone MCP package directly:

npx -y @martinloop/mcp

Add it to common hosts:

codex mcp add martin-loop -- npx -y @martinloop/mcp
claude mcp add --transport stdio --scope user martin-loop -- npx -y @martinloop/mcp
claude mcp add --transport stdio --scope user martin-loop -- cmd /c npx -y @martinloop/mcp

Generate host config from the root CLI:

npx martin-loop mcp print-config --host codex --transport stdio --profile minimal
npx martin-loop mcp print-config --host claude --transport stdio --profile diagnostic
npx martin-loop mcp print-config --host gemini --transport stdio --profile full-local
npx martin-loop mcp print-config --host generic --transport stdio --profile github-review

The root martin-loop package, standalone @martinloop/mcp package, plugin metadata, and MCPB product version are aligned at 0.8.10. The MCPB manifest schema remains 0.3.

The public MCP release train labels are:

  • 0.1.4 operator foundation

  • 0.2.0 cockpit expansion

  • 0.2.5 public MCP package line

  • 0.2.7 usability and review release

  • 0.3.0 host adoption and onboarding release

  • 0.3.1 review and handoff release

  • 0.5.3 execution-control and host-compatibility release

  • 0.5.5 governed-autonomous execution and proof-surface release

  • 0.5.6 hosted run sync, fail-closed rollback, and verified-completion hardening

The standalone MCP registry/server identifier is io.github.Keesan12/martin-loop.

More detail: MCP setup, MCP tool reference, and MCP compatibility.

SDK

npm install martin-loop
import { MartinLoop, createClaudeCliAdapter } from "martin-loop";

const loop = new MartinLoop({
  adapter: createClaudeCliAdapter({ workingDirectory: process.cwd() }),
  defaults: {
    workspaceId: "my-workspace",
    projectId: "my-project",
    budget: {
      maxUsd: 3,
      softLimitUsd: 2.25,
      maxIterations: 3,
      maxTokens: 20_000,
    },
  },
});

const result = await loop.run({
  task: {
    title: "Fix auth regression",
    objective: "Fix the failing auth regression tests",
    verificationPlan: ["pnpm test"],
    repoRoot: process.cwd(),
  },
});

console.log(result.decision.status);

The root SDK also exports createCodexCliAdapter, createGeminiCliAdapter, createDirectProviderAdapter, and createOpenAiCompatibleAdapter.

More detail: SDK reference and package map.

Examples

Development

Requirements:

  • Node.js 20+

  • pnpm 10.x

git clone https://github.com/Keesan12/martin-loop.git
cd martin-loop
pnpm install --frozen-lockfile
pnpm lint
pnpm test
pnpm build
pnpm public:copy-scan
pnpm public:git-surface
pnpm oss:validate
pnpm public:smoke
pnpm release:matrix:local

Standalone MCP validation:

pnpm --filter @martinloop/mcp lint
pnpm --filter @martinloop/mcp test
pnpm --filter @martinloop/mcp build
pnpm --filter @martinloop/mcp smoke:pack
pnpm --filter @martinloop/mcp smoke:published:pack
pnpm --filter @martinloop/mcp verify:release

Contributing

Issues, bug reports, workflow feedback, and focused pull requests are welcome. Public-facing docs should stay concise, user-centered, and accurate.

git checkout -b feat/your-feature
pnpm lint
pnpm test
git commit -m "feat: describe what you built"
git push -u origin feat/your-feature

Telemetry & Privacy

MartinLoop sends minimal anonymous usage data to help improve reliability and prioritize development. On a fresh interactive install, telemetry is enabled by default but remains blocked until the one-time disclosure is shown. After the disclosure, the same run may send the allowlisted anonymous events unless you opt out.

What is sent:

  • Random installation ID (generated locally, never linked to your identity)

  • Per-process session ID

  • CLI version, Node version, OS and architecture

  • Event name and timestamp

  • Command category, run duration, success/failure category

  • Whether a receipt was generated; whether recovery occurred

  • Opaque remote-experience ID/type after a click

What is never sent:

  • Source code, prompts, task text, repository contents, file names, file paths

  • Environment variables, secrets, provider/model output

  • Receipt contents, ledger contents, approval details, verifier evidence

  • Email addresses, workspace, project, or organization identifiers

  • Raw exception messages or stack traces

Endpoint: https://tupopqvqnyyjuxseyxkr.supabase.co/functions/v1/product-events

Headers sent: Content-Type: application/json, User-Agent: MartinLoop-CLI/<version>

No authorization header, API key, or direct table access.

Opt out anytime:

martin telemetry off

Inspect what is sent:

martin telemetry explain

Environment variables that disable telemetry: MARTIN_TELEMETRY_DISABLED=1, DO_NOT_TRACK=1, CI=1

Set MARTIN_TELEMETRY_DEBUG=1 to print the telemetry envelope to stderr without transmitting it.

MartinLoop continues to work normally with telemetry disabled. No features are gated on telemetry consent.

License

Apache-2.0. See LICENSE.

Available Tools

24 tools
martin_arcadeA

Open the presentation-only MartinLoop Arcade when the host supports MCP Apps. The Arcade cannot change governed execution or evidence.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden, and it does so well. 'Presentation-only' and 'cannot change governed execution or evidence' accurately disclose both what the tool does and what it will not do, giving the agent clear safety expectations.

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

Conciseness5/5

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

The description is two compact sentences with no filler. The first sentence front-loads the action and preconditions, and the second adds the essential limitation. Every sentence earns its place.

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

Completeness5/5

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

For a zero-parameter tool with no output schema, the description provides everything needed: what happens, when it should happen, and what side effects it cannot have. No important invocation information is missing.

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

Parameters4/5

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

The tool has zero parameters and the schema is already fully covered. With no parameters to document, the description does not need to add parameter explanations; the baseline for zero-parameter tools applies.

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

Purpose5/5

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

The description names a specific action ('Open') and a distinct resource ('MartinLoop Arcade') and scopes it as presentation-only. It differentiates the tool from the run/eval/status siblings by emphasizing it is strictly a display surface, not a control surface.

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

Usage Guidelines5/5

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

The description explicitly states the condition under which the tool should be used ('when the host supports MCP Apps'). It also tells the agent not to use it for mutating or governed workflows by clarifying that the Arcade 'cannot change governed execution or evidence'.

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

martin_arcade_statusA
Read-onlyIdempotent

Read the read-only evidence projection used by the Arcade view. Provide loopId for one exact run or omit it to load the latest run. Use only for Arcade rendering; use martin_status for budget pressure or martin_run_dossier for full evidence. This tool reads persisted evidence and never changes run state.

NameRequiredDescriptionDefault
loopIdNoOptional MartinLoop run identifier. Omit it to read the latest persisted run.

Output Schema

NameRequiredDescription
costYes
budgetYes
loopIdYesRun identifier represented by this Arcade snapshot.
attemptsYesNumber of recorded attempts.
warningsYesEvidence or interpretation warnings for the Arcade view.
completedYesWhether the run is outside an active lifecycle state.
verificationYesPersisted verifier evidence summary.
displayOutcomeYesTerminal verified-handoff outcome, or null while the run is active.
lifecycleStateYesCurrent persisted lifecycle state.
receiptIntegrityYesPersisted receipt-integrity verdict.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is largely covered. The description reinforces this with 'reads persisted evidence and never changes run state' and notes the Arcade-only rendering purpose, but adds little beyond what the structured fields already provide.

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

Conciseness4/5

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

Three short sentences, front-loaded with the tool's identity and scope, with zero filler. The final clause about not changing run state slightly restates the readOnlyHint annotation, a minor redundancy.

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

Completeness5/5

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

An output schema exists so return values need no explanation, and the description fully covers purpose, scoping input, alternatives, and read-only behavior. Complete for a single-optional-parameter read tool.

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

Parameters3/5

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

Schema coverage is 100% and the loopId description already documents omission meaning 'latest persisted run', so the description's equivalent statement is redundant. Baseline 3 is appropriate when the schema fully carries parameter meaning.

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

Purpose5/5

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

States a specific verb (read) and resource (the read-only evidence projection used by the Arcade view), and explicitly contrasts itself with sibling tools martin_status and martin_run_dossier. An agent can distinguish it from the other evidence-reading tools without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (Arcade rendering), when-not/alternatives (martin_status for budget pressure, martin_run_dossier for full evidence), and the loopId-vs-omit choice. Nothing 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.

martin_cancelA
Destructive

Write a durable cancellation receipt for one canonical MartinLoop run. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root, while reason and requestedBy add audit context. Use when work must be abandoned, not temporarily held. This records a request and does not kill a process; use martin_pause for a reversible hold.

NameRequiredDescriptionDefault
fileNoPath to one canonical run record or directory. Mutually exclusive with loopId and latest.
latestNoWhen true, targets the latest canonical run. Mutually exclusive with file and loopId.
loopIdNoCanonical MartinLoop run identifier. Mutually exclusive with file and latest.
reasonNoOptional non-empty reason recorded in the cancellation receipt.
runsDirNoOptional run-store root override used to resolve loopId or latest.
requestedByNoOptional human or runtime identity label recorded for audit context.

Output Schema

NameRequiredDescription
okYesWhether the control receipt was recorded.
stateYesRun control state after this request, including all recorded receipts.
actionYesThe control action that was recorded.
loopIdYesMartinLoop run identifier the control was applied to.
reasonNoHuman-readable reason for the control, if provided.
summaryYesHuman-readable result of the control request.
controlIdYesUnique receipt ID for this control action.
requestedAtYesISO 8601 timestamp when the control was recorded.
requestedByNoIdentity that requested the control, if provided.
requestedActionYesThe control action that was requested.

TDQS

A4.7/5.0
Behavior4/5

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

The destructiveHint=true annotation could mislead an agent into thinking a process is killed; the description corrects this directly ('This records a request and does not kill a process') and adds audit-context intent. It doesn't address the idempotentHint=false implication of repeat calls, which is a minor remaining gap.

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

Conciseness5/5

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

Three sentences, front-loaded with the action and selector constraint, then usage guidance, then the critical behavioral caveat. No redundant restatement of the name or schema.

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

Completeness5/5

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

With an output schema present, return values need not be explained, and the description still covers the selector contract, store-root override, audit fields, and the distinction from martin_pause. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3. The description adds framing beyond the schema by stating the 'exactly one selector' grouping and clarifying roles (runsDir changes the run-store root; reason/requestedBy supply audit context), which helps an agent assemble a valid call.

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

Purpose5/5

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

States a specific verb and resource: 'Write a durable cancellation receipt for one canonical MartinLoop run.' It also distinguishes itself from the sibling martin_pause by name, so an agent can differentiate 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 Guidelines5/5

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

Gives an explicit trigger ('Use when work must be abandoned, not temporarily held') plus the alternative and its selection condition ('use martin_pause for a reversible hold'). Both when-to-use and when-not-to-use are covered.

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

martin_continueB
Destructive

Record a durable continue or resume request for a Martin run after a human pause or approval checkpoint.

NameRequiredDescriptionDefault
fileNo
latestNo
loopIdNo
reasonNo
runsDirNo
requestedByNo

Output Schema

NameRequiredDescription
okYesWhether the control receipt was recorded.
stateYesRun control state after this request, including all recorded receipts.
actionYesThe control action that was recorded.
loopIdYesMartinLoop run identifier the control was applied to.
reasonNoHuman-readable reason for the control, if provided.
summaryYesHuman-readable result of the control request.
controlIdYesUnique receipt ID for this control action.
requestedAtYesISO 8601 timestamp when the control was recorded.
requestedByNoIdentity that requested the control, if provided.
requestedActionYesThe control action that was requested.

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already disclose destructiveHint=true and idempotentHint=false, so the safety profile is carried by structured data. The description adds useful context ('durable' request, triggered by a pause/approval checkpoint) but never explains what state is mutated, whether the request can be rejected, or what permissions are required, leaving a non-trivial gap for a destructive write.

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 trigger condition is placed after the core action. Efficient, though its brevity contributes to the gaps in the other dimensions.

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. Nevertheless, for a six-parameter destructive, non-idempotent write tool, the description omits all parameter guidance and any detail on what the durable request does or how it is consumed, leaving it under-specified for correct invocation.

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 six parameters (file, latest, loopId, reason, runsDir, requestedBy), so the description is the only place meaning could be added. It explains none of them, not even the const-true 'latest' flag or the purpose of 'reason'/'requestedBy', offering only a faint framing that this is a 'request' object.

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 ('Record') and resource ('continue or resume request for a Martin run'), and the clause 'after a human pause or approval checkpoint' clarifies the state it acts on. It does not explicitly name or distinguish itself from nearby siblings such as martin_pause or martin_cancel, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description implies the usage context ('after a human pause or approval checkpoint'), which is genuine situational guidance. However, it names no alternative and gives no when-not condition, so the agent must infer the boundary against martin_pause, martin_cancel, and martin_run.

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

martin_create_prB
Destructive

Create or preview a GitHub PR with a MartinLoop dossier body. Use execute=true to actually call gh.

NameRequiredDescriptionDefault
baseNo
fileNo
titleNo
formatNo
latestNo
loopIdNo
executeNo
runsDirNo

Output Schema

NameRequiredDescription
urlNoURL of the created pull request.
bodyYesGitHub-flavoured Markdown PR body containing the run dossier.
gradeYesVerification grade assigned to the run.
scoreYesNumeric verification score from 0–100.
titleYesSuggested GitHub pull-request title.
branchNoCurrent branch of the run's repository, when known.
loopIdYesMartinLoop run identifier used to generate the summary.
createdYesWhether a pull request was created.
executeYesWhether gh was asked to create the pull request.

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the mutation risk is known. The description usefully adds that the operation previews by default and only performs the destructive 'gh' call when execute=true, which is valuable context beyond the annotations. It still omits auth requirements (gh CLI), what exactly gets created, and side effects of the dossier body.

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 with the core action front-loaded and the mode-switch instruction immediately after. No filler; slightly terse given the parameter count it must cover.

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 for an 8-parameter, destructive, non-idempotent tool with 0% schema coverage, the description only addresses the execute flag and leaves most input semantics undefined, which is inadequate for correct invocation.

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 8 parameters. The description only clarifies one parameter (execute), leaving base, file, title, format, latest, loopId, and runsDir entirely undocumented in both the schema and the description. With such low coverage the description does not compensate for the gap.

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 ('Create or preview a GitHub PR with a MartinLoop dossier body'), which is clear and distinct from siblings like martin_pr_summary and martin_review_pr. It is not tautological and an agent can grasp the action 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?

The 'Use execute=true to actually call gh' clause tells the agent how to switch from preview to real execution, which implies the safe default. However, there is no explicit guidance on when to choose this tool over sibling PR tools (martin_pr_summary, martin_review_pr), so usage is only partially framed.

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

martin_doctorA
Read-onlyIdempotent

Read-only environment, engine, workspace, and run-store diagnostics for MartinLoop. Use first for software work, fresh installs, suspicious state, or before retries. Do not use as proof that a task is complete. Next: call martin_estimate or martin_triage_runs depending on whether this is new work or failed prior work.

NameRequiredDescriptionDefault
engineNoOptional engine to highlight in diagnostics.
runsDirNoOptional runs-root override resolved under the default Martin runs root.
workingDirectoryNoOptional repo-root override for doctor context.

Output Schema

NameRequiredDescription
serverYes
statusYes
enginesYes
summaryYes
runStoreYes
warningsYes
environmentYes
receiptScopeYes
requestedEngineNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, and the description's 'Read-only' phrasing reinforces this without adding conflict. It adds behavioral value by scoping the diagnostic domains and by warning that the output is not proof of completion, which is a meaningful non-obvious trait. With annotations covering safety, this is strong but not maximal.

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

Conciseness5/5

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

Three concise sentences deliver purpose, usage timing, exclusions, and next steps with no filler. The most important information is front-loaded, and every sentence earns its place. Reusing 'Read-only' from annotations is minor redundancy but not harmful to an agent scanning prose.

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

Completeness5/5

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

For a tool with zero required parameters, a complete output schema, and read-only/idempotent annotations, the description covers all essential decision-making context. It includes scope, when to invoke, what not to infer, and which sibling to call next. An agent can safely invoke this tool correctly without further clarification.

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

Parameters3/5

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

Schema description coverage is 100%, with all three optional parameters already thoroughly described in the input schema. The description itself adds no parameter-specific guidance, but the schema carries the full burden. This meets the baseline for a fully covered schema.

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

Purpose4/5

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

The description clearly identifies the tool as read-only diagnostics for environment, engine, workspace, and run-store data, which is specific about resources and scope. It lacks an explicit active verb like 'get' or 'run', instead using the noun phrase 'diagnostics', though the intent is unmistakable. It distinguishes from siblings by positioning itself as a first-step diagnostic rather than a completion check.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: 'Use first for software work, fresh installs, suspicious state, or before retries.' It also provides a clear exclusion: 'Do not use as proof that a task is complete.' It routes the agent to the appropriate next tool based on whether the work is new or failed, making the decision tree explicit.

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

martin_dossierA
Read-onlyIdempotent

Read a formatted evidence summary for one MartinLoop run. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root. Set format to json, md, or github-pr; json is the default. Use after martin_run, before merge or release claims, or when sharing what happened. Do not use as a substitute for missing verifier evidence; use martin_run_dossier for the full structured record. Next: review verification results, retry, or hand off the receipt.

NameRequiredDescriptionDefault
fileNoPath to one run record or directory. Mutually exclusive with loopId and latest.
formatNoOutput format. Defaults to json.
latestNoWhen true, loads the latest run. Mutually exclusive with file and loopId.
loopIdNoMartinLoop run identifier. Mutually exclusive with file and latest.
runsDirNoOptional run-store root override used to resolve loopId or latest.

Output Schema

NameRequiredDescription
costYes
loopYes
budgetYes
sourceYes
relatedYes
attemptsYes
warningsYes
artifactsYes
inspectionYes
sourceKindYes
recentEventsYes
verificationYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds behavioral context: it requires exactly one selector, explains that runsDir changes the run-store root, and notes that json is the default format. It doesn't describe the return shape, but the output schema exists and the description's added constraints are useful.

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

Conciseness5/5

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

The description is compact and front-loaded: it states the core action in the first sentence, then selector/format rules, then usage context, then an exclusion. Every sentence earns its place, and the structure moves from what to how to when.

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

Completeness5/5

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

For a read-only, idempotent tool with a full output schema and 100% parameter coverage, the description is complete. It covers selector semantics, format options, default behavior, runsDir override, when to use it, and when not to use it. The only minor gap is not describing the exact content of the formatted summary, but the output schema and the phrase 'evidence summary' cover that sufficiently.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents all five parameters. The description adds value by clarifying the mutual exclusivity of selectors ('Provide exactly one selector') and by explaining that runsDir is a root override for resolving loopId or latest. It also names the format enum values and the default, which reinforces the schema without repeating it verbatim.

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

Purpose5/5

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

The description clearly states the tool reads a formatted evidence summary for a MartinLoop run, with specific selector options (file, loopId, latest) and format options. It distinguishes itself from martin_run_dossier by explicitly saying it is not a substitute for the full structured record, and it names the sibling tool for that purpose.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'Use after martin_run, before merge or release claims, or when sharing what happened.' It also provides a clear exclusion: 'Do not use as a substitute for missing verifier evidence; use martin_run_dossier for the full structured record.' This is strong routing guidance.

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

martin_estimateA
Read-onlyIdempotent

Read-only cost, route, and pre-work burn estimate for a software objective. Use before planning/preflight when a change may spend agent time or exceed budget. Do not use for casual questions or as permission to execute. Next: call martin_plan if the estimate is acceptable, or ask for consent if budget/risk is high.

NameRequiredDescriptionDefault
engineNoWhich agent CLI would be used. Defaults to claude.
budgetUsdNoBudget ceiling for estimation. Defaults to 5.
fileScopeNoOptional file paths to scope the estimate.
objectiveYesThe coding task to estimate.
workingDirectoryNoOptional workspace path for recording the estimate receipt against the same task root you plan to run.

Output Schema

NameRequiredDescription
engineYes
reasonYes
budgetUsdYes
objectiveYes
compressedNo
confidenceYes
blockedStepsNo
selectedModeYes
expectedCostUsdYes
compressionSummaryNo
recommendedBudgetUsdNo
expectedPreworkBurnPctYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description reinforces this with 'Read-only' and 'not as permission to execute.' It adds context about producing a pre-work burn estimate and warns about budget/risk consent, going beyond the bare annotation flags. No contradictions with annotations.

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

Conciseness5/5

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

Three sentences deliver purpose, usage conditions, exclusions, and next-step guidance with zero filler. The most important information—read-only estimation—is front-loaded, and every clause earns its place.

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

Completeness5/5

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

Given that annotations cover read-only and idempotent behavior, the schema covers all parameters, and an output schema exists, the description fills the remaining gaps: when to use it, what it is for, and what to do next. Nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema itself documents all parameters. The description adds general context about 'software objective' and 'budget/risk' but does not provide new meaning for individual parameters beyond the schema. Baseline 3 is appropriate; the description does not carry the parameter documentation burden.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read-only cost, route, and pre-work burn estimate for a software objective.' This clearly distinguishes the tool from planning, execution, and run-management siblings like martin_plan and martin_run. It also communicates the operative scope—estimating, not executing.

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

Usage Guidelines5/5

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

The description explicitly says when to use it ('before planning/preflight when a change may spend agent time or exceed budget') and when not to ('Do not use for casual questions or as permission to execute'). It also provides a concrete next step: call martin_plan if acceptable, or ask for consent for high budget/risk. This is exemplary routing guidance.

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

martin_evalA
Read-onlyIdempotent

Grade a MartinLoop run across six dimensions — task completion, verifier health, diff discipline, regression risk, security risk, and reviewability — and return a scored merge-readiness verdict. Use after a governed run completes to decide whether the result is safe to merge or promote. Use before martin_pr_summary or martin_create_pr to confirm the run is merge-ready. Do not use to retrieve raw verification command output — use martin_get_verification_results for that. Do not use to review an existing PR body — use martin_review_pr instead. This tool reads saved run evidence and inspects local git signals; it does not modify state or contact GitHub.

NameRequiredDescriptionDefault
fileNoAbsolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest.
latestNoWhen true, evaluates the most recently updated run in the run store. Mutually exclusive with file and loopId.
loopIdNoMartinLoop run identifier from the run store. Mutually exclusive with file and latest.
runsDirNoOverride the default run-store root directory. Optional.

Output Schema

NameRequiredDescription
gradeYesOverall merge readiness grade derived from the six check dimensions.
scoreYesNumeric evaluation score from 0–100.
checksYes
loopIdYesUnique MartinLoop run identifier.
sourceYesResolved path to the loop-record source file.
summaryYesOne-paragraph plain-English evaluation summary.
warningsYesNon-blocking advisory warnings from the evaluation.
sourceKindYesHow the run was identified.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this by stating it 'reads saved run evidence and inspects local git signals' and 'does not modify state or contact GitHub.' It adds valuable context beyond the annotations by revealing that the tool operates on local signals only and does not reach out to GitHub, which is not inferable from structured fields alone.

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

Conciseness5/5

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

The description is dense but well-structured, front-loading the core purpose before usage guidance and exclusions. Every sentence earns its place: purpose, when to use, workflow placement, what not to use it for, and behavioral guarantees. It avoids fluff and provides substantial decision-relevant information in a compact form.

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

Completeness5/5

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

Given that the tool has an output schema and strong annotations, the description covers the remaining context an agent needs: the domain of operation (MartinLoop run grading), the six dimensions, merge-readiness interpretation, workflow ordering, alternatives, and side-effect guarantees. The optional parameter selection is already documented in the schema, and the output schema covers return-value expectations, so no critical context is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters already have clear descriptions in the schema, including mutual exclusivity between file, latest, and loopId. The description itself does not add much parameter-level detail beyond saying it grades a run, but with complete schema coverage this is acceptable and does not require compensation.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Grade a MartinLoop run across six dimensions' and clearly states the output is 'a scored merge-readiness verdict.' It distinguishes the tool from siblings by explicitly listing what it is not for, such as retrieving raw verification output and reviewing PR bodies, so an agent can tell it apart without opening schemas.

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

Usage Guidelines5/5

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

The description gives explicit timing guidance ('Use after a governed run completes'), workflow placement ('Use before martin_pr_summary or martin_create_pr'), and two explicit negative use cases with named alternatives (martin_get_verification_results and martin_review_pr). This leaves little ambiguity about when to invoke this tool versus its siblings.

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

martin_get_attemptB
Read-onlyIdempotent

Load one Martin attempt summary with artifact directory references for a canonical run.

NameRequiredDescriptionDefault
fileNoPath to a canonical loop-record.json file or run directory.
loopIdNoLoop ID under the run store.
runsDirNoOptional runs-root override.
attemptIndexNoAttempt index to inspect. Defaults to the latest attempt.

Output Schema

NameRequiredDescription
loopYes
sourceYes
attemptYes
warningsYes
sourceKindYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety and idempotency are covered. The description adds that the tool returns a 'summary with artifact directory references', which is useful but does not elaborate on what those references are or how they are structured. Given the read-only and idempotent hints, the bar is lower, and the description provides some additional context, so a 3 is appropriate.

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, concise sentence that front-loads the main purpose and includes key details (attempt summary, artifact directory references, canonical run). It is efficient and readable, with no unnecessary fluff.

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

Completeness3/5

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

The tool has four parameters, an output schema exists, and annotations cover safety. The description provides a high-level purpose but does not clarify which parameters are required or how they interact (e.g., the relationship between file and loopId). Given the complexity and available schema, the description is sufficient for basic understanding but not fully complete for edge cases.

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

Parameters3/5

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

Schema description coverage is 100%, meaning each parameter has a description in the schema. The tool's description adds limited value beyond the schema, mainly implying that the tool focuses on a single attempt and that attemptIndex defaults to the latest. It does not explain how the parameters interplay (e.g., file versus loopId). Baseline 3 is correct because the schema already documents parameters adequately.

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 action ('Load'), a specific resource ('one Martin attempt summary'), and the key scope ('for a canonical run'). It is clear what the tool does at a high level, but it does not explicitly differentiate from sibling tools like martin_get_run or martin_get_verification_results, which also appear to retrieve run-related data.

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?

The description does not specify when to use this tool versus its siblings. For instance, it does not indicate that this tool is for inspecting a specific attempt within a run, while martin_get_run might be for whole-run details. There is no explicit guidance on which scenarios warrant this tool over alternatives, leaving the agent to infer from the name.

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

martin_get_runB
Read-onlyIdempotent

Load one Martin run and return its budget, cost, verification, artifact, and canonical path summary.

NameRequiredDescriptionDefault
fileNoPath to a canonical loop-record.json, legacy file, or run-store directory.
latestNoWhen true, loads the most recently updated loop record in the run store.
loopIdNoLoop ID under the run store.
runsDirNoOptional runs-root override.

Output Schema

NameRequiredDescription
costYes
loopYes
budgetYes
sourceYes
warningsYes
artifactsYes
inspectionYes
sourceKindYes
verificationYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and idempotentHint, covering safety and repetition behavior. The description adds that the tool returns a specific summary of fields, but it does not disclose any additional behavioral traits such as error behavior, how missing runs are handled, or constraints on parameter combinations. With annotations in place, this is an acceptable baseline.

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 a single, well-structured sentence that leads with the action and then lists the output components. Every word earns its place, and there is no redundant or vague phrasing.

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

Completeness4/5

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

Given that an output schema and readOnly/idempotent annotations exist, the description adequately summarizes what the tool does and returns. However, it does not clarify that exactly one of file, latest, or loopId should be used, or whether these are mutually exclusive. This is a minor gap for a read-only retrieval tool.

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

Parameters3/5

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

The input schema provides descriptions for all 4 parameters, so schema coverage is 100%. The tool description itself adds no parameter-level meaning, and the baseline of 3 is appropriate because the schema carries the burden.

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 ('Load') and names the resource ('one Martin run'), then enumerates the returned fields (budget, cost, verification, artifact, canonical path summary). This makes the core purpose clear, but it does not explicitly differentiate from siblings like martin_get_attempt or martin_get_verification_results, aside from the field listing.

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?

The description gives no guidance on when to choose this tool over alternatives, nor does it mention parameter selection rules (e.g., file vs latest vs loopId). Agents are left to infer usage from the schema alone, and no exclusions or sibling comparisons are provided.

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

martin_get_verification_resultsA
Read-onlyIdempotent

Load structured verification evidence for a MartinLoop run — verifier commands, pass/fail outcomes, and contradiction signals — from stored loop events and ledger entries. Use after a run completes to confirm whether automated verifiers passed before merging or promoting the result. Do not use to get a merge-readiness grade — use martin_eval for a scored grade with six check dimensions. Do not use for live run status — use martin_get_status instead. This tool only reads persisted run files and does not execute commands, modify state, or contact GitHub.

NameRequiredDescriptionDefault
fileNoAbsolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId.
loopIdNoMartinLoop run identifier from the run store. Mutually exclusive with file.
runsDirNoOverride the default run-store root directory. Optional.

Output Schema

NameRequiredDescription
loopYes
sourceYes
warningsYes
sourceKindYes
verificationYes

TDQS

A4.6/5.0
Behavior5/5

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

Even though annotations already mark readOnly and non-destructive, the description adds behavior beyond annotations: it reads persisted run files, does not execute commands, modify state, or contact GitHub. This is valuable operational context and does not contradict annotations.

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

Conciseness5/5

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

Three sentences, each earning its place: core purpose, when to use, exclusions, and behavioral boundary. The alternatives and constraints are front-loaded and the prose is tight.

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

Completeness4/5

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

With a rich output schema, fully described parameters, and annotations, the description is nearly complete. It does not explicitly state that at least one of file or loopId should be supplied despite the schema listing none as required, which is a small but real invocation gap.

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

Parameters3/5

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

Schema coverage is 100%, so the input schema already documents file, loopId, and runsDir with their meaning and mutual exclusivity. The description adds no further parameter-level detail, which is acceptable because the schema carries the burden.

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

Purpose5/5

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

The description names a specific verb (Load), resource (structured verification evidence for a MartinLoop run), and content (verifier commands, pass/fail outcomes, contradiction signals). It explicitly distinguishes itself from martin_eval and martin_get_status, so an agent can tell it apart without opening schemas.

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

Usage Guidelines5/5

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

It gives explicit when-to-use ('after a run completes' to confirm verifiers passed before merging/promoting) and explicit when-not-to-use with named alternatives (martin_eval for merge-readiness, martin_get_status for live status). These exclusions leave no ambiguity about routing.

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

martin_inspectB
Read-onlyIdempotent

Summarise Martin Loop run records from a saved loop file or run-store directory.

NameRequiredDescriptionDefault
fileNoOptional path under the Martin runs root to a loop-record.json file, a legacy .jsonl file, or a run-store directory.
runsDirNoOptional runs-root override resolved under the default Martin runs root.

Output Schema

NameRequiredDescription
sourceYes
warningsYes
latestRunNo
loopCountYes
portfolioYes
inspectionYes
recentRunsYes
statusBreakdownYes
lifecycleBreakdownYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description does not contradict those annotations, but it adds little beyond the verb 'Summarise'—no detail about what gets read, potential output size, or any other behavioral traits. This meets the baseline with annotations present.

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?

A single, front-loaded sentence with no filler: verb, object, and source are all in the first clause. It is scannable and every word earns its place.

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

Completeness4/5

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

This is a low-complexity read-only tool with full annotations, an output schema, and two fully described optional parameters. The description adequately captures the operation and input source. The main gap is the lack of selection guidance among siblings, but that is less critical given how simple and safe the operation is.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters. The description mentions 'saved loop file or run-store directory', which mirrors the file parameter's schema description and adds no new format, syntax, or precedence information. Baseline 3 is appropriate.

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 clearly states a specific verb ('Summarise') and resource ('Martin Loop run records') plus the input source. It implies an aggregate, read-oriented operation distinct from siblings like martin_list_runs or martin_get_run, but does not explicitly differentiate itself by name, so it stops short of a perfect score.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus the many sibling inspection tools (e.g., martin_get_run, martin_list_runs, martin_triage_runs, martin_run_dossier). The only implicit usage context is the accepted input types in the description, but there are no exclusions, conditions, or alternative routing hints.

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

martin_list_runsA
Read-onlyIdempotent

List recent Martin runs from the run store with lightweight filters for status, lifecycle, engine metadata, and recency.

NameRequiredDescriptionDefault
limitNoMaximum number of runs to return. Defaults to 20.
modelNoFilter by attempt model.
statusNoFilter by loop status.
runsDirNoOptional runs-root override.
adapterIdNoFilter by attempt adapter ID.
updatedAfterNoOptional ISO-8601 timestamp for recency filtering.
lifecycleStateNoFilter by lifecycle state.

Output Schema

NameRequiredDescription
sourceYes
filtersYes
runsRootYes
warningsYes
latestRunNo
loopCountYes
recentRunsYes
statusBreakdownYes
lifecycleBreakdownYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already cover readOnlyHint and idempotentHint, so the safety profile is established. The description adds scope context ('run store', 'recent', 'lightweight filters') but discloses little beyond what the annotations and parameter schemas already imply; there is no contradiction.

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

Conciseness5/5

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

A single, front-loaded sentence names the operation and then summarizes the filter dimensions without any filler. Every word contributes to the agent's understanding.

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

Completeness4/5

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

With no required parameters, fully described schema entries, safe annotations, and an existing output schema, the description is largely sufficient for correct invocation. It lacks only explicit alternative routing to siblings, which is more of a usage-guidance gap than a completeness gap.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds a useful conceptual grouping—status, lifecycle, engine metadata, and recency—that helps an agent map the seven optional filter parameters into meaningful categories beyond the flat schema entries.

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 ('List') and resource ('Martin runs from the run store'), making it clear this is a listing operation distinct from run/get/inspect/status siblings. It does not explicitly contrast itself with martin_triage_runs, so it falls just short of full sibling differentiation.

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 description implies usage: call this when you need a recent list of runs with lightweight filters, but it gives no explicit guidance about when to prefer a sibling like martin_get_run or martin_triage_runs. The context is clear enough to infer, but no exclusions or alternatives are stated.

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

martin_logsA
Read-onlyIdempotent

Read recent MartinLoop events, ledger entries, and operator control receipts for a single run. Use to observe live or completed run activity, diagnose stuck or failed runs, or audit operator actions. Do not use to check run completion status — use martin_get_status instead. Do not use to retrieve verification evidence — use martin_get_verification_results instead. This tool only reads persisted run files and does not execute commands, modify state, or contact GitHub.

NameRequiredDescriptionDefault
fileNoAbsolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest.
limitNoMaximum number of log entries to return, sorted by timestamp descending. Defaults to 20.
latestNoWhen true, loads the most recently updated run in the run store. Mutually exclusive with file and loopId.
loopIdNoMartinLoop run identifier from the run store. Mutually exclusive with file and latest.
runsDirNoOverride the default run-store root directory. Optional; defaults to the MartinLoop runs directory.

Output Schema

NameRequiredDescription
liveYes
loopIdYesUnique MartinLoop run identifier.
sourceYesResolved path to the loop-record source file.
entriesYesLog entries sorted by timestamp descending, capped at limit.
logCountYesNumber of log entries returned after applying the limit.
sourceKindYesHow the run was identified: by file path, loop ID, latest flag, or runs directory.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds operational context beyond those flags: it only reads persisted run files, does not execute commands, does not modify state, and does not contact GitHub. This network-isolation and no-execution detail is valuable behavioral context not present in annotations. No contradiction.

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

Conciseness5/5

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

Four sentences with zero waste: core purpose, use cases, two exclusions, and a behavioral guarantee. The verb+resource is front-loaded, and every sentence earns its place.

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

Completeness5/5

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

Complete for a read-only observational tool. The description covers purpose, usage context, exclusions, and behavior; the output schema explains return values; and annotations cover the safety profile. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters (file, limit, latest, loopId, runsDir) are fully documented in the schema. The description hints at the single-run scope that maps to the mutual-exclusion constraints, but it does not add parameter-level detail beyond the schema. Baseline 3 is appropriate when the schema carries the full burden.

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 ('Read'), a precise resource ('MartinLoop events, ledger entries, and operator control receipts'), and a scope ('for a single run'). It distinguishes itself from siblings by naming what it is not (martin_get_status, martin_get_verification_results), so an agent can select it confidently without opening schemas.

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

Usage Guidelines5/5

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

Explicitly states when to use ('observe live or completed run activity, diagnose stuck or failed runs, or audit operator actions') and when not to use, naming two alternatives with the conditions that route elsewhere. Nothing 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.

martin_pauseA
Destructive

Write a durable pause receipt for one canonical MartinLoop run. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root, while reason and requestedBy add audit context. Use for a temporary hold before risky follow-up work. This records a request and does not kill a process; use martin_cancel to abandon work or martin_continue to resume.

NameRequiredDescriptionDefault
fileNoPath to one canonical run record or directory. Mutually exclusive with loopId and latest.
latestNoWhen true, targets the latest canonical run. Mutually exclusive with file and loopId.
loopIdNoCanonical MartinLoop run identifier. Mutually exclusive with file and latest.
reasonNoOptional non-empty reason recorded in the pause receipt.
runsDirNoOptional run-store root override used to resolve loopId or latest.
requestedByNoOptional human or runtime identity label recorded for audit context.

Output Schema

NameRequiredDescription
okYesWhether the control receipt was recorded.
stateYesRun control state after this request, including all recorded receipts.
actionYesThe control action that was recorded.
loopIdYesMartinLoop run identifier the control was applied to.
reasonNoHuman-readable reason for the control, if provided.
summaryYesHuman-readable result of the control request.
controlIdYesUnique receipt ID for this control action.
requestedAtYesISO 8601 timestamp when the control was recorded.
requestedByNoIdentity that requested the control, if provided.
requestedActionYesThe control action that was requested.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare idempotentHint=false and destructiveHint=true; the description adds the important clarification that this 'records a request and does not kill a process', which materially changes how an agent should reason about the destructive hint. It also flags the durable write. It stops short of covering permissions or repeat-call behaviour (non-idempotent → duplicate receipts?), 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 sentences, front-loaded with the core action and effect, then selectors, then routing. Nothing is filler; even the semi-colon-packed selector sentence carries only required information.

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

Completeness4/5

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

For a mutating tool with an output schema (so return values need not be explained) and annotations covering the safety hints, the description covers action, effect, selectors, audit fields, and sibling routing. Only secondary details such as required permissions or behaviour on repeated calls are absent.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents every parameter, including the mutual exclusivity of file/loopId/latest and the roles of runsDir, reason, and requestedBy. The description restates the selector rule and field roles rather than adding new semantics, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The opening sentence names a specific verb and resource: 'Write a durable pause receipt for one canonical MartinLoop run.' The description also distinguishes the tool from its closest siblings by naming martin_cancel and martin_continue, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

It states the positive case ('Use for a temporary hold before risky follow-up work') and the alternatives with their selecting conditions ('use martin_cancel to abandon work or martin_continue to resume'). The when-to-use / when-to-use-something-else decision is fully specified.

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

martin_planA
Read-onlyIdempotent

Read-only planning step that turns an objective into bounded scope, verifier proposal, policy pack, and risk recommendation. Use for authorized software changes before preflight/run. Do not use to mutate files or replace the verifier. Next: call martin_preflight with the chosen scope, budget, and verifier.

NameRequiredDescriptionDefault
maxUsdNo
contextNoOptional extra issue or bug context.
maxTokensNo
objectiveYesThe coding objective to plan.
maxMinutesNo
policyPackNo
deniedPathsNo
maxCommandsNo
allowedPathsNo
maxIterationsNo
maxFilesChangedNo
verificationPlanNo
workingDirectoryNoOptional repo-root override resolved under the MCP workspace root.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and idempotentHint. The description reinforces the read-only nature, adds what the tool produces, and clarifies that it does not mutate files or replace the verifier. This adds useful behavioral context beyond the annotations, though idempotence is not explicitly discussed.

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

Conciseness5/5

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

Three sentences, with the core purpose front-loaded and no filler. Every sentence adds useful information about scope, usage boundaries, or next steps.

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?

Despite having an output schema and safety annotations, the tool is complex with 13 input parameters. The description gives a good workflow overview but does not explain how to choose or set the many constraint parameters, which are mostly undocumented at 23% schema coverage. An agent would struggle to construct a well-formed planning request.

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 only 23%, so the description must compensate for the many undocumented parameters. It mentions 'objective', 'scope', 'budget', and 'verifier', but does not map these to specific fields such as maxUsd, verificationPlan, policyPack, allowedPaths, or deniedPaths. Most parameters remain unexplained in both schema and description.

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

Purpose5/5

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

The description clearly identifies this as a read-only planning step that converts an objective into concrete artifacts: bounded scope, verifier proposal, policy pack, and risk recommendation. It also differentiates itself from preflight and run by explicitly positioning itself before those phases.

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

Usage Guidelines5/5

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

The description explicitly says when to use it ('before preflight/run' for 'authorized software changes'), when not to use it ('Do not use to mutate files or replace the verifier'), and what to do next ('call martin_preflight with the chosen scope, budget, and verifier'). This is exemplary guidance.

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

martin_preflightA
Read-onlyIdempotent

Read-only validation of the exact run contract before execution or spend. Use after planning and before martin_run to check engine, verifier, path scope, and budget. Do not use as execution or completion proof. Next: call martin_run if allowed, otherwise resolve the reported blocker.

NameRequiredDescriptionDefault
modelNoModel override passed to the CLI.
engineNoWhich agent CLI would be used. Defaults to claude.
maxUsdNoHard budget ceiling in USD.
contextNoOptional issue context carried into the run contract.
maxTokensNoMaximum total tokens across all attempts.
objectiveYesThe coding task to validate.
projectIdNo
maxMinutesNoEstimated wall-clock minutes allowed for the run contract.
policyPackNo
deniedPathsNoRepo-relative path globs Martin must never modify.
maxCommandsNoEstimated maximum commands allowed for the run contract.
workspaceIdNo
allowedPathsNoRepo-relative path globs Martin may modify.
maxIterationsNoMaximum number of loop attempts.
maxFilesChangedNoEstimated maximum files changed for the run contract.
verificationPlanNoCommands that must all exit 0 for completion.
workingDirectoryNoOptional repo-root override resolved under the MCP workspace root.

Output Schema

NameRequiredDescription
okYes
summaryYes
warningsYes
executionYes
readinessYes
normalizedYes
receiptScopeYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover readOnlyHint and idempotentHint, and the description adds real value beyond them: it clarifies it validates engine, verifier, path scope, and budget without spending, and sets the boundary that it is not execution or completion proof. It does not describe the reported-blocker format or failure modes, though the output schema likely carries that.

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

Conciseness5/5

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

Three tight sentences with zero waste: purpose front-loaded, then usage, then the next-step handoff. Every sentence earns its place.

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

Completeness5/5

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

Output schema exists so return values need no explanation, and the description covers what is validated, when to call it, when not to, and what to do next. For a 17-param preflight tool this is complete enough to invoke correctly.

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 82%, above the high threshold, so the schema already documents parameters and the baseline is 3. The description groups the validated areas (engine, verifier, path scope, budget) which loosely maps to engine/verificationPlan/paths/maxUsd parameters, adding light orientation but no syntax or format detail.

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

Purpose5/5

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

States a specific verb and resource: 'Read-only validation of the exact run contract before execution or spend.' This clearly distinguishes it from siblings like martin_run (execution) and martin_estimate, and the scope (validation only, no spend) is unambiguous.

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

Usage Guidelines5/5

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

Explicit when: 'Use after planning and before martin_run.' Explicit when-not: 'Do not use as execution or completion proof.' Plus routing: 'call martin_run if allowed, otherwise resolve the reported blocker.' All alternatives and conditions are named.

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

martin_pr_summaryA
Read-onlyIdempotent

Generate a GitHub-ready pull-request title and Markdown body from a completed MartinLoop run dossier, including its verification grade and score. Use after a governed run completes when you need PR copy without creating the PR. Use martin_create_pr instead to actually open the PR on GitHub. Use martin_review_pr to evaluate an existing PR body against run evidence. Use martin_eval first if you need a merge-readiness grade before generating the PR body. This tool only reads saved run evidence and does not modify the repository or contact GitHub.

NameRequiredDescriptionDefault
fileNoAbsolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest.
formatNoDossier rendering format. Defaults to github-pr for PR body generation. Use md for plain Markdown or json for structured output.
latestNoWhen true, generates the summary for the most recently updated run. Mutually exclusive with file and loopId.
loopIdNoMartinLoop run identifier from the run store. Mutually exclusive with file and latest.
runsDirNoOverride the default run-store root directory. Optional.

Output Schema

NameRequiredDescription
bodyYesGitHub-flavoured Markdown PR body containing the run dossier.
gradeYesVerification grade assigned to the run.
scoreYesNumeric verification score from 0–100.
titleYesSuggested GitHub pull-request title.
loopIdYesMartinLoop run identifier used to generate the summary.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already carry readOnlyHint, idempotentHint, and destructiveHint, and the description adds useful concrete context: it only reads saved run evidence, does not modify the repository, and does not contact GitHub. This goes beyond the annotations by explicitly ruling out network side effects and repo mutations.

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

Conciseness5/5

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

The main purpose is front-loaded, the alternative routing is compressed into clear usage guidance, and the no-side-effect statement earns its place. Every sentence contributes to selection, invocation, or safety clarification.

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

Completeness5/5

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

With an output schema present and strong annotations, the description covers when to use it, what it consumes, what it produces, and what it does not do. An agent has enough information to invoke it correctly without guessing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters, their mutual exclusivity, and format defaults. The description does not add parameter-level detail, but it does not need to since the schema covers it.

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?

Opens with a specific verb ('Generate') and names the concrete artifacts: a GitHub-ready PR title and Markdown body from a completed MartinLoop run dossier. It also distinguishes itself from martin_create_pr, martin_review_pr, and martin_eval, so an agent can tell which sibling to pick.

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

Usage Guidelines5/5

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

Explicitly states when to use the tool: after a governed run completes when PR copy is needed without creating the PR. It also names the alternatives for actually opening the PR, reviewing an existing PR, and obtaining a merge-readiness grade first.

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

martin_review_prA
Read-onlyIdempotent

Review a PR body or draft against the MartinLoop run dossier and evaluation evidence, and return a verdict with specific findings. Use when you have an existing PR body and want to check whether it accurately represents the governed run evidence. Supply prBody to review a specific body string; omit it to evaluate the auto-generated dossier body. Do not use to generate a PR body from scratch — use martin_pr_summary instead. Do not use to open or create a PR — use martin_create_pr instead. This tool only reads saved run evidence and does not modify the repository or contact GitHub.

NameRequiredDescriptionDefault
fileNoAbsolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest.
formatNoDossier format used when generating the reference body for comparison. Defaults to github-pr.
latestNoWhen true, reviews against the most recently updated run. Mutually exclusive with file and loopId.
loopIdNoMartinLoop run identifier from the run store. Mutually exclusive with file and latest.
prBodyNoThe PR body text to review. If omitted, the auto-generated dossier body is evaluated instead.
runsDirNoOverride the default run-store root directory. Optional.

Output Schema

NameRequiredDescription
loopIdYesMartinLoop run identifier the review was performed against.
summaryYesPlain-English review summary.
verdictYesMerge verdict: approve_with_review means safe to merge with human review; needs_changes requires fixes; blocked means do not merge.
findingsYesSpecific findings that informed the verdict.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is well-covered. The description adds valuable context beyond annotations: it clarifies the tool 'only reads saved run evidence and does not modify the repository or contact GitHub,' which is a specific behavioral guarantee not present in the annotations. It also explains the behavior of omitting prBody (evaluates the auto-generated body). This adds meaningful behavioral transparency without contradicting any annotations.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then provides usage guidance, exclusions, and a safety note in a logical flow. Every sentence serves a distinct function—purpose, when-to-use, exclusions, and behavioral transparency—with no filler or redundancy. It is appropriately sized for the tool's complexity.

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

Completeness5/5

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

Given the tool has an output schema and rich annotations, the description covers all essential aspects: it explains what the tool does, when to use it, when not to use it (with alternatives), the key parameter behavior (prBody omission), and its non-destructive nature. No critical information is missing for an agent to select and invoke this tool correctly.

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

Parameters3/5

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

The input schema has 100% description coverage, so each parameter's purpose is already well-documented. The description adds minimal additional parameter semantics: it reiterates the prBody behavior (supply to review a specific body; omit to evaluate the auto-generated one) which duplicates the schema's description. No other parameters receive additional explanation in the description, so it does not exceed the baseline expected for high schema coverage.

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 ('Review'), a specific resource ('PR body or draft against the MartinLoop run dossier and evaluation evidence'), and a specific output ('a verdict with specific findings'). It also differentiates itself from siblings by naming martin_pr_summary and martin_create_pr as alternatives for different tasks, making the tool's distinct role unambiguous.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool ('Use when you have an existing PR body and want to check whether it accurately represents the governed run evidence') and when not to use it, naming the exact alternative tools ('Do not use to generate a PR body from scratch — use martin_pr_summary instead. Do not use to open or create a PR — use martin_create_pr instead.'). This provides clear routing with no ambiguity.

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

martin_runA
Destructive

Execute a governed MartinLoop coding run after MCP workflow admission is satisfied. Use when the user has authorized implementation, bug fixing, tests, or refactoring and doctor/estimate/plan/preflight receipts match this task. Do not use for question-only diagnosis or when policy, budget, credentials, or scope still need consent. Next: read martin_dossier and verifier evidence.

NameRequiredDescriptionDefault
modelNoOptional model override passed to the primary provider.
engineNoWhich agent CLI to use. Defaults to claude.
maxUsdNoHard budget ceiling in USD.
maxTokensNoMaximum total tokens across all attempts.
objectiveYesThe coding task to complete. Be specific about what needs to change.
projectIdNoProject identifier for telemetry.
deniedPathsNoRepo-relative path globs Martin must never modify.
workspaceIdNoWorkspace identifier for telemetry.
allowedPathsNoRepo-relative path globs Martin may modify.
maxIterationsNoMaximum number of loop attempts.
fallbackEnginesNoExplicit ordered provider fallbacks authorized for this run. No provider is added implicitly.
verifyTimeoutMsNoHard timeout for each verifier command in milliseconds.
verificationPlanNoCommands that must all exit 0 for the task to be considered complete.
workingDirectoryNoOptional repo-root override resolved under the MCP workspace root. Must stay within that safe root.
providerExecutionTimeoutMsNoHard timeout for each provider coding process in milliseconds.

Output Schema

NameRequiredDescription
budgetYes
engineYes
loopIdYes
reasonYes
statusYes
costUsdYes
attemptsYes
pressureYes
inspectionYes
shouldStopYes
lifecycleStateYes
remainingTokensNo
workingDirectoryYes
remainingBudgetUsdYes
verificationPassedYes
remainingIterationsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=false, so the safety profile is covered by structured data. The description adds meaningful preconditions not expressed anywhere else: admission gating, matching receipts, and consent requirements around policy/budget/credentials. It stops short of spelling out that the run mutates the working tree and consumes real provider spend, but the governance framing and maxUsd/maxIterations schema fields make that inferable.

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

Conciseness5/5

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

Three sentences, each carrying distinct information: what it does, when to use it versus not, and what to read next. Prerequisites are front-loaded and there is no repetition of schema content.

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

Completeness4/5

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

For a destructive, 15-parameter execution tool with an output schema, the description supplies the workflow context (admission receipts, consent exclusions, follow-up reads) that structured fields cannot convey. The only gap is that it never states the concrete side effects — file mutation within allowedPaths and monetary spend — relying on annotations and schema to imply them.

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

Parameters3/5

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

Schema description coverage is 100%, so all 15 parameters are already documented in structured fields, including the allowedPaths/deniedPaths semantics and provider fallback ordering. The description adds no parameter-level meaning beyond what the schema states, so the baseline 3 applies.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Execute a governed MartinLoop coding run') and immediately scopes it with the admission condition ('after MCP workflow admission is satisfied'). The clause listing authorized task types (implementation, bug fixing, tests, refactoring) separates it cleanly from diagnostic siblings like martin_doctor or martin_estimate.

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

Usage Guidelines5/5

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

Explicit when-to-use ('user has authorized implementation... and doctor/estimate/plan/preflight receipts match this task') and explicit when-not ('Do not use for question-only diagnosis or when policy, budget, credentials, or scope still need consent'). It also names the follow-up ('Next: read martin_dossier and verifier evidence'), covering the before/after sequence an agent needs.

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

martin_run_dossierA
Read-onlyIdempotent

Read the full structured execution dossier for one MartinLoop run, including attempts, events, artifacts, verification, integrity, cost, and related discovery surfaces. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root. Use for comprehensive evidence review. Do not use for a compact state check; use martin_get_run, or use martin_dossier when formatted sharing output is required.

NameRequiredDescriptionDefault
fileNoPath to a canonical loop-record.json, legacy file, or run-store directory. Mutually exclusive with loopId and latest.
latestNoWhen true, loads the most recently updated loop record. Mutually exclusive with file and loopId.
loopIdNoLoop ID under the run store. Mutually exclusive with file and latest.
runsDirNoOptional run-store root override used to resolve loopId or latest.

Output Schema

NameRequiredDescription
costYes
loopYes
budgetYes
sourceYes
relatedYes
attemptsYes
warningsYes
artifactsYes
inspectionYes
sourceKindYes
recentEventsYes
verificationYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description carries a lower burden. It adds some context about the tool reading a comprehensive dossier, but no additional behavioral traits such as return format or side effects. This is adequate but not rich.

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 three sentences with no filler: the main purpose, the selector constraint, and the usage routing. It is front-loaded with the core action and every sentence earns its place.

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

Completeness5/5

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

For a read-only tool with annotations covering safety and an output schema covering return values, the description is complete. It explains the selectors, the run-store root override, and routes to the correct sibling when the use case differs. An agent has everything needed to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents each parameter and their mutual exclusivity. The description reiterates the selector concept and runsDir override but adds no information beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read the full structured execution dossier for one MartinLoop run' and enumerates the contents (attempts, events, artifacts, verification, integrity, cost, discovery surfaces). It also names siblings it is not ('use martin_get_run' and 'use martin_dossier'), clearly differentiating this tool from alternatives.

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

Usage Guidelines5/5

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

Explicit when-to-use and when-not-to-use guidance is provided: 'Use for comprehensive evidence review' and 'Do not use for a compact state check; use martin_get_run, or use martin_dossier when formatted sharing output is required.' This gives the agent a decision rule, not just context.

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

martin_statusA
Read-onlyIdempotent

Read the current budget, cost, remaining limits, and stop pressure for one MartinLoop run. Provide exactly one selector: loopJson for an inline record, file for a saved record, loopId for a run-store ID, or latest for the newest run; runsDir only changes the run-store root. Use for a compact budget check. Do not use for full events or artifacts; use martin_get_run or martin_run_dossier instead.

NameRequiredDescriptionDefault
fileNoPath under the Martin runs root to a loop-record.json file, a legacy .jsonl file, or a run-store directory. Mutually exclusive with loopJson, loopId, and latest.
latestNoWhen true, loads the most recently updated loop record. Mutually exclusive with loopJson, file, and loopId.
loopIdNoLoop ID resolved as <runsDir>/<loopId>/loop-record.json. Mutually exclusive with loopJson, file, and latest.
runsDirNoOptional runs-root override resolved under the default Martin runs root.
loopJsonNoJSON-serialized LoopRecord.

Output Schema

NameRequiredDescription
budgetYes
loopIdYes
sourceYes
statusYes
costUsdYes
attemptsYes
pressureYes
avoidedUsdYes
inspectionYes
shouldStopYes
lifecycleStateYes
remainingTokensNo
remainingBudgetUsdYes
remainingIterationsYes

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds a useful boundary beyond that: it returns only a compact budget snapshot for one run and not full events/artifacts, and clarifies that runsDir only changes the run-store root. No behavioral contradiction with the annotations.

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

Conciseness5/5

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

Three sentences with no filler: purpose first, selector rule second, usage boundary third. Every sentence earns its place and the most important operational constraint ('exactly one selector') is stated prominently.

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

Completeness5/5

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

Given the output schema, annotations, and fully covered parameters, the description covers the remaining operational rules: exactly one selector, what each selector points to, runsDir's scoped effect, and when to route to siblings. There is no critical missing information an agent would need to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds semantic meaning by mapping each selector to its intended source: 'inline record' for loopJson, 'saved record' for file, 'run-store ID' for loopId, and 'newest run' for latest. It also explains the non-selector role of runsDir, which helps an agent avoid treating it as a fifth mutually exclusive option.

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

Purpose5/5

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

The description names a specific verb ('Read') and resource ('current budget, cost, remaining limits, and stop pressure for one MartinLoop run'), and proactively distinguishes from siblings by saying it is not for full events/artifacts (martin_get_run or martin_run_dossier). It is immediately clear what this tool does and what it is not.

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

Usage Guidelines5/5

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

It gives a compact use case ('Use for a compact budget check') and explicit exclusions with named alternatives ('Do not use for full events or artifacts; use martin_get_run or martin_run_dossier instead'). The selector rule ('Provide exactly one selector...') also tells the agent how to choose an input path.

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

martin_triage_runsA
Read-onlyIdempotent

Read-only prioritization of saved Martin runs that need attention. Use when the user says a prior attempt failed, asks what to fix next, or resumes an interrupted session. Do not use for a brand-new objective with no relevant run history. Next: inspect the selected run or dossier before retrying.

NameRequiredDescriptionDefault
limitNoMaximum number of runs to triage. Defaults to 20.
modelNoFilter by attempt model.
statusNoFilter by loop status.
runsDirNoOptional runs-root override.
adapterIdNoFilter by attempt adapter ID.
updatedAfterNoOptional ISO-8601 timestamp for recency filtering.
includeHealthyNoWhen true, include healthy runs instead of only attention-worthy findings.
lifecycleStateNoFilter by lifecycle state.

Output Schema

NameRequiredDescription
sourceYes
filtersYes
findingsYes
runsRootYes
warningsYes
findingCountYes
evaluatedRunsYes
severityBreakdownYes

TDQS

A4.5/5.0
Behavior4/5

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

The description labels the operation 'read-only', which aligns with readOnlyHint and idempotentHint, and adds non-obvious selection behavior by saying only runs 'that need attention' are prioritized. It also provides the workflow cue to inspect the selected run or dossier before retrying, which is useful context beyond the annotations.

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

Conciseness5/5

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

Three short sentences cover purpose, usage triggers, and next step with no filler. The key selection signal, that this is for attention-worthy runs and not brand-new objectives, is front-loaded.

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

Completeness5/5

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

With readOnly and idempotent annotations, a fully described 8-parameter schema, and an output schema present, the description supplies what structured fields cannot: selection rationale and follow-up workflow. It is complete enough for an agent to decide when to invoke and what to do next.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter has a meaningful description, including default behavior for limit and the includeHealthy filter. The tool description itself adds no parameter-level detail, which is acceptable given the high-coverage baseline.

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

Purpose5/5

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

The description states a specific resource ('saved Martin runs'), the action ('prioritization'), and the filtering criterion ('that need attention'). This clearly positions it against siblings like martin_list_runs or martin_status, which imply plain listing or status checks rather than attention-based triage.

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

Usage Guidelines5/5

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

It gives concrete positive triggers ('prior attempt failed', 'asks what to fix next', 'resumes an interrupted session') and an explicit exclusion ('Do not use for a brand-new objective with no relevant run history'). It also names the next action, so an agent knows both when to call and what to do afterward.

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. 1 tool updatev0.8.9
    • Changedmartin_run2 fields changed
      • addedInput schema / properties / fallbackEngines
        Added value: +{
        +  "description": "Explicit ordered provider fallbacks authorized for this run. No provider is added implicitly.",
        +  "items": {
        +    "enum": [
        +      "claude",
        +      "codex",
        +      "gemini",
        +      "openai"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array",
        +  "uniqueItems": true
        +}
      • changedInput schema / properties / model / description
        Previous value: -"Optional model override passed to the CLI."New value: +"Optional model override passed to the primary provider."
  2. 6 tool updatesv0.8.6
    • Changedmartin_arcade_status1 field changed
      • changedOutput schema / properties / displayOutcome / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "VERIFIED",
        -      "STOPPED",
        -      "NEEDS REVIEW"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "VERIFIED",
        +      "STOPPED",
        +      "NEEDS_REVIEW"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedmartin_cancel5 fields changed
      • addedOutput schema / properties / ok
        Added value: +{
        +  "description": "Whether the control receipt was recorded.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / requestedAction
        Added value: +{
        +  "description": "The control action that was requested.",
        +  "enum": [
        +    "pause",
        +    "cancel",
        +    "continue"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / state
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Run control state after this request, including all recorded receipts.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "description": "Human-readable result of the control request.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "loopId",
        -  "action",
        -  "controlId",
        -  "requestedAt"
        -]New value: +[
        +  "loopId",
        +  "action",
        +  "controlId",
        +  "requestedAt",
        +  "ok",
        +  "summary",
        +  "requestedAction",
        +  "state"
        +]
    • Changedmartin_continue5 fields changed
      • addedOutput schema / properties / ok
        Added value: +{
        +  "description": "Whether the control receipt was recorded.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / requestedAction
        Added value: +{
        +  "description": "The control action that was requested.",
        +  "enum": [
        +    "pause",
        +    "cancel",
        +    "continue"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / state
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Run control state after this request, including all recorded receipts.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "description": "Human-readable result of the control request.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "loopId",
        -  "action",
        -  "controlId",
        -  "requestedAt"
        -]New value: +[
        +  "loopId",
        +  "action",
        +  "controlId",
        +  "requestedAt",
        +  "ok",
        +  "summary",
        +  "requestedAction",
        +  "state"
        +]
    • Changedmartin_create_pr5 fields changed
      • addedOutput schema / properties / branch
        Added value: +{
        +  "description": "Current branch of the run's repository, when known.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / created
        Added value: +{
        +  "description": "Whether a pull request was created.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / execute
        Added value: +{
        +  "description": "Whether gh was asked to create the pull request.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / url
        Added value: +{
        +  "description": "URL of the created pull request.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "loopId",
        -  "title",
        -  "body",
        -  "grade",
        -  "score"
        -]New value: +[
        +  "loopId",
        +  "title",
        +  "body",
        +  "grade",
        +  "score",
        +  "execute",
        +  "created"
        +]
    • Changedmartin_pause5 fields changed
      • addedOutput schema / properties / ok
        Added value: +{
        +  "description": "Whether the control receipt was recorded.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / requestedAction
        Added value: +{
        +  "description": "The control action that was requested.",
        +  "enum": [
        +    "pause",
        +    "cancel",
        +    "continue"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / state
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Run control state after this request, including all recorded receipts.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "description": "Human-readable result of the control request.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "loopId",
        -  "action",
        -  "controlId",
        -  "requestedAt"
        -]New value: +[
        +  "loopId",
        +  "action",
        +  "controlId",
        +  "requestedAt",
        +  "ok",
        +  "summary",
        +  "requestedAction",
        +  "state"
        +]
    • Changedmartin_preflight1 field changed
      • addedOutput schema / properties / execution / properties / codexDiagnostics
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "candidateProbeResults": {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "hostPlatform": {
        +      "type": "string"
        +    },
        +    "installKind": {
        +      "type": "string"
        +    },
        +    "invocationMode": {
        +      "type": "string"
        +    },
        +    "launchReady": {
        +      "type": "boolean"
        +    },
        +    "nativeInstallValid": {
        +      "type": "boolean"
        +    },
        +    "remediation": {
        +      "type": "string"
        +    },
        +    "sandboxCompatible": {
        +      "type": "boolean"
        +    },
        +    "sandboxMode": {
        +      "type": "string"
        +    },
        +    "selectedPath": {
        +      "type": "string"
        +    },
        +    "summary": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "launchReady",
        +    "summary"
        +  ],
        +  "type": "object"
        +}
  3. 14 tool updatesv0.6.6
    • Changedmartin_cancel1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_continue1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_create_pr1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_dossier1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_eval1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_get_attempt1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  }
        -]
    • Changedmartin_get_run1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_get_verification_results1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  }
        -]
    • Changedmartin_logs1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_pause1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_pr_summary1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_review_pr1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_run_dossier1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
    • Changedmartin_status1 field changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "loopJson"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "file"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "loopId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "latest"
        -    ]
        -  }
        -]
  4. 11 tool updatesv0.6.5
    • Changedmartin_doctor1 field changed
      • addedOutput schema / properties / runStore / properties / latestRun / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_dossier1 field changed
      • addedOutput schema / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_get_attempt1 field changed
      • addedOutput schema / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_get_run1 field changed
      • addedOutput schema / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_get_verification_results1 field changed
      • addedOutput schema / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_inspect2 fields changed
      • addedOutput schema / properties / latestRun / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recentRuns / items / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_list_runs2 fields changed
      • addedOutput schema / properties / latestRun / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / recentRuns / items / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_run1 field changed
      • addedOutput schema / properties / inspection / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_run_dossier1 field changed
      • addedOutput schema / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_status1 field changed
      • addedOutput schema / properties / inspection / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
    • Changedmartin_triage_runs1 field changed
      • addedOutput schema / properties / findings / items / properties / loop / properties / activeAttemptId
        Added value: +{
        +  "description": "ID of the currently active attempt, when a run is in progress.",
        +  "type": "string"
        +}
  5. 6 tool updatesv0.5.9
    • Changedmartin_arcade_status2 fields changed
      • addedInput schema / properties / loopId / description
        Added value: +"Optional MartinLoop run identifier. Omit it to read the latest persisted run."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "attempts": {
        +      "description": "Number of recorded attempts.",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "budget": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "maxUsd": {
        +          "type": "number"
        +        },
        +        "remainingUsd": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "maxUsd",
        +        "remainingUsd"
        +      ],
        +      "type": "object"
        +    },
        +    "completed": {
        +      "description": "Whether the run is outside an active lifecycle state.",
        +      "type": "boolean"
        +    },
        +    "cost": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "actualUsd": {
        +          "type": "number"
        +        },
        +        "provenance": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "actualUsd",
        +        "provenance"
        +      ],
        +      "type": "object"
        +    },
        +    "displayOutcome": {
        +      "anyOf": [
        +        {
        +          "enum": [
        +            "VERIFIED",
        +            "STOPPED",
        +            "NEEDS REVIEW"
        +          ],
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Terminal verified-handoff outcome, or null while the run is active."
        +    },
        +    "lifecycleState": {
        +      "description": "Current persisted lifecycle state.",
        +      "type": "string"
        +    },
        +    "loopId": {
        +      "description": "Run identifier represented by this Arcade snapshot.",
        +      "type": "string"
        +    },
        +    "receiptIntegrity": {
        +      "additionalProperties": true,
        +      "description": "Persisted receipt-integrity verdict.",
        +      "type": "object"
        +    },
        +    "verification": {
        +      "additionalProperties": true,
        +      "description": "Persisted verifier evidence summary.",
        +      "type": "object"
        +    },
        +    "warnings": {
        +      "description": "Evidence or interpretation warnings for the Arcade view.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "loopId",
        +    "lifecycleState",
        +    "completed",
        +    "displayOutcome",
        +    "verification",
        +    "receiptIntegrity",
        +    "attempts",
        +    "cost",
        +    "budget",
        +    "warnings"
        +  ],
        +  "type": "object"
        +}
    • Changedmartin_cancel6 fields changed
      • addedInput schema / properties / file / description
        Added value: +"Path to one canonical run record or directory. Mutually exclusive with loopId and latest."
      • addedInput schema / properties / latest / description
        Added value: +"When true, targets the latest canonical run. Mutually exclusive with file and loopId."
      • addedInput schema / properties / loopId / description
        Added value: +"Canonical MartinLoop run identifier. Mutually exclusive with file and latest."
      • addedInput schema / properties / reason / description
        Added value: +"Optional non-empty reason recorded in the cancellation receipt."
      • addedInput schema / properties / requestedBy / description
        Added value: +"Optional human or runtime identity label recorded for audit context."
      • addedInput schema / properties / runsDir / description
        Added value: +"Optional run-store root override used to resolve loopId or latest."
    • Changedmartin_dossier5 fields changed
      • addedInput schema / properties / file / description
        Added value: +"Path to one run record or directory. Mutually exclusive with loopId and latest."
      • addedInput schema / properties / format / description
        Added value: +"Output format. Defaults to json."
      • addedInput schema / properties / latest / description
        Added value: +"When true, loads the latest run. Mutually exclusive with file and loopId."
      • addedInput schema / properties / loopId / description
        Added value: +"MartinLoop run identifier. Mutually exclusive with file and latest."
      • addedInput schema / properties / runsDir / description
        Added value: +"Optional run-store root override used to resolve loopId or latest."
    • Changedmartin_pause6 fields changed
      • addedInput schema / properties / file / description
        Added value: +"Path to one canonical run record or directory. Mutually exclusive with loopId and latest."
      • addedInput schema / properties / latest / description
        Added value: +"When true, targets the latest canonical run. Mutually exclusive with file and loopId."
      • addedInput schema / properties / loopId / description
        Added value: +"Canonical MartinLoop run identifier. Mutually exclusive with file and latest."
      • addedInput schema / properties / reason / description
        Added value: +"Optional non-empty reason recorded in the pause receipt."
      • addedInput schema / properties / requestedBy / description
        Added value: +"Optional human or runtime identity label recorded for audit context."
      • addedInput schema / properties / runsDir / description
        Added value: +"Optional run-store root override used to resolve loopId or latest."
    • Changedmartin_run_dossier4 fields changed
      • changedInput schema / properties / file / description
        Previous value: -"Path to a canonical loop-record.json, legacy file, or run-store directory."New value: +"Path to a canonical loop-record.json, legacy file, or run-store directory. Mutually exclusive with loopId and latest."
      • changedInput schema / properties / latest / description
        Previous value: -"When true, loads the most recently updated loop record in the run store."New value: +"When true, loads the most recently updated loop record. Mutually exclusive with file and loopId."
      • changedInput schema / properties / loopId / description
        Previous value: -"Loop ID under the run store."New value: +"Loop ID under the run store. Mutually exclusive with file and latest."
      • changedInput schema / properties / runsDir / description
        Previous value: -"Optional runs-root override."New value: +"Optional run-store root override used to resolve loopId or latest."
    • Changedmartin_status3 fields changed
      • changedInput schema / properties / file / description
        Previous value: -"Optional path under the Martin runs root to a loop-record.json file, a legacy .jsonl file, or a run-store directory."New value: +"Path under the Martin runs root to a loop-record.json file, a legacy .jsonl file, or a run-store directory. Mutually exclusive with loopJson, loopId, and latest."
      • changedInput schema / properties / latest / description
        Previous value: -"When true, loads the most recently updated loop record in the runs directory."New value: +"When true, loads the most recently updated loop record. Mutually exclusive with loopJson, file, and loopId."
      • changedInput schema / properties / loopId / description
        Previous value: -"Loop ID resolved as <runsDir>/<loopId>/loop-record.json."New value: +"Loop ID resolved as <runsDir>/<loopId>/loop-record.json. Mutually exclusive with loopJson, file, and latest."

TDQS

A3.7/5.0

Scored across 24 tools

Disambiguation3/5

The action tools (run, pause, cancel, continue, plan, preflight, estimate) are cleanly separable, but the read surface is crowded: martin_status, martin_get_run, martin_inspect, martin_run_dossier, martin_dossier, martin_logs, martin_get_verification_results and martin_eval all read the same persisted run records. The descriptions pre-empt confusion with explicit 'do not use X, use Y' cross-references, which helps, but that pattern itself signals overlapping purpose. martin_inspect vs martin_get_run vs martin_run_dossier remains a genuine three-way overlap an agent could easily misselect.

Naming Consistency4/5

All tools use the martin_ prefix with snake_case verb_noun structure (martin_get_run, martin_list_runs, martin_create_pr), which is highly predictable. A few names are noun-only or vague (martin_inspect, martin_status, martin_eval, martin_arcade), and descriptions reference a martin_get_status tool that is not in the set, slightly weakening the surface's internal consistency.

Tool Count3/5

At 24 tools this sits in the heavy band; the governed-run lifecycle genuinely is multi-stage, but at least four read/report variants (status, get_run, dossier, run_dossier) and two Arcade tools feel like they could be consolidated. Each tool has a stated purpose, so nothing is gratuitous, but the set is wider than an agent typically wants to navigate.

Completeness4/5

Coverage is strong across the lifecycle: diagnostics (doctor), estimation, planning, preflight, execution, hold/cancel/resume, listing and triage, run/attempt retrieval, verification evidence, grading, and PR summary/create/review. Minor gaps include no explicit retry/resume-run operation and dangling references to a martin_get_status tool that does not exist in this surface.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.
    28
    1
    288,522 PyPI
    91,671
    MIT
  • A
    license
    A
    quality
    Not graded
    maintenance
    Enables browser automation through Playwright using accessibility tree snapshots instead of screenshots. Supports web scraping, form interactions, testing, and connecting to existing browser sessions with logged-in accounts.
    23
    7,920 npm
    5
    -
  • A
    license
    A
    quality
    C
    maintenance
    Python MCP server for GitHub operations, providing native tool integration with Claude Code and other MCP clients. It enables managing issues, pull requests, CI status, milestones, and batch operations via natural language.
    15
    MIT