martin-loop
Make AI coding agents safe to scale autonomously: assign work, cap spend, enforce policy, verify output, roll back failures, learn from loops, and prove ROI across every repo.
Documentation
MartinLoop
Your coding agent says it's done. MartinLoop makes it prove it.
One system to control, verify and understand coding-agent work.
Start Here
Install — 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`.
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.
For AI Agents
MartinLoop is the execution-control system around coding agents. The coding agent still writes the code. MartinLoop governs the run and makes completion prove itself.
Use MartinLoop when a coding task needs one or more of these controls:
- 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 control layer across Codex, Claude Code, and other coding-agent environments
Canonical lifecycle:
DEFINE
-> PREFLIGHT
-> CONTROL
-> VERIFY
-> RECOVER
-> PROVE
-> ANALYZEThe 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.
Why MartinLoop
AI coding agents are useful, but unbounded retry loops are expensive.
A task that looked like a small fix can become dozens of attempts, a blown token budget, and a diff nobody trusts. MartinLoop gives every run an explicit contract: objective, verifier, budget, scope, receipts, and a clear stop condition.
Use it when AI coding work needs to stay bounded, inspectable, and safe to review before it becomes expensive or destructive.
Why Teams Adopt MartinLoop
- It turns agent behavior into inspectable run receipts you can actually review.
- It enforces hard stop conditions before runaway retries spend more money.
- It adds rollback-aware rules so failed attempts do not silently leave unsafe changes behind.
- It helps teams compare outcomes across agents under one governed flow.
Teams use MartinLoop when they need governed agent execution that can be reviewed and trusted.
2-Minute Install Path
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 1Quick Start
Try MartinLoop in a disposable demo workspace:
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 --latestOptional global install:
npm install -g martin-loop
martin-loop --versionIf 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 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 the current root package: MartinLoop 0.5.8.
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 --latestExample receipt files: Markdown and JSON.
Run This Audit Yourself
Use this lane from a clean temp directory to verify the public CLI flow exactly as shipped:
npx -y martin-loop@0.5.6 --version
npx -y martin-loop@0.5.6 start
npx -y martin-loop@0.5.6 demo
cd martin-loop-demo
npm install
npx -y martin-loop@0.5.6 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.5.6 dossier --latest --json
npx -y martin-loop@0.5.6 share --latest --jsonFor deterministic installs, pin the package line (`martin-loop@0.5.8`) 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)
Public governed runs use one canonical taxonomy: the 13 runtime `FailureClass` values from `@martin/contracts`.
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 ]
martin-loop phase status|contract|session-start|preflight|run [--execute]
martin-loop preflight [options]
martin-loop run [options]
martin-loop bench --suite
martin-loop triage
martin-loop dossier (--latest | --loop-id | --file )
martin-loop runs list|get|attempt|verify ...
martin-loop mcp print-config --host
martin-loop mcp install --host
martin-loop mcp verify-install --host [--scope ]
martin-loop mcp rollback --host [--scope ]
martin-loop mcp uninstall --host [--scope ]
martin-loop challenge [--loop-id | --file | --latest]
martin-loop share (--loop-id | --file | --latest) [--out-dir ]
martin-loop badge [--format svg|json] [--runs-dir ]Common options:
--budget Hard cost cap in USD
--budget-usd Alias for --budget
--soft-limit-usd Soft budget threshold in USD
--verify Verifier command after each attempt
--proof Run verifier-only evidence checks without claiming governed execution
--max-iterations Maximum number of attempts
--max-tokens Maximum token budget
--engine Adapter to use: claude, codex, gemini, or openai
--cwd Repo root for the run
--allow-path Restrict writes to this path pattern; repeatable
--deny-path Block this path pattern; repeatable
--runs-dir Override the local Martin runs rootExamples 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-50From a clean public clone:
pnpm install --frozen-lockfile
pnpm bench:build
pnpm bench:eval
pnpm bench:report:ralphyEquivalent workspace-filter commands:
pnpm --filter @martin/benchmarks build
pnpm --filter @martin/benchmarks test
pnpm --filter @martin/benchmarks eval
pnpm --filter @martin/benchmarks report:ralphyThe 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/mcpAdd 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/mcpGenerate 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-reviewThe root `martin-loop` package, standalone `@martinloop/mcp` package, plugin metadata, and MCPB product version are aligned at `0.5.8`. 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-loopimport { 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
- Quickstart
- Examples
- MartinLoop for AI Agents
- Agent Failure Atlas
- Failure Taxonomy (13 Runtime Classes)
- PRE-028-PUBLIC-SURFACE-DIFF.md
- Claude Code walkthrough
- Codex setup
- MCP setup
- MCP tool reference
- Agent run receipts
- Benchmark + receipt page
- GitHub Actions budget gate
- OpenCode-style adapter
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:localStandalone 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:releaseContributing
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-featureStar this repo if you think AI coding needs budgets, brakes, and receipts.
·
MartinLoop is part of the NVIDIA Inception program.
Telemetry & Privacy
MartinLoop sends minimal anonymous usage data to help improve reliability and prioritize development. A first-run notice appears before any data is transmitted. No data is sent on that first run.
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/`
No authorization header, API key, or direct table access.
Opt out anytime:
martin telemetry offInspect what is sent:
martin telemetry explainEnvironment variables that disable telemetry: `MARTIN_TELEMETRY_DISABLED=1`, `DO_NOT_TRACK=1`, `CI=1`
MartinLoop continues to work normally with telemetry disabled. No features are gated on telemetry consent.
License
Apache-2.0. See LICENSE.
Frequently asked questions
What is martin-loop?
martin-loop is Make AI coding agents safe to scale autonomously: assign work, cap spend, enforce policy, verify output, roll back failures, learn from loops, and prove ROI across every repo.
How do I install martin-loop?
Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.
Is martin-loop open source?
Yes — it is hosted on GitHub at https://github.com/Keesan12/martin-loop and has 47 stars.
Related MCP tools
Open-source cross-agent memory layer for coding agents via MCP. Compatible with Claude Code, Codex, Cursor, Windsurf, Gemini CLI, Antigravity, OpenClaw, Hermes Agent, Oh-my-Pi, Pi, Copilot, Kiro, OpenCode, and Trae.
Cut AI token costs 95%+ on code exploration. The leading MCP server for precise, symbol-level GitHub code retrieval via tree-sitter AST. Works with Claude Code, Cursor & any MCP client. 313B+ tokens saved.
👾 Open Computer Use – Open-Source Alternative to Codex Computer Use
Open-source coding agent memory. Records issues, attempts, fixes and decisions, then warns your agent before it repeats an approach that already failed. Native MCP server for Claude Code, Cursor, Antigravity and Codex. 100% local, no cloud, no telemetry. MIT.
Give your AI agents persistent, collective memory — with deduplicating absorb, supersession lineage, semantic search, and a graph UI. Speaks MCP.
A Model Context Protocol (MCP) server and CLI that provides tools for agent use when working on iOS and macOS projects.
Run your own MCP server? See who uses it and what to fix.
Measure it with TrackMCP