저는 2년 넘게 코딩 에이전트(coding agents)를 사용해 개발해 왔습니다.
여러 에이전트를 병렬로 실행할 때 개발자들이 저지르는 한 가지 실수가 있습니다:
그들은 각 에이전트에게 코드의 자체 브랜치(branch)를 제공하지만, 모든 에이전트가 동일한 공유 데이터에 직접 쓰도록 허용합니다.
예를 들어, Claude Code와 Codex가 모두 같은 레코드(record)의 작업을 맡아 동시에 읽었다고 가정해 봅시다. Codex가 먼저 완료되어 변경 사항을 저장합니다. Claude Code는 시작할 때 읽었던 복사본으로 여전히 작업하고 있으며, 이 복사본은 이제 오래된 상태입니다. 이것이 저장될 때, 그 오래된 복사본을 다시 작성하여 Codex의 변경 사항을 지워버립니다.
두 에이전트 모두 오류를 받지 않으며, 데이터를 조회하는 다음 에이전트는 Codex가 수행한 작업을 결코 볼 수 없습니다.
코드(Code)는 모든 변경 사항이 브랜치에 기록되고 병합(merge) 시점에서 검사되기 때문에 이러한 문제가 없습니다. 하지만 데이터를 다루는 에이전트는 병렬 스택(parallel stack)을 가지고 있지 않습니다.
마침내 개발자들이 Git 모델이 내장된 그래프 데이터베이스를 오픈 소스화했습니다.
Omnigraph는 에이전트의 데이터를 Git가 코드를 버전 관리하는 방식대로 버전 관리하는 오픈 소스 그래프 데이터베이스입니다. 각 에이전트는 자체 브랜치에 작성하며, 모든 병합은 메인(main) 최신 버전을 기준으로 확인된 후에 적용됩니다.
레포지토리 주소는 다음과 같습니다: https://t.co/7wZg7yh0H3
(별표를 누르는 것을 잊지 마세요 🌟)
아래 이미지는 표준 그래프 DB와 Omnigraph를 비교합니다:
[IMG:N]
표준 그래프 DB:
- 모든 에이전트가 하나의 라이브(live) 그래프에 제자리에서 작성합니다.
- 가장 마지막에 쓰인 것이 승리하며, 심지어 오래된 복사본에서 온 경우에도 그렇습니다.
- 다음 쿼리는 혼합된 컨텍스트를 읽기 때문에 최종 답변은 오래된 변경 사항에 의존하게 됩니다.
Omnigraph:
- 정책 게이트(policy gate)가 메인에 대한 직접적인 쓰기를 차단합니다.
- 각 에이전트는 병합될 때까지 자체 브랜치에 작성하며 격리됩니다.
- 병합 검사는 Claude Code가 오래된 버전에서 시작했음을 확인하고, 충돌을 표시한 후, Claude Code는 최신 메인(main)으로부터 재시도합니다.
- 모든 병합은 diff하거나 롤백할 수 있는 커밋(commit)이 됩니다.
이것은 Rust로 작성되었으며, 에이전트들은 MCP, TypeScript SDK 또는 CLI를 통해 연결됩니다.
더 깊이 알고 싶다면, Avi가 공유 에이전트 데이터에 단순히 행 잠금(row locks)뿐만 아니라 브랜치, diff, 병합 검사가 필요한 이유에 대한 전체 분석을 작성했습니다.
이 글은 두 개의 Claude Code 에이전트를 사용한 실제 실행 과정을 다루며, 병합 거부(refused merge)부터 깔끔한 재시도(clean retry)까지의 과정이 담겨 있습니다. 아래에서 확인해 보세요.
아래 내용을 읽어보세요.
https://t.co/Qks4NHoghv