Interlock · Experiment E6실험 E6
Three agents changing one backend at the same time세 에이전트가 같은 백엔드를 동시에 고칠 때
The closest of our experiments to real work: three Claude Code agents start together on a small shop backend, one of them changes a function the others depend on, and their branches are merged one after another. 실제 작업에 가장 가까운 실험입니다. Claude Code 에이전트 셋이 작은 쇼핑 백엔드에서 동시에 시작하고, 그중 하나는 다른 에이전트가 쓰는 함수를 바꾸며, 세 브랜치를 차례로 병합합니다.
Run on 2026-10-18 with Interlock V3.0.0 and real Claude Code 2.1.302 sessions (Sonnet 5.5): 22 runs of three agents, 66 sessions, including a first round before a parser fix.2026-10-18, Interlock V3.0.0과 실제 Claude Code 2.1.302 세션(Sonnet 5.5)으로 실행. 에이전트 셋씩 22회, 세션 66개(파서 수정 전 1차 포함). Raw results (JSON)원자료 (JSON)
Method방법
- Backend: a demo shop with auth, orders, billing, a store and pytest tests (12 files). Three agents start at the same time, each in its own worktree:백엔드: auth·orders·billing·store와 pytest 테스트가 있는 데모 쇼핑몰(파일 12개). 세 에이전트가 각자 워크트리에서 동시에 시작합니다.
- A adds a one-time code to
loginand updates its callers and tests.A:login에 일회용 코드를 추가하고 호출부와 테스트를 고칩니다. - B adds
cancel_order.B:cancel_order를 추가합니다. - C adds
quick_checkout, which callslogin.C:login을 부르는quick_checkout을 추가합니다.
- A adds a one-time code to
- Merge: A, then B, then C. A branch that conflicts is left out, and the tests run on main.병합: A, B, C 순서로 병합합니다. 충돌하는 브랜치는 빼고, main에서 테스트를 돌립니다.
- Rounds: four runs per condition in each round. In round 2 the headless agents had no permission to run pytest; round 3 allowed
python -m pytestand used the build after an independent review's fixes. Round 1 (six runs, before a parser fix) is in the raw data.차수: 차수마다 조건별 4회. 2차에서는 헤드리스 에이전트가 pytest를 실행할 권한이 없었고, 3차는python -m pytest를 허용하고 독립 리뷰 결함을 고친 빌드로 돌렸습니다. 1차(6회, 파서 수정 전)는 원자료에 있습니다.
Results결과
| Round · condition차수 · 조건 | Branches merged without conflict충돌 없이 병합된 브랜치 | Tests pass on mainmain 테스트 통과 | Broken login calls on mainmain의 깨진 login 호출 |
C's PR held until A mergedC의 PR을 A 뒤로 보류 | Avg. cost평균 비용 | Avg. time평균 시간 |
|---|---|---|---|---|---|---|
| 2 · No Interlock2차 · Interlock 없음 | 8/12 | 4/4 (C left out)4/4 (C 제외) | 0 | – | $0.33 | 26 s |
| 2 · Interlock V3 | 12/12 | 1/4 | 2 | 2/4 | $0.44 | 52 s |
| 3 · No Interlock3차 · Interlock 없음 | 8/12 | 4/4 (C left out)4/4 (C 제외) | 0 | – | $0.29 | 24 s |
| 3 · Interlock V3 | 12/12 | 3/4 | 0 | 4/4 | $0.45 | 65 s |
- Without Interlock, C's branch hit a merge conflict in all 8 runs. Main stayed green only because C's work was left out.Interlock이 없으면 C의 브랜치는 8번 모두 병합 충돌이 났습니다. main이 녹색인 것은 C의 작업이 빠졌기 때문입니다.
- With Interlock, all three branches merged without conflict in all 8 runs.Interlock이 있으면 8번 모두 세 브랜치가 충돌 없이 합쳐졌습니다.
- In round 3, C's calls fit A's declared signature in all 4 runs, C's pull request was held until A's merged in 4 of 4, and no broken
logincall reached main. The one red main was a meaning mismatch, not a signature problem: C's test used a one-time code different from A's placeholder. The merge gate's test step flagged it on C's pull request, but this harness records the gate's verdict and merges every branch that git can merge anyway.3차에서 C의 호출은 4번 모두 A가 선언한 시그니처에 맞았고, C의 PR은 4번 모두 A가 병합될 때까지 보류됐으며, main에 깨진login호출은 하나도 들어가지 않았습니다. main이 빨간 1번은 시그니처 문제가 아니라 의미 불일치였습니다. C의 테스트가 A의 임시 값과 다른 일회용 코드를 썼습니다. 병합 게이트의 테스트 단계가 C의 PR에서 이를 표시했지만, 이 실험 도구는 게이트 판정을 기록만 하고 git이 합칠 수 있는 브랜치는 모두 병합합니다. - Of the 7 refusals in round 3, 5 were B and C adding tests at the same spot in
tests/test_shop.pyand 2 were calls to the old signature. No agent stopped after a refusal.3차의 거부 7건 중 5건은 B와 C가tests/test_shop.py의 같은 자리에 테스트를 넣으려 한 경우, 2건은 옛 시그니처 호출이었습니다. 거부 뒤 멈춘 에이전트는 없었습니다.
What to watch주의할 점
- Coordination costs time and tokens here. In round 3, cost per run was 58% higher and time 2.7 times longer; turns per agent rose from 7.3 to 15.6. Following the coordination rules, handling refusals and checking tests that fail on a branch until A merges all add turns. We did not log tool calls, so we cannot split the cost further.이 실험에서는 조정에 시간과 비용이 듭니다. 3차에서 회당 비용은 58% 늘었고 시간은 2.7배 걸렸으며, 에이전트당 턴은 7.3에서 15.6으로 늘었습니다. 조정 규칙을 따르고, 거부를 처리하고, A가 병합되기 전이라 브랜치에서 실패하는 테스트를 확인하는 과정이 모두 턴을 더합니다. 도구 호출별 기록을 남기지 않아 더 나눠 볼 수는 없습니다.
- Round 2 let two old calls through. On the build before the review's fixes, C wrote
loginwith the old signature in 2 of 4 runs, and the edit check did not refuse either. The merge gate flagged both on C's pull request ("missing otp"), but because this harness merges regardless of the gate, both reached main and failed the tests. We kept no timestamps, so we cannot tell whether C wrote the call before A declared the change. In round 3 the edit check refused C's old call twice, and C rewrote it both times.2차에서는 옛 호출 2건이 통과했습니다. 리뷰 결함을 고치기 전 빌드에서 C는 4번 중 2번login을 옛 시그니처로 썼고, 편집 검사는 둘 다 거부하지 않았습니다. 병합 게이트가 C의 PR에서 둘 다 표시했지만("missing otp"), 이 실험 도구는 게이트와 상관없이 병합하므로 둘 다 main에 들어가 테스트가 실패했습니다. 시각 기록이 없어 C가 A의 선언 전에 호출을 썼는지는 알 수 없습니다. 3차에서는 편집 검사가 C의 옛 호출을 2번 거부했고, C는 두 번 모두 고쳐 썼습니다.
Limits한계
- A small backend (12 files) and four runs per cell. Only Anthropic models were used.작은 백엔드(파일 12개), 칸마다 4회. Anthropic 모델만 썼습니다.
- E6 is 66 of the 560 live Claude Code sessions in our experiments. The Interlock source and the experiment harness are not public.E6은 전체 실험의 실제 Claude Code 세션 560개 중 66개입니다. Interlock 소스와 실험 도구는 공개하지 않습니다.