콘텐츠로 이동

에이전트 세션을 나누고, 메모리 레이어로 잇기 — 두 주의 기록

노트 · 사용 기록

에이전트 세션을 나누고, 메모리 레이어로 잇기 — 두 주의 기록

한 저장소에 에이전트 세션 10개를 두 주 동안: 세션마다 워크트리, 공유 폴더와 복사본, 그리고 세션이 배운 것을 남기는 메모리 레이어. 잘된 것과 걸린 것.

2026-10-05

VENETA는 세 갈래로 일합니다. VENETA WorldModel(통신·유통·반도체·전력·금융·공급망 에디션이 한 저장소를 공유하는 산업용 월드모델), VENETA Orchestrate(앞으로의 데이터 플랫폼), 그리고 project veneta입니다. WorldModel과 Orchestrate에는 개발자가 여러 명 있고, 개발자마다 에이전트 세션을 여러 개 띄워 일합니다. project veneta는 두 사람(이현주, 이민준)이 에이전트 세션들과 함께 만듭니다.

project veneta는 VENETA WorldModel 코어 안의 메모리·자가 개선 레이어만 따로 떼어, 일반 사용자와 기업이 쓸 수 있게 만든 것입니다. 로컬 LLM의 쓸모를 높이려는 것이고, 이것을 원하는 사용자가 있을 것이라고 봅니다. 완전 무료이고, 텔레메트리를 받지 않습니다. 사이트·앱·오픈소스 저장소는 WorldModel 저장소와 따로 있습니다.

제품 세 갈래, 개발팀 셋, 그리고 수십 개의 에이전트 세션이 한꺼번에 움직이니, 세션 하나가 다른 세션이 고치는 파일을 건드리지 않게 하는 것이 첫 번째 문제였습니다. 답은 두 가지였습니다. 세션마다 git 워크트리를 따로 주는 개발 환경, 그리고 세션이 바뀌어도 배운 것이 남는 메모리 레이어. 아래는 두 주 동안 워크스페이스 10개와 워크트리 10개로 일한 기록입니다.

세션마다 폴더를 따로 줍니다

워크트리 기반 에이전트 개발 환경은 저장소 하나를 세션마다 다른 폴더(워크트리)로 꺼내 주고, 각 세션이 자기 폴더에서만 일하게 합니다. 우리는 Orca ADE(onorca.dev)를 쓰지만, 같은 원리의 도구면 어느 것이든 됩니다. 어떤 파일을 공유하고 어떤 파일을 복사할지는 저장소 안의 설정 두 개로 정합니다.

  • 공유 폴더 — 크고 다시 만들 수 있는 폴더는 원본 체크아웃에서 심볼릭 링크로 공유합니다. 우리는 node_modules와 파이썬 가상환경 둘만 넣었습니다.
  • 세션별 복사본 — git이 추적하지 않지만 각 세션이 자기 복사본을 가져야 하는 파일. 우리는 .env.local 두 개입니다. 비밀값은 이 장비를 떠나지 않습니다.
  • 그 밖의 gitignored 산출물(프레임워크 빌드 캐시, SQLite DB)은 세션마다 따로 만들어집니다. 일부러 공유하지 않습니다.

배치는 단순합니다. WorldModel 저장소 하나에 코어와 에디션별 워크트리, 그리고 논문용으로 특정 커밋에 고정한 워크트리를 둡니다. 사이트·앱·오픈소스 저장소는 각각 워크스페이스 하나씩입니다. 세션마다 개발 서버 포트도 따로 정해 두고, 한 번만 띄우면 되는 서비스는 모든 세션이 같이 씁니다.

세션이 바뀌어도 배운 것이 남습니다

폴더를 나누면 충돌은 사라지지만, 세션은 서로 모릅니다. 어제 세션이 고친 실수, 운영자가 알려 준 예외, 지난주에 내린 결정을 오늘의 세션은 처음부터 다시 설명받아야 했습니다. 여기에 veneta의 메모리·자가 개선 레이어를 붙였습니다. 세션이 배운 규칙은 제안으로 올라오고, 사람이 승인한 것만 남으며, 승인된 규칙과 지난 결정은 다음 세션이 그대로 이어받습니다. 누가 무엇을 승인했는지는 원장(Ledger)에 남습니다. 두 가지를 같이 쓰니 폴더 격리만 할 때보다 훨씬 좋았습니다. 세션 수가 늘어도 설명을 반복하는 일이 줄었고, 되돌릴 수 있는 기록이 남았습니다.

좋았던 것

  • 세션이 서로를 밟지 않습니다. 두 주 동안 세션 10개가 같은 저장소에서 커밋했는데 머지 충돌은 작업 내용 때문이지 환경 때문은 아니었습니다.
  • 새 세션이 가볍습니다. node_modules를 다시 설치하지 않으니 워크트리 하나 만드는 데 몇 초면 됩니다. 전체 테스트 1,500여 개가 어느 세션에서나 11초에 돕니다.
  • 논문용 스냅샷을 세션으로 고정할 수 있습니다. 특정 커밋에 워크트리를 두고 그 세션에서만 측정하면, 다른 세션의 개발이 측정에 섞이지 않습니다.
  • 세션끼리 일을 넘깁니다. 코어 세션이 사이트 세션에 “이 커밋으로 다시 렌더해 달라”고 보내고, 사이트 세션이 배포 결과를 돌려주는 식입니다. 폴더가 나뉘어 있고 배운 것이 공유되어야 뜻이 있는 일입니다.

걸렸던 것

  • 심볼릭 링크를 커밋한 사건. 공유 폴더가 링크로 보이기 때문에, 한 세션에서 git add -A를 하면 링크 자체가 커밋될 수 있습니다. 9월 19일에 그렇게 올라간 링크를 데모 체크아웃이 받아 깨진 적이 있습니다. 규칙: 머지 전에 git ls-files -s | grep ^120000으로 링크 모드 파일을 확인합니다.
  • 개발 서버는 세션마다 하나, 포트는 달라야 합니다. 같은 빌드 캐시 위에 개발 서버 둘을 띄우면 깨집니다. 그래서 빌드 캐시는 공유에서 뺐고, 미리보기 서버 설정은 원본 체크아웃에 두고 각 세션의 경로와 포트를 적어 둡니다.
  • npm ci를 한 세션에서 돌리면 모든 세션의 서버가 영향을 받습니다. 공유 폴더이기 때문입니다. 설치 뒤에는 돌고 있던 개발 서버를 다시 띄워야 합니다.
  • DB는 세션마다 따로라 “같은 데이터”가 아닙니다. 한 세션에서 넣은 테스트 인시던트가 다른 세션의 테스트를 깨뜨리지는 않지만, 반대로 “저쪽에서 보이던 것”이 이쪽에는 없습니다. 측정은 항상 어느 세션의 DB인지 적습니다.
  • 공유 폴더를 늘리고 싶은 유혹. 캐시·빌드 산출물까지 공유하면 빨라 보이지만 위의 빌드 캐시 사고가 그 답입니다. 다시 만들 수 있고 쓰기가 없는 것만 공유합니다.

누구에게 권하나

저장소 하나에 에이전트 세션을 둘 이상 두는 팀이면 바로 값을 합니다. 세션이 하나뿐이면 보통의 체크아웃으로 충분합니다. 정리하면, 워크트리 격리는 “폴더를 나눠 주는 일”을 하고, 메모리 레이어는 “나뉜 세션이 배운 것을 잇는 일”을 합니다. 포트·DB·서버를 세션마다 어떻게 둘지는 팀의 규칙이 정합니다. 우리 규칙 네 줄은 위에 있습니다.

관련 노트: DGX Spark 운영 노트 · 로컬 LLM 고르기