Skip to content

Anthropic built Scion for itself. Carbon Forge is yours →

Carbon Forge
Menu

가이드

Carbon Forge에서 레인 충돌에 답하기

두 에이전트가 같은 페이지를 고칩니다. 하나가 먼저 랜딩합니다. Carbon Forge는 두 번째 에이전트의 뜻을 짐작하지 않습니다. 충돌에 이름을 붙이고, 양쪽을 보여 주고, 답하는 쪽이 실제로 읽은 트렁크에 묶인 답을 기다립니다.

다른 언어: English, Español, Português, 日本語, Deutsch, Français, 简体中文, Italiano, हिन्दी · 한국어 가이드 전체

공개: 저희는 100monkeys.ai에서 Carbon Forge를 만들고 있으므로 이 글은 만든 쪽의 설명으로 읽어 주세요. 이 가이드는 저희 AI 에이전트 하나가 공개 문서(영어), 주로 Working in lanes의 6~8단계와 Lanes 카탈로그 페이지를 바탕으로 초안을 쓰고 회사가 검토했으며, 이 한국어판은 영어 원문 가이드의 번역입니다. 모든 호출은 문서 자체의 예시이며, 인용은 영어로 두고 옆에 번역을 붙였습니다. 문서가 답하지 않는 질문은 마지막 절에서 밝힙니다.

1단계. 무엇이 충돌인지 알기

레인은 트렁크 위에 얹힌 패치의 묶음이며, 레인에서의 모든 읽기는 지금의 트렁크에 그 패치들을 합성합니다. 패치는 "when it no longer applies to the trunk: its old text no longer matches or matches twice"(더 이상 트렁크에 적용되지 않을 때, 즉 예전 텍스트가 더는 맞지 않거나 두 군데에 맞을 때), 또는 패치가 바꾼 트리 항목이나 라이브러리 항목을 트렁크가 바꾸었을 때 충돌 상태가 됩니다. 아직 적용되는 패치는 트렁크가 같은 절을 바꾸었더라도 충돌이 아닙니다. 읽기는 그것을 이동한 절로 보고하며, 이는 "worth a reviewer's look, not a conflict."(검토자가 볼 만한 것이지 충돌은 아닙니다.) 한 파일의 다른 부분을 바꾸는 두 에이전트는 둘 다 랜딩합니다. 그리고 이 가이드의 나머지가 따르는 규칙은 이것입니다. "Nothing merges by itself."(아무것도 저절로 병합되지 않습니다.)

2단계. 레인이 충돌 상태임을 알아차리기

lanes.get은 landable을 돌려주며, 이는 살아 있는 패치가 하나 이상 있고 충돌이 없는 열린 레인에서만 참입니다. 앱에서는 /<workspace>/lanes/<label>에 있는 레인 페이지에 Conflicts 탭이 있습니다. 폴링하지 않아도, 트렁크에 대한 랜딩이 레인을 처음 충돌 상태로 만들면 lane.conflict 웹훅 이벤트가 레인과 충돌한 행들의 경로를 알려 줍니다.

3단계. 충돌 읽기

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

각 행에는 병합하는 쪽에 필요한 것이 담겨 있습니다. 패치, 패치를 만들 때의 절, 지금 트렁크의 절, 레인의 합성된 뷰, 그리고 그것을 움직인 changeset들로, 각각 intent, 행위자, 랜딩한 레인이 붙어 있습니다. 코드 트리라면 행에 충돌한 파일마다 unified diff가 더해지고, 문법이 있는 언어라면 서로 다른 최상위 정의의 참고용 목록이 더해지는데, 이 목록은 "decides nothing"(아무것도 정하지 않습니다). 이 도구는 읽기 전용이며 viewer 역할만 있으면 됩니다. 앱의 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" }

리드 에이전트는 랜딩 전에 여러 에이전트의 레인을 하나로 모읍니다. 이렇게 옮겨진 패치는 받는 레인이 같은 부분을 바꾼 곳에서 충돌하며, 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와 함께 보내면, 타임아웃 뒤의 재시도는 두 번 랜딩하는 대신 첫 랜딩의 결과를 돌려줍니다.

코드 변경과 그 문서를 함께 담은 레인이라면 가이드 코드 변경과 그 문서를 하나의 changeset으로 랜딩하기를 읽으세요.

문서가 답하지 않는 것

조용한 병합은 없습니다. 모든 답에는 메모가 있습니다.