Antigravity와 Google AI를 활용해 오픈 소스 생태계 전반에서 373개의 버그를 해결한 방법
요약
AI 에이전트 엔지니어가 Antigravity 에이전틱 IDE와 Google AI를 활용하여 오픈 소스 프로젝트에서 373개의 버그를 해결한 사례를 소개합니다. 단순 오타 수정을 넘어 보안 취약점, 충돌, 경쟁 상태 등 실질적인 코드 문제를 해결하는 과정을 다룹니다.
핵심 포인트
- Antigravity 에이전틱 IDE와 Google AI를 활용한 효율적인 버그 수정
- 오픈 소스 생태계의 보안, 충돌, 경쟁 상태 등 실질적 문제 해결
- AI 도구를 활용한 대규모 오픈 소스 기여(373개 PR) 방법론
이 글은 Sentry가 지원하는 DEV's Summer Bug Smash: Clear the Lineup에 제출된 글입니다.
"모든 버그는 이해되기를 기다리는 하나의 이야기이며, 모든 수정 사항은 공유할 가치가 있는 하나의 장(chapter)이다."
자기소개
안녕하세요, 동료 개발자 여러분. 저는 Aniruddha Adak입니다. 더 짧은 이름을 원하신다면 Ani라고 불러주셔도 좋습니다. 저는 자율 시스템(autonomous systems)을 구축하고 오픈 소스(open source)에 기여하며 대부분의 시간을 보내는 **AI 에이전트 엔지니어 (AI Agent Engineer)**이자 **풀스택 개발자 (Full-Stack Developer)**입니다. 저의 GitHub를 방문하거나, aniruddha-adak.vercel.app에서 작업물을 살펴보고, X와 DEV에서 저의 생각을 확인하실 수 있습니다.
저는 커뮤니티 주도 소프트웨어의 힘을 믿습니다. 오픈 소스 프로젝트의 버그를 수정할 때, 여러분은 단순히 자신을 위한 문제를 해결하는 것이 아닙니다. 여러분의 이름을 영원히 알지 못할 수천 명의 다른 개발자들을 위해 문제를 해결하는 것입니다. 그 조용한 영향력이 저를 계속 나아가게 합니다.
지난 몇 달 동안, 저는 여러 오픈 소스 저장소(repositories)에 걸쳐 **373개의 머지된 풀 리퀘스트 (merged pull requests)**를 제출했습니다. 이 포스트에서는 제가 완료한 가장 영향력 있는 버그 수정 사례들과 이를 가능하게 했던 도구들, 그리고 Google AI와 **Antigravity 에이전틱 IDE (agentic IDE)**가 이 여정에서 어떻게 저의 비밀 무기가 되었는지에 대해 말씀드리고자 합니다.
프로젝트 개요
오픈 소스 생태계는 방대하고, 취약하며, 아름다울 정도로 혼란스럽습니다. 버그는 눈에 잘 띄는 곳에 숨어 있습니다. 테스트되지 않는 에러 핸들러(error handlers) 속에 잠복해 있고, CI 파이프라인(CI pipelines)이 놓치는 플랫폼별 에지 케이스(edge cases) 속에 둥지를 틀고 있습니다. 또한 너무 늦기 전까지는 아무도 감사(audit)하지 않는 보안상 중요한 코드 경로(code paths)로 스며들기도 합니다.
저는 AI 인프라 도구부터 개발자 프레임워크, 연구 플랫폼에 이르기까지 6개의 주요 오픈 소스 프로젝트 (open source projects) 전반에 걸쳐 버그를 타겟팅했습니다. 각 수정 사항은 단순한 문서 수정이나 오타 교정이 아닌, 실제로 병합(merged)된 기여였습니다. 이는 충돌(crashes)을 해결하고, 보안 취약점(security holes)을 패치하며, 경쟁 상태(race conditions)를 제거하고, 고장 난 기능을 복구하는 실질적인 코드 변경 사항들이었습니다.
제가 기여한 프로젝트 목록은 다음과 같습니다:
| 프로젝트 | 도메인 | 주요 수정 사항 |
|---|---|---|
| cognee | AI 메모리 인프라 (AI memory infrastructure) | 보안, 시각화 및 플랫폼 호환성을 위한 3가지 핵심 수정 사항 |
| ... |
버그 수정 심층 분석 (Bug Fix Deep Dives)
1. Global Settings API의 보안 취약점 (Security Vulnerability)
저장소 (Repository): topoteretes/cognee
풀 리퀘스트 (Pull Request):
GitHub logo fix(security): restrict global settings and disable public registration #3115
**aniruddhaadak80**님이 2026년 6월 20일에 게시함
Closes #3084
이 PR은 #3084에서 보고된 보안 취약점(security vulnerabilities)을 해결합니다:
- 전역 설정 탈취(global configuration takeover)를 방지하기 위해
POST /api/v1/settings에 슈퍼유저 권한(superuser privileges)을 요구합니다. - 키 접두사(key prefixes) 유출을 방지하기 위해
GET /api/v1/settings에서 LLM 및 VectorDB API 키를 완전히 마스킹(mask) 처리합니다. - 관리자가 공개 셀프 등록(public self-registration)을 비활성화할 수 있도록
COGNEE_PUBLIC_REGISTRATION_ENABLED환경 변수를 추가합니다.
문제점 (The Problem)
POST /api/v1/settings 엔드포인트가 권한 확인(privilege checks) 없이 노출되어 있었습니다. 인증된 사용자라면 누구든 전역 설정(global configuration settings)을 수정할 수 있었으며, 이는 사실상 애플리케이션 인스턴스 전체를 탈취할 수 있음을 의미했습니다. 이는 보안 엔지니어를 식은땀 흘리게 만드는 종류의 취약점입니다.
해결책 (The Fix)
저는 설정 엔드포인트(settings endpoint)에 대해 슈퍼유저 권한(superuser privilege) 요구 사항을 구현하고, 응답 페이로드(response payload)에서 LLM 자격 증명(credentials)을 완전히 마스킹(masking) 처리했습니다. 이 변경 사항은 매우 정밀하게 이루어졌습니다. 단 두 줄의 권한 부여(authorization) 로직이었지만, 보안에 미치는 영향은 막대했습니다.
영향 (The Impact)
이 수정 사항은 issue #3084를 해결하였으며, 잠재적인 설정 탈취 공격(configuration takeover attacks)을 방지했습니다. 다른 개발자들이 의존하는 AI 인프라를 구축할 때, 보안은 하나의 기능(feature)이 아닙니다. 그것은 토대(foundation)입니다.
2. LanceDB의 Windows 경로 해석 크래시 (Windows Path Resolution Crash)
리포지토리 (Repository): topoteretes/cognee
풀 리퀘스트 (Pull Request):
GitHub logo fix(lancedb): 긴 경로에 대한 OS Error 3를 해결하기 위해 Windows 경로에 자동으로 접두사를 추가합니다 (fixes #2941) #3123
**aniruddhaadak80**님이 2026년 6월 20일에 게시함
Closes #2941
이 PR은 로컬 파일 시스템 저장소를 사용할 때 vector_db_url에 대한 절대 Windows 경로를 자동으로 정규화(normalize)하고 접두사(prefix)를 추가합니다. 이는 Windows에서 벡터 데이터를 영구 저장하기 위해 긴 파일 경로를 생성할 때 LanceDB 서브프로세스(subprocesses)에 의해 발생하는 OS Error 3를 해결합니다.
문제 (The Problem)
Windows에서는 로컬 파일 시스템 저장소를 위한 vector_db_url의 경로가 기존의 260자 제한을 초과할 때 OS Error 3가 발생했습니다. LanceDB 서브프로세스는 아무런 메시지 없이 실패(fail silently)하여, 사용자에게는 명확한 에러 메시지 없이 손상된 벡터 데이터베이스만 남게 되었습니다. 이는 실제 Windows 운영 환경에서만 나타나는 전형적인 크로스 플랫폼 호환성 버그였습니다.
해결책 (The Fix)
\\?\ 확장 길이 경로 접두사(extended-length path prefix)를 사용하여 절대 Windows 경로를 자동으로 정규화하고 접두사를 추가하도록 구현했습니다. 이 수정 사항은 런타임(runtime)에 플랫폼을 감지하고 필요한 경우에만 변환을 적용하므로, Linux 및 macOS 사용자에게는 영향이 전혀 없습니다.
영향 (The Impact)
이 작업은 issue #2941을 해결하였으며, 많은 사용자들에게 처음으로 Windows에서 cognee를 완전히 사용할 수 있게 만들었습니다. 크로스 플랫폼 호환성 (Cross-platform compatibility)은 화려하지는 않지만, 장난감과 도구를 구분 짓는 요소입니다.
3. 데이터셋 컨텍스트 누락으로 인한 그래프 엔진 초기화 문제
저장소 (Repository): topoteretes/cognee
풀 리퀘스트 (Pull Request):
GitHub logo fix(visualize): resolve dataset context before initializing graph engine #3114
**aniruddhaadak80**님이 2026년 6월 20일에 게시함
Closes #3007
현재 visualize_graph()는 어떠한 데이터셋 컨텍스트 (dataset context) 없이 그래프 엔진을 초기화하며, cognify가 데이터를 쓰는 실제 데이터셋별 데이터베이스 대신 기본 빈 그래프 데이터베이스로 되돌아가는(fallback) 문제가 있습니다. 이 수정 사항은 get_authorized_existing_datasets를 통해 데이터셋을 확인하고 get_unified_engine()에 데이터셋 UUID를 제공함으로써, search()의 데이터셋 확인 로직과 일치하도록 만듭니다.
문제점 (The Problem)
visualize_graph() 함수가 데이터셋 컨텍스트 없이 그래프 엔진을 초기화하고 있었습니다. 이로 인해 cognify 작업이 데이터를 저장하는 실제 데이터셋별 데이터베이스 대신 기본 빈 그래프 데이터베이스를 사용하게 되었습니다. 사용자는 데이터가 완벽하게 보존되어 있음에도 불구하고, 시각화(visualize)를 호출했을 때 빈 그래프를 받게 되는 상황이 발생했습니다.
해결 방법 (The Fix)
그래프 엔진을 초기화하기 전에 데이터셋 컨텍스트를 해결하여, 시각화 파이프라인 (visualization pipeline)이 올바른 데이터베이스 인스턴스에 연결되도록 했습니다. 이 변경을 위해서는 데이터 수집 (ingestion)부터 cognify를 거쳐 시각화에 이르기까지의 전체 데이터 흐름 (data flow)을 이해해야 했습니다.
영향 (The Impact)
이것은 issue #3007을 해결하였으며, 사용자에게 직접 노출되는 핵심 기능을 복구했습니다. 시각화 (visualization)가 깨질 때, 사용자들은 그래프 엔진을 탓하지 않습니다. 그들은 제품 전체를 탓합니다.
4. Fetch Timeout Wrapper에서 AbortSignal이 무시됨
Repository: openclaw/openclaw
Pull Request:
GitHub logo fix(utils): fetchWithTimeout ignores caller-provided AbortSignal in RequestInit #102951
**aniruddhaadak80**가 2026년 7월 9일에 게시함
Description
src/utils/fetch-timeout.ts에서 fetchWithTimeout 래퍼 (wrapper)는 다음과 같이 구현되어 있습니다:
export async function fetchWithTimeout(
url: string,
init: RequestInit,
timeoutMs: number,
fetchFn: typeof fetch = fetch,
): Promise<Response> {
const { signal, cleanup } = buildTimeoutAbortSignal({
timeoutMs: Math.max(1, timeoutMs),
operation: "fetchWithTimeout",
url,
});
try {
return await fetchFn(url, { ...init, signal });
} finally {
cleanup();
}
}
하지만, 호출자 (caller)가 init.signal에 사용자 정의 AbortSignal을 지정할 경우 (예를 들어, 상위 작업이 중단되거나 클라이언트가 연결을 끊을 때 요청을 취소하기 위해), 이 신호는 buildTimeoutAbortSignal에서 생성된 새로운 신호에 의해 완전히 덮어씌워집니다.
Impact
호출자가 제공한 AbortSignal이 조용히 누락되고 무시됩니다. 이는 호출자 측에서의 취소 요청이 fetchWithTimeout 도중 요청을 중단시키지 못함을 의미합니다.
Suggested Fix
타임아웃 컨트롤러가 상위 신호 (parent signal)에 체이닝 (chained)될 수 있도록 init.signal을 buildTimeoutAbortSignal에 전달하십시오:
const { signal, cleanup } = buildTimeoutAbortSignal({
timeoutMs: Math.max(1, timeoutMs),
operation: "fetchWithTimeout",
url,
signal: init.signal,
});
문제점 (The Problem)
fetchWithTimeout 유틸리티가 RequestInit을 통해 전달된 AbortSignal을 무시하고 있었습니다. 호출자가 자체적인 중단 컨트롤러 (abort controller)를 제공할 경우, 래퍼 (wrapper)가 충돌하는 타임아웃 신호 (timeout signal)를 생성하여 호출자의 중단 요청이 조용히 무시되었습니다. 이로 인해 취소할 수 없는 요청이 발생하였고, 장시간 실행되는 에이전트 워크플로우 (agentic workflows)에서 리소스 누수 (resource leaks)를 야기했습니다.
해결책 (The Fix)
AbortSignal.any()를 사용하여 호출자의 AbortSignal을 내부적으로 생성된 타임아웃 신호와 적절히 결합하도록 신호 처리 로직을 수정했습니다. 이제 두 가지 취소 경로가 모두 올바르게 작동하며, 타임아웃이 발생하거나 호출자가 취소를 신호할 때 요청이 중단됩니다.
영향 (The Impact)
이 수정으로 Mattermost 채널 통합에서의 요청 취소 문제가 해결되었으며, openclaw 프레임워크 내의 모든 네트워크 작업에 영향을 미치던 리소스 누수를 제거했습니다.
5. 컨텍스트 매니저 (Context Manager)에서의 락 해제 경합 조건 (Lock Release Race Condition)
저장소 (Repository): aniruddhaadak80/cognee
풀 리퀘스트 (Pull Request):
GitHub logo hold_lock 컨텍스트 매니저에서 안전하게 락 해제 #7
**aniruddhaadak80**이 2026년 6월 23일에 게시함
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기