프로젝트 소개

testgraph는 여정 수준(journey-level)의 테스트 선택 도구입니다. git diff가 주어지면 변경 사항으로 인해 어떤 사용자 대상 흐름이 깨질 수 있는지, 그리고 어떤 순서로 테스트해야 하는지를 분석하여 모든 테스트를 다시 실행하라는 지시 대신 짧은 순위 목록을 반환합니다. 이 도구는 의도적으로 브라우저를 구동하거나 테스트를 생성하거나 자체 치유(self-heal)를 수행하지 않습니다. testgraph의 명시적인 역할은 기존 드라이버 상위 계층에서 무엇을 테스트할 가치가 있는지 결정하는 것입니다. 작동 방식 여정 레지스트리(journey registry)는 각 사용자 여정과 경로 핸들러 또는 스케줄러 스윕과 같은 진입 심볼(entry symbols)의 이름을 지정합니다. propose 모듈은 인덱스를 대조하여 Python 경로 데코레이터와 Next.js 컨벤션을 스캔함으로써 새 저장소를 위한 레지스트리 초안을 작성하며, 사람이 읽기 전까지는 승인 상태(approved)를 false로 표시합니다. 따라서 승인되지 않은 레지스트리는 실행 시 알림을 보내며 조용히 실행되지 않습니다. diff의 경우, testgraph는 변경된 라인 범위를 해당 소유 심볼(시드, seeds)에 매핑합니다. 그 다음 CodeGraph 엣지 그래프를 역방향으로 전이적으로 탐색하여 시드에 의존하는 모든 심볼(영향을 받는 집합, impacted set)을 찾고, 진입 심볼이 해당 집합에 포함된 여정들을 팬인(fan-in) 기준으로 순위를 매겨 보고합니다. 이때 각 여정은 도달한 가장 강력한 엣지 경로의 신뢰도를 가집니다. 신뢰도는 경로상 엣지들의 최솟값 중 최댓값으로 계산되므로, 체인은 가장 약한 홉(hop)만큼만 신뢰할 수 있으며 단 하나의 견고한 경로만으로도 충분합니다. 약하거나 합성된 엣지를 통해서만 도달한 여정은 조용히 신뢰되는 대신 수동 확인 대상으로 플래그가 지정되며, 선택 목록에서 절대 제거되지 않습니다. 이 도구는 재현율 우선(recall-first) 방식으로, 변경 사항이 실제로 영향을 미친 여정을 누락시키는 것보다 과잉 선택하는 것을 선호합니다. 답변을 내놓기 전, 무결성 가드(integrity guard)는 손상되었거나 오래된 CodeGraph 인덱스에서의 실행을 거부합니다. 잘못된 그래프는 확신에 찬 잘못된 답변을 생성하기 때문입니다. 레지스트리 해석은 먼저 발견되는 순서대로 진행됩니다. 환경 변수 탈출구, 저장소 내부의 .testgraph/journeys 디렉토리(권장 위치), 그리고 프로젝트 체크아웃 내 패키지 옆의 journeys 디렉토리 순입니다. 레지스트리는 모든 위치에서 파일 이름이 아닌 자체 선언된 타겟을 기준으로 매칭되며, 다른 프로젝트에서 복사하여 수정하지 않은 레지스트리는 거부됩니다. 전제 조건 및 설치 표준 라이브러리만 사용하는 Python 3.11 이상(외부 종속성 없음), diff 입력을 위한 git, 그리고 codegraph init으로 생성된 CodeGraph 인덱스가 있는 타겟 저장소가 필요합니다. PyPI에서 pip install testgraph로 설치할 수 있습니다. 휠(wheel) 파일에는 패키지만 포함되며, 측정 하네스와 도그푸딩(dogfood) 레지스트리는 저장소에 위치합니다. CLI 및 MCP 명령줄 진입점에는 CI 게이트나 다른 에이전트를 위해 사람이 읽을 수 있는 형식 또는 JSON 출력을 제공하는 select, 에이전트가 커밋 전 읽을 수 있는 정적 여정 맵을 작성하는 export, propose, record 및 요약 모드가 포함됩니다. MCP stdio 서버는 testgraph_impact와 testgraph_journeys라는 두 가지 도구를 노출하며 저장소별로 등록됩니다. 이는 표준 라이브러리만 사용하고 분석 모듈을 지연 로딩(lazy import)하므로, 유휴 상태의 서버는 sqlite3를 로드하지 않고 데이터베이스 연결을 유지하지 않으며 메모리에 인덱스를 보관하지 않습니다. README에 따르면 전체 핸드셰이크 후 측정된 RSS는 15.2 MB로, 일반적인 Python MCP SDK 서버의 62~69 MB보다 낮습니다. 연결 및 원장(ledger) hooks/install.sh는 승인된 레지스트리가 있는 모든 저장소에 pre-push 훅을 설치하여, 각 푸시마다 깨질 수 있는 여정들을 출력합니다. 훅은 먼저 codegraph sync를 실행합니다. 시드는 라인 범위에서 오는데, 코드가 이동하기 전에 구축된 인덱스는 오래된 스팬(span)에 대해 diff를 해석하기 때문입니다. 변경된 파일의 바이트가 인덱싱된 복사본과 여전히 일치하지 않으면 답변의 품질이 저하되며 해당 파일 이름이 명시됩니다. 훅은 모든 경로에서 0으로 종료되어 푸시를 절대 실패시키지 않으며, git config 설정으로 저장소별로 비활성화하거나 uninstall 플래그로 제거할 수 있습니다. 각 실행은 JSONL 원장에 선택 행 하나를 추가합니다. record 명령은 여정 실행 결과라는 나머지 절반을 작성하며, 저장소와 커밋을 기준으로 두 데이터를 결합하면 선택 목록에 없었음에도 실패한 여정(silent under-selection)을 계산할 수 있습니다. 상태 이 도구는 신뢰도 가중 경로가 추가된 phase-1 스파이크(spike)로 설명되며, 하나의 도그푸딩 타겟에서 작동 및 검증되었습니다. 수동으로 라벨링된 5개의 커밋에서 재현율 1.00, 평균 정밀도 0.68을 기록했고, 독립적인 AST 오라클을 기준으로 점수를 매긴 20개의 시드 뮤테이션 사이트에서 재현율 1.00을 기록했으며, 무결성 가드 테스트 및 스키마 고정이 완료되었습니다. 범위는 해당 단일 타겟으로, 백엔드 진입점에 등록된 여정을 통해 백엔드 및 프론트엔드 파일을 분석합니다. 또한 README에는 레지스트리가 없는 두 저장소에 대한 후속 측정 결과, 이전의 비용 절감 주장이 거짓임이 밝혀졌다고 기록되어 있습니다. 23개의 여정이 있는 한 저장소에서는 38개 커밋에 대해 0개, 2개 커밋에 대해 23개의 여정 히스토그램이 나왔고, 207개 여정이 있는 다른 저장소에서는 등록된 표면을 건드리지 않은 커밋을 제외했을 때 여정 실행의 54.1%만 피할 수 있었습니다. 따라서 선택 숫자는 절감의 약속이라기보다 결합도(coupling)의 하한선으로 읽어야 합니다. 동일한 측정 결과, 신뢰도 0.3에서 전체 레지스트리 선택이라는 오탐(false-positive)은 수동 확인 대상으로 플래그가 지정된 반면, 실제 영향 범위가 큰 경우는 0.9의 신뢰도로 깨끗하게 반환되어 랭킹 기능이 확인되었습니다.