Skip to main content
Glama

CI crates.io License: Apache-2.0

Foremerge は、Git の上に構築された、コーディングエージェント向けのオープンソースの連携プロトコルです。エージェントは分離したワークツリーを維持しながら、意図、セマンティッククレーム、依存関係、暫定的な ChangeSet、決定、検証、来歴(provenance)を共有します。

エージェントにインストールしてもらう

→

完了

→

衝突が発生する前に把握できる

Claude Code、Codex、Cursor のいずれかに1行貼り付ける

Foremerge をインストールして自動的に接続する

すべてのエージェントが、他のエージェントが変更しようとしていることを、別々のワークツリーでも把握できる

ステータス: Foremerge 0.4.0 は pre-1.0 のローカルファースト MVP です。CLI、JSON API、MCP サーバー、SQLite ストア、決定的な衝突検出器、検証ゲート付きライフサイクルは実装済みです。公開スキーマは今後も変更される可能性があります。複数マシンでの共有モードと、公開されたベンチマーク結果はまだ存在しません。

仕組み

同じプロジェクトで2つの AI エージェントが同時に作業しているとします。それぞれがコードの自分のコピーを持つため、ファイルをめぐって争うことはありません。両方とも完了し、両方とも正しく見えます。それなのに、お互いの作業を打ち消し合っていたことが判明します。

Git はテキストを比較するのであって意図を比較するのではないため、Git はそれを警告できません。2つのエージェントが同じファイルの同じ部分を編集したときは、Git が止めてくれます。しかし、それぞれ単独では完全に合理的で、しかも別々のファイルに収まる2つの編集は見えません。あるエージェントがすべての呼び出し元を新しい StripePaymentService に移行し、別のエージェントが古い PaymentService に PayPal サポートを追加した場合、重なる部分はないため、Git は何も言わずに両方をマージし、PayPal の作業は誰も呼ばなくなったクラスに取り残されます。

Foremerge は、エージェントが作業を行う前に、これから行おうとしていることを宣言させることでこれを解決します。

  1. 各エージェントは、これから触ろうとしている対象を宣言します。 コードではなく、対象だけです。「sendEmail 関数を変更します」のように。

  2. すべてのエージェントは1つの共有リストを読み取ります。 それはプロジェクトの .git フォルダ内にある小さなデータベースで、Claude でも Codex でも Cursor でも、あなたのマシン上のすべてのエージェントが同じ状況を把握できます。

  3. 2つの計画が衝突したら、すぐに知らせてくれます。 Foremerge は2つのエージェントを特定し、なぜ計画が衝突するのかを説明し、作業をどう分割するかを提案します。その時点では両方のワークツリーはまだクリーンなので、破棄しなければならない作業はありません。

共有ホワイトボードのようなものだと考えてください。エージェントは開始する前に、これから取り組むことを書き込み、他の全員がすでに書いたことを読み取ります。

Foremerge があえて行わないことが2つあります。ファイルをロックしたりエージェントをブロックしたりは決してしません。1つのエージェントがクラッシュしただけでエージェント群全体が停止してしまうからです。したがって、警告は助言であり、主導権はあなたにあります。また、モデルに衝突を判断させたりもしません。同じ入力には常に同じ答えが返るからです。

Related MCP server: uacos

Git にはまだ見えない衝突

Agent A: Replace PaymentService with StripePaymentService
Agent B: Add PayPal support to PaymentService

これらのエージェントは、同じ行に触れることなく別々のツリーで作業できます。それでも計画は衝突します。一方は拡張ポイントを削除し、もう一方はそれに依存しているからです。

両方のエージェントが同じ symbol:PaymentService スコープを宣言し、一方はそれを replace すると、もう一方は extend すると宣言します。Foremerge は、どちらかがコードを書く前にこれら2つの宣言を比較し、HIGH のアドバイザリを発行して、PaymentProvider のような安定した抽象化で協調することを提案します。その提案は説明可能な根拠であり、自動的なアーキテクチャ決定やハードロックではありません。

操作はサマリーから読み取るのではなく宣言されるため、各エージェントが計画をどのように表現したかは関係ありません。「Consolidate payments onto Stripe」も「Replace PaymentService with Stripe」も同じ結論に達します。

Git は永続的なリポジトリのままです。Foremerge は、その上に欠けていた共有認識を提供します。

実際の Foremerge リリースデモで、どちらのワークツリーも変更される前に PaymentService の衝突を検出しているターミナル表示

実際に 0.1.0 のリリースバイナリを examples/terminal-session.txt で実行して取得した実際の衝突フィールドからレンダリングしています。表示されているコマンドは、示されている jq フィルタを使用しています。出力は読みやすさのために省略されています。

クイックスタート: 5分以内で最初の衝突を確認する

コーディングエージェントにやってもらう

連携させたいリポジトリの中で、これを Claude Code、Codex、または Cursor に貼り付けてください:

Set up Foremerge in this repository so we can coordinate parallel agents.

1. Install it:      curl -fsSL https://foremerge.com/install.sh | sh
2. Initialize:      foremerge init
3. Wire this client and any others in use: foremerge setup all
4. Register the check I should be validated against, for example:
                    foremerge checks set test -- cargo test --all-targets
5. Confirm:         foremerge doctor --client all

Then read the Foremerge skill that step 3 installed for this client and follow
it from now on: publish your intent with semantic scopes before editing, claim
the scope, and check for conflicts before you start.

ステップ4は、このリポジトリの実際のテストコマンドに合わせて調整してください。ステップ3ではクライアントに MCP サーバーの有効化を求めるため、実行前にプロンプトが表示されます。Codex の登録はユーザーレベルですが、1回の登録ですべてのリポジトリで機能します。連携させたいリポジトリの中で Codex を起動してください。

あるいは自分でやる

最近の Git と jq が必要です。チェックサム検証済みのプレビルドリリースバイナリをインストールしてください(macOS と Linux 対応。スクリプトは ~/.local/bin にインストールします):

curl -fsSL https://foremerge.com/install.sh | sh

[!TIP] 2つのコマンド、1つのプログラム。 これにより foremerge と fmg がインストールされます。fmg は同じバイナリの短い名前です。fmg status と foremerge status は同じことを行います。以下の例では foremerge と表記していますが、どちらでもお好みで入力してください。

または、Rust 1.85+ でソースからビルドします: cargo install --locked --git https://github.com/naw103/foremerge foremerge、あるいはチェックアウトから cargo install --locked --path . を実行します。Windows バイナリはリリースページにあります。更新するにはインストーラを再実行してください。次に、連携させたいリポジトリの中で:

foremerge init
foremerge doctor

インストーラ、リリースアーカイブ、cargo install はすべて、0.4.0 以降では両方の名前を提供します。PATH 上に fmg という名前で応答する別のプログラムがすでにある場合、インストーラはそれを上書きせず、そのままにしてその旨を伝えます。

このリポジトリで使用するクライアント向けにネイティブスキルと MCP エントリをインストールし、エージェントが名前で要求できる信頼済みチェックを定義します:

foremerge setup all
foremerge checks set test -- cargo test --all-targets
foremerge doctor --client all

受理は検証ゲートで制御されます。Foremerge はエージェントの言葉をそのまま信じるのではなく、チェック自体を実行します。フル CI スイートではなく、ビルドや型チェックなど、高速で壊れた引き継ぎを実際に検出できるチェックを選んでください。このゲートは、他のエージェントがその作業を完了として扱ってよいかを決定するものであり、CI の代わりにはなりません。このリポジトリに検証すべき意味のあるものが何もない場合は、常に成功するチェックを登録するのではなく、一度だけその旨を伝えてください:

foremerge checks policy advisory

そのように受理された作業は、理由とともに UNVERIFIED として記録されるため、監査証跡が、実際には実行されていないチェックを実行済みとして示すことは決してありません。foremerge doctor は、登録されたチェックがここで実際に実行できるかどうかを報告します。これはエージェントのワークツリーでは重要です。依存関係ディレクトリは通常 gitignore されており、git worktree add はそれらを作成しないからです。

1つのクライアントに対しては、setup codex、setup claude、または setup cursor を使用します。セットアップは無関係な設定(プロジェクトの MCP JSON のキー順序を含む)を保持します。Foremerge をアップグレードすると、編集されていない Foremerge 自身のスキルファイルはその場で更新されますが、あなたが編集したスキルファイルや、異なる Foremerge MCP エントリは、明示的に --force を渡さない限り置き換えられることはありません。setup all はすべてのクライアントを試行して各結果を報告し、いずれかが失敗した場合は非ゼロで終了します。Codex の MCP 登録はユーザーレベルで、すべてのリポジトリに適用され、Codex を起動したディレクトリから解決されます。エージェントクライアントのセットアップ を参照してください。

init は、リポジトリの Git 共通ディレクトリ配下にローカルの連携状態を作成します。追跡されたファイルは変更されません。以下のワークツリーなしのセッションでも、コード作成前の検出を試すには十分です。実際のコーディングエージェントは、分離したワークツリーと実際のモデル識別子を登録する必要があります。

STRIPE_AGENT=$(
  foremerge --json agent register \
    --name stripe-agent \
    --no-worktree |
  jq -er '.data.id'
)

STRIPE_RESULT=$(
  foremerge --json intent publish \
    --agent "$STRIPE_AGENT" \
    --task "modernize-payments" \
    --summary "Replace PaymentService with StripePaymentService" \
    --scope symbol:PaymentService=replace
)
STRIPE_INTENT=$(printf '%s\n' "$STRIPE_RESULT" | jq -er '.data.intent.id')

PAYPAL_AGENT=$(
  foremerge --json agent register \
    --name paypal-agent \
    --no-worktree |
  jq -er '.data.id'
)

PAYPAL_RESULT=$(
  foremerge --json intent publish \
    --agent "$PAYPAL_AGENT" \
    --task "add-paypal" \
    --summary "Add PayPal support to PaymentService" \
    --scope symbol:PaymentService=extend
)
PAYPAL_INTENT=$(printf '%s\n' "$PAYPAL_RESULT" | jq -er '.data.intent.id')

printf '%s\n' "$PAYPAL_RESULT" |
  jq '.data.conflicts[] | {kind, severity, scope, explanation, suggestion}'

printf '%s\n' "$PAYPAL_RESULT" |
  jq '.data.related_work[] | {agent, summary, asserted, overlap}'

最初のコマンドは、ローカルでの実行によるライブの検出結果を出力します。2番目のコマンドは related_work、つまりもう一方のエージェントの意図と、両方の宣言された操作で重なるすべてのスコープを出力します。Foremerge は何が重なるかを示します。その意味を判断するのはあなたであり、foremerge assess record でそれを記録します。先にファイルを変更する必要はありません。キャプチャされた明確にラベル付けされたトランスクリプトを examples/terminal-session.txt で確認できます。

クレームは、どちらのエージェントもブロックせずに所有権のコンテキストを追加します:

foremerge --json work claim \
  --agent "$STRIPE_AGENT" \
  --intent "$STRIPE_INTENT" \
  --scope symbol:PaymentService \
  --reason "Changing the provider boundary" >/dev/null

foremerge --json work claim \
  --agent "$PAYPAL_AGENT" \
  --intent "$PAYPAL_INTENT" \
  --scope symbol:PaymentService \
  --reason "Adding another provider" |
  jq '.data | {advisory_only, warnings}'

foremerge --json work query --scope symbol:PaymentService |
  jq '.data[] | {agent: .agent.name, intent: .intent.summary, open_conflicts}'

両方のクレームは成功します。2番目のレスポンスには重複警告が含まれます。クレームは貸与されたアドバイザリであり、排他的な所有権ではないためです。

Git の上でどう機能するか

  coding agent A                                  coding agent B
        |                                               |
  isolated worktree A                            isolated worktree B
        |                                               |
        +--------- semantic events, not edits ----------+
                              |
                    CLI / MCP / JSON API
                              |
                     Foremerge service
                    /        |        \
       SQLite coordination   git CLI   validation argv
       in <git-common-dir>       |           |
                    \         Git repository /
                     durable commits and refs

すべてのフロントエンドは同じサービスとストアを使用します。セマンティックグラフは次のとおりです:

Agent → Task → Intent → Claim → Symbol → Dependency
      → ChangeSet → Test → Result → Decision → Provenance

ミューテーションは、型付き SQLite プロジェクションを更新し、グラフのエッジを具体化し、ハッシュチェーンされたセマンティックイベントを1つのトランザクションで追加します。このログは改ざんの証拠として有用ですが、リモートのアイデンティティ署名や分散合意ではありません。

Git ワークツリー: 隔離されたファイル、共有される認識

Foremerge は Git 共通ディレクトリを解決し、デフォルトのデータベースを次の場所に保存します:

<git-common-dir>/foremerge/state.sqlite3

リンクされたワークツリーは、チェックアウトされたファイルが別々であっても、その共通ディレクトリを共有します。標準 Git に対する Foremerge の薄いラッパーでワークツリーを作成します:

foremerge worktree create \
  --branch agent/paypal \
  --path ../payments-paypal \
  --base HEAD

foremerge --cwd ../payments-paypal --json agent register \
  --name paypal-agent \
  --model "$ACTUAL_MODEL_ID"

同じリポジトリ内の別のワークツリーは、登録されたエージェントとその意図をすぐに認識します。--database PATH または FOREMERGE_DB でストレージを上書きできますが、状態を共有するには、ローカルのすべてのエージェントが同じデータベースを指す必要があります。MVP は SQLite をマシン間で複製しません。ネットワークマウントされたデータベースから分散安全性を推定しないでください。

Foremerge は ChangeSet フィンガープリントと受け入れ済み refs のために Git の状態をスナップショットします。自動的に merge、rebase、cherry-pick、push を行ったり、ターゲットブランチを更新したりはしません。

セマンティックワークフロー

INTENT ─claim→ CLAIMED ─start→ IN_PROGRESS ─publish→ PROVISIONAL
       ─validate current fingerprint→ VALIDATED
       ─accept gates→ ACCEPTED ─record Git ref→ COMMITTED

サポートされているスコープの種類は次のとおりです:

symbol api schema config infra test migration env file component contract domain

最も狭くて有用なセマンティックスコープを公開してください。ファイルパスだけでは、API、設定、スキーマ、インフラストラクチャ、言語をまたぐ衝突を見逃します。

よく使うコマンド:

境界

コマンド

来歴を登録

foremerge agent register --name NAME --model MODEL

インテントを公開

foremerge intent publish --agent ID --task TASK --summary TEXT --scope KIND:KEY=OPERATION

スコープを主張

foremerge work claim --agent ID --intent ID --scope KIND:KEY

実装を開始

foremerge work start INTENT_ID --agent AGENT_ID

変更中の担当者を問い合わせ

foremerge work query --scope KIND:KEY

全エージェントの作業を確認

foremerge status

プランを事前確認

foremerge conflicts check --intent TEXT --scope KIND:KEY=OPERATION

結論を記録

foremerge assess record --agent ID --intent ID --related-intent-id ID --verdict V --rationale TEXT --action A

連携メッセージを送信

foremerge coordinate send --from ID --to ID --message TEXT

セマンティックイベントを監視

foremerge work watch --after-seq 0

foremerge <command> --help を実行すると、現在のすべてのフラグが表示されます。--json、--cwd、--database などのグローバルフラグは、サブコマンドの前後に指定できます。

ChangeSet と検証ゲート

ChangeSet には、エージェント/モデル、タスクとインテント、影響を受けるファイル/シンボル/コントラクト、依存関係、実装サマリー、報告されたテスト、決定、来歴、ワークツリー、フィンガープリント、ステータス、Git 参照が記録されます。受理された候補と、その後のランディングコミットは、それぞれ accepted_commit と integration_commit として別々に保持されます。

誠実な統合の順序は次のとおりです。

  1. インテントを公開し、セマンティックスコープを主張し、実装を進行中としてマークします。

  2. 分離されたエージェントブランチ上で作業し、コミットします。

  3. そのクリーンな候補に対する ChangeSet を公開します。

  4. Foremerge に、その正確なフィンガープリントに対する検証の実行を依頼します。

  5. 高優先度の競合を解決し、その後、依然としてクリーンで検証済みの参照を受理します。

  6. 通常の Git またはプルリクエストで統合します。

  7. 永続的な統合コミットを Foremerge に記録します。

foremerge work claim \
  --agent "$AGENT_ID" \
  --intent "$INTENT_ID" \
  --scope component:payments
foremerge work start "$INTENT_ID" --agent "$AGENT_ID"

# Implement the change and commit it on this isolated branch before publishing.
CHANGESET_ID=$(
  foremerge --json changeset publish \
    --agent "$AGENT_ID" \
    --intent "$INTENT_ID" \
    --summary "Introduce PaymentProvider and StripePaymentProvider" \
    --file src/payments.rs \
    --symbol PaymentProvider \
    --symbol StripePaymentProvider \
    --contract payment-provider \
    --provenance-json '{"source":"coding-agent"}' \
    --git-ref HEAD \
    --worktree "$PWD" |
  jq -er '.data.id'
)

foremerge changeset validate "$CHANGESET_ID" \
  --worktree "$PWD" \
  -- cargo test --all-targets

foremerge changeset accept "$CHANGESET_ID" --git-ref HEAD

# Integrate with ordinary Git, then record the commit that actually landed.
foremerge changeset commit "$CHANGESET_ID" --git-ref main

エージェントが報告する --reported-test COMMAND=STATUS の値は来歴にすぎません。それらは受理条件を満たしません。Foremerge が所有する検証では、コマンドの引数ベクトル、終了ステータス、出力、所要時間、候補のフィンガープリントが記録されます。検証後に変更が検出された場合、その試行は非権威となりますが、その出力と変更パス診断は changeset attempts で照会可能なままです。

使い捨ての未追跡出力を生成する信頼済みチェックの場合、オペレーターは追跡ファイルを変更せずに、完全一致またはディレクトリプレフィックスのルールを設定できます。

foremerge validation-exclusions set \
  --path coverage.log \
  --path target/validation-reports/

正規化されたポリシーダイジェストは候補フィンガープリントの一部であり、追跡済みの変更は決して除外できず、MCP はポリシーを変更できず、生成されたファイルは受理前に削除する必要があります。ADR 0001 を参照してください。

受理には、クリーンなワークツリーと未解決の HIGH 競合がないことも必要です。ただし、呼び出し元が明示的な --allow-high-conflicts オーバーライドを --override-reason "..." とともに意図的に使用する場合を除きます。競合は明示的な理由を添えて解決することを推奨します。受理により refs/foremerge/accepted/<changeset-id> が作成されます。コードのマージは行われません。

検証コマンドは、オペレーティングシステムの権限を持つ信頼済みローカルコードとして実行されます。Foremerge はそれらをサンドボックス化しません。

エージェントクライアントと MCP: 完全なライフサイクルツール

foremerge mcp を stdio 上で実行します。MCP は HTTP デーモンを必要としません。両者は同じデータベース上のアダプターです。

ツール

目的

register_agent

エージェント、モデル、能力、ワークツリーの来歴を記録する

publish_intent

計画中の作業を告知し、各スコープに対する影響を宣言し、競合と評価すべき関連作業を受け取る

record_assessment

1件の関連インテントについての結論と、今後行うことを記録する

claim_work

セマンティックスコープに対するリースされた助言的クレームを作成する

query_work

エージェント、インテント、クレーム、ChangeSet、競合を検索する

check_conflicts

コード変更前に、公開済みまたは暫定のインテントを確認する

publish_changeset

実装、テスト、決定、Git の来歴を記録する

coordinate_with_agent

競合または ChangeSet にリンクした永続的なメッセージを送信する

start_work

クレーム済みの作業を実装段階に進める

resolve_conflict

永続的な競合に対する監査済みの解決を記録する

run_verification

名前で信頼済みリポジトリチェックを実行する。生の MCP argv は決して実行しない

accept_changeset

最終的な競合、依存関係、検証、Git ゲートを適用する

record_commit

実際の Git 統合コミットを記録する

discard_work

クレームとブロッカーを解放しつつ、放棄された作業を保持する

list_agents

登録済みエージェントの来歴を読み取る

get_intent

1件のインテントと現在の競合スナップショットを読み取る

get_changeset

1件の ChangeSet と Git/来歴の状態を読み取る

status

一貫性のあるコーディネーターステータスのスナップショットを読み取る

有効な最小構成である examples/mcp-config.json から始めてください。この構成は、クライアントがリポジトリを作業ディレクトリとして foremerge を起動することを想定しています。リポジトリの作業ディレクトリ設定がないクライアントは、mcp の前に絶対パスの --database を渡す必要があります。リンクされたワークツリーの .git がディレクトリであると想定するのではなく、Git 共通ディレクトリを導出してください。

インストーラー、ネイティブスキルの場所、クライアント固有の MCP ファイル、診断、安全な置換ルールについては、エージェントクライアントのセットアップ を参照してください。トランスポートの動作、スキーマ、名前付きチェック、入力例、マルチワークツリー構成については、MCP セットアップ を参照してください。

ソースクローンには、.codex/skills、.claude/skills、.cursor/skills に同等のスキルと、ポータブルな Claude および Cursor 用 MCP テンプレートが含まれています。Cargo インストールには標準スキルが埋め込まれているため、foremerge setup はこのソースツリーをコピーしなくても別のリポジトリにインストールできます。

ローカル JSON API

デーモンはデフォルトで、http://127.0.0.1:47811 上の認証付きループバック HTTP を使用します。init は、プラットフォームがサポートする場合、プライベートファイル権限でベアラートークンを作成します。

一方のターミナルで:

foremerge daemon

もう一方のターミナルでは、トークンパスを推測するのではなく、Foremerge から読み取ってください:

export FOREMERGE_URL=http://127.0.0.1:47811
TOKEN_FILE=$(foremerge --json init | jq -er '.data.token_file')
FOREMERGE_TOKEN=$(tr -d '\r\n' < "$TOKEN_FILE")

curl --fail --silent --show-error \
  --header "Authorization: Bearer $FOREMERGE_TOKEN" \
  --get "$FOREMERGE_URL/v1/work" \
  --data-urlencode 'scope=symbol:PaymentService' |
  jq .

トークンを出力、コミット、共有しないでください。/healthz はデータベースを使用しないプロセスの生存確認であり、/readyz は制限付きで待機しないストアプローブです。どちらも公開されています。ページングされたイベントチェーン監査を含むすべての /v1 ルートは、信頼できるローカルテスト用にデーモンが意図的に --no-auth で起動された場合を除き、トークンを必要とします。MVP は非ループバックバインドを拒否し、堅牢化された公開デプロイメントのセキュリティモデルではありません。

CLI のエスケープハッチである foremerge request は、ローカル認証を自動的に読み取ります。実行可能な curl ウォークスルーは examples/api-requests.sh にあります。完全なルートとエラーのリファレンスは JSON API です。

MVP が意図的に主張しないこと

  • 競合検出は決定的で説明可能ですが、ヒューリスティックです。同義の概念を見逃したり、互換性のある作業に対して警告したりすることがあります。

  • クレームは警告を行うだけです。ファイル、シンボル、エージェントをロックすることは決してありません。

  • 検証の合格が証明するのは、記録されたコマンドが記録されたフィンガープリントに対して合格したことだけであり、テスト計画が完全だったことではありません。

  • Git 参照とプロセス結果は、自己申告のモデル、プロンプト、テストの記述よりも強い証拠です。

  • イベントチェーンは保持されたチェーン内の変更を検出します。署名、リモート構成証明、外部チェックポイントではありません。

  • ローカル SQLite は共有モードの合意ではなく、ループバックのベアラートークンは公開デプロイメントのセキュリティモデルではありません。

  • 実行可能なベンチマークフィクスチャ、再現可能なクエリハーネス、ベンチマーク計画はありますが、調整ありと調整なしのパフォーマンス結果の公開はまだありません。

  • Foremerge は、コードレビュー、アーキテクチャのオーナーシップ、CI、セキュリティスキャン、Git ホスティングのルール、バックアップを置き換えるものではありません。

Foremerge を統合ゲートとして使用する前に、完全な制限事項と信頼モデルをお読みください。

ドキュメント

ドキュメント

回答する内容

アーキテクチャ

なぜ単一の Rust バイナリ、SQLite、Git CLI、共有 common-dir 状態なのか?

プロトコル

エージェントは何を、いつ公開するのか?

状態モデル

どの遷移と不変条件が作業をゲートするのか?

競合検出

どの決定論的ルールが検出結果と提案を生成するのか?

Git 統合

フィンガープリント、ワークツリー、受理済み refs はどのように動作するのか?

エージェントクライアント

Codex、Claude Code、Cursor はどのようにスキルと MCP サーバーを発見するのか?

MCP セットアップ

クライアントは 18 個のライフサイクル/読み取りツールをどのように設定して呼び出すのか?

JSON API

どのルート、リクエストボディ、認証、エラーが提供されるのか?

OpenAPI スキーマ

機械可読な HTTP コントラクトとは何か?

ベンチマーク計画

協調実行と非協調実行はどのように比較されるのか?

検証除外 ADR

検証が無視してよい生成パスはどれか、そしてその理由は?

ロードマップ

現在、次、後日、非目標とは何か?

制限事項

MVP が保証しないことは何か?

ブランド

どのマーク、色、タイポグラフィ、アイコン、CLI 出力ルールが Foremerge のあらゆるサーフェスに適用されるのか?

また、変更履歴、セキュリティポリシー、行動規範 も参照してください。

コントリビューションとライセンス

コントリビューション、特にスコープの語彙、競合の証拠、ChangeSet の来歴、検証ポリシーに関するプロトコルフィードバックを歓迎します。CONTRIBUTING.md を読んでから、完全なローカルゲートを実行してください:

make verify

Foremerge は Apache License 2.0 の下でライセンスされています。

Available Tools

18 tools
accept_changesetAccept a validated ChangeSetA

Accept a ChangeSet as done so other agents may build on it. Use this after run_verification passes; use record_commit later, once the work has actually landed on the target branch. Foremerge re-checks every gate before accepting: the worktree must be clean and unchanged since publication, verification must have passed (unless the repository's policy is advisory and nothing was verified), no HIGH conflict on the intent may be OPEN or COORDINATING (resolve_conflict clears an agreed one, and discard_work dismisses the conflicts of work you drop), and every intent in the ChangeSet's dependencies must already be accepted, with its accepted commit, or once committed its recorded integration commit, in this commit's history. On success it marks the ChangeSet and intent ACCEPTED, pins the commit as accepted_commit, writes refs/foremerge/accepted/<changeset_id>, and returns the updated ChangeSet. A failed gate returns an error naming it (CHECK_FAILED, BLOCKING_CONFLICT, UNSATISFIED_DEPENDENCY, STALE_CHANGESET, INVALID_TRANSITION) and changes nothing. Overriding a gate is an operator action on the CLI or HTTP API and is refused over MCP, so ask a human when a gate should be bypassed.

NameRequiredDescriptionDefault
git_refNoOptional commit to accept. Defaults to the ref recorded at publication, then the worktree HEAD. Whatever it names must resolve to the current worktree HEAD.
changeset_idYesThe ChangeSet to accept (chg_...), as returned by publish_changeset.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say it is a non-destructive, non-idempotent write with no override; the description adds substantial context beyond that: it enumerates every gate re-checked, the exact failure error codes, that a failed gate changes nothing, and the state written on success (ACCEPTED status, accepted_commit pin, refs/foremerge/accepted/...). It also discloses that gate overrides are refused over MCP and must go to a human, which is critical behavior an agent could not infer.

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

Conciseness4/5

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

Front-loaded with purpose and the when-to-use rule before the gate detail, and nearly every clause carries load-bearing information (gate list, error codes, side effects). The gate enumeration is dense and slightly overlong, but not wasteful.

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

Completeness5/5

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

No output schema exists, yet the description states what is returned (the updated ChangeSet) along with state mutations and ref writes. Combined with the explicit failure modes and MCP override restriction, an agent has 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.

Parameters3/5

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

Schema description coverage is 100%, with git_ref's defaulting and HEAD-resolution rules documented in the schema itself, so the description does not need to repeat them. The description adds only indirect meaning (the worktree must be clean and unchanged), leaving the baseline 3 appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Accept a ChangeSet as done') plus the downstream consequence ('so other agents may build on it'). It explicitly contrasts with the sibling record_commit, so an agent can distinguish the two without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit ordering rule: use this after run_verification passes, and use record_commit later once work has landed. It also names the sibling tools that clear blocking conditions (resolve_conflict, discard_work), so the agent knows how to unblock a failed accept.

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

check_conflictsCheck intent conflictsA
Read-only

Ask whether planned work collides with other agents' active work, before any change exists. Read-only: nothing is stored, so use it while only planning. It runs the same comparison as publish_intent: overlapping scopes, not only identical ones, and the declared operations on each. Pass intent_id alone to list the persisted OPEN or COORDINATING conflicts on a published intent (use this before publish_changeset and before run_verification, since conflicts are raised when the later intent publishes). Pass intent text with scopes, or intent_id with replacement scopes, for a what-if check against every intent from INTENT through VALIDATED, excluding ACCEPTED, COMMITTED and DISCARDED; those findings carry ephemeral eph_ ids and are not recorded. Returns conflicts (each with severity, explanation, evidence and a suggested coordination step), checked_intents, blocking (true when any finding is HIGH), ephemeral (true when the ids are per-call eph_ ids), as_of_event (the ledger event sequence the read reflects), and the active policy. To record a decision about overlap, use record_assessment or resolve_conflict instead.

NameRequiredDescriptionDefault
intentNoFree-form summary of work not yet published, for a what-if check. Provide this or intent_id. Passing an intent id here is rejected; use intent_id.
scopesNoScopes to compare, each with the operation you would perform. With intent text, these are the proposed scopes. With intent_id, non-empty scopes replace the intent's own for this check only.
agent_idNoOptional caller agent id. Informational only; it does not change which work is compared.
intent_idNoA published intent (int_...) to check. Provide this or intent.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and idempotentHint=false, so the safety profile itself is covered; the description's 'nothing is stored' restates that but adds the useful nuance that findings get ephemeral eph_ ids and are not recorded. It also discloses the compared intent-status window (INTENT through VALIDATED, excluding ACCEPTED/COMMITTED/DISCARDED), the blocking-when-HIGH rule, and as_of_event semantics, which are genuinely beyond the annotations. However, these are largely framed as return-shape detail rather than deeper operational constraints, so it sits just above the annotated baseline.

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

Conciseness4/5

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

It is long, but front-loaded with the core purpose and constraint before the mode and return-value detail, and each clause (timing, modes, status window, return fields) earns its place given there is no output schema. Minor redundancy between 'Read-only: nothing is stored' and the readOnlyHint annotation, and the trailing enumeration of return fields is dense.

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

Completeness5/5

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

With no output schema, the description compensates by enumerating the returned fields (conflicts with severity/explanation/evidence/suggested step, checked_intents, blocking, ephemeral, as_of_event, active policy). Combined with the status-window and two-mode explanations, an agent has 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.

Parameters3/5

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

Schema coverage is 100% and each parameter already has a rich description, including the intent-vs-intent_id rejection rule and the same-kind/operation semantics, so the baseline of 3 applies. The description adds the combination semantics — intent_id alone versus intent_id plus replacement scopes versus intent text plus proposed scopes — which is real value, but it largely mirrors what the schema's own parameter descriptions state.

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

Purpose5/5

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

The opening sentence states a specific verb and resource: ask whether planned work collides with other agents' active work, before any change exists. It explicitly positions itself against publish_intent (same comparison, but read-only, no stored change) and against record_assessment/resolve_conflict (for recording decisions). An agent can tell exactly what this does versus its siblings without opening any schema.

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

Usage Guidelines5/5

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

It gives concrete timing ('before publish_changeset and before run_verification, since conflicts are raised when the later intent publishes') and explains the two invocation modes: intent_id alone for persisted OPEN/COORDINATING conflicts, intent text plus scopes or intent_id plus replacement scopes for a what-if check. It also names the alternatives to reach for when the goal is to record a decision rather than detect a conflict.

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

claim_workClaim semantic workA

Tell other agents you are working on specific scopes of your own intent, for a limited time. Use this after publish_intent and record_assessment, and before start_work. Claims are advisory and never lock: if any other intent, another of yours included, holds a live claim on a matching scope (symbols match loosely by name), you still get the claim, and a claim-overlap conflict is recorded and returned as a warning. The first claim moves the intent from INTENT to CLAIMED. Claiming a scope the intent already holds renews its lease instead of adding a second claim, which is how long-running work keeps its claims. Only the intent's owner may claim, and only while the intent is INTENT, CLAIMED or IN_PROGRESS. Returns the created or renewed claims, overlap warnings, advisory_only: true, and scope_warnings when a symbol key will lose its class.

NameRequiredDescriptionDefault
reasonNoOptional note shown to other agents explaining why you hold the claim.
scopesYesThe scopes to claim. Use the scopes declared on the intent; operations are not repeated here.
agent_idYesYour agent id (agt_...). Must own the intent.
intent_idYesYour intent (int_...) that the claims belong to.
lease_secondsNoHow long the claim lasts before it expires, from 60 seconds to 24 hours. Default one hour. Claim again to renew.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the read/write safety profile; the description supplies the substantive semantics — claims are advisory and never lock, overlapping claims still succeed but produce a recorded warning, the first claim transitions INTENT→CLAIMED, and re-claiming renews the lease rather than duplicating. It even discloses the return payload components, which is critical given there is no output schema.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence and every subsequent sentence carries non-obvious information (ordering, advisory nature, renewal, ownership, returns). It is dense — the third sentence bundles advisory semantics, conflict handling, and warnings — but no sentence is filler.

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

Completeness5/5

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

For a mutating, non-idempotent tool with no output schema, the description covers the state machine, authorization constraint, the renewal idiom, the conflict-warning behavior, and the shape of the response. Nothing an agent needs in order to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds genuine meaning on top by explaining that symbol matching is loose and case-insensitive by name, and that re-claiming an existing scope renews the lease (the practical use of lease_seconds for long-running work). It does not restate the enum or the 60s–24h bounds, but the schema already covers those.

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

Purpose5/5

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

Opens with a concrete verb+resource: registering an advisory claim on scopes of your own intent for a limited time. It distinguishes itself from siblings by naming publish_intent, record_assessment, and start_work as the surrounding sequence, so an agent knows exactly where this sits in the workflow.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('after publish_intent and record_assessment, and before start_work') and what alternative behavior to expect ('Claiming a scope the intent already holds renews its lease instead of adding a second claim'). It also states the preconditions: owner-only, and only while the intent is INTENT, CLAIMED, or IN_PROGRESS.

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

coordinate_with_agentCoordinate with another agentA

Send a stored message to another registered agent, usually to agree how two overlapping pieces of work should coexist. Use it when check_conflicts or related_work shows a clash you need the other agent to act on; afterwards, a party to the conflict records the agreement with resolve_conflict, naming this message's id. Linking a conflict_id moves that conflict from OPEN to COORDINATING. The message is appended to a durable log with status UNREAD; it does not interrupt or control the other agent. No MCP tool reads messages: the recipient reads them with the CLI, foremerge coordinate inbox. Returns the stored message, including its msg_ id.

NameRequiredDescriptionDefault
messageYesWhat you propose or need, in plain language.
conflict_idNoOptional stored conflict (cfl_...) this message is about. An eph_ id from a what-if check_conflicts is rejected with NOT_FOUND. May be combined with changeset_id.
to_agent_idYesThe recipient's agent id (agt_...), for example the owner of the conflicting intent.
changeset_idNoOptional ChangeSet (chg_...) this message is about. Must exist.
from_agent_idYesYour agent id (agt_...).

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the uninformative all-false annotations, disclosing that the message is appended to a durable log with status UNREAD, that it does not interrupt or control the recipient, that linking a conflict_id moves it from OPEN to COORDINATING, and that no MCP tool reads messages. It also states the return value includes the stored message and its msg_ id.

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

Conciseness5/5

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

The description is longer than typical but every sentence carries distinct information: purpose, trigger, follow-up action, state transition, durability, non-interruptive nature, and return value. It is deliberately structured and front-loaded with the core operation, with no filler or repetition.

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

Completeness5/5

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

Despite lacking an output schema, the description explicitly states what is returned. It covers the integration with sibling tools, the state change on conflict_id, the durable status semantics, and the limitation that only the CLI can read messages. This is a complete briefing for a tool with this complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all five parameters. The description adds a bit of contextual meaning (e.g., conflict_id linking moves the conflict, eph_ ids are rejected), but most parameter semantics already appear in the schema, so a baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Send a stored message to another registered agent,' and immediately states the purpose—'to agree how two overlapping pieces of work should coexist.' It also differentiates from siblings by referencing check_conflicts and resolve_conflict, clarifying this tool is for the message-sending step, not conflict detection or resolution.

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

Usage Guidelines5/5

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

Explicit guidance is given: 'Use it when check_conflicts or related_work shows a clash you need the other agent to act on.' It also explains the follow-up flow with resolve_conflict and names the message id, and notes that the recipient reads via CLI since no MCP tool reads messages. This fully covers when and how to use the tool relative to alternatives.

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

discard_workDiscard workA
Destructive

Close one of your own intents that you will not take through accept_changeset. Call it before you stop working, whenever the intent is still open: an intent never closes itself, and an open one is compared against every later intent on the same scopes. Two cases. Work that will not be finished, for example a duplicate or work another agent took over: pass a reason. Work that reached Git without a passing named check, so it cannot be accepted: pass landed_ref as well, naming the commit or branch it landed in. Either way it sets the intent to DISCARDED, releases all of its active claims, and dismisses its OPEN or COORDINATING conflicts so they stop blocking the other party. With landed_ref the commit is checked and recorded, but the intent still ends DISCARDED, not ACCEPTED: nothing here says the work was verified. The history stays in the event log, but a discarded intent cannot be resumed; publish a new intent instead. Only the owner may discard, and not once the intent is ACCEPTED, COMMITTED or already DISCARDED. Returns the updated intent. To agree that two intents can coexist, use resolve_conflict instead.

NameRequiredDescriptionDefault
reasonYesWhy the work is being closed: why it was abandoned, or how it landed. Required and recorded in the event log.
agent_idYesYour agent id (agt_...). Must own the intent.
intent_idYesThe intent (int_...) to discard.
landed_refNoOnly for work that reached Git: the commit, branch or tag it landed in. Refused with INVALID_INPUT if it does not resolve to a commit, with TARGET_DIVERGED if the intent published a ChangeSet whose changes it does not hold, by ancestry or by content as record_commit checks, and with STALE_CHANGESET if that ChangeSet was published with uncommitted changes or before the repository's first commit.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, but the description goes well beyond that: it states what specifically changes (intent set to DISCARDED, active claims released, OPEN/COORDINATING conflicts dismissed so they stop blocking the other party), that the event history is retained but the intent cannot be resumed, and that landed_ref does not imply verification ('still ends DISCARDED, not ACCEPTED'). It also discloses the return value. No contradiction with the destructive/readOnly hints.

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

Conciseness4/5

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

Front-loaded with the core action and organized by a 'Two cases' branch that makes the dense content scannable. It is longer than minimal—some explanation of state transitions and the landed_ref caveat could be trimmed—but virtually every sentence carries operational meaning.

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

Completeness5/5

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

Covers all four parameters with their conditional usage, the post-call state of the intent and its claims/conflicts, the ownership and state preconditions, resume impossibility, and the return value. With no output schema, this is exactly the context an agent needs to call a destructive state-changing tool safely.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics the schema does not: the conditional relationship between the parameters ('pass a reason' alone vs 'pass landed_ref as well'), and the consequence of landed_ref (commit checked and recorded but intent still DISCARDED). It does not restate the error codes, which the schema already carries.

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

Purpose5/5

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

States a specific verb and resource ('Close one of your own intents') plus the condition that distinguishes it ('that you will not take through accept_changeset'). It also names the sibling it must not be confused with ('To agree that two intents can coexist, use resolve_conflict instead'), so an agent can route correctly without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit timing ('Call it before you stop working, whenever the intent is still open'), two enumerated usage cases (abandoned work vs work that landed without a passing named check), and a hard exclusion with an alternative (resolve_conflict). Preconditions are spelled out: only the owner, and not once ACCEPTED, COMMITTED or already DISCARDED.

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

get_changesetGet a ChangeSetA
Read-onlyIdempotent

Read one ChangeSet by id. Use it to check a ChangeSet's status (PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or SUPERSEDED), its fingerprint, and its commit provenance: accepted_commit, pinned at acceptance and never changed, and integration_commit, set by record_commit. Read-only. Use get_intent for the work item itself. To find an id, status lists PROVISIONAL, VALIDATED and ACCEPTED ChangeSets, and query_work shows each intent's latest one.

NameRequiredDescriptionDefault
idYesThe ChangeSet id (chg_...).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld=false, and the description reinforces this with 'Read-only.' It also adds meaningful behavioral detail beyond the annotations: accepted_commit is pinned at acceptance and never changed, and integration_commit is set by record_commit. No contradiction with annotations is present.

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

Conciseness5/5

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

The description is information-dense and well-structured: operation and target first, then what can be checked, then read-only status, then routing to alternatives. Every sentence earns its place, and no filler or redundant restating of the title appears.

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

Completeness5/5

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

For a single-parameter read tool with full schema coverage and comprehensive annotations, the description fully covers what an agent needs: what the tool returns conceptually (status, fingerprint, provenance) and how to obtain an id. The absence of an output schema does not create a material gap because the description names the fields the agent should expect.

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

Parameters4/5

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

The schema covers 100% of parameters with a clear description of id, so the baseline is 3. The description adds useful parameter context by explaining how to find an id: status lists qualifying ChangeSets and query_work shows each intent's latest one. This exceeds the schema's minimal id description.

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

Purpose5/5

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

The description uses a specific verb-resource pair: 'Read one ChangeSet by id', and clearly distinguishes it from siblings by stating what it is not for: 'Use get_intent for the work item itself.' An agent can tell this tool apart from get_intent, status, and query_work without inspecting schemas.

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

Usage Guidelines5/5

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

It explicitly states when to use this tool: to check ChangeSet status, fingerprint, and commit provenance. It also names alternatives and when they apply, including get_intent for the work item, status for finding PROVISIONAL/VALIDATED/ACCEPTED ids, and query_work for each intent's latest ChangeSet.

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

get_intentGet an intentA
Read-onlyIdempotent

Read one intent by id, with its owning agent and the count and ids of its OPEN or COORDINATING conflicts (check_conflicts with intent_id shows severity). Use it to see an intent's current status (INTENT, CLAIMED, IN_PROGRESS, PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or DISCARDED), declared scopes and depends_on, for example before assessing someone else's related work. Read-only. Use query_work to search intents by agent, status or scope, and status for everything at once.

NameRequiredDescriptionDefault
idYesThe intent id (int_...).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive, and the description reinforces this with 'Read-only.' It goes beyond annotations by disclosing the return shape (conflict counts/ids, status enum, scopes, depends_on) and noting that severity requires check_conflicts.

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

Conciseness5/5

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

Three dense sentences with zero filler. The core purpose is front-loaded, followed by return details and sibling routing. Each sentence contributes distinct value.

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

Completeness5/5

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

For a single-parameter read tool with strong annotations and explicit sibling routing, the description covers the purpose, return contents, safety profile, and alternatives. No critical information an agent needs is missing.

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

Parameters3/5

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

The schema already fully documents the single id parameter with format 'int_...'. The description mentions reading by id but adds no new parameter semantics beyond what the schema provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource ('Read one intent by id') and enumerates exactly what is returned: owning agent, OPEN/COORDINATING conflict count and ids, status, scopes, and depends_on. It also distinguishes itself from query_work and status explicitly.

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

Usage Guidelines5/5

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

Provides clear when-to-use context ('before assessing someone else's related work') and explicitly routes to alternatives: query_work for searching by agent/status/scope and status for everything at once. This leaves little ambiguity about tool selection.

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

list_agentsList coding agentsA
Read-onlyIdempotent

List every registered agent in registration order, with its id, name, model, capabilities, worktree, Git branch and head at registration, and status. Read-only and takes no arguments. Use it to find the agent id of another participant before coordinate_with_agent. Use status for the active agents alongside their current work.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description reinforces read-only behavior and adds the detail of registration order, which goes beyond the annotations. It doesn't contradict annotations and provides useful context about the returned data.

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

Conciseness5/5

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

The description is efficient with no fluff. It front-loads the purpose, then provides usage guidance in separate short sentences. Each sentence adds value: purpose, read-only/no-args, usage for coordinate_with_agent, and usage for status. No redundant text.

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

Completeness5/5

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

Given the tool has no output schema, the description compensates by listing all returned fields and their order. It also covers a primary use case (finding agent ids) and mentions the alternative (status). For a simple read-only list tool, nothing essential is missing.

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

Parameters4/5

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

The tool has zero parameters and the schema is empty, so there is nothing to explain. The description explicitly notes 'takes no arguments', which is helpful confirmation. Baseline for 0 params is 4, and this description meets that.

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

Purpose5/5

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

The description clearly states the tool lists every registered agent with a specific set of fields (id, name, model, capabilities, worktree, Git branch/head, status). It distinguishes from siblings by noting it's a full listing, unlike status which focuses on active agents. The verb 'List' and resource 'registered agents' are explicit.

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

Usage Guidelines5/5

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

The description gives explicit guidance: use it to find agent ids before coordinate_with_agent, and use status for active agents alongside current work. This differentiates it from the status tool and provides a clear when-to-use and when-not-to-use scenario.

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

publish_changesetPublish a provisional ChangeSetA

Record a finished unit of implementation for your intent so it can be verified and accepted. Use it once the change is committed in your worktree, after check_conflicts and before run_verification. Foremerge snapshots the worktree (defaulting to your registered one), resolves the candidate commit and its diff base, and stores a fingerprint that verification and acceptance are later checked against. files and symbols are inferred only from uncommitted changes, so list them yourself for committed work. The ChangeSet starts PROVISIONAL and the intent becomes PROVISIONAL. Publishing again while the previous ChangeSet is PROVISIONAL or VALIDATED creates a new one, marks the old one SUPERSEDED, and resets verification. Only the intent's owner may publish, while the intent is CLAIMED, IN_PROGRESS, PROVISIONAL or VALIDATED. Git itself is not modified. Returns the ChangeSet, including its chg_ id, fingerprint, and open_conflicts on the intent at that moment.

NameRequiredDescriptionDefault
filesNoChanged file paths. Left empty, they are inferred from uncommitted changes only, so list them for committed work.
testsNoTests you ran yourself. Recorded as history only; acceptance relies on run_verification, not on this list.
git_refNoCandidate commit. Omit it: it defaults to the worktree's HEAD, and acceptance rejects any other commit with STALE_CHANGESET.
summaryYesWhat the change does, in one or two sentences.
symbolsNoCode symbols added or changed. Left empty, they are inferred from uncommitted changes only, so list them for committed work.
agent_idYesYour agent id (agt_...). Must own the intent.
base_refNoTrue diff base when known (for example the fork point of this agent branch); defaults to the candidate commit's first parent.
worktreeNoPath of the Git worktree holding the change. Defaults to your registered worktree, then the server's working directory. Must belong to your registered repository.
contractsNoNamed interfaces or agreements this change affects, for example payment-provider.
decisionsNoDesign decisions a reviewer or later agent should know about.
intent_idYesThe intent (int_...) this implementation fulfils.
provenanceNoOptional JSON object of your own context, such as a prompt or task reference. Foremerge adds Git provenance under provenance.git.
dependenciesNoIntent ids (int_...) this change builds on, and the dependency list acceptance enforces. accept_changeset refuses with UNSATISFIED_DEPENDENCY unless each is ACCEPTED or COMMITTED and its accepted commit (or, once COMMITTED, its integration commit) is in this change's Git history. Intent ids only: not package or library names.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, idempotent=false, destructive=false) by disclosing the state machine: the ChangeSet starts PROVISIONAL, the intent becomes PROVISIONAL, re-publishing supersedes the old ChangeSet and resets verification. It also states the important safety fact that Git itself is not modified, plus the STALE_CHANGESET rejection behavior.

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

Conciseness4/5

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

Dense but front-loaded: the first sentence establishes purpose, the second establishes workflow position, then behavior and preconditions follow. Every sentence carries information, though the description runs long and a reader must hold several state-transition facts at once.

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

Completeness5/5

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

For a 13-parameter mutation tool with no output schema, the description covers preconditions, side effects, state transitions, and even the return payload ('the ChangeSet, including its chg_ id, fingerprint, and open_conflicts'). Nothing an agent needs to invoke it correctly appears to be missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already carries the parameter burden; the description's note that files and symbols are inferred only from uncommitted changes largely restates the schema's own wording. It does add the defaulting chain for worktree (registered worktree, then server CWD) and the fingerprint/base_ref resolution, but these are also documented in the schema.

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

Purpose5/5

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

States a specific verb and resource ('Record a finished unit of implementation for your intent') and immediately positions it in the workflow relative to siblings check_conflicts, run_verification, and accept_changeset. An agent can distinguish it from get_changeset and publish_intent without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit ordering ('once the change is committed in your worktree, after check_conflicts and before run_verification') and explicit eligibility conditions ('Only the intent's owner may publish, while the intent is CLAIMED, IN_PROGRESS, PROVISIONAL or VALIDATED'). It also names the alternative path for committed work, and covers the re-publish case that selects a different outcome.

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

publish_intentPublish intentA

Announce work you are about to do, and the scopes it will change, before creating or editing any file meant for the repository, documents included. It is the first write for a task you are committed to, after register_agent; while only planning, use check_conflicts, which stores nothing. The intent is stored with status INTENT and compared against every other active intent. Returns the intent (with its int_ id), any conflicts detected immediately, warnings (for example no scopes declared, or a symbol key that will lose its class), and related_work: active intents, your own others included, that may relate to yours. Entries with asserted: true are collisions with both declared operations stated; the rest are candidates, with why_surfaced saying why. Assess each related_work entry and call record_assessment before changing files, then claim_work and start_work. Use check_conflicts instead for a what-if check that stores nothing.

NameRequiredDescriptionDefault
taskYesShort name of the task this belongs to, for example payments-provider. Intents with the same task text share one task record.
scopesNoEvery scope this work will touch, each with the operation performed on it. Conflict detection relies on these, so declare them all.
summaryYesWhat you are going to change, in one sentence.
agent_idYesYour agent id (agt_...) from register_agent.
metadataNoOptional JSON object of extra context stored with the intent.
rationaleNoOptional reason for the change.
depends_onNoIntent ids (int_...) this work relies on, recorded for the coordination graph and reported as dependents by query_work. Not checked or enforced: to make acceptance require them, also list them in publish_changeset's dependencies.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say non-readOnly, non-destructive, non-idempotent, closed-world; the description goes well beyond by disclosing the stored status INTENT, that the intent is compared against every other active intent, and the exact response payload (int_ id, immediate conflicts, warnings such as undeclared scopes or a symbol losing its class, related_work with asserted/why_surfaced). It also clarifies that this call is a persistent write, not a what-if.

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

Conciseness4/5

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

Front-loaded with the core action and its timing, then response shape, then the mandated follow-up sequence. It is dense but earns most of its length; the closing 'Use check_conflicts instead for a what-if check that stores nothing' largely repeats the earlier 'while only planning, use check_conflicts, which stores nothing'.

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

Completeness5/5

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

For a 7-parameter mutation tool with no output schema, the description supplies the missing return-value contract, the warnings taxonomy, the asserted-vs-candidate distinction, and the downstream call sequence. An agent has everything needed to call it correctly and act on the result.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: conflict detection relies on the scopes list so all must be declared, and omitting them produces a warning. That connects the scopes parameter to observable output behavior rather than restating the schema.

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

Purpose5/5

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

States a specific verb (announce) and resource (intent, with the scopes it will change) and pins the moment in the workflow: first write for a committed task, after register_agent, before creating or editing repository files. It is clearly distinguished from the read-only alternative check_conflicts, which is named twice.

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

Usage Guidelines5/5

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

Explicit when-to-use (about to do committed write work, before touching files), explicit when-not/alternative (while only planning, use check_conflicts since it stores nothing), and explicit ordering relative to siblings (record_assessment, then claim_work, then start_work). Little is left to inference.

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

query_workQuery active workA
Read-onlyIdempotent

Search intents by owner, status or scope, to answer questions like who is changing this symbol, or which work still has open conflicts. Read-only. Each result joins an intent to its agent, its claims, its latest ChangeSet (id and full object), the ids of intents that depend on it, and its count of OPEN or COORDINATING conflicts. Results are an array, capped by limit. With no filters it returns intents of every status, including finished ones. Use get_intent when you already have an id, and status for a grouped overview of everything at once.

NameRequiredDescriptionDefault
limitNoMaximum number of intents to return, from 1 to 500. Default 50.
scopeNoIntents that declared, or ever claimed, a matching scope. Symbols match loosely, on their last two :: segments ignoring namespace and case, so unrelated same-named symbols can appear.
statusNoOnly intents in this lifecycle status: INTENT, CLAIMED, IN_PROGRESS, PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or DISCARDED. Case-insensitive.
agent_idNoOnly intents owned by this agent (agt_...).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the description's 'Read-only' phrase is redundant but harmless. It adds genuine behavioral value beyond annotations by disclosing the result shape (joins intent to agent, claims, latest ChangeSet, dependent intent ids, and OPEN/COORDINATING conflict counts), array capping by limit, and the surprising default that with no filters it returns intents of every status including finished ones.

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

Conciseness5/5

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

Three focused sentences with zero filler: purpose and examples, result shape and safety, default behavior and sibling routing. The most decision-relevant information (what it does, how results look) is front-loaded, and the sibling routing closes the description. Every sentence earns its place.

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

Completeness4/5

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

For a complex query tool with no output schema, the description compensates well by describing the joined result shape, the capping behavior, and the unfiltered default. The exhaustive schema covers parameter semantics, so the only gap is exact output field names/types, which the narrative join description largely mitigates. Minor omissions like pagination details are covered by the limit parameter's schema description.

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

Parameters3/5

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

Schema coverage is 100%: limit, status, agent_id, and the nested scope object all have thorough descriptions, including the loose symbol-matching caveat. The description reinforces the semantic mapping of filters to questions (owner/status/scope) but adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Search intents by owner, status or scope') and illustrates the purpose with concrete questions ('who is changing this symbol, or which work still has open conflicts'). It also names the siblings it is not ('Use get_intent when you already have an id, and status for a grouped overview'), so an agent can distinguish it from confusable read-only tools without opening schemas.

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

Usage Guidelines5/5

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

The description explicitly routes the agent to alternatives with the triggering condition: 'Use get_intent when you already have an id, and status for a grouped overview of everything at once.' It also embeds usage signals via the example questions and states the default no-filter behavior, which tells the agent when this tool is appropriate versus when a narrower lookup is better.

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

record_assessmentRecord an assessment of related workA

Record what you concluded about one entry from related_work. Foremerge states which scopes overlap and how the declared operations relate; deciding what that means is yours. Call this once per related intent, after publish_intent and before you change files. Each call appends a new assessment rather than replacing an earlier one, and changes no statuses: it does not open, resolve or dismiss conflicts. Act on the verdict with coordinate_with_agent, resolve_conflict or discard_work as needed. Only the intent's owner may assess it. Returns the stored assessment with its asm_ id.

NameRequiredDescriptionDefault
actionYesWhat you will do next. proceeding: continue as planned. rescoping: change your scopes first. waiting: hold until the other work lands. abandoning: drop your intent (then call discard_work).
verdictYesconflicts: the two plans cannot both land as written. compatible: they can. duplicate: the same work twice. depends_on: yours needs theirs to land first.
agent_idYesYour agent id (agt_...). Must own intent_id.
intent_idYesYour intent (int_...) whose publish returned the related_work.
rationaleYesWhy you reached that verdict, specific enough for a later reader to check.
related_intent_idYesThe other intent (int_...) from the related_work entry you are assessing. It may belong to another agent or be one of your own.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: append-not-replace semantics (consistent with idempotentHint=false), no status mutations, an authorization constraint ('Only the intent's owner may assess it'), and the returned identifier (asm_). The non-destructive-to-conflict-state clarification is exactly the kind of context annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with purpose and organized so each sentence adds a distinct rule (ordering, append behavior, follow-up tools, ownership). Slightly long at six sentences, and 'Only the intent's owner may assess it' partly duplicates the agent_id schema text, keeping it just short of a 5.

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

Completeness5/5

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

Covers the full call lifecycle an agent needs: when to call, ordering relative to publish_intent and file changes, what the call does and does not mutate, authorization, and what is returned even though no output schema exists. Nothing material is missing for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by clarifying that the stored verdict is the agent's judgment about system-reported overlap rather than a restatement of it, and that the rationale must be checkable later. It does not add syntax or format detail beyond that.

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

Purpose5/5

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

States a specific verb and resource ('Record what you concluded about one entry from related_work') and immediately frames the division of labor: the system reports overlaps, the agent decides their meaning. It is clearly distinguishable from siblings like check_conflicts, resolve_conflict and coordinate_with_agent, which are named as separate actions rather than folded into this tool.

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

Usage Guidelines5/5

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

Gives an explicit triggering condition and ordering ('Call this once per related intent, after publish_intent and before you change files') plus explicit routing to alternatives ('Act on the verdict with coordinate_with_agent, resolve_conflict or discard_work as needed'). The when-not is also clear: it does not open, resolve or dismiss conflicts.

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

record_commitRecord integration commitA

Record where accepted work finally landed, after it has been merged through ordinary Git or a pull request. Use it last, after accept_changeset and the merge. The commit must have the accepted commit in its history or, after a squash or rebase merge, hold every change the candidate made, checked path by path against their merge base; otherwise the call fails with TARGET_DIVERGED naming what is missing. On success it stores integration_commit, moves the ChangeSet to COMMITTED, and returns the updated ChangeSet, whose provenance.integration.method says how containment was shown (ancestor or content). accepted_commit is kept unchanged, so the record shows both what was verified and where it landed. Foremerge does not merge or push anything itself.

NameRequiredDescriptionDefault
git_refYesThe landed commit, as a SHA or ref such as main, resolved in the ChangeSet's worktree.
changeset_idYesAn ACCEPTED ChangeSet (chg_...).

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses behavior well beyond the annotations: it validates containment by ancestor or content, names the failure mode TARGET_DIVERGED, describes the state transition to COMMITTED, and explains the returned provenance.integration.method. It also clarifies that accepted_commit remains unchanged, making the record show both verification and final landing.

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

Conciseness5/5

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

The description is front-loaded with purpose and usage, then moves into validation, success behavior, and a clarifying caveat. Despite being fairly dense, every sentence contributes material information for correct invocation.

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

Completeness5/5

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

There is no output schema, but the description covers the important return behavior: the updated ChangeSet and its provenance.integration.method. It also covers failure behavior and state changes, so an agent has enough context to call the tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the two parameters are already documented. The description still adds meaningful semantics by explaining how git_ref is validated against the accepted commit or, after squash/rebase, against the candidate changes path by path using the merge base.

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

Purpose5/5

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

The description gives a specific verb and resource: recording where accepted work landed after merge. It clearly distinguishes this tool from accept_changeset and the merge step by saying to use it last, after accept_changeset and the merge.

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

Usage Guidelines5/5

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

It explicitly states when to use the tool: after accepted work has been merged through ordinary Git or a pull request. It also states the key prerequisite and what happens when it is not met, failing with TARGET_DIVERGED, and clarifies that Foremerge does not merge or push itself.

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

register_agentRegister coding agentA

Register yourself as a participant and get the agent id every other write tool needs. Call it once at the start of each session, before publish_intent. Every call creates a new agent record, even for a name already in use; a warning is returned when an active agent with the same name and worktree exists, because that record's intents cannot be claimed by the new one. Passing a worktree records its Git branch and head; it must be inside the repository this server is bound to, normally the one it was launched in, or it is rejected with INVALID_INPUT. Returns the agent, including its agt_ id, and any warnings.

NameRequiredDescriptionDefault
nameYesA readable name for this agent, for example payments-stripe.
modelNoOptional model identifier, for example the LLM you are running as.
worktreeNoPath to your Git worktree, inside the repository this server is bound to. Recommended.
capabilitiesNoOptional skills or areas, for example rust or payments, shown to other agents.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important non-obvious behaviors: every call creates a new agent record even for a repeated name, a warning is returned when an active same-name/worktree agent exists, invalid worktree paths are rejected with INVALID_INPUT, and the response includes the agent plus warnings. These details are significant for correct invocation and are not visible from annotations alone.

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

Conciseness4/5

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

The description is dense but every sentence adds essential information: purpose, call timing, non-idempotence, warning conditions, validation behavior, and return value. It is longer than average but justified by the need to explain branching behavior and constraints. Slight restructuring could improve scannability, but nothing is wasted.

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

Completeness5/5

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

For a registration tool with no output schema, the description is remarkably complete: it covers lifecycle timing, idempotency caveats, validation failures, response contents, and relationship to other tools. An agent has enough information to call it correctly and interpret the result without additional investigation.

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

Parameters4/5

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

Schema parameter descriptions already cover all four parameters at 100% coverage, providing a solid baseline. The description adds meaningful extra context for worktree by stating it must be inside the bound repository and is otherwise rejected, and clarifies that the worktree records Git branch and head. This goes beyond the schema without needing to repeat every parameter.

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

Purpose5/5

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

The description states a specific action ('Register yourself as a participant') and the concrete resource produced ('the agent id every other write tool needs'), immediately distinguishing it from sibling tools like list_agents or publish_intent. It clearly communicates the tool's central role in the workflow.

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

Usage Guidelines5/5

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

The description explicitly says to call it once at the start of each session and before publish_intent, providing clear ordering. It also warns about calling it again for the same name/worktree, which tells the agent when reusing the tool may not be appropriate. This is strong, actionable guidance.

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

resolve_conflictResolve a persisted conflictA

Record an audited resolution decision for a durable cfl_* conflict so blocked work can proceed. Over MCP only an agent whose intent is a party may resolve it, and the decision is recorded under its agent id. Foremerge does not verify agreement or message ids, so either party can clear the gate alone: resolve only after the other party agrees. Use coordinate_with_agent first to reach that agreement, and discard_work instead when one side is simply dropping its work. Resolving moves the conflict to RESOLVED, which clears it from the acceptance gate for both intents; it does not change any code. It fails if the conflict is already resolved or dismissed. Returns the updated conflict.

NameRequiredDescriptionDefault
agent_idYesYour agent id (agt_...). Your intent must be one of the conflict's two parties.
rationaleYesWhy this resolves the clash, naming the msg_ ids where you agreed it. Must be non-empty; its content is not checked.
resolutionYesShort title for the agreed outcome, for example sequenced: provider abstraction lands first, or split scopes. No fixed vocabulary.
conflict_idYesThe conflict to resolve (cfl_...), from check_conflicts, publish_intent or status.

TDQS

A4.7/5.0
Behavior5/5

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

With only generic annotations (all false), the description carries the full burden and does so thoroughly. It discloses that agreement and message ids are not verified, that either party may resolve alone, the state transition to RESOLVED, the effect on both intents' acceptance gates, that code is not changed, failure conditions, and the return value. This goes far beyond what annotations provide.

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

Conciseness5/5

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

The description is information-dense yet every sentence earns its place: purpose, access constraint, safety warning, alternatives, side effects, failure mode, and return value. It is front-loaded with the core purpose and avoids filler, making it easy for an agent to scan and apply.

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

Completeness5/5

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

Given the tool's mutation semantics, the lack of an output schema, and minimal annotations, the description is complete. It covers the state change, failure conditions, constraints, and what is returned. An agent has enough information to invoke the tool safely and correctly without needing additional details.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters in detail. The description adds some operational context (e.g., only a party may resolve, decision recorded under agent id), but it does not materially extend parameter meaning beyond what the schema's property descriptions already state. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific action ('Record an audited resolution decision') on a specific resource ('durable cfl_* conflict') and explains the goal ('so blocked work can proceed'). It also differentiates from discard_work, making the tool's unique role unmistakable.

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

Usage Guidelines5/5

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

It explicitly tells the agent when to use the tool ('resolve only after the other party agrees'), which tool to use first ('Use coordinate_with_agent first'), and which alternative to choose instead ('discard_work instead when one side is simply dropping its work'). This is clear, actionable guidance with exclusions and alternatives.

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

run_verificationRun a trusted verification checkA

Run one named check from the trusted Foremerge registry of the repository this store is bound to. Raw commands are intentionally not accepted over MCP, and the registry cannot be selected by the caller or the server's working directory. Use it after publish_changeset and before accept_changeset; acceptance relies on this result, not on tests you report yourself. The check's command runs in the ChangeSet's worktree with the registry's timeout. It may create only generated files excluded from the fingerprint: changing any other file fails with STALE_CHANGESET, and excluded files left from an earlier run fail with CHECK_FAILED before it starts. The worktree must still match the fingerprint recorded at publication, or the call fails with STALE_CHANGESET and you must publish again. A pass moves the ChangeSet to VALIDATED; a failure leaves or returns it to PROVISIONAL. Returns the validation record: whether it passed, the exit code, captured stdout and stderr, the duration, and the fingerprint it ran against.

NameRequiredDescriptionDefault
checkYesName of a check an operator registered with foremerge checks set, for example test. Unknown names are rejected.
changeset_idYesThe ChangeSet (chg_...) to verify. Must be PROVISIONAL or VALIDATED.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide no hints (all false), so the description carries the full burden and excels. It discloses side effects: may create generated files, moves state to VALIDATED or returns to PROVISIONAL, specific failure modes (STALE_CHANGESET, CHECK_FAILED), fingerprint requirements, and the registry timeout. This goes well beyond what annotations offer.

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

Conciseness5/5

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

Though lengthy, every sentence earns its place: purpose, usage timing, constraints, error conditions, state transitions, and return value are all covered. Front-loaded with purpose and usage, structured logically. No filler.

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

Completeness5/5

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

For a state-changing verification tool with error conditions and a return record, the description is complete. It covers prerequisites (fingerprint match), timing relative to siblings, error semantics, state outcomes, and the returned validation record. An agent can invoke it correctly without further info.

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

Parameters3/5

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

Schema covers both parameters fully (100% coverage) with descriptions including format and state constraints. The description reiterates the changeset state requirement but adds no new parameter-specific meaning beyond what the schema provides, so baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('run') and resource ('one named check from the trusted Foremerge registry'), and explicitly differentiates from siblings by noting it is for verification between publish and accept, and that raw commands are not accepted. An agent can clearly identify this as the verification step.

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

Usage Guidelines5/5

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

Explicitly states when to use: 'Use it after publish_changeset and before accept_changeset; acceptance relies on this result, not on tests you report yourself.' Also says raw commands are not accepted, guiding away from any alternative that might accept free-form commands. No ambiguity.

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

start_workStart claimed workA

Mark your claimed intent as being implemented. Call it after claim_work, immediately before you begin changing files. It moves the intent from CLAIMED to IN_PROGRESS and fails in any other state, or if you do not own the intent. It does not create or renew claims; use claim_work for that. Returns the updated intent with open_conflicts, the count and ids of its OPEN or COORDINATING conflicts; check their severity with check_conflicts before going further.

NameRequiredDescriptionDefault
agent_idYesYour agent id (agt_...). Must own the intent.
intent_idYesYour CLAIMED intent (int_...).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (non-read-only, non-destructive, non-idempotent), and the description adds state-machine semantics, ownership requirements, failure modes, and a follow-up dependency (check_conflicts before proceeding). This is rich behavioral context beyond what annotations provide.

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

Conciseness5/5

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

Every sentence carries unique information: purpose, timing, failure semantics, alternative tool, and return value. The state transition is front-loaded and there is no filler.

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

Completeness5/5

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

Although there is no output schema, the description documents the return value (updated intent with open_conflicts count and ids) and directs the agent to check_conflicts next. Nothing needed to invoke or interpret the call correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (agent_id, intent_id) are already documented with their ownership and CLAIMED-state requirements. The description restates the ownership constraint but adds no new syntax or format detail, so baseline 3 applies.

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

Purpose5/5

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

States a precise state transition (CLAIMED to IN_PROGRESS) with a specific verb and resource. It also explicitly names the sibling it is not (claim_work), so an agent can distinguish it without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit timing ('after claim_work, immediately before you begin changing files'), explicit failure conditions ('fails in any other state, or if you do not own the intent'), and an explicit exclusion with an alternative ('does not create or renew claims; use claim_work for that').

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

statusRead coordinator statusA
Read-onlyIdempotent

Get the whole coordination picture in one call, taken from a single consistent read: active agents, all intents grouped by lifecycle status, unexpired claims, OPEN or COORDINATING conflicts with both parties named, and ChangeSets grouped by status. Read-only and takes no arguments. Use it to orient at the start of a session or before choosing work. Use query_work to filter by agent, status or scope, and get_intent or get_changeset for full detail on one item.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive. The description adds value by stating it is a single consistent read and enumerating the exact content included, which helps the agent understand what the returned picture covers without an output schema.

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

Conciseness5/5

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

The description is front-loaded with the core capability and content list, then adds usage guidance and alternatives. Every sentence serves a distinct purpose: what, safety, when, and what else to use.

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

Completeness5/5

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

For a no-argument read tool, the description completely specifies what the result includes, its consistency property, and when to call it. It also points to sibling tools for filtering and detail, so an agent has enough context to choose correctly.

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

Parameters5/5

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

There are zero parameters, and the description explicitly says 'takes no arguments,' leaving no ambiguity. The schema fully covers parameter semantics, and the description reinforces that no arguments should be supplied.

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

Purpose5/5

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

The description states a specific purpose: get the whole coordination picture in one call, enumerating active agents, intents grouped by lifecycle status, claims, conficts, and ChangeSets. It also differentiates from siblings by point out query_work for filtering and get_intent/get_changeset for detail.

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

Usage Guidelines5/5

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

It explicitly says when to use it: orient at session start or before choosing work. It also names alternatives for other needs: query_work for filtering and get_intent/get_changeset for single item detail, making routing clear.

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

Tool Schema Changelog

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

  1. 2 tool updatesv0.6.0
    • Changeddiscard_work2 fields changed
      • addedInput schema / properties / landed_ref
        Added value: +{
        +  "description": "Only for work that reached Git: the commit, branch or tag it landed in. Refused with INVALID_INPUT if it does not resolve to a commit, with TARGET_DIVERGED if the intent published a ChangeSet whose changes it does not hold, by ancestry or by content as record_commit checks, and with STALE_CHANGESET if that ChangeSet was published with uncommitted changes or before the repository's first commit.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / reason / description
        Previous value: -"Why the work is being abandoned. Required and recorded in the event log."New value: +"Why the work is being closed: why it was abandoned, or how it landed. Required and recorded in the event log."
    • Changedpublish_changeset1 field changed
      • changedInput schema / properties / dependencies / description
        Previous value: -"Intent ids (int_...) this change builds on, and the dependency list acceptance enforces. accept_changeset refuses with UNSATISFIED_DEPENDENCY unless each is ACCEPTED or COMMITTED and its accepted commit is in this change's Git history. Intent ids only: not package or library names."New value: +"Intent ids (int_...) this change builds on, and the dependency list acceptance enforces. accept_changeset refuses with UNSATISFIED_DEPENDENCY unless each is ACCEPTED or COMMITTED and its accepted commit (or, once COMMITTED, its integration commit) is in this change's Git history. Intent ids only: not package or library names."
  2. 16 tool updatesv0.4.3
    • Changedaccept_changeset2 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"The ChangeSet to accept (chg_...), as returned by publish_changeset."
      • addedInput schema / properties / git_ref / description
        Added value: +"Optional commit to accept. Defaults to the ref recorded at publication, then the worktree HEAD. Whatever it names must resolve to the current worktree HEAD."
    • Changedcheck_conflicts6 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Optional caller agent id. Informational only; it does not change which work is compared."
      • addedInput schema / properties / intent / description
        Added value: +"Free-form summary of work not yet published, for a what-if check. Provide this or intent_id. Passing an intent id here is rejected; use intent_id."
      • addedInput schema / properties / intent_id / description
        Added value: +"A published intent (int_...) to check. Provide this or intent."
      • addedInput schema / properties / scopes / description
        Added value: +"Scopes to compare, each with the operation you would perform. With intent text, these are the proposed scopes. With intent_id, non-empty scopes replace the intent's own for this check only."
      • addedInput schema / properties / scopes / items / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scopes / items / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
    • Changedclaim_work7 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / intent_id / description
        Added value: +"Your intent (int_...) that the claims belong to."
      • addedInput schema / properties / lease_seconds / description
        Added value: +"How long the claim lasts before it expires, from 60 seconds to 24 hours. Default one hour. Claim again to renew."
      • addedInput schema / properties / reason / description
        Added value: +"Optional note shown to other agents explaining why you hold the claim."
      • addedInput schema / properties / scopes / description
        Added value: +"The scopes to claim. Use the scopes declared on the intent; operations are not repeated here."
      • addedInput schema / properties / scopes / items / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scopes / items / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
    • Changedcoordinate_with_agent5 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"Optional ChangeSet (chg_...) this message is about. Must exist."
      • addedInput schema / properties / conflict_id / description
        Added value: +"Optional stored conflict (cfl_...) this message is about. An eph_ id from a what-if check_conflicts is rejected with NOT_FOUND. May be combined with changeset_id."
      • addedInput schema / properties / from_agent_id / description
        Added value: +"Your agent id (agt_...)."
      • addedInput schema / properties / message / description
        Added value: +"What you propose or need, in plain language."
      • addedInput schema / properties / to_agent_id / description
        Added value: +"The recipient's agent id (agt_...), for example the owner of the conflicting intent."
    • Changeddiscard_work3 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / intent_id / description
        Added value: +"The intent (int_...) to discard."
      • addedInput schema / properties / reason / description
        Added value: +"Why the work is being abandoned. Required and recorded in the event log."
    • Changedget_changeset1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The ChangeSet id (chg_...)."
    • Changedget_intent1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The intent id (int_...)."
    • Changedpublish_changeset18 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / contracts / description
        Added value: +"Named interfaces or agreements this change affects, for example payment-provider."
      • addedInput schema / properties / decisions / description
        Added value: +"Design decisions a reviewer or later agent should know about."
      • addedInput schema / properties / decisions / items / properties / alternatives / description
        Added value: +"Options you considered and rejected."
      • addedInput schema / properties / decisions / items / properties / rationale / description
        Added value: +"Why you chose it."
      • addedInput schema / properties / decisions / items / properties / title / description
        Added value: +"The decision, for example Use a provider trait."
      • addedInput schema / properties / dependencies / description
        Added value: +"Intent ids (int_...) this change builds on, and the dependency list acceptance enforces. accept_changeset refuses with UNSATISFIED_DEPENDENCY unless each is ACCEPTED or COMMITTED and its accepted commit is in this change's Git history. Intent ids only: not package or library names."
      • addedInput schema / properties / files / description
        Added value: +"Changed file paths. Left empty, they are inferred from uncommitted changes only, so list them for committed work."
      • addedInput schema / properties / git_ref / description
        Added value: +"Candidate commit. Omit it: it defaults to the worktree's HEAD, and acceptance rejects any other commit with STALE_CHANGESET."
      • addedInput schema / properties / intent_id / description
        Added value: +"The intent (int_...) this implementation fulfils."
      • addedInput schema / properties / provenance / description
        Added value: +"Optional JSON object of your own context, such as a prompt or task reference. Foremerge adds Git provenance under provenance.git."
      • addedInput schema / properties / summary / description
        Added value: +"What the change does, in one or two sentences."
      • addedInput schema / properties / symbols / description
        Added value: +"Code symbols added or changed. Left empty, they are inferred from uncommitted changes only, so list them for committed work."
      • addedInput schema / properties / tests / description
        Added value: +"Tests you ran yourself. Recorded as history only; acceptance relies on run_verification, not on this list."
      • addedInput schema / properties / tests / items / properties / command / description
        Added value: +"The command you ran, for example cargo test."
      • addedInput schema / properties / tests / items / properties / status / description
        Added value: +"Its outcome as you observed it, for example passed or failed."
      • addedInput schema / properties / tests / items / properties / summary / description
        Added value: +"Optional short note on what ran or failed."
      • addedInput schema / properties / worktree / description
        Added value: +"Path of the Git worktree holding the change. Defaults to your registered worktree, then the server's working directory. Must belong to your registered repository."
    • Changedpublish_intent9 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...) from register_agent."
      • addedInput schema / properties / depends_on / description
        Added value: +"Intent ids (int_...) this work relies on, recorded for the coordination graph and reported as dependents by query_work. Not checked or enforced: to make acceptance require them, also list them in publish_changeset's dependencies."
      • addedInput schema / properties / metadata / description
        Added value: +"Optional JSON object of extra context stored with the intent."
      • addedInput schema / properties / rationale / description
        Added value: +"Optional reason for the change."
      • addedInput schema / properties / scopes / description
        Added value: +"Every scope this work will touch, each with the operation performed on it. Conflict detection relies on these, so declare them all."
      • addedInput schema / properties / scopes / items / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scopes / items / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
      • addedInput schema / properties / summary / description
        Added value: +"What you are going to change, in one sentence."
      • addedInput schema / properties / task / description
        Added value: +"Short name of the task this belongs to, for example payments-provider. Intents with the same task text share one task record."
    • Changedquery_work6 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Only intents owned by this agent (agt_...)."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of intents to return, from 1 to 500. Default 50."
      • addedInput schema / properties / scope / description
        Added value: +"Intents that declared, or ever claimed, a matching scope. Symbols match loosely, on their last two :: segments ignoring namespace and case, so unrelated same-named symbols can appear."
      • addedInput schema / properties / scope / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scope / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
      • addedInput schema / properties / status / description
        Added value: +"Only intents in this lifecycle status: INTENT, CLAIMED, IN_PROGRESS, PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or DISCARDED. Case-insensitive."
    • Changedrecord_assessment5 fields changed
      • addedInput schema / properties / action / description
        Added value: +"What you will do next. proceeding: continue as planned. rescoping: change your scopes first. waiting: hold until the other work lands. abandoning: drop your intent (then call discard_work)."
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own intent_id."
      • addedInput schema / properties / intent_id / description
        Added value: +"Your intent (int_...) whose publish returned the related_work."
      • addedInput schema / properties / rationale / description
        Added value: +"Why you reached that verdict, specific enough for a later reader to check."
      • addedInput schema / properties / related_intent_id / description
        Added value: +"The other intent (int_...) from the related_work entry you are assessing. It may belong to another agent or be one of your own."
    • Changedrecord_commit2 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"An ACCEPTED ChangeSet (chg_...)."
      • addedInput schema / properties / git_ref / description
        Added value: +"The landed commit, as a SHA or ref such as main, resolved in the ChangeSet's worktree."
    • Changedregister_agent4 fields changed
      • addedInput schema / properties / capabilities / description
        Added value: +"Optional skills or areas, for example rust or payments, shown to other agents."
      • addedInput schema / properties / model / description
        Added value: +"Optional model identifier, for example the LLM you are running as."
      • addedInput schema / properties / name / description
        Added value: +"A readable name for this agent, for example payments-stripe."
      • addedInput schema / properties / worktree / description
        Added value: +"Path to your Git worktree, inside the repository this server is bound to. Recommended."
    • Changedresolve_conflict4 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Your intent must be one of the conflict's two parties."
      • addedInput schema / properties / conflict_id / description
        Added value: +"The conflict to resolve (cfl_...), from check_conflicts, publish_intent or status."
      • addedInput schema / properties / rationale / description
        Added value: +"Why this resolves the clash, naming the msg_ ids where you agreed it. Must be non-empty; its content is not checked."
      • addedInput schema / properties / resolution / description
        Added value: +"Short title for the agreed outcome, for example sequenced: provider abstraction lands first, or split scopes. No fixed vocabulary."
    • Changedrun_verification2 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"The ChangeSet (chg_...) to verify. Must be PROVISIONAL or VALIDATED."
      • addedInput schema / properties / check / description
        Added value: +"Name of a check an operator registered with foremerge checks set, for example test. Unknown names are rejected."
    • Changedstart_work2 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / intent_id / description
        Added value: +"Your CLAIMED intent (int_...)."
  3. 18 tool updatesv0.1.0
    • First observedaccept_changeset
    • First observedcheck_conflicts
    • First observedclaim_work
    • First observedcoordinate_with_agent
    • First observeddiscard_work
    • First observedget_changeset
    • First observedget_intent
    • First observedlist_agents
    • First observedpublish_changeset
    • First observedpublish_intent
    • First observedquery_work
    • First observedrecord_assessment
    • First observedrecord_commit
    • First observedregister_agent
    • First observedresolve_conflict
    • First observedrun_verification
    • First observedstart_work
    • First observedstatus

TDQS

A4.4/5.0

Scored across 18 tools

Disambiguation5/5

The tools map to distinct lifecycle stages: intents, claims, changesets, verification, acceptance, commit recording, coordination, and conflict handling. Read tools are explicitly differentiated as get-by-id, query/filter, or status overview, and conflict-related operations are separated into check, assess, coordinate, resolve, and discard.

Naming Consistency4/5

Almost all tools use a predictable snake_case verb_noun pattern, such as publish_intent, claim_work, run_verification, and record_commit. The main deviation is status, which is a bare noun, though the naming remains readable overall.

Tool Count4/5

The 18 tools sit slightly above the typical 3-15 range, but the server implements a multi-step coordination protocol where each tool corresponds to a distinct gate or action. It is somewhat heavy, but not obviously padded.

Completeness4/5

The coordination lifecycle is largely covered: registration, intent publication, claims, changeset publication, verification, acceptance, commit recording, conflict resolution, and discard are all present. The notable gap is that coordinate_with_agent sends messages but no MCP tool reads them, forcing recipients to use the CLI and leaving the message loop only partly closed over MCP.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server that decomposes tasks into plans with disjoint file boundaries, validates overlaps, and creates git worktrees with a ready prompt per plan.
    3
    98 npm
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Local-first code intelligence and safety layer for AI coding agents. MCP server exposes dependency graph, impact analysis, and AST-compressed repo context, backed by typed local memory, patch-scope safety gates, and git-independent transaction rollback.
    1
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    A filesystem-based MCP server for AI coding agents to coordinate work across git worktrees by claiming files, checking for conflicts, and logging progress without affecting the repository's git history.
    5
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server for orchestrating a fleet of CLI coding agents in isolated git worktrees. It exposes tools for spawning workers, sending instructions, reviewing diffs, and merging changes, with full terminal visibility.
    10 npm
    4
    MIT