8시간 만에 8개의 에이전트 스택(agent-stack) 저장소를 출시했습니다. 그 비결을 공개합니다.
요약
개발자가 8시간 만에 8개의 에이전트 스택 저장소를 출시할 수 있었던 효율적인 개발 패턴을 공유합니다. 핵심은 문제를 한 문장으로 정의하는 단순함, 철저한 테스트 기반의 검증, 그리고 즉시 실행 가능한 데모 제공에 있습니다.
핵심 포인트
- 라이브러리는 하나의 명확한 문제만 해결해야 함
- 테스트 통과 여부가 프로젝트 완료의 기준임
- API 키 없이도 실행 가능한 데모를 포함해야 함
- 반복된 패턴을 통한 근육 기억(Muscle Memory) 활용
오늘 저는 GitHub에 8개의 공개 저장소(repositories)를 푸시했습니다. 5개의 새로운 에이전트 스택(agent-stack) 라이브러리와 방치되었던 3개의 March 스캐폴드(scaffolds) 복구 작업입니다. 278개의 새로운 테스트, 세 가지의 서로 다른 프로그래밍 언어, 그리고 대부분의 새로운 라이브러리에는 런타임 의존성(runtime dependencies)이 전혀 없습니다.
사람들은 "어떻게" 했는지 물을 것이고, 솔직한 답변은 "AI가 작성했다"가 아닙니다. 솔직한 답변은 지난 8주 동안 35개의 에이전트 스택(agent-stack) 라이브러리를 출시해 왔으며, 지루한 패턴들이 이제 근육 기억(muscle memory)이 되었다는 것입니다. 오늘은 그저 평소보다 더 많은 횟수로 패턴을 실행한 한 차례의 과정이었을 뿐입니다.
그 패턴이 무엇인지 소개합니다.
라이브러리당 하나의 지루한 문제
5개의 새로운 라이브러리는 각각 하나의 문제를 해결합니다.
- prompt-shield: 붙여넣은 프롬프트 인젝션(prompt-injection) 텍스트가 모델에 도달하는 것을 방지합니다.
- crusoe-nemotron-harness: Crusoe Cloud에서 Nemotron 에이전트를 비용, 데이터 송신(egress), 검증(vet), 스냅샷(snap), 추적(trace), 예산(budget) 기능과 함께 래핑(wrap)합니다.
- tool-call-cache: 정형화된 인자(canonical args)를 통해 LLM 도구 호출(tool calls)을 메모이제이션(memoize)합니다.
- perfectcorp-tryon-concierge: Perfect Corp YouCam API를 사용하는 채팅 스타일의 AI 에이전트입니다.
- bitte-telegram-launcher: 어떤 Bitte 에이전트든 작동하는 Telegram 봇으로 변환합니다.
각각은 한 문장으로 설명이 가능합니다. 그 어떤 것도 플랫폼이 되려고 시도하지 않습니다. 그 어떤 것도 다음 문제까지 해결하려고 하지 않습니다.
만약 문제를 한 문장으로 설명할 수 없다면, 저는 저장소(repo)를 시작하지 않습니다. 설명이 "그리고 또한"이라는 방향으로 흐르기 시작하면, 코드를 작성하기 전에 중단합니다.
테스트는 증거이고, README는 피치(pitch)다
8개 모두 실제 테스트 스위트(test suite)를 갖추고 있습니다. 새로운 라이브러리들은 각각 41개에서 79개의 테스트를 가지고 있습니다. 3개의 복구된 프로젝트는 하나의 스텁 어설션(stub assertion)이나 거의 제로에 가까운 커버리지에서 각각 22개, 25개, 50개의 테스트로 늘어났습니다.
제가 "출시했다(shipped)"라고 말할 때는, API 키가 없는 상태에서 새로 클론(clone)했을 때 pytest -q가 초록색(pass)을 반환하는 것을 의미합니다. 심사위원이 그 초록색 바를 재현할 수 없다면, 그 프로젝트는 완료된 것이 아닙니다.
README는 판매 피치(sales pitch)입니다. 라이브러리가 수행하는 한 가지를 주장합니다. 라이브러리가 수행하지 않는 것을 주장하지 않습니다.
오프라인 데모가 아니면 인정되지 않는다
새로 만든 5개의 라이브러리 각각에는 자격 증명(credentials) 없이도 데모가 실행될 수 있도록 FakeProvider 또는 시드된 스텁(seeded stub)이 포함되어 있습니다.
이것은 단순한 편의 기능(quality-of-life nicety)이 아닙니다. 이는 "심사위원이 직접 실행해 보고 작동하는 것을 확인했다"와 "심사위원이 README를 읽어보았으나, Crusoe Cloud 키를 발급받고 싶지 않아 그냥 지나쳤다" 사이의 차이를 만듭니다.
부활시킨 프로젝트들에도 동일한 패턴을 적용했습니다. agentmemory v0.3은 API 키 없이 인메모리 저장소(in-memory store)에서 실행되는 가시적 검색(visible-retrieval) 데모를 제공합니다. ragvitals v0.2는 API 키 없이 합성된 500개 문서 코퍼스(corpus)와 노후화 조절 노브(aging knob)를 제공합니다. agentcore는 에이전트 루프(agent loop)가 완전히 오프라인에서 실행될 수 있도록 스크립트된 InMemoryLLM 스텁을 제공합니다.
가능한 경우 런타임 의존성(runtime dependencies) 제로화
새로 만든 5개의 라이브러리 중 4개는 런타임 의존성이 전혀 없습니다(zero-runtime-dependency). 유일한 예외는 UI를 위한 Gradio와 이미지 합성을 위한 Pillow가 필요한 perfectcorp-tryon-concierge입니다.
의존성 제로(Zero dependencies)는 다음과 같은 의미를 갖습니다: 더 빠른 pip install, 공급망 공격 표면(supply chain surface) 제거, 읽기 쉬운 코드, 그리고 사용자를 위한 버전 고정(version-pinning) 문제의 감소입니다. 또한 이는 라이브러리가 의존성 없이도 충분히 작아야 함을 의미하며, 이는 유용한 설계 압박(design pressure)으로 작용합니다.
의존성을 없앨 수 없는 경우에는, 의존성 목록을 잘 알려진 두세 개의 패키지로 제한합니다.
부활 규칙: 추가하지 말고 깎아내라
부활시킨 세 개의 프로젝트는 오늘 작업 중 제가 가장 자랑스럽게 생각하는 부분입니다.
방치된 스캐폴드(scaffold)를 부활시킬 때 유혹에 빠지기 쉬운 것은, 원래 계획했던 것을 완성하기 위해 기능을 추가하는 것입니다. 그것은 함정입니다. 원래 스캐폴드가 완성되지 않았던 이유는 너무 컸기 때문입니다. 기능을 더 추가하는 것은 똑같은 실수를 반복하는 것입니다.
부활 규칙은 다음과 같습니다: README 헤드라인이 약속한 '단 한 가지'를 선택하여, 그것이 엔드 투 엔드(end-to-end)로 작동하게 만들고, 테스트를 작성한 뒤, 출시하십시오. 기여하지 않는 다른 모든 것은 제거하십시오.
agentcore에는 6개의 플레이스홀더 메서드(think, act, observe, plan, usetool, getcontext)가 있었습니다. 이제 이들은 각각 실제로 무언가를 수행하며 하나의 루프로 구성됩니다. Bash 도구의 거부 패턴(deny patterns)은 실제로 거부 동작을 수행합니다. OpenAI 호환 LLM 어댑터는 실제로 API를 호출합니다. 그 외의 모든 것은 잘려 나갔습니다.
강제 함수로서의 네이밍 (Naming as a forcing function)
하나의 짧은 케밥 케이스 (kebab-case) 구절로 라이브러리의 이름을 지을 수 없다면, 저는 시작조차 하지 않습니다. prompt-shield는 작동합니다. tool-call-cache도 작동합니다. crusoe-nemotron-harness는 장황하지만 정확합니다. 만약 이름을 설명하기 위해 두 개의 절이 필요하다면, 그것은 범위 (scope)가 너무 크다는 신호입니다.
이름은 코드보다 먼저 출시되어야 합니다.
복리 투자로서의 에이전트 스택 (agent-stack) 제품군
오늘 공개한 8개의 저장소 (repos)는 독립적인 것이 아닙니다. 이것들은 각 구성 요소가 서로 결합되는 35개의 라이브러리로 이루어진 제품군 위의 다음 레이어입니다.
prompt-shield는 에이전트 입력 (agent input) 앞에 위치합니다. agentguard는 네트워크 송신 (network egress)을 감쌉니다. agentvet은 도구 인자 (tool args)를 검증합니다. agentsnap은 호출 추적 (call trace)을 기록합니다. agenttrace는 비용과 지연 시간 (latency)을 합산합니다. agentcast는 구조화된 출력 (structured output)을 강제합니다. token-budget-py는 지출을 제한합니다. tool-call-cache는 반복되는 호출을 메모이제이션 (memoize) 합니다.
각 라이브러리는 한 번에 읽을 수 있을 만큼 충분히 작습니다. 이들이 모여 모든 프로덕션 LLM 애플리케이션의 지루한 인프라 레이어를 커버합니다. 새로운 라이브러리가 이전 라이브러리의 패턴을 재사용할 수 있기 때문에, 이 투자는 복리로 쌓입니다.
솔직한 부분
새로 만든 5개의 라이브러리 중 2개는 SUBMISSION.md에 명시된 대로 플레이스홀더 (placeholder) 데모 영상이 포함되어 있습니다. 아직 녹화하지 않았습니다.
푸시된 8개의 저장소 중 2개는 첫 푸시 이후 정리 작업을 위해 몇 개의 git 후속 커밋이 있었습니다. 복구된 저장소 중 하나의 CHANGELOG 버전 헤더에는 엠 대시 (em dash)가 포함되어 있는데, 이는 이전 v0.1 헤더에 있었기 때문이며 스타일보다 일관성이 더 중요했기 때문입니다.
핵심은 이것입니다: 이러한 속도 (velocity)는 마법도 아니고 공짜도 아닙니다. 마찰 (friction)이 거의 사라질 정도로 패턴을 충분히 많이 출시해 본 경험이 필요합니다. 이 스타일로 만드는 첫 번째 라이브러리는 주말이 걸립니다. 서른다섯 번째 라이브러리는 한 시간이 걸립니다.
사용해 보세요
8개 모두 github.com/MukundaKatta 에서 확인할 수 있습니다. MIT 라이선스이며, 공개되어 있고, 바로 읽어볼 수 있습니다.
만약 이 중 어떤 것이라도 현재 여러분이 겪고 있는 문제를 해결해 준다면, 필요한 것을 가져가세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기