Skip to content

Anthropic built Scion for itself. Carbon Forge is yours →

Carbon Forge
Menu

Anleitung

Einen Lane-Konflikt in Carbon Forge beantworten

Zwei Agenten bearbeiten dieselbe Seite. Einer landet zuerst. Carbon Forge rät nicht, was der zweite gemeint hat: Es benennt den Konflikt, zeigt beide Seiten und wartet auf eine Antwort, die an den Trunk gebunden ist, den die antwortende Person tatsächlich gelesen hat.

Auch auf: English, Español, Português, 日本語, Français, 한국어, 简体中文, Italiano, हिन्दी · Alle Anleitungen auf Deutsch

Offenlegung: Wir entwickeln Carbon Forge bei 100monkeys.ai, lesen Sie dies also als Bericht des Herstellers. Einer unserer KI-Agenten hat diese Anleitung aus der öffentlichen Doku (auf Englisch) entworfen, vor allem den Schritten 6 bis 8 von Working in lanes und der Katalogseite Lanes, und das Unternehmen hat sie geprüft; diese deutsche Ausgabe ist eine Übersetzung der englischen Originalanleitung. Jeder Aufruf ist das eigene Beispiel der Doku; Zitate bleiben auf Englisch, mit der Übersetzung daneben. Wo die Doku eine Frage offen lässt, sagt es der letzte Abschnitt.

Schritt 1. Wissen, was als Konflikt zählt

Eine Lane ist eine Menge von Patches über dem Trunk, und jeder Lesezugriff auf sie setzt den Trunk, wie er jetzt steht, mit diesen Patches zusammen. Ein Patch ist im Konflikt, "when it no longer applies to the trunk: its old text no longer matches or matches twice" (wenn er nicht mehr auf den Trunk passt: sein alter Text passt nicht mehr oder passt zweimal), oder wenn der Trunk einen Baum- oder Bibliothekseintrag geändert hat, den der Patch ersetzt hat. Ein Patch, der noch passt, ist kein Konflikt, selbst wenn der Trunk denselben Abschnitt geändert hat; der Lesezugriff meldet ihn als verschobenen Abschnitt, "worth a reviewer's look, not a conflict." (einen Blick beim Review wert, kein Konflikt.) Zwei Agenten, die verschiedene Teile einer Datei ändern, landen beide. Und die Regel, der der Rest dieser Anleitung folgt: "Nothing merges by itself." (Nichts merged von selbst.)

Schritt 2. Bemerken, dass eine Lane im Konflikt ist

lanes.get liefert landable, das nur für eine offene Lane mit mindestens einem lebenden Patch und ohne Konflikt wahr ist. In der App hat die Seite der Lane unter /<workspace>/lanes/<label> einen Tab Conflicts. Ohne Polling nennt ein Webhook-Ereignis lane.conflict die Lane und die Pfade ihrer Konfliktzeilen, sobald eine Landung auf dem Trunk sie zum ersten Mal in Konflikt bringt.

Schritt 3. Den Konflikt lesen

lanes.conflicts { "label": "agent/7/fix-login" }

Jede Zeile trägt, was jemand zum Zusammenführen braucht: den Patch; den Abschnitt, wie er stand, als der Patch genommen wurde; den Abschnitt des Trunks jetzt; die zusammengesetzte Sicht der Lane; und die Changesets, die ihn bewegt haben, jedes mit Intent, Akteur und der Lane, die es gelandet hat. Für einen Code-Baum fügt die Zeile ein Unified Diff jeder Konfliktdatei hinzu und, für eine Sprache mit Grammatik, eine beratende Liste der abweichenden Top-Level-Definitionen, die "decides nothing" (nichts entscheidet). Das Werkzeug liest nur und braucht nur die Rolle Viewer. In der App zeigt der Tab Conflicts den Trunk-Text und den Lane-Text mit dem genauen Aufruf, um jeden zu beantworten, "ready to copy, while the page itself decides nothing." (bereit zum Kopieren, während die Seite selbst nichts entscheidet.)

Schritt 4. Einen Textkonflikt beantworten

lanes.resolve { "patch_id": "…", "note": "kept both sign-in options", "old_string": "…", "new_string": "…" }

Die Antwort ist ein neuer Patch mit einer Notiz von 1 bis 1.024 Zeichen, die sagt, warum. Er wird "matched against the trunk as it stands now and bound to the hash of that state." (gegen den Trunk, wie er jetzt steht, abgeglichen und an den Hash dieses Stands gebunden.) Der alte Patch bleibt als Verlauf erhalten, markiert als superseded. Ein Baumkonflikt wird genauso mit upserts, removals oder patches beantwortet, ein Bibliothekseintrag mit einem sha256. Antworten Sie der Reihe nach: Ein späterer Patch auf derselben Entität wartet, bis der frühere gelöst ist.

Schritt 5. Oder den Patch verwerfen

lanes.drop_patch { "patch_id": "…" }

Wenn der Trunk schon getan hat, was der Patch tun sollte, oder der Patch nicht mehr gewollt ist, verwerfen Sie ihn stattdessen. Wo die Entität, gegen die der Patch genommen wurde, nicht mehr existiert, sagt die Ablehnung der Doku, den Patch zu verwerfen statt ihn zu lösen.

Schritt 6. Einen Verschiebekonflikt beantworten

lanes.resolve { "patch_id": "…", "note": "kept the trunk's rename and moved on from it", "to_path": "guides/sign-in" }

Eine Lane, die eine Seite umbenennt, gerät in Konflikt, wenn der Trunk dieselbe Seite seitdem verschoben hat, wenn der Trunk jetzt den neuen Pfad hält oder wenn die Seite weg ist. Antworten Sie mit to_path und, wo sich der Titel ändern soll, mit title. Die Lösung ist an den Pfad gebunden, den der Trunk jetzt hält; eine spätere Verschiebung auf dem Trunk macht sie also ebenfalls veraltet.

Schritt 7. Konflikte in zusammengeführter Arbeit beantworten

lanes.merge { "from": "agent/8/tests", "into": "agent/7/fix-login", "intent": "assemble the login fix" }

Ein leitender Agent sammelt die Lanes mehrerer Agenten vor dem Landen in einer. Ein so mitgenommener Patch gerät dort in Konflikt, wo die empfangende Lane geändert hat, was er ändert, und lanes.conflicts nennt als moved_by die früheren Patches der empfangenden Lane, auf denen er jetzt steht. Seine Lösung beantwortet die Sicht der empfangenden Lane, nicht den Trunk allein.

Schritt 8. Landen, zuerst mit einem Probelauf

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" }

Die Landung wird in ihrer eigenen Transaktion erneut geprüft und als Ganzes abgelehnt, jeder Konflikt benannt, wenn sich etwas bewegt hat. Eine Lösung beantwortet genau einen Stand des Trunks; bewegt der Trunk diesen Abschnitt vor der Landung, wird die Lösung veraltet und die Landung abgelehnt mit:

resolution <id> was resolved against <hash>; the trunk's section is now <hash>

Lesen Sie dann lanes.conflicts erneut und beantworten Sie den frischen Stand. Auf einem geschützten Trunk mit Landing-Regeln gilt: Jede Lösung nach den Freigaben lässt diese "count for nothing" (nichts mehr zählen), die Freigabe kommt also nach der letzten Antwort. Senden Sie die Landung mit einem idempotency_key, dann liefert ein Wiederholungsversuch nach einem Timeout das Ergebnis der ersten Landung, statt zweimal zu landen.

Für eine Lane, die eine Codeänderung und ihre Dokumentation zusammen trägt, lesen Sie unsere Anleitung Eine Codeänderung und ihre Dokumentation in einem Changeset landen.

Was die Doku offen lässt

Keine stillen Merges. Jede Antwort hat eine Notiz.