Fagan
This server is the Fagan pipeline MCP server: it plans, dispatches, reviews, and merges autonomous software-engineering work.
Plan management: generate/decompose a plan, save it, list plans, ingest into Plane, and pause/resume plan execution.
Story orchestration: list ready stories, dispatch agents to work on stories, checkpoint progress, interrupt/resume, patch story fields, and set story statuses.
Review & merge: run code review, approve merges, and advance the whole pipeline through test → review → PR → merge.
Automation: run one orchestration tick (
advance_pipeline) or across all ingested plans (advance_all_plans), honoring concurrency and resource gates.Overlord decisions: escalate blocking decisions, review the decision audit log, and rule per policy.
Configuration & diagnostics: inspect resolved role/provider/model configs and effective environment/config provenance.
Usage tracking: probe and persist current subscription usage.
Fagan
Spend tokens on judgment, not typing.
Frontier models cost money per token and are excellent at judgment. Local models run free and are adequate at typing. This pipeline splits software engineering along exactly that line: a frontier model decomposes the work, plans it, reviews the diff, and adjudicates anything risky — while a local model writes the implementation at no marginal cost.
What makes the cheap half trustworthy is inspection. In Michael Fagan's 1976 IBM study, formal inspection found 82% of the defects in the released product — 38 per KLOC, against 8 per KLOC for unit testing. Quality lives in the gate, not in the author. So this project spends its budget on gates: TDD enforced before implementation, an independent review pass, acceptance-oracle grading, a risk-tiered overlord that stops for a human on anything irreversible, and a merge gate that re-runs the suite against the rebased branch before anything lands.
The goal is narrow and specific: enterprise-grade engineering discipline — decomposition, TDD, code review, dependency-ordered delivery — on a $20/month budget.
For detailed reference material, see REFERENCE.md.
Before you start: read Reliability & limitations below. This is an autonomous coding pipeline with real, documented failure modes — it is not a hands-off "describe a feature, get a PR" tool yet.
Platform support
Developed and run day-to-day on macOS. The core (MCP server, dashboard, Claude-backend dispatch/review, the full test suite) is plain Python and CI tests it on Ubuntu across Python 3.12–3.14 on every push. Two pieces are macOS-only:
launchd/*.plist— the scheduler/MLX-supervisor/usage-poller are packaged as launchd jobs on macOS. On Linux, render the systemd equivalent withscripts/generate_systemd_units.sh(see Scheduler below) instead of hand-rolling init files, or run the entry points directly in a foreground terminal/tmuxsession.MLX (
PIPELINE_LOCAL_PROVIDER=mlx) — Apple Silicon only. Local dispatch works fine on Linux via Ollama or LM Studio instead (PIPELINE_LOCAL_PROVIDER=ollama/lmstudio).
Windows is untested.
Related MCP server: Vibecoders MCP
Quickstart
One-line install
curl -fsSL https://raw.githubusercontent.com/motock/fagan/master/scripts/remote-install.sh | bashThis clones the repo to ~/.fagan (override the location with
FAGAN_INSTALL_DIR, and the source URL with FAGAN_REPO_URL) and runs
scripts/install.sh inside it -- equivalent to the manual clone-and-run
steps below, minus the typing. Re-running it later updates the existing
checkout (git pull --ff-only) instead of re-cloning.
Piping a remote script into bash means trusting whatever that URL serves
at fetch time. If you'd rather read it first:
curl -fsSL https://raw.githubusercontent.com/motock/fagan/master/scripts/remote-install.sh -o remote-install.sh
less remote-install.sh # or open it in an editor
bash remote-install.shEither way, cd into the install directory it reports (~/.fagan by
default) and continue from step 2 below. Prefer a manual clone? Use the
steps below instead.
This gets the MCP server registered and a first plan running end-to-end.
A first run needs no local model at all: with nothing configured, dispatch
and review fall back to the claude backend, which shells out to the Claude
Code CLI. That fallback is the starting configuration, not the intended one
— the cost split described above only happens once you deliberately route
the implementation role to a local model, which is why the shipped registry
ships no roles block of its own: see Provider selection & authorization
below for how to make that choice when you're ready.
# 1. Clone and install the Python environment
git clone https://github.com/motock/fagan.git
cd fagan
scripts/install.sh # creates .venv, installs requirements.txt
# 2. Register the MCP server with Claude Code (adjust the path to where you cloned it)
claude mcp add -s user pipeline "$(pwd)/.venv/bin/python3" "$(pwd)/app/pipeline_mcp_server.py"
# 3. Copy the persona subagents and decision policy into place
# (cp -n skips any file you already have — e.g. a customized code-reviewer.md —
# instead of silently overwriting it; diff before removing -n if you do want the update)
mkdir -p ~/.claude/agents
cp -n agents/*.md ~/.claude/agents/
cp -n overlord-policy.md ~/.claude/overlord-policy.md
# 4. Restart Claude Code (or start a new session) so it picks up the MCP serverscripts/install.sh creates the .venv, installs requirements.txt and
requirements-dashboard.txt (the dashboard's fastapi/uvicorn deps, installed
on every run; a --dev install uses requirements-dev.txt, which already
includes the dashboard deps), and reports on the tools the pipeline shells out
to — required: git, gh, and the claude CLI; optional: ollama and
docker — with graceful-degradation messaging, and is safe to re-run. It does not register the MCP server, set environment
variables, or install the persona subagents — steps 2–4 above cover those. With
nothing but the claude backend configured, ollama/docker being absent is
expected, not an error.
From a Claude Code session in the project you want the pipeline to work on:
Ask the
product-analystsubagent to turn a goal into epics/stories, or hand-write a plan per the schema.mcp__pipeline__save_plan(oringest_plan) with that plan and arepo_rootpointing at the target project — not this pipeline repo.mcp__pipeline__list_ready_storiesto see what's unblocked, thenmcp__pipeline__dispatch_storyto claim and start one.Watch progress with the dashboard:
scripts/dashboard.sh start, then openhttp://localhost:8000.For unattended operation, run the scheduler so ready stories advance without you calling
advance_pipelineby hand:.venv/bin/python3 -m pipeline.scheduler_daemon(foreground, or under launchd/systemd/tmux — see Scheduler below).
Start with PIPELINE_AUTONOMY=dry-run (plans and logs only, nothing is
dispatched or merged) until you've watched one plan run and trust the gates —
see Autonomy levels.
Only using the claude backend? The PIPELINE_LOCAL_* and
PIPELINE_BACKEND_*=ollama/lmstudio/mlx variables, and Ollama/MLX/LM Studio
setup, only matter if you opt a role into local-model dispatch — but provider
selection itself is still a required setup step (the shipped registry routes
nothing; see Provider selection & authorization below), and even the
claude path needs two credentials before the first dispatch: gh auth login
(the pipeline opens and merges PRs through the GitHub CLI) and the Claude Code
CLI's own login. See
Minimal configuration for the handful of
variables actually worth setting on day one, versus the ~100 that exist purely
for tuning.
Provider selection & authorization
Provider selection is a required setup step. The shipped
model_registry.json deliberately declares which models exist per provider
but ships no roles routing: this project decouples from any single
provider, so the operator chooses. There are two supported ways to select a
provider per role, checked in this order by resolve_role:
Plan role config — a plan's per-role
provider/modelbeats everything below.A
rolesblock in a registry file — the single source of truth for role routing; see below.PIPELINE_BACKEND_<ROLE>environment variables — consulted only when the registry has no entry for the role (the empty-state path, so a fresh clone still boots); e.g.PIPELINE_BACKEND_DISPATCH=ollamaopts the dispatch role into Ollama.The caller's own fallback — for dispatch/review this is the
claudebackend.
For an interactive alternative to editing registry JSON by hand, run the
picker: .venv/bin/python scripts/choose_providers.py. It walks through all
nine roles one at a time, showing each role's current provider/model and where
that setting came from, and lets you switch it by typing an option number —
each of the nine roles is configured independently, and every change is
validated against the registry before it is written. It is safe to re-run any
time: re-running just re-reads the current routing, and pressing Enter keeps a
role's existing setting.
The same two registry files work for both selection styles:
PIPELINE_MODEL_REGISTRY_PATHpoints the pipeline at any registry JSON you like.model_registry.local.json(repo root) is the convention for a personal registry: it is gitignored, so your per-role routing stays out of the repo. PointPIPELINE_MODEL_REGISTRY_PATHat it, or copy it overmodel_registry.jsonlocally if you prefer not to set the variable.
A roles block names a provider and a friendly model name per role; the
friendly name must exist under that provider's models in the same file, and
the concrete tag is resolved from there. A typo raises an error rather than
silently falling back.
Authorization matrix. Selecting a provider also selects which credentials
you must establish first — scripts/install_checks.py probes these and
reports unauthorized (remedy: a login, not an install) where it can:
Provider / tool | Credential needed | How to establish it |
| GitHub auth (the pipeline opens and merges PRs through |
|
| Claude Code CLI's own login |
|
any | An ollama.com account, signed into the local daemon |
|
| Per-vendor API keys | |
on-device ollama / lmstudio / mlx tag | Nothing extra | — |
On the :cloud rows: those calls are proxied through https://ollama.com by
the local ollama daemon, which sends its own credential — the pipeline sends
no credential of its own. :cloud tags are the only ollama tags that need
a sign-in; purely on-device tags need nothing beyond the daemon running.
Getting-started walkthrough
The walkthrough works with whatever dispatch provider you have configured —
PIPELINE_BACKEND_DISPATCH (set it explicitly, or add a roles block to a
local registry — the shipped registry routes nothing; see Provider selection
& authorization above). With claude configured, dispatch and review shell
out to the Claude Code CLI; with a local provider such as ollama configured,
they run on that local model instead.
Install — one command:
scripts/install.sh(see the quickstart above for what it does and does not do).Register the MCP server and personas — quickstart steps 2–3 above (
claude mcp add ...plus copyingagents/*.mdand the overlord policy), then restart Claude Code.Start the dashboard —
scripts/dashboard.sh start, then openhttp://localhost:8000and pick your target project in the workspace picker.Decompose a tiny goal — ask the
product-analystsubagent (or the dashboard's decompose action) to turn a one-liner goal into epics/stories, thenmcp__pipeline__save_planthe result with itsrepo_rootfield pointing at your target project — not this pipeline repo.Dispatch the first ready story —
mcp__pipeline__list_ready_stories, thenmcp__pipeline__dispatch_storyon the first one, and watch the story advance across the kanban board in the dashboard.Watch it merge — with
PIPELINE_AUTONOMY=gated(the default), a risk-lowstory that passes review merges unattended. Start withPIPELINE_AUTONOMY=dry-runfirst, per the quickstart advice above.Prefer the scripted path? —
.venv/bin/python scripts/smoke_getting_started.pyruns the same flow end-to-end without the dashboard, in a scratchPLAN_DIRthat never touches your real plans. The smoke is provider-neutral: it runs on your configured dispatch provider (PIPELINE_BACKEND_DISPATCH, defaultclaude) and announces the resolved provider, model and source up front, so you always know which backend it validated. Exit codes:0PASS (the story reachedtests_passed),1the resolved provider isclaudeand theclaudeCLI is missing, exit 2 means the configured provider is empty or unrecognised — a configuration error, not a refusal of a local provider —3the bounded poll timed out,4the story failed. Honest caveat: PASS depends on the configured model actually completing the story, so a failure on a weak local model reflects that model, not a broken pipeline.
For what can still go wrong, see Reliability & limitations.
Companion MCP server (overlord + acceptance-oracle only)
Not ready to adopt the whole orchestrator? pipeline/companion_server.py is a
second, smaller MCP server (pipeline-companion) exposing two ideas that
stand on their own without adopting the rest of the pipeline:
escalate_decision (the overlord decision path) and the acceptance-oracle
helpers classify_oracle_outcome / acceptance_digests. It imports the real pipeline.overlord and
pipeline.oracle_gate modules rather than duplicating them, so it stays in
sync with the main server. Add it alongside the main server as a second
mcpServers entry:
{
"mcpServers": {
"pipeline": {
"command": ".venv/bin/python3",
"args": ["app/pipeline_mcp_server.py"]
},
"pipeline-companion": {
"command": ".venv/bin/python3",
"args": ["-m", "pipeline.companion_server"]
}
}
}The adoptable specs this server exports live in docs/specs/:
OVERLORD_POLICY_SPEC.md (the overlord decision path),
ACCEPTANCE_ORACLE_PATTERN.md (the acceptance-oracle grading pattern), and
DOCKER_SANDBOX.md (the opt-in Docker sandboxing behavior).
Running standalone (dashboard + scheduler, no MCP server)
The dashboard exposes the same operations as the MCP tools — save/ingest a plan,
decompose a goal, dispatch a story, advance, review, approve merge — so the
pipeline can run without registering an MCP server at all. That parity lives at
the HTTP API, not in the UI: the dashboard UI directly surfaces chat (including
drafting a plan), browsing plans, stories, journals and logs, the workspace
picker, the worktree-patch review/apply flow, role configuration, and ingesting a
saved plan. Dispatch, advance, review and approve-merge have UI-less API routes
(/api/plans/{plan_name}/stories/{story_key}/dispatch and friends) available for
scripting, and for the standalone flow the scheduler is the intended driver:
draft and ingest a plan from the dashboard, then let the scheduler dispatch,
advance, review and merge ready stories on its own. The
supported path is one command:
scripts/standalone-setup.sh upup provisions a scratch data dir (default ~/pipeline-standalone), writes
the shared operator env file with absolute paths, starts the dashboard and the
scheduler through their existing helper scripts, and then refuses to report
success until GET /api/health answers with an empty config_mismatch and
the intended plan_dir. Main options: --data-dir DIR (default
~/pipeline-standalone), --target-repo DIR (default: a scratch repo under
the data dir), --port PORT (default 8001), --autonomy MODE (default
dry-run), plus --repo-root and --force. down stops both processes and
leaves the scratch data in place; status prints the resolved paths and both
processes' state.
Both long-running processes read the same operator env file:
scripts/dashboard.sh and scripts/scheduler.sh both source
.pipeline.env (gitignored; see .pipeline.env.example) first, then
.dashboard.env (gitignored; see .dashboard.env.example) second, so
existing dashboard-only installs keep their current last-write precedence —
.dashboard.env still works and simply overrides .pipeline.env where they
overlap.
Because the dashboard and the scheduler are separate processes, PLAN_DIR
must match between the two: the scheduler writes a config fingerprint to
<plan_dir>/.scheduler_health.json, and /api/health reports
config_mismatch listing the fields where the dashboard's resolved config
differs from that fingerprint. A non-empty config_mismatch means the UI and
the scheduler are working different plan stores — check that both were
started with the same PLAN_DIR (the standalone script writes one env file
for exactly this reason, and fails hard on a non-empty config_mismatch).
The normal prerequisites still apply in standalone mode: gh auth login for
the PR/merge path (the pipeline opens and merges PRs through the GitHub CLI),
and provider authorization for whichever backend is configured — see
Provider selection & authorization above.
Components at a glance
Piece | Location | Role |
Persona subagents |
| The SDLC roles agents play |
Decision policy |
| How the overlord decides |
Pipeline MCP server |
| All pipeline tools + orchestration; |
Backend seam |
| Per-role driver routing ( |
Local agent loop |
| Native-tool-calling write loop for local dispatch (subprocess) |
Monitoring dashboard |
| FastAPI status/lifecycle viewer; in standalone mode (see "Running standalone" below) it also drives save/ingest/dispatch/review/merge directly |
Install / deps |
| venv + dependency setup |
Tests |
|
|
Plans / manifests / logs |
| Plan, manifest, decisions, notifications |
Worktrees |
| Isolated per-story branches |
Issue tracker | Plane (external, optional) | Mirror of story state; skipped entirely when unconfigured (manifest is the source of truth) |

The dashboard's Comms view — ask what's blocked, draft a plan, or approve a merge, all routed through the same gated API the kanban board's own buttons call. More screenshots (the live kanban board and the workspace picker) are in docs/DEMO.md.
Architecture
┌───────────────────────────────────────────────────────────┐
│ Orchestrator loop (cron / /loop skill) │
│ advance_pipeline(plan) — one idempotent tick │
└───────────────────────────┬───────────────────────────────┘
│ ready stories (deps satisfied)
▼
┌───────────────┐ resolve backend + ┌───────────────────────────────┐
│ Plan/Manifest │ persona/model │ Dispatch │
│ (JSON, Plane) │──────────────────────►│ claude -p OR local loop │
└───────────────┘ │ (tech-lead plans for local → │
│ .agent_plan.md) │
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ Headless story agent, TDD- │
│ first, in an isolated git │
│ worktree │
└───────────────┬───────────────┘
local fail → escalate │ tests +
to claude (`auto`) │ acceptance oracle
▼
┌───────────────────────────────┐
│ code-reviewer: VERDICT, │
│ opens a PR │
└───────────────┬───────────────┘
▼
low → decide silently ┌───────────────────────────────┐
medium → decide, notify the user │ Overlord adjudicates risk │──► decisions log
high → park, wait for a human │ (blocked decisions, merge, │ (audit trail)
│ scope disputes) │
└───────────────┬───────────────┘
▼ approved
┌───────────────────────────────┐
│ Merge gate: rebase on master, │
│ force-push, poll CI, re-run │
│ the suite on the rebased │
│ branch │
└───────────────┬───────────────┘
▼
masterPersonas (~/.claude/agents/)
Each persona is a Claude Code subagent: a markdown file with YAML frontmatter
(name, description, model, and optionally memory: user) and a
system-prompt body. The pipeline reads the body and dispatches a headless agent
with it as the role.
memory: user injects the user-memory directory into the system prompt on
every Claude call — high-leverage context but expensive in tokens. The
reviewer personas (code-reviewer, security-engineer) deliberately omit
it: their job is a mechanical check (run tests, read diff, emit VERDICT),
the CLAUDE.md rules they need are in the persona body, and skipping the
~132 KB memory injection shaves ~30-40% off every review call's input tokens.
The dispatch and overlord personas keep it because they benefit from project
context and are lower-volume.
Persona | Default model | Responsibility |
| opus | Decompose a goal into epics/stories with acceptance criteria, dependencies, and per-story |
| opus | General system design, tech selection, API design (delegates mobile to |
| sonnet | Default TDD implementer for non-mobile work |
| opus | Threat modeling and security review (OWASP, Secure by Design) |
| sonnet | Build/CI, branch & worktree hygiene, releases |
| sonnet | Reviews a branch, emits a |
| haiku | Docs for externally visible changes |
| opus | The decision authority (see below) |
Existing mobile specialists (mobile-architect, mobile-engineer,
ux-mobile-principal, qa-test-engineer) are unchanged and used for mobile work.
To change a persona's behavior or default model, edit its .md file. The
frontmatter model: line is the fallback model when a story does not specify one.
The overlord and the decision policy
The overlord (~/.claude/agents/overlord.md) rules on the user's behalf when
a story agent is blocked, two personas disagree, or a gate needs adjudication. It
follows ~/.claude/overlord-policy.md (plus an optional per-repo
<repo>/.overlord-policy.md override).
Decision tiers:
Routine / reversible → decide silently (naming, internal structure, a library within the approved stack, refactors).
Notify-async (
risk: medium) → decide, proceed, flag the user (new dependency, schema change, additive API change).Park-and-ping (
risk: high) → do not act unattended; hold for human review and notify. Anything irreversible, security/auth, money, production config, or breaking changes. Always parked regardless of autonomy level.
The overlord returns a structured ruling (RULING / TIER / RISK /
RATIONALE / NOTIFY_USER) that is parsed and written to the plan's decisions
log as an audit record.
Reference
See REFERENCE.md for the full MCP tools reference, the plan/story JSON schema, per-role provider/model configuration, guided decomposition and TDD-split details, every PIPELINE_*/LOCAL_AGENT_* environment variable, the end-to-end workflow, safety controls, the usage gate, and development/testing instructions.
For a worked end-to-end example of the pipeline developing this repository itself — the install command, the real pull requests it produced, and an honest account of what it can't do yet — see docs/DEMO.md.
For how a release is cut, see docs/RELEASING.md.
Prerequisites
Python 3.10+ and the project venv. CI tests 3.12–3.14 on Ubuntu and macOS on every push; 3.10/3.11 aren't part of the CI matrix, so treat them as likely-fine but unverified.
git on PATH.
GitHub CLI (
gh).Claude Code CLI (
claude).
Scheduler
The advance-scheduler runs as a long-lived daemon rather than a periodic
launchd tick. launchd's role is limited to crash-restarting it via KeepAlive.
Environment Variables
PIPELINE_SCHEDULER_INTERVAL_S – default reconcile sweep interval (default 60 seconds).
PIPELINE_SCHEDULER_HEALTH_PATH – optional path where the daemon writes its health JSON each iteration.
Rendering the launchd files for your machine
The committed launchd/*.plist files and launchd/pipeline-logs.newsyslog.conf
are a reference copy: they carry the maintainer's own absolute paths (a
/Users/<name>/... home directory, a specific model cache path) and will not
work unedited on another machine. On a fresh install, regenerate them yourself
with scripts/generate_launchd_plists.sh (install.sh does not run this for
you) — it fills the templates in launchd/
(launchd/com.fagan.pipeline.*.plist.template) from three flags:
--repo-root— the pipeline checkout the rendered files should point at (default: the repo that contains the script).--out-dir— where the rendered files are written (default:<repo-root>/launchd).--mlx-model-path— the local MLX model directory baked into the mlx-supervisor plist. As an alternative to the flag you can set theMLX_MODEL_PATHenvironment variable; the flag wins when both are given. The script fails closed — it exits with an error — when neither is supplied.
The same script also renders launchd/pipeline-logs.newsyslog.conf from
launchd/pipeline-logs.newsyslog.conf.template, substituting only the repo root.
scripts/generate_launchd_plists.sh \
--repo-root "$HOME/.claude/mcp-servers/pipeline" \
--out-dir "$HOME/.claude/mcp-servers/pipeline/launchd" \
--mlx-model-path "$HOME/.cache/qwen2.5_coder_14b_manual"These launchd files are macOS-only - see Platform support.
Rendering the systemd units for Linux
scripts/generate_systemd_units.sh renders the equivalent systemd user-unit
and logrotate files from systemd/*.template, the same way
scripts/generate_launchd_plists.sh does for launchd – minus MLX, which is
Apple Silicon-only:
scripts/generate_systemd_units.sh \
--repo-root "$HOME/fagan" \
--out-dir "$HOME/fagan/systemd"Install as per-user systemd units (no root required):
mkdir -p ~/.config/systemd/user
cp systemd/com.fagan.pipeline.advance-scheduler.service ~/.config/systemd/user/
cp systemd/com.fagan.pipeline.usage-poller.service ~/.config/systemd/user/
cp systemd/com.fagan.pipeline.usage-poller.timer ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now com.fagan.pipeline.advance-scheduler.service
systemctl --user enable --now com.fagan.pipeline.usage-poller.timer
# Optional: let these run even when you are not logged in
loginctl enable-linger "$USER"Log rotation (needs root, one-time):
sudo cp systemd/pipeline-logs.logrotate.conf /etc/logrotate.d/com.fagan.pipelineReliability & limitations
This pipeline runs real autonomous coding loops, and they fail in specific, documented ways — read this before pointing it at anything you care about.
Local (non-Claude) model dispatch is the weak point. It works well for small, mechanically-scoped stories (one concern, ≤2 production files) and degrades sharply on anything bigger: large-file edits, multi-function stories, and anchored inserts into long existing functions reliably cause step-cap timeouts, stalls, or file corruption from stale line-number edits.
docs/plans/*.mdandretros/*.mdin this repo are the actual incident record this finding comes from, not a marketing claim — read a few before trusting local dispatch on anything non-trivial.PIPELINE_BACKEND_DISPATCH=autoexists specifically to escalate a struggling local attempt to Claude rather than let it loop.The "$20/month" framing is the design goal the gates are built around, not a benchmarked result yet. The one full model-comparison run on record (
tests/benchmark/FINDINGS.md) was contaminated mid-run by rate limits and credit exhaustion, so there is no clean apples-to-apples success-rate/cost comparison across backends published yet. The cleanest number there is narrow —gpt-oss:20bon-device, 2 T1 tasks, 2/2 success with the independent oracle passing on the merged code, one trial each — and is directional, not a quality comparison. Read that file for exactly what is and isn't known before citing a number from it.A green test suite is not proof of a correct or complete change. An executor (local or Claude) converges to the minimum diff that turns its own tests green, and can write a self-consistently wrong test that encodes the same bug as its implementation. See
.claude/rules/code-review.md's "Merge-gate and AI-review lessons" section — every lesson there came from a real merged regression, not a hypothetical.A story marked
doneis not proof its title's full scope shipped. A "migrate everything" or "remove all X" story can pass review and merge having only done part of the job, because review grades the story's own tests, not the title's claim. See.claude/rules/agent-dispatch-story-sizing.md.The overlord's
park-and-pingtier is a real safety floor, not a suggestion — high-risk decisions (irreversible actions, auth/security, money, production config, breaking changes) always stop for a human, regardless of autonomy level. Start any new deployment atPIPELINE_AUTONOMY=dry-runand read the decisions log before trustinggatedorfull.This is a single-maintainer research project, not a maintained product with an SLA. The test suite and CI are real gates, but expect rough edges, and expect the failure-mode catalog to keep growing as new ones are found.
If you hit a new failure mode, it's worth documenting (see retros/ for the
existing format) rather than working around it silently — the whole value of
this project's design is that failure modes get named and fed back into how
stories are sized and reviewed.
License
Licensed under the Apache License, Version 2.0 — see LICENSE and NOTICE.
Available Tools
23 toolsadvance_all_plansA
Run advance_pipeline on every plan that has been ingested (has a manifest), keyed by plan name. Plans saved but not yet ingested (no manifest) are skipped. Intended for a recurring scheduler (cron/launchd or /loop) so newly ingested plans are picked up automatically with no hardcoded plan name to maintain.
NOTE on zombie reaping: the per-plan advance_pipeline polling phase already handles dead-pid in_progress stories via check_story_status (which falls through to test-running on dead pids). Running an external reap pass BEFORE the polling would clobber that and silently leave stories re-dispatching forever without ever running the test (manifest observation 2026-06-28: 3 e2e stories hit dispatch_attempts= MISSING because the reap ate the polling opportunity). The reap helper _reap_zombie_in_progress_stories is kept for callers that need a one-shot cleanup (e.g. tests, ops CLI) but is NOT wired in here.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it explains skipping non-ingested plans, how dead-pid stories are handled via check_story_status, and why an external reap pass is deliberately not wired in. This is detailed, non-obvious behavior that an agent would not otherwise know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the skip condition is immediately clear. The zombie-reaping note is valuable but contains more incident detail than an agent needs for selection, so the definition is slightly verbose rather than perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter batch tool with an output schema, the description covers what it does, when to use it, which plans are included, and important behavioral caveats. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema already exhaustively covers the input contract. The description adds relevant context by explaining that no plan name needs to be passed because the tool iterates all ingested plans.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Run advance_pipeline') and a precise resource scope ('every plan that has been ingested'), and distinguishes itself from the per-plan sibling advance_pipeline by emphasizing 'every plan' and the manifest condition. It also clarifies what is excluded (plans without a manifest).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear intended use case: a recurring scheduler that picks up newly ingested plans automatically, and notes the no-hardcoded-plan-name benefit. It does not explicitly name the alternative for single-plan advancement, though 'every plan' strongly implies the boundary with advance_pipeline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
advance_pipelineA
Run one orchestration tick: dispatch every ready story (deps satisfied), advance finished stories through test -> review -> PR, and adjudicate merges against the risk threshold. Idempotent; designed to be called repeatedly by a scheduler (/loop or cron). In PIPELINE_AUTONOMY=dry-run it plans and logs only, taking no actions.
Honors a per-backend resource gate: dispatch and review are gated independently by their own backend's resource_status() (see _role_resource_ok). If the dispatch backend is gated, in-progress stories are interrupted (checkpointed, resumable) and no new dispatch starts; if the review backend is gated, review is deferred. Each is independent, so a Claude usage pause no longer freezes local-backed dispatch. Merge adjudication always runs (no model usage). "interrupted" stories are dispatch-eligible like "todo" ones, so they resume automatically once the dispatch backend frees up.
Also honors MAX_CONCURRENT_AGENTS: dispatch is capped to the number of free slots remaining (limit minus agents already in_progress across all plans), so a tick never starts more agents than the configured ceiling. Stories left undispatched this tick stay "todo"/"interrupted" and are picked up on a later tick as slots free up.
Skips entirely (returns {"ok": True, "skipped": "locked"}) if another tick for this same plan is already running - see _plan_lock.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility and does so thoroughly. It discloses idempotency, dry-run behavior, per-backend gating with independent dispatch/review gates, interruption/resume semantics, MAX_CONCURRENT_AGENTS cap, and the locked-skip response. This is exceptional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence adds essential behavioral context. It is front-loaded with the core purpose, then progressively details gating, concurrency, and locking. There is no filler or redundancy; each clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex orchestration tool, the description covers all critical aspects: what actions are taken, idempotency, gating logic, concurrency limits, and lock behavior. The existence of an output schema covers return-value details, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, plan_name, has zero schema description. The description doesn't explicitly define it, but the tool name and the phrase 'Run one orchestration tick' make it obvious that plan_name identifies the plan to advance. Given the single-parameter simplicity, this is acceptable; a baseline 4 applies due to low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: 'Run one orchestration tick' and then enumerates the specific actions (dispatch ready stories, advance through test->review->PR, adjudicate merges). It clearly differentiates from siblings like advance_all_plans (one plan vs all) and dispatch_story (single story vs orchestrated batch).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says it is idempotent and designed for repeated scheduler calls, and describes the skip-on-lock behavior. It doesn't explicitly name alternatives (e.g., 'use advance_all_plans for all plans'), but the one-plan scope is clear from the purpose and the lock behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_mergeD
Approve a merge by delegating to PipelineService.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing effects and side effects. It does not mention what changes approving a merge makes, whether it is idempotent, what permissions are needed, or what the output indicates. 'Delegating to PipelineService' is an implementation detail, not behavioral information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, but brevity is not the same as conciseness here because almost all useful substance is absent. The phrase 'by delegating to PipelineService' adds no practically useful information and reads as filler rather than an earned sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no annotations and no parameter documentation, the description is severely incomplete. Even with an output schema present, the agent cannot determine what action is actually performed on the referenced plan or story, when it should be invoked, or what the result means.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not compensate. It does not explain how plan_name and story_key are used, why both are required, or what valid values look like. The meaning of these parameters is entirely unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'Approve a merge' is essentially a restatement of the tool name 'approve_merge', with the only additional detail being the implementation note 'by delegating to PipelineService'. It does not define what a merge is in this domain or differentiate the action from related pipeline or plan operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus sibling tools such as advance_pipeline, review_story, or set_story_status. There are no preconditions, timing cues, 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.
checkpointA
Record a durable checkpoint for a dispatched agent's progress. Commits any uncommitted work in the story's worktree as a WIP commit and appends an entry to the story's journal (plan.story.journal.json). Call this after completing each idempotent step of a story so a killed agent can resume from the last checkpoint instead of starting over.
| Name | Required | Description | Default |
|---|---|---|---|
| step | Yes | ||
| summary | Yes | ||
| next_hint | No | ||
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does well: it discloses both side effects (creating a WIP commit and appending to the journal). It does not mention edge cases like permissions or failure behavior, but the core behavioral disclosure is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first defines the action and side effects, the second gives the calling convention and purpose. Every clause earns its place and the key verb is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does and when to call it, and an output schema exists so return values need not be described. However, because there are no annotations and schema descriptions are absent, the incomplete parameter semantics and lack of sibling differentiation leave the overall picture only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the 5 parameters. It only indirectly clarifies 'step' and 'story' through the usage context, and does not explain plan_name, summary, or next_hint. That is a meaningful gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: record a durable checkpoint, commit WIP work, and append a journal entry. It names the exact resources involved (worktree, plan.story.journal.json) and the behavior is clearly distinct from the sibling plan/story management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call it: 'after completing each idempotent step of a story'. It also explains the benefit of doing so (resume after kill). It does not name alternative tools or give when-not-to-use guidance, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_usageA
Probe current subscription usage (current session + current week) via a headless /cost call and persist it to USAGE_STATE_PATH.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and it covers both the mechanism ('headless /cost call') and the side effect ('persist it to USAGE_STATE_PATH'). It could add more about failure behavior or prerequisites, but the core behavioral traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the primary purpose, and every clause earns its place by adding scope, mechanism, or persistence detail. No redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter probe with an output schema, the description covers purpose, scope, mechanism, and persistence. The main gap is the absence of any note about when not to call it or what the persisted state is used for, but this is minor given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the description isn't required to add parameter-level meaning; the baseline for zero-param tools is 4. The description's mention of scope is not parameter documentation but it reinforces what the tool measures.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Probe'), a concrete resource ('current subscription usage'), and a precise scope ('current session + current week'). This distinguishes it from the unrelated sibling tools and leaves no doubt about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the invocation context clear: an agent calls this tool when it needs current subscription usage, scoped to session and week. It doesn't name explicit exclusions or alternatives, but no sibling tool overlaps with this usage-checking function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decompose_planA
Turn a raw goal/feature request into epics/stories JSON via the product-analyst persona, run on whichever provider the "decompose" role is configured for (PIPELINE_BACKEND_DECOMPOSE env var, or a "decompose" entry in model_registry.json - defaults to Claude when neither is set). This is a separate, additional path from the interactive product-analyst subagent (invoked via the Agent tool, which is always Claude) - that path remains available and is still the default choice for Claude-quality decomposition; this tool exists so decomposition can also run on a local provider when desired.
Does NOT call save_plan itself - review the returned plan the same way you would review the interactive subagent's output, then save_plan it yourself.
Returns {"ok": True, "plan": {...}} on success. On failure, returns {"ok": False, "error": ...}, with "raw": included whenever the backend actually returned text that failed to parse (never raises).
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses the success and failure return contracts, includes raw output on parse failures, states that it never raises, and clarifies that it does not persist the plan via save_plan.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every paragraph serves a distinct decision point: core action, provider configuration, relationship to the alternative path, save_plan responsibility, and return contract. The main purpose is front-loaded in the first sentence, and there is no obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, no annotations, and the complexity of provider selection and output handling, the description is complete. It tells the agent exactly what to pass, what provider will be used, what the return shape is, what failure looks like, and what the agent must do after calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must define the sole request parameter. It does this by calling it a 'raw goal/feature request', which is sufficient for a single free-form string parameter, though it does not give examples or length/format constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Turn a raw goal/feature request into epics/stories JSON'. It further distinguishes itself from the interactive product-analyst subagent and clarifies that it is a separate decomposition path, so an agent can tell it apart from siblings like save_plan and the Agent tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool versus the interactive product-analyst subagent: the interactive path is still the default for Claude-quality decomposition, while this tool is for running decomposition on a local provider when desired. It also gives a clear behavioral instruction: do not expect it to call save_plan; review the output and save it yourself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dispatch_storyA
Spawn a headless Claude Code agent to work on a single story.
For a fresh story, creates a git worktree on a new branch. For a story left "interrupted" (or whose worktree already exists from a prior run), reuses the existing worktree/branch instead and seeds the agent's prompt with the checkpoint journal so it continues rather than starting over. Transitions the Plane issue to In Progress. Returns the subprocess PID; completion is async.
Acquires _plan_lock so direct MCP tool calls serialize across MCP
server processes - without this guard, two Claude sessions (each with
their own MCP server PID) can both call dispatch_story on the same story
in the same window, and the second one treats the first one's
half-built worktree as resumable and spawns a second agent into the
same directory. That race is what produced the repeated zero-output
agent deaths logged in 2026-06-27's e2e-decentralized-messaging run.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It covers the core action (spawn agent), the worktree lifecycle (create vs. reuse), the transition to In Progress, the async completion and PID return, and a detailed explanation of the _plan_lock race condition including a concrete failure example. This is exceptionally transparent and goes beyond typical descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then explains the fresh/interrupted branching, and finally a lengthy race-condition explanation. The race-condition paragraph is detailed but arguably excessive for an agent deciding whether to call the tool; it could be condensed to a caution about locking. Overall it is well-structured but slightly verbose, so a middle score is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema shown, the description covers the essential behavioral aspects: what it does, how it handles different states, the async nature, the returned PID, and the concurrency risk. The only major omission is the meaning of the two parameters, which is a notable gap. Still, for a tool of moderate complexity, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining the parameters. It never explicitly defines plan_name or story_key. While the names are somewhat self-explanatory (plan identifier and story key), the description does not add any detail about their format, allowed values, or relationship. For a tool with two required parameters and zero schema coverage, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource statement: 'Spawn a headless Claude Code agent to work on a single story.' It then distinguishes fresh versus interrupted stories and explains worktree reuse, which differentiates it from sibling tools like mark_story_in_progress or interrupt_story. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains when to use the tool (for a fresh or interrupted story) and what happens in each case. It does not explicitly name alternatives or say 'use this instead of X,' but the behavioral context (spawning an agent, worktree management) makes the use case evident. It also cautions about the lock race condition, which is relevant to safe usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_effective_configA
Read-only diagnostic snapshot of the pipeline's effective configuration: every role in config_provenance.PIPELINE_ROLES with its resolved (provider, model) and provenance, every cataloged env var's resolved value and provenance, any unrecognized/ignored env vars present, and which config-source files were actually consulted (and whether each exists). Pure read - makes no changes and writes nothing.
"restart_required" on a role/env entry means that entry's winning value came from an env var or the launchd plist/mcp_server_env layer, so a change there only takes effect after the scheduler/MCP server is restarted. By contrast, a plan's role_config and model_registry.json are both read fresh on every call, so edits to either are live immediately with no restart needed.
A role entry carrying a non-None "error" key is misconfigured (e.g. no model configured for it anywhere, or its provider/model pairing isn't declared in model_registry.json) - never raises for this; the bad role just reports its error inline while the rest of the roles resolve normally.
Pass plan_name to additionally layer in that plan's role_config overrides (same effect as get_role_config's plan_name); a plan_name whose manifest doesn't exist degrades to "no plan overrides" rather than raising.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It explicitly states pure read semantics, no writes, how restart_required is determined, which layers are live vs require restart, and how misconfigured roles are reported inline without raising. It also discloses degradation behavior for nonexistent plan manifests.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but each sentence adds a distinct behavioral fact: read-only guarantee, restart semantics, error handling, and plan_name semantics. It is front-loaded with the core purpose and organized into logical paragraphs, so the density is justified and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the presence of an output schema, and the complete absence of annotations, the description provides everything an agent needs to invoke it correctly: what it returns, how it errors, when restarts are needed, and how the optional parameter behaves. No critical behavioral gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so all meaning must come from the description. The description explains plan_name's effect in detail: it layers in the plan's role_config overrides, matches get_role_config's plan_name behavior, and degrades gracefully when the manifest doesn't exist. This goes far beyond the bare schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read-only diagnostic snapshot of the pipeline's effective configuration'. It enumerates exactly what the snapshot contains (roles, env vars, ignored vars, config files), and it distinguishes itself from the sibling get_role_config by describing how plan_name behaves relative to it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when you need the effective resolved configuration and provenance across roles, env vars, and config files. It also explains the optional plan_name behavior and compares it to get_role_config. It does not explicitly say 'do not use this when...', but the diagnostic framing and sibling contrast provide sufficient usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_role_configA
Show the resolved (provider, model) for every pipeline role - overlord, planner, dispatch, review, decompose - given the current env vars and model_registry.json, optionally layered with a specific plan's role_config (pass plan_name to include it). Lets you check what a plan will actually run on before executing it. Pure read; makes no changes.
"planner" here reports its own explicit configuration layer (env var / plan role_config / registry) using the same "claude" bottom-of-chain default as the other roles - it does NOT reproduce the extra "mirror dispatch's own backend when nothing else is configured" fallback that _resolve_planner_backend applies at actual dispatch time (that fallback depends on a specific story's already-resolved dispatch backend, which doesn't exist outside of a real dispatch call).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full behavioral burden. It explicitly states 'Pure read; makes no changes' and explains a non-obvious nuance about planner resolution (not reproducing the mirror fallback). This level of transparency about what the tool does and does not do is exemplary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose is front-loaded in the first sentence, and the second paragraph is a necessary caveat about planner behavior. While a bit verbose, every sentence adds value and there is no fluff. The structure is logical, though slightly longer than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, inputs, and a key behavioral caveat. An output schema exists, so return format does not need elaboration. For a complex config-resolution tool, the description gives an agent everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the only parameter (plan_name) by stating 'pass plan_name to include it', giving meaningful context beyond the bare schema. It does not detail format or constraints, but for a single optional string parameter, this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action (show resolved provider/model), the resource (all pipeline roles), and the inputs (env vars, model_registry.json, optional plan_name). It is specific and distinct from siblings like get_effective_config by enumerating the exact roles covered and the resolution layers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear use case: 'check what a plan will actually run on *before* executing it'. This establishes when to use the tool, but it does not explicitly contrast with alternative config tools (e.g., get_effective_config) or state when not to use it. No exclusions are mentioned, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingest_planA
Push a saved plan into Plane. Creates epics first, then issues linked to their parent epic. Optionally restrict to specific epic summaries via only_epics. Returns a manifest mapping local IDs to Plane UUIDs.
Re-ingesting an already-ingested plan merges into the existing manifest rather than replacing it: epics/stories not touched this call (including everything only_epics excludes) are preserved verbatim, a story whose key already exists gets its authored fields (summary, agent_instructions, dependencies, persona, model, acceptance, risk) refreshed while its runtime state (status, pr_url, ...) is kept, and top-level manifest keys outside epics/stories/repo_root (paused, local_model_fallback, final_rework_escalation, ...) carry over untouched. Pass overwrite=True to restore the old wholesale-replace behavior (drops anything not produced by this call).
| Name | Required | Description | Default |
|---|---|---|---|
| overwrite | No | ||
| plan_name | Yes | ||
| only_epics | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does so excellently. It discloses idempotent merge semantics: untouched epics/stories are preserved, existing story authored fields are refreshed while runtime state is kept, and unrelated manifest keys carry over. It also warns that overwrite=True restores destructive wholesale-replace behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the verb, resource, and order of operations; the rest supplies necessary edge-case behavior without filler. Though dense, every sentence adds a distinct fact an agent needs to call the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful, potentially destructive tool with no annotations, the description covers creation order, optional restriction, returned manifest, and re-ingestion behavior. The output schema exists, and the manifest return is still summarized, so no critical invocation context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the two non-obvious parameters: only_epics restricts to specific epic summaries, and overwrite toggles old wholesale-replace behavior. plan_name is not explicitly described but is self-evident as the identifier of the saved plan to ingest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and workflow: 'Push a saved plan into Plane. Creates epics first, then issues linked to their parent epic.' This clearly distinguishes ingest_plan from sibling tools like save_plan, decompose_plan, or advance_all_plans, and makes its role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended trigger is clear: after a plan has been saved, this tool pushes it into Plane and optionally restricts ingestion via only_epics. It does not explicitly name sibling alternatives or exclusions, but the context is strong enough for an agent to determine when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interrupt_storyA
Stop a dispatched agent and leave its story resumable.
Sends SIGTERM to the agent's process (a no-op if it has already exited), commits any uncommitted work in its worktree as a checkpoint, and marks the story "interrupted" rather than "failed" so a later dispatch_story call resumes it instead of starting over. The worktree and branch are left in place.
Acquires _plan_lock for the same reason dispatch_story does - two MCP
servers can race here too, with one calling interrupt while the other
calls dispatch on the same story, producing a manifest write race that
leaves the worktree in an inconsistent state.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: sends SIGTERM (no-op if exited), commits uncommitted work as a checkpoint, marks story 'interrupted' rather than 'failed', leaves worktree and branch in place, and acquires _plan_lock due to a race condition. This is exceptionally transparent about side effects and concurrency concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: the main action is front-loaded, followed by detailed mechanics and a separate paragraph on locking. Each sentence adds value, though the lock explanation is a bit verbose. It is appropriately sized for a tool with this complexity and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core behavior, side effects, and concurrency rationale, and the existence of an output schema likely handles return values. However, it does not explain the parameters or state prerequisites (e.g., the story must be currently dispatched). Given the detailed nature, it is mostly complete but leaves parameter semantics unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining plan_name and story_key. It mentions 'plan' and 'story' in the text but never explicitly defines what these parameters represent or how they are used. An agent would have to infer their meaning from the tool name and context, which is insufficient for unambiguous invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Stop a dispatched agent and leave its story resumable.' It details the mechanism (SIGTERM, commit, marking interrupted) which clearly distinguishes it from siblings like mark_story_done (which would finalize) or dispatch_story (which starts). The resumability is a unique, well-articulated trait.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool (to stop a running agent while preserving progress) and mentions that a later dispatch_story call resumes it. However, it does not explicitly state when not to use it (e.g., for permanent termination) or compare against other status-changing siblings like mark_story_done. The context is clear but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_decisionsB
Return the overlord decision log for a plan (audit trail).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'Return', implying a read operation, but does not mention ordering of entries, whether the log is complete, or any access requirements. Critical behavioral traits like read-only guarantees or limitations are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action, resource, and a clarifying parenthetical. Every word contributes value with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required parameter) and an output schema exists, so the description need not detail return values. It conveys the core purpose and audit trail intent, which is likely sufficient for a read-only list operation. Minor omissions like error cases are acceptable given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The phrase 'for a plan' indicates that plan_name specifies which plan's log to retrieve, which is minimal but relevant. However, no additional details are given about valid values, defaults, or relation to existing plans.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Return the overlord decision log for a plan') and adds the clarifying 'audit trail' note. It is distinct from sibling tools like request_decision or review_story, which deal with creating or reviewing decisions, not listing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool relative to alternatives. It does not mention prerequisites, such as requiring an existing plan, or differentiate it from other list/read tools like list_plans. No context is given on typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_plansD
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Tool has no description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tool has no description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool has no description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tool has no description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ready_storiesA
Return stories whose dependencies are satisfied and that are still in To Do. Use this to decide what to dispatch next.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description is the only behavioral disclosure. It clearly states the operation is a read-only retrieval ('Return stories...') with explicit filtering criteria. It does not discuss potential side effects, but for a list operation the word 'Return' plus the use context are sufficient for an agent to infer non-mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences: the first defines the behavior and criteria, the second gives usage guidance. Every word is purposeful and the meaning is dense, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required parameter) and an output schema is present, so return values need not be described. The description covers the core behavior and intended use. The only meaningful gap is the plan_name parameter, which goes unmentioned, but this does not cripple the overall completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The description never mentions plan_name, and the schema only provides the name and required flag. An agent must infer from the tool name and 'stories' that plan_name selects the plan whose ready stories are listed. This is a real gap for a required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return'), a resource ('stories'), and explicit criteria ('dependencies are satisfied' and 'still in To Do'). This precisely defines the tool's purpose and differentiates it from siblings like dispatch_story or mark_story_in_progress, which operate on stories rather than list them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence, 'Use this to decide what to dispatch next,' explicitly gives the context and timing for invoking the tool. It does not mention alternatives or exclusions, but the guidance is clear enough for an agent to know when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_story_doneB
Transition the ticket to Done and update the local manifest. Use after you've reviewed and merged the agent's PR.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the main effects—marking the story Done and updating the local manifest—but does not address reversibility, failure conditions, or any other side effects. It is minimally transparent but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core action and then adds the critical precondition, making it highly concise and well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has two required parameters and no parameter docs, and the description does not clarify them. It provides a useful precondition but not enough information to confidently invoke the tool correctly in all contexts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage and the description does not explain plan_name or story_key at all. It adds no meaning beyond the parameter names, leaving the agent to guess what values these should take.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: transition a ticket/story to Done and update the local manifest. It is specific and not a tautology, though it does not explicitly contrast with siblings like set_story_status or mark_story_in_progress.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage condition: only after reviewing and merging the agent's PR. It does not mention when not to use the tool or point to alternatives, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_story_in_progressA
Transition the ticket to In Progress and update the local manifest. Use this before writing any code for a story.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosing behavior. It explicitly names two side effects: ticket status transition and local manifest update. However, it omits preconditions, error behavior, reversibility, and any other consequences of this mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the action and then provide usage context. There is no filler, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The core action and when to use it are covered, and an output schema exists for return-value details. However, the description leaves gaps around parameter semantics and how this tool relates to sibling tools like set_story_status, making it only moderately complete for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate for missing parameter documentation. It does not explain what plan_name or story_key mean beyond their self-explanatory names, leaving the agent to infer the relationship between a plan and a story.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb-resource action: transition the ticket to In Progress and update the local manifest. It is understandable and distinguishes from mark_story_done by the status direction, though it does not explicitly differentiate itself from set_story_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage context: use this before writing any code for a story. It lacks explicit when-not-to-use guidance or alternative recommendations, but the trigger condition is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_storyA
Edit a story's plan-authored fields (agent_instructions, model, persona, risk, dependencies, acceptance, pr_url, summary) without hand-editing the manifest JSON.
Hand-editing the manifest directly races the scheduler's 60s advance_all_plans tick - a read-modify-write on either side can silently clobber the other's write. This tool acquires the same _plan_lock the scheduler and dispatch_story use, so the edit is atomic with respect to it. Only the fields above may be set; status transitions go through set_story_status, not this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | ||
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite having no annotations, the description discloses important behavioral details: it acquires the _plan_lock for atomicity, it can only modify the listed fields, and it is safe with respect to the scheduler's tick. This is more than adequate given the lack of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It starts with the core purpose, then explains the key behavioral details (locking, allowed fields, exclusion). Every sentence adds value, and the format is scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex (nested object fields, required parameters) and has an output schema, so the description doesn't need to explain return values. It covers the most critical context: what fields can be edited, why locking matters, and which alternative to use for status changes. The only gap is a bit more detail on parameter syntax, but it's mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no description coverage (0%), so the description must carry the burden for parameter semantics. It does mention the 'fields' parameter by listing the allowed fields, but it does not explain the format of plan_name or story_key, or what the fields object should look like beyond the field names. This is partial compensation, but could be more explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Edit a story's plan-authored fields' and lists the specific fields it can edit. It distinguishes itself from other tools by emphasizing that it edits fields without hand-editing the manifest JSON and that status transitions are handled elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides usage guidance: it says when to use this tool (for editing specific fields) and when not to use it (for status transitions, which go through set_story_status). It also warns against hand-editing the manifest JSON, effectively telling the agent to use this tool instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_planA
Stop advance_pipeline/advance_all_plans from touching this one plan - no new dispatch, review, or merge - while leaving every other ingested plan's scheduler ticks unaffected. Any story currently in_progress is interrupted (checkpointed and left resumable) so a paused plan isn't quietly burning usage in the background. Resume with resume_plan.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden and handles it well: it discloses that in_progress stories are interrupted, checkpointed, and left resumable, and that no background usage is burned. It stops short of describing already-paused behavior or persistence details, but the key side effects are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load the action and scope, then cover side effects and reversal. No filler, restatement, or redundant schema repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one required string parameter and an output schema, the description provides everything needed to invoke it correctly: what is stopped, what is preserved, what happens to in-progress work, and how to undo it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the single plan_name parameter, and the description never mentions the parameter by name or its format. However, phrases like 'this one plan' and 'paused plan' make the target of the operation clear enough to compensate at a basic level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: pause a single plan so advance_pipeline/advance_all_plans no longer dispatch, review, or merge it. It clearly differentiates the tool from global pipeline operations and from resume_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the sibling tools this operation blocks and clarifies that other plans remain unaffected, which defines the precise use case. It also directs the agent to resume_plan as the paired reversal operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_decisionA
Escalate a blocking decision to the overlord, which rules on the user's behalf per the decision policy. The ruling is appended to the plan's decisions log (audit trail) and returned. Call this from a story agent when you are blocked on a choice the user would normally make.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | ||
| options | Yes | ||
| question | Yes | ||
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the ruling is 'appended to the plan's decisions log (audit trail) and returned,' which informs the agent of the side effect and output. It does not mention potential errors, permissions, or reversibility, but the core behavior is transparent enough for a decision-request tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, tightly packed with the core action, result, and usage condition. It is front-loaded with the verb and resource, and each sentence earns its place. There is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the purpose, when to use, and the outcome (ruling appended to log and returned). However, it omits parameter semantics and does not mention any preconditions or failure scenarios. Given the output schema exists, return format is covered, but the missing parameter guidance is a significant gap for a tool with 5 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides no information about the parameters. The names (plan_name, story_key, question, options, context) are somewhat self-explanatory but not fully defined. For example, what exactly constitutes 'options' or the expected format of 'context' is unclear. The description fails to compensate for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Escalate a blocking decision to the overlord, which rules on the user's behalf per the decision policy.' It specifies the action, the resource (overlord), and the trigger condition ('when you are blocked on a choice the user would normally make'). This is distinct from siblings like list_decisions or review_story, which have different intents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use: 'Call this from a story agent when you are blocked on a choice the user would normally make.' It does not explicitly mention when not to use or list alternatives, but the conditional context is clear. A sibling like review_story might be used for non-blocking review, but this is not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_planA
Clear a pause set by pause_plan so this plan's stories are eligible for dispatch/review/merge on the next advance_pipeline tick again.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must carry the behavioral burden. It discloses the timing (next advance_pipeline tick) and the effect (stories eligible for dispatch/review/merge), but does not discuss reversibility, side effects, or whether there are any prerequisites beyond having a paused plan. This is a basic resume operation, and the description adds some context beyond just 'resume'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that immediately states the primary action (clear a pause) and the consequence (stories become eligible). No filler words; every part carries meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and no output schema expectations explained, but an output schema exists (possibly indicating a return value). The description could mention what the response looks like, but given the tool's simplicity and the known pipeline context, it is largely complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only one parameter, plan_name, and 0% schema description coverage, the description provides no additional meaning beyond the schema. Since the parameter name is self-explanatory, the baseline of 3 is appropriate; no further compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: clearing a pause set by pause_plan, and its effect: making stories eligible for dispatch/review/merge on the next advance_pipeline tick. It references the specific sibling (pause_plan) and the pipeline mechanic, distinguishing it from other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the intended use case: resuming a plan that was paused. It implicitly indicates it should be used after pause_plan, but doesn't explicitly state when not to use it or list alternatives. However, given the clear pair with pause_plan, the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_storyA
Run the code-reviewer persona over a dispatched story's branch. On APPROVE, open a PR via gh and set status to pr_open; otherwise set status to changes_requested. Does not merge — merge is the overlord's decision.
Only reviewable when story["status"] == "tests_passed" - any other status (a stale/duplicate call, e.g. a second tick racing an already-merged story) is a no-op skip; see README.md's "Review & merge" section.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: it discloses the concrete side effects (opens PR via gh, sets status to pr_open or changes_requested), explicitly states it does not merge, and explains no-op behavior for invalid statuses. This is strong behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed paragraphs that front-load the main behavior, then add the critical precondition and exclusion. Every sentence adds usable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an output schema, the description covers the essential call-time facts: action, status transitions, non-merge guarantee, and invalid-call handling. It also references the README for deeper review/merge detail, so an agent has enough to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not define plan_name or story_key beyond their names. The general story/status context helps indirectly, but the required parameters are left mostly implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: running the code-reviewer persona over a dispatched story's branch. It clearly distinguishes itself from merge-related siblings by explicitly saying 'Does not merge — merge is the overlord's decision.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition: only reviewable when story status is 'tests_passed', and any other status is a no-op skip. It even anticipates stale/duplicate racing calls and points to README for more context, making when-to-use versus when-to-avoid unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_planA
Save a generated project plan to disk. Plan should be JSON matching the schema: { "epics": [ { "summary", "stories": [...] } ] }. Call this after generating a plan so the user can review before ingestion.
workspace is optional. When supplied, it is validated and (WS-11) the model-authored repo_root in plan_json is OVERWRITTEN with the server-validated resolved path (the server overwrites the model-authored value; this tool never resolves or rewrites plan_json itself). When omitted, the plan's own repo_root is trusted, exactly as before. The tool deliberately does NOT fall back to the dashboard's persisted active workspace: the MCP server and the dashboard are separate processes, and silently coupling them through shared durable state is out of scope (that fallback lives only in the dashboard HTTP route).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_json | Yes | ||
| plan_name | Yes | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and excels. It discloses key behavioral traits: the overwriting of repo_root when workspace is supplied (WS-11), that the tool never resolves or rewrites plan_json itself, and that it deliberately does not fall back to the dashboard's persisted workspace, explaining the separate-process rationale. These details exceed what annotations would typically cover and prevent misleading assumptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but well-structured: purpose, format, then a detailed workspace behavior paragraph. The rationale for the no-fallback decision is valuable and earns its place. It is front-loaded with the core purpose and scoping before diving into edge cases. No wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (optional workspace, overwriting, process boundary), the description covers the critical aspects: the JSON schema, the overwriting rule, the fallback decision. An output schema exists to document return values, so that omission is acceptable. It does not address error conditions or interactions with siblings beyond the ingestion hint, but for a save operation the provided details are largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It provides extensive semantics for workspace (validation, overwriting behavior, fallback rationale) and clarifies plan_json's required schema. However, plan_name is not explicitly described beyond being a required string, though its meaning as a name is likely inferred. The description adds significant value for two of three parameters, nearly fully compensating for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Save a generated project plan to disk.' It specifies the expected JSON format and differentiates from ingestion by noting 'so the user can review before ingestion,' distinguishing it from the sibling ingest_plan. The verb, resource, and purpose are all explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: 'Call this after generating a plan so the user can review before ingestion.' This implies the correct sequence (generate → save → review → ingest) and indicates when to use it. It does not name alternative tools explicitly, but the 'before ingestion' phrase sets the stage, and the workspace behavior explains when to omit or supply it. No explicit exclusions are given, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_story_statusA
Transition a story to an explicit status without hand-editing the manifest JSON (e.g. resetting a "parked" story to "interrupted" so the scheduler retries it).
Acquires _plan_lock for the same reason patch_story does. Only accepts the fixed set of statuses the pipeline itself assigns (todo/in_progress/running/interrupted/failed/tests_passed/pr_open/ changes_requested/parked/done) - this is a sanctioned status change, not a way to invent pipeline state the rest of the code doesn't expect.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| plan_name | Yes | ||
| story_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well by disclosing that it acquires _plan_lock and only accepts pipeline-defined statuses. This tells the agent about locking side effects and invariants. It does not cover possible failures or permission requirements, but the key behavioral constraints are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary action and includes an example before adding lock and status constraints. The status list is long but necessary because the schema lacks enums. Minor indirectness ('for the same reason patch_story does') keeps it from being perfectly self-contained.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return-value details are not required. The description gives enough context for a correct call: what the tool does, the exact allowed statuses, an example use case, and lock behavior. The only gaps are minor details about the plan/story parameters and failure conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and no enum metadata exists, but the description supplies the complete allowed status set, which is the critical parameter meaning. plan_name and story_key are left to their self-explanatory titles, and the description's story/plan context partially covers them. This is solid compensation for a low-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Transition a story to an explicit status') and contrasts it with hand-editing the manifest JSON. The fixed status list and 'sanctioned status change' clarify exactly what this tool is for, making it distinguishable from related story tools by defining its scope rather than by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete usage example ('resetting a parked story to interrupted so the scheduler retries it') and says the tool is the sanctioned path rather than inventing state. It does not explicitly name alternative sibling tools or state when not to use it, so it lacks full exclusion guidance.
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.
23 tool updates
v0.1.0- First observed
advance_all_plans - First observed
advance_pipeline - First observed
approve_merge - First observed
check_usage - First observed
checkpoint - First observed
decompose_plan - First observed
dispatch_story - First observed
get_effective_config - First observed
get_role_config - First observed
ingest_plan - First observed
interrupt_story - First observed
list_decisions - First observed
list_plans - First observed
list_ready_stories - First observed
mark_story_done - First observed
mark_story_in_progress - First observed
patch_story - First observed
pause_plan - First observed
request_decision - First observed
resume_plan - First observed
review_story - First observed
save_plan - First observed
set_story_status
TDQS
Scored across 23 tools
The tool set is mostly well-separated, but there are overlapping clusters: set_story_status overlaps with both mark_story_done and mark_story_in_progress, and get_role_config is largely a subset of get_effective_config. Descriptions help disambiguate, but an agent could reasonably select the wrong tool in these cases.
Nearly all tools follow a clear verb_noun snake_case pattern (dispatch_story, pause_plan, list_decisions). The only notable deviation is the single-word 'checkpoint', which is still understandable but breaks the otherwise consistent convention.
23 tools is on the heavier side, but the server covers a complex orchestration pipeline: plan management, story dispatch, status transitions, review/merge, decisions, and configuration inspection. Each major workflow area needs multiple tools, so the count feels justified rather than bloated.
The pipeline lifecycle is well covered: plan creation/ingestion, story dispatch/checkpoint/interrupt, status transitions, review, merge, decisions, and config diagnostics. Minor gaps exist, such as no plan deletion/update tool, no detailed plan/story read-back tool beyond list_plans and list_ready_stories, and no merge rejection or PR close path, but agents can work around these.
Maintenance
Related MCP Connectors
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
A paid remote MCP for OpenAI Codex agent coordination MCP, built to return verdicts, receipts, usage
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that spawns autonomous Claude Code agents in GitHub repos, enabling task delegation with persistent state, multi-step workflows, and job monitoring.47187 npm2Apache 2.0
- AlicenseAqualityBmaintenanceOne MCP that turns Claude Code into your whole dev stack by swallowing other MCP servers, delegating to Codex & Gemini on your CLI subscriptions, remembering projects in a searchable knowledge graph, and carrying setup across sessions — secret-free by design.233MIT
- AlicenseAqualityCmaintenanceMulti-agent orchestration MCP server that lets Claude Code delegate backend, frontend, and tooling tasks to specialized AI agents (Codex, Kimi, Grok) with contract-first sequencing and workspace mutation guards.47MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that lets ChatGPT or any MCP client securely delegate coding tasks to a local Claude Code instance, with git checkpointing, approval gates, and structured results. Supports code review, test running, and rollback via simple tool calls.5 npmMIT