他の言語: English, Español, Português, Deutsch, Français, 한국어, 简体中文, Italiano, हिन्दी · 日本語のガイド一覧
開示: Carbon Forge は 100monkeys.ai で開発しているため、作り手による説明として読んでください。このガイドは公開ドキュメント、主に Working in lanes のステップ 6 から 8 とカタログの Lanes ページをもとに当社の AI エージェントが下書きし、当社が確認しました。この日本語版は英語の原文ガイドの翻訳です。呼び出しはすべてドキュメント自身の例で、引用は英語のまま載せ、訳を添えています。ドキュメントが答えていない点は、最後の節に書いています。
ステップ 1. 何が競合になるかを知る
レーンはトランクの上に重ねたパッチの集まりで、レーン上の読み取りはそのたびに今のトランクとそれらのパッチを合成します。パッチが競合するのは "when it no longer applies to the trunk: its old text no longer matches or matches twice"(トランクにもう適用できないとき。古いテキストがもう一致しないか、2 か所で一致する)場合、またはパッチが置き換えたツリーやライブラリのエントリをトランクが変えた場合です。トランクが同じセクションを変えていても、まだ適用できるパッチは競合ではありません。読み取りはそれを移動したセクションとして報告し、"worth a reviewer's look, not a conflict."(レビュー担当が見る価値はあるが、競合ではない)。1 つのファイルの別々の部分を変えた 2 つのエージェントは、どちらもランディングします。そして、このガイドの残りが従う規則は "Nothing merges by itself."(ひとりでにマージされるものはない)です。
ステップ 2. レーンが競合していることに気づく
lanes.get は landable を返し、これは生きたパッチが 1 つ以上あって競合のない開いたレーンでだけ true になります。アプリでは、/<workspace>/lanes/<label> にあるレーンのページに Conflicts タブがあります。ポーリングしなくても、トランクへのランディングで初めてレーンが競合したとき、lane.conflict の Webhook イベントがレーンと競合している行のパスを知らせます。
ステップ 3. 競合を読む
lanes.conflicts { "label": "agent/7/fix-login" } 各行にはマージする人に必要なものが入っています。パッチ、パッチを取ったときのセクション、今のトランクのセクション、レーンの合成ビュー、そしてそれを動かしたチェンジセット(それぞれインテント、実行者、ランディング元のレーン付き)。コードツリーでは競合している各ファイルの unified diff が加わり、文法のある言語では異なるトップレベル定義の参考リストも加わりますが、これは "decides nothing"(何も決めない)。このツールは読み取り専用で、閲覧者のロールだけで使えます。アプリの Conflicts タブはトランクのテキストとレーンのテキストを、それぞれに答えるための正確な呼び出しとともに示し、"ready to copy, while the page itself decides nothing."(すぐコピーできるが、ページ自体は何も決めない)。
ステップ 4. テキストの競合に答える
lanes.resolve { "patch_id": "…", "note": "kept both sign-in options", "old_string": "…", "new_string": "…" } 答えは、理由を書いた 1 から 1,024 文字のメモ付きの新しいパッチです。これは "matched against the trunk as it stands now and bound to the hash of that state."(今のトランクと照合され、その状態のハッシュに結び付けられる)。古いパッチは履歴として残り、superseded の印が付きます。ツリーの競合も同じように upserts、removals、patches で、ライブラリエントリは sha256 で答えます。順番に答えてください。同じエンティティへの後のパッチは、前のパッチが解決されるまで待ちます。
ステップ 5. またはパッチを捨てる
lanes.drop_patch { "patch_id": "…" } パッチがやろうとしたことをトランクがすでに済ませているとき、またはパッチがもう要らないときは、代わりに捨てます。パッチを取った対象のエンティティがもうない場合、ドキュメントの拒否メッセージは解決ではなくパッチを捨てるよう伝えます。
ステップ 6. 移動の競合に答える
lanes.resolve { "patch_id": "…", "note": "kept the trunk's rename and moved on from it", "to_path": "guides/sign-in" } ページの名前を変えるレーンは、その後トランクが同じページを移動したとき、トランクが新しいパスをすでに使っているとき、またはページがもうないときに競合します。to_path で、タイトルも変えるべきなら title も付けて答えます。解決は今トランクにあるパスに結び付くので、後でトランクが移動すれば、それも古くなります。
ステップ 7. まとめた作業の競合に答える
lanes.merge { "from": "agent/8/tests", "into": "agent/7/fix-login", "intent": "assemble the login fix" } リードのエージェントは、ランディングの前に複数のエージェントのレーンを 1 つにまとめます。こうして運ばれたパッチは、受け取る側のレーンが同じところを変えていると競合し、lanes.conflicts は、それが今よりどころにしている受け取る側のレーンの前のパッチを moved_by として示します。その解決はトランクだけでなく、受け取る側のレーンのビューに答えます。
ステップ 8. まずドライランをしてからランディングする
lanes.land { "label": "agent/7/fix-login", "intent": "fix: accept magic links", "dry_run": true }
lanes.land { "label": "agent/7/fix-login", "intent": "fix: accept magic links" } ランディングは自身のトランザクションの中で改めて検査され、何かが動いていれば、すべての競合を示したうえで丸ごと拒否されます。解決はトランクのある正確な状態に答えるものなので、ランディングの前にトランクがそのセクションを動かすと解決は古くなり、ランディングは次のメッセージで拒否されます。
resolution <id> was resolved against <hash>; the trunk's section is now <hash> そのときは lanes.conflicts を読み直し、新しい状態に答えてください。ランディングルールのある保護されたトランクでは、承認の後に行った解決はそれらの承認を "count for nothing"(無効にする)ので、承認は最後の答えの後にします。ランディングを idempotency_key 付きで送れば、タイムアウト後の再試行は 2 度ランディングするのではなく、最初のランディングの結果を返します。
コードの変更とそのドキュメントを一緒に運ぶレーンについては、ガイドコードの変更とそのドキュメントを 1 つのチェンジセットでランディングするを読んでください。
ドキュメントが答えていないこと
- ベースのセクションを取り戻せないときにどうするか。競合の行はそれを探して最大 200 リビジョンさかのぼり、見つからなければ
unknownを報告しますが、そこからどう答えるかは書かれていません。 dry_runのランディングが何を返すか。ガイドは呼び出しを示していますが、応答は示していません。lane.conflictイベントが、レーンとパス以外に何を運ぶか。