TIP/AI

Ponytail — AI 에이전트를 "제일 게으른 시니어 개발자"로 만드는 스킬

고생쨩 2026. 6. 24. 08:55

ponytail은 Claude Code, Codex, Gemini CLI 같은 AI 코딩 에이전트한테 "안 써도 되는 코드는 쓰지 마라"를 주입하는 스킬 플러그인임. 콘셉트는 회사 다닌 지 버전 관리 시스템보다 오래된, 긴 머리 묶고 둥근 안경 쓴 전설의 시니어임. 코드 50줄 보여주면 아무 말 없이 1줄로 바꿔버리는 그 사람을 에이전트 안에 넣은 거임.

핵심 철학은 단순함. 안 쓴 코드가 최고의 코드(The best code is the code you never wrote)임.

GitHub 별 5만 개 넘게 받은 화제의 레포임.


왜 필요함?

AI 에이전트한테 "날짜 선택기 만들어줘" 하면 보통 이렇게 함:

  • flatpickr 라이브러리 설치함
  • 래퍼 컴포넌트 작성함
  • 스타일시트 추가함
  • 타임존 논의 시작함

근데 ponytail 깔려 있으면 이렇게 끝남:

<!-- ponytail: browser has one -->
<input type="date">

404줄짜리가 23줄 됨. 브라우저에 이미 있는 걸 왜 다시 만드냐는 거임.


어떻게 동작함?

코드 쓰기 전에 에이전트가 사다리를 위에서부터 타고 내려오다가 먼저 걸리는 칸에서 멈춤:

1. 이거 존재할 필요 있음?   → 없으면 스킵 (YAGNI)
2. 표준 라이브러리에 있음?   → 그거 씀
3. 네이티브 플랫폼 기능임?    → 그거 씀
4. 이미 깔린 의존성에 있음?   → 그거 씀
5. 한 줄로 됨?              → 한 줄
6. 그제서야: 동작하는 최소한

중요한 건 게으른 거지 부주의한 게 아니라는 점임. 신뢰 경계(trust boundary) 검증, 데이터 유실 처리, 보안, 접근성은 절대 자르지 않음. 코드가 작아지는 이유는 줄여서가 아니라 그만큼만 필요해서임.


사용 예시

전부 실제 벤치마크 출력에서 가져온 거임. 같은 모델(Claude Haiku 4.5)이 스킬 없을 때 vs ponytail 켰을 때를 비교한 거임.

예시 1 — 정렬 (24줄 → 1줄)

// ponytail: this exists
numbers.sort((a, b) => a - b)

모든 런타임에 정렬만 평생 파는 사람들이 튜닝해둔 sort가 이미 들어있음. 직접 퀵소트 짤 이유 없음.

예시 2 — API 엔드포인트 (5개 파일 → 9줄)

# ponytail: drop the layers; keep the response schema, it whitelists what leaves the API
class UserOut(BaseModel):
    id: int
    name: str
    email: str

@app.get("/users/{user_id}", response_model=UserOut)
def get_user(user_id: int, db: Session = Depends(get_db)):
    user = db.get(User, user_id)
    if not user:
        raise HTTPException(404)
    return user

리포지토리 패턴, 서비스 레이어, 커스텀 예외 클래스는 다 의식(ceremony)에 불과했음. 근데 response_model=UserOut은 안 자름. 이게 어떤 필드가 API 밖으로 나가는지 화이트리스트로 거르는 신뢰 경계라서임. 그냥 return user 하면 노출하면 안 되는 컬럼까지 다 새버림. 이게 ponytail이 긋는 선임 — 레이어는 잘라도 신뢰 경계는 지킴.

예시 3 — 날짜/색상 선택기

앞에서 본 것처럼 네이티브 <input type="date">, <input type="color">로 끝남. 날짜 선택기 404줄 → 23줄, 색상 선택기 287줄 → 23줄임.


숫자로 보는 효과

실제 오픈소스 레포(FastAPI + React 풀스택 템플릿)를 헤드리스 Claude Code 세션이 직접 수정하게 하고, 남긴 git diff로 채점한 결과임. 기능 티켓 12개, 같은 에이전트로 스킬 있을 때/없을 때 비교, n=4, Haiku 4.5 기준임.

무(無)스킬 기준 대비 코드량(LOC) 토큰 비용 시간 안전성
ponytail -54% -22% -20% -27% 100%
caveman (간결 프롬프트) -20% +7% +3% +2% 100%
"YAGNI + 한 줄" 프롬프트 -33% -14% -21% -30% 95%

ponytail은 모든 지표를 다 깎으면서도 안전성 100%를 유지한 유일한 방식임. 과하게 만드는 함정이 있는 작업에서 효과가 제일 크고, 이미 최소한인 코드에선 거의 0임.

⚠️ 주의: 초기엔 80~94% 감소라고 홍보했는데, 그건 단발성(single-shot) 생성 기준이라 맨모델 답변이 설명·옵션으로 길어진 탓도 있었음. 위 표가 공정한 에이전트 기준으로 보정한, 더 방어 가능한 수치임. 이런 솔직함이 오히려 신뢰 가는 포인트임.


설치

플러그인이 노드 라이프사이클 훅 2개를 돌려서 node가 PATH에 있어야 함(없어도 스킬은 동작하고 항상 켜진 활성화만 조용해짐).

Claude Code

/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail

Codex

codex plugin marketplace add DietrichGebert/ponytail

/plugins에서 Ponytail 설치하고, /hooks에서 훅 2개 신뢰 처리하면 됨.

Gemini CLI

gemini extensions install https://github.com/DietrichGebert/ponytail

이 외에도 GitHub Copilot CLI, OpenCode, pi, OpenClaw, Antigravity CLI까지 14개 에이전트 지원함. Cursor·Windsurf·Cline·Zed·Aider·Kiro 같은 룰 기반 도구는 레포의 룰 파일만 복사하면 됨. AGENTS.md만 읽는 호스트(CodeWhale, Codex 확장 등)는 그 파일 하나로 무설정 동작함.

기본 강도는 full임. PONYTAIL_DEFAULT_MODE 환경변수나 config 파일로 lite/full/ultra/off 설정 가능함.


커맨드

커맨드 하는 일
/ponytail [lite|full|ultra|off] 강도 설정 또는 끄기
/ponytail-review 현재 diff를 과설계 관점으로 리뷰, 삭제 목록 줌
/ponytail-audit diff뿐 아니라 레포 전체를 과설계 감사
/ponytail-debt 미뤄둔 ponytail: 단축들을 장부로 모아 "나중에"가 "영영 안 함" 되는 걸 방지
/ponytail-gain 벤치마크 기반 효과 스코어보드 표시
/ponytail-help 커맨드 요약

/ponytail ultra는 코드베이스가 너한테 개인적으로 잘못했을 때 쓰는 모드임.


평가

ponytail은 새로운 기술이라기보다 YAGNI(You Aren't Gonna Need It) 원칙을 에이전트한테 강제로 체화시키는 잘 만든 프롬프트/스킬 패키지임. AI 에이전트가 시키지도 않은 추상화·라이브러리·레이어를 자꾸 쌓는 과설계 성향을 정조준한 거임.

좋은 점:

  • 토큰·비용·시간 다 줄어드는 게 실측으로 증명됨
  • 보안·검증·접근성은 안 자르는 선을 명확히 그음
  • 14개 에이전트 호환 + MIT 라이선스로 도입 부담 적음
  • 벤치마크 수치를 스스로 보정·공개하는 솔직함

생각할 점:

  • 추론 토큰을 많이 쓰는 모델(예: GPT-5.5)에선 사다리 따지느라 오히려 토큰이 늘 수도 있음
  • 팀이 정말 복잡한 추상화가 필요한 케이스에선 강도 조절이나 off가 필요함

AI 어시스트 개발 워크플로우 굴리는 팀이라면, 사람 리뷰 단계 사이에 끼워넣는 "기본 게으름 가드레일"로 한 번 써볼 만함.


레포: https://github.com/DietrichGebert/ponytail