own-it읽고, 정하고, 넘긴다

이제 알고 고칠게요!

클로드가 코드를 읽고 빠진 것을 찾아 카드로 올립니다. 무엇을 할지는 직접 고릅니다. 모델은 채택하신 것만 구현합니다.

GitHub 읽기 권한 없이, 로컬에서 돕니다.

카드

실제 카드 예시

말이 아니라 실제 화면입니다. 로그인 없이 아래 카드를 직접 채택하거나 거절해 보세요. 서버로는 아무것도 나가지 않습니다.

에러 처리·보통

응답이 안 오면 기다리는 데 끝이 없다

안 하면

콘텐츠 생성은 이미지까지 켜면 2분이 넘게 걸립니다. 그 사이 서버가 멈추거나 사용자의 인터넷이 끊기면 화면은 "생성 중"만 계속 돌립니다. 취소 버튼도 없어서 사용자는 몇 분을 더 기다리다 새로고침합니다. 검사 화면도 같아서, 단계 표시가 "진행 중"에 멈춘 채 영원히 안 넘어갑니다.

하면

요청마다 제한 시간을 둡니다. 검사와 생성은 5분, 나머지 조회는 30초처럼 나누고, 넘기면 "시간이 초과됐습니다. 다시 시도해 주세요"로 끝납니다. 로딩 화면에 취소 버튼이 생겨 사용자가 직접 멈출 수 있습니다.

근거 · frontend/lib/api/client.ts:755-763

export async function generateContent(req: GenerateRequest): Promise<GenerateResponse> {
  const url = `${getApiUrl()}/generate`;
  const response = await fetch(url, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify(req),
  });
    
개념

AbortController는 이미 보낸 요청을 도중에 취소하는 브라우저 기능입니다. 지금은 요청을 보내 놓고 응답이 올 때까지 무한정 기다리는 구조라, 응답이 영영 안 오면 화면도 영영 안 끝납니다.

에러 처리·작음

AI 호출이 실패하면 이유를 안 보고 무조건 한 번 더 부른다

안 하면

첫 호출이 어떤 이유로 실패하든 곧바로 같은 요청을 다시 보냅니다. 사용량 한도 초과와 키 만료, 응답 지연에도 똑같이 한 번 더 부릅니다. 그래서 요금이 두 배로 나가고, 화면에 남는 오류는 두 번째 실패라서 진짜 원인(키가 만료됐다, 한도를 넘겼다)이 가려집니다.

하면

형식 지정을 거부당한 경우에만 다시 부르고, 나머지 실패는 그대로 위로 올려 보냅니다. 사용량 초과는 사용량 초과로 보이고, 과금되는 호출은 한 번만 나갑니다.

근거 · backend/src/barum/vlm.py:271-277

try:
    resp = self.client.chat.completions.create(
        model=self.model, messages=msg,
        response_format={"type": "json_object"})
except Exception:
    # 일부 모델은 response_format을 거부한다 - 없이 재시도.
    resp = self.client.chat.completions.create(model=self.model, messages=msg)
    
개념

재시도는 "다시 하면 될 것 같은 실패"에만 쓰는 것입니다. 키가 없거나 한도를 넘긴 실패는 다시 해도 결과가 같고, 유료 호출이라면 돈만 두 번 나갑니다.

  1. 대기카드가 올라옵니다. 아직 아무 일도 없습니다.
  2. 채택당신이 정합니다. 이유는 거절할 때만 남깁니다.
  3. 적용됨모델이 구현을 마치고 표시합니다. 여기서부터는 되돌릴 수 없습니다.

작동 방식

  1. 01

    리뷰를 부릅니다

    클로드에게 관점을 붙여 슬래시 명령으로 부릅니다.

  2. 02

    카드가 올라옵니다

    모델이 코드를 읽고 빠진 것을 카드로 올립니다.

  3. 03

    채택하거나 거절합니다

    직접 정합니다. 거절은 이유를 한 줄 남깁니다.

  4. 04

    채택된 것만 구현됩니다

    모델이 구현을 마쳐야 적용됨으로 바뀝니다. 데이터베이스가 지킵니다.

지원 클라이언트

  • 클로드코드CLI. 토큰 한 줄로 등록합니다.
  • 클로드 데스크톱커넥터 설정에 붙이거나, .mcpb 파일 하나로 설치합니다.
  • 안티그래비티설정 파일에 붙이거나, 채팅으로 연결을 부탁해도 됩니다.
  • ChatGPT / Codexconfig.toml 하나로 붙습니다.
연결 방법 자세히 보기 →

보안

보안은 이렇게 지킵니다

  • 코드는 서버로 오지 않습니다

    MCP 서버는 내 컴퓨터에서 돕니다. 서버로 오는 것은 카드 한 장당 20줄 이하의 발췌뿐입니다.

  • GitHub 읽기 권한을 요구하지 않습니다

    로그인은 신원을 확인하는 용도입니다. 어떤 권한(scope)도 요청하지 않습니다.

  • 토큰은 기기 단위, 즉시 폐기할 수 있습니다

    노트북을 잃어버렸다면 그 토큰만 지우면 됩니다. 폐기는 되돌릴 수 없어 누르기 전 한 번 더 묻습니다.

  • “적용됨”은 데이터베이스가 강제합니다

    사람은 버튼으로 적용됨을 만들 수 없습니다. 모델이 mark_applied 를 불러야만 바뀌고, 그 뒤로는 판정도 못 바꿉니다.

만든 이유

저도 바이브코딩을 합니다. AI에게 맡기고 “진행”을 누르거나, 추천이라고 표시된 쪽을 고릅니다. 하나하나 공부하면서 개발할 여유는 없습니다.

그래도 최소한은 알고 싶었습니다. 이 기능이 왜 필요한지, 코드는 대략 어떤 모양인지. own-it 은 그 최소한을 지키려고 만들었습니다. 전부 이해할 필요는 없습니다. 무엇을 선택하고 있는지 알고 고르면 됩니다.

이 방식을 저부터 쓰고 있습니다.

직접 정할 준비가 되셨다면