QA Agent가 기억하고 병렬로 돌기 시작한 날

26년 03월 20일

슬랙 스레드 제목부터 고쳤다

이날은 QA Agent를 “한 번 쓰고 버리는 도구”에서 “기억하고 병렬로 돌아가는 시스템”으로 바꾼 날이었다.

세 가지 작업을 했는데, 따로 보면 각자 별거 아니지만 합치면 큰 변화였다.

그 전까지 QA Agent가 슬랙에 결과를 올릴 때, 스레드 제목만 봐서는 이게 어느 시트에 대한 결과인지 알기가 어려웠다.

결과 페이지 링크도 들쭉날쭉했다.

결과를 받아보는 사람이 스레드를 열어봐야 뭔지 알 수 있으니까 불편했다.

그래서 스레드 제목에 시트 이름을 바로 노출하게 바꿨다.

그리고 테스트 결과 페이지 링크를 일관되게 맞췄다.

전날에 케이스 결과를 간결하게 줄이고 스크린샷에 페이지 URL을 넣고 케이스 제목을 검증 조건 우선으로 바꿨었다.

오늘 한 작업이랑 이어지니까, 슬랙에서 QA 결과를 받아보는 경험이 확 달라졌다.

스레드 제목만 봐도 어느 시트인지 알고 결과 링크를 타고 가면 바로 해당 페이지를 볼 수 있다.

CLI 매번 띄우던 걸 서버 세션으로

근데 제목 정리보다 더 큰 작업은 실행 방식을 바꾼 거다.

그 전까지는 QA Agent가 테스트를 돌릴 때마다 opencode를 CLI로 새로 띄웠다.

프로세스를 새로 시작하니까 컨텍스트가 날아가고 콜드 스타트 비용이 매번 들었다.

케이스가 늘어나면서 병렬 실행이랑 컨텍스트 재사용에 한계가 보이기 시작했다.

그래서 opencode를 서버로 띄워서 쓰는 걸로 바꿨다.

구조를 잡았다.

  • 계획을 담당하는 세션 하나를 따로 만들고 - 실행 Lane마다 각자 세션을 따로 쓴다

여기서 Lane은 병렬 실행 단위다.

Planner가 케이스 특성에 맞춰 1~5개 사이에서 Lane 개수를 정한다.

그 전까지는 Lane들이 세션을 공유했는데, 같은 계정으로 테스트하는 Lane끼리 서로 상태를 밟아버리는 문제가 있었다.

그래서 Lane마다 세션을 분리했다.

서버 세션이 유지되니까, Lane이 테스트하면서 알아낸 페이지 정보를 그 세션 안에서 계속 들고 있다.

매번 처음부터 다시 알아내지 않아도 된다.

이게 며칠 뒤에 붙을 멀티 에이전트 구조의 전제 조건이 됐다.

다음 날에 이 Lane 세션 분리 원칙을 확정했다. Lane은 절대 세션을 공유하지 않는다.

그리고 Context-Gateway라는 opencode 플러그인 설계까지 이어졌다.

학습한 지식을 코드 저장소 밖으로

마지막 작업은 저장소 구조 정리였다.

QA Agent가 돌면서 쌓이는 데이터가 세 종류 있었다.

Fixture Knowledge, 에이전트 스킬, Planning 캐시다.

전부 런타임에 점점 쌓이는 데이터인데, 이걸 코드 저장소 안에 두고 있었다.

그러니까 문제가 두 가지 생겼다.

하나는 git이 이 런타임 데이터를 계속 트래킹하니까 저장소가 더러워지고 머지 충돌이 났다.

다른 하나는 더 심각했는데, 저장소를 클린하게 다시 받으면 학습한 지식이 싹 날아간다는 거다.

한참 돌려서 쌓은 실행 지식이 깃 클론 한 번이면 사라지니까 문제였다.

Fixture Knowledge

Fixture Knowledge는 실행 지식이다.

며칠 전에 JSON에서 SQLite로 바꾸면서 URL 단위로 조회할 수 있게 된 상태였다.

같은 페이지를 다시 테스트하면 이전에 알아낸 로그인 단계, 셀렉터, 함정 같은 걸 다시 학습하지 않아도 된다.

에이전트 스킬

에이전트 스킬은 성공한 실행 결과에서 패턴을 뽑아내서 도메인 범용으로 승격시킨 거다.

어제 이 수명주기를 정의했었다.

성공 케이스의 실행 지식을 스킬로 쌓고 다음 실행 때 Planner가 조회해서 쓰는 구조다.

Planning 캐시

Planning 캐시는 어제 만든 시트 단위 캐시다.

같은 시트를 다시 실행하면 전체 플래닝을 생략하고 바뀐 케이스만 부분 재계획한다.

이 세 가지를 전부 코드 저장소 밖으로 뺐다.

런타임 지식은 저장소와 무관하게 유지되고 코드 저장소는 깔끔하게 유지된다.

마무리

세 작업이 전부 이어져 있었다.

슬랙 출력을 자기 설명적으로 만들고 실행을 서버 세션 기반으로 바꾸고 학습한 지식을 영구 저장소로 옮겼다.

서버 세션 전환이 가장 큰 영향을 줬다.

며칠 뒤에 Planner, Executor, Inspector가 역할을 나누는 멀티 에이전트 구조가 들어왔는데, 그게 가능하려면 세션이 분리되어 있어야 했다.

오늘 그 기반을 깔아둔 셈이다.

그리고 학습한 지식이 깃 클론에 날아가지 않게 된 것도 크다.

돌릴수록 똑똑해지는 구조인데, 저장소를 다시 받으면 초기화되면 말이 안 되니까.