ULTRAPLAN: 30분 원격 계획

/ultraplan 또는 키워드로 클라우드 Opus 세션을 30분 동안 실행.

01

개요

ULTRAPLAN은 복잡한 계획 작업을 클라우드의 Opus 모델에 위임하여 최대 30분간 실행하는 원격 계획 시스템입니다. 사용자가 /ultraplan 슬래시 커맨드를 입력하거나 특정 키워드 패턴이 감지되면 자동으로 트리거됩니다.

다루는 소스 파일: ultraplan/trigger.tsultraplan/session.tsultraplan/poller.tsultraplan/delivery.ts

ULTRAPLAN은 4단계 파이프라인으로 동작합니다:

02

키워드 스캐너

ULTRAPLAN은 명시적 /ultraplan 커맨드 외에도, 사용자 입력의 자연어 패턴을 분석하여 계획 요청을 자동으로 감지합니다. 다만, 오탐을 방지하기 위해 여러 필터가 적용됩니다.

// ultraplan/trigger.ts — 키워드 스캐너 & 필터
function shouldTriggerUltraplan(input: string): boolean {
  // 필터 1: 인용문 내부의 텍스트는 무시
  const unquoted = stripQuotedStrings(input)

  // 필터 2: 파일 경로 패턴 제외
  if (containsFilePath(unquoted)) return false

  // 필터 3: 슬래시 커맨드 패턴 제외 (/ultraplan 자체는 별도 처리)
  if (isSlashCommand(unquoted)) return false

  // 필터 4: 물음표로 끝나는 단순 질문 제외
  if (isSimpleQuestion(unquoted)) return false

  // 키워드 매칭
  return PLAN_KEYWORDS.some(kw => unquoted.includes(kw))
}

const PLAN_KEYWORDS = [
  'plan', 'architect', 'design',
  'strategy', 'roadmap', 'blueprint',
]
딥 다이브 — 왜 4중 필터인가?

ULTRAPLAN은 클라우드 Opus 세션을 30분간 실행하므로 비용이 높습니다. 따라서 오탐으로 인한 불필요한 세션 실행을 최소화해야 합니다. 인용문, 파일 경로, 슬래시 커맨드, 단순 질문을 필터링하면 "plan이라는 단어가 포함된 파일 경로를 읽어줘" 같은 입력이 잘못 트리거되는 것을 방지합니다.

03

실행 시퀀스

ULTRAPLAN이 트리거되면 "detached" 패턴으로 원격 세션을 실행합니다. 로컬 클라이언트는 세션 시작 후 즉시 제어를 반환받고, 원격 세션은 독립적으로 실행됩니다.

// ultraplan/session.ts — "detached" 패턴 실행
let ultraplanLaunching = false  // 동기 플래그: 중복 실행 방지

async function launchUltraplan(prompt: string): Promise<UltraplanSession> {
  // 동기 가드: 이미 실행 중이면 중복 방지
  if (ultraplanLaunching) {
    throw new Error('ULTRAPLAN session already launching')
  }
  ultraplanLaunching = true

  try {
    // 1. 원격 CCR 세션 생성 (Opus 모델 지정)
    const session = await createRemoteSession({
      model: 'opus',
      maxDuration: 30 * 60 * 1000,  // 30분
      prompt: buildUltraplanPrompt(prompt),
    })

    // 2. 폴링 엔진 시작
    startPolling(session.id)

    return session
  } finally {
    ultraplanLaunching = false
  }
}

ultraplanLaunching 동기 플래그

ultraplanLaunching 플래그는 ULTRAPLAN 세션의 중복 실행을 방지하는 동기식 가드입니다. 비동기 락이 아닌 단순 boolean을 사용하는 이유는, JavaScript의 단일 스레드 특성상 동기 코드 실행 중에는 다른 비동기 콜백이 개입할 수 없기 때문입니다.

주의사항

ultraplanLaunching 플래그는 finally 블록에서 반드시 해제되어야 합니다. 예외 발생 시 해제되지 않으면 이후 모든 ULTRAPLAN 요청이 차단됩니다.

04

폴링 엔진

원격 세션이 시작되면 로컬 클라이언트는 커서 기반 폴링으로 진행 상황을 모니터링합니다. 각 폴 요청은 마지막으로 받은 커서 위치 이후의 새로운 이벤트만 반환합니다.

// ultraplan/poller.ts — 커서 기반 폴링 엔진
async function pollSession(sessionId: string): Promise<void> {
  let cursor: string | undefined

  while (true) {
    const response = await fetchEvents(sessionId, { cursor })

    for (const event of response.events) {
      // ExitPlanModeScanner: 완료 신호 감지
      if (isExitSignal(event)) {
        await deliverPlan(sessionId)
        return
      }
      // 중간 진행 상황 UI 업데이트
      updateProgressUI(event)
    }

    // 커서 전진 — 다음 폴은 여기서부터
    cursor = response.nextCursor

    // 백오프: 이벤트가 없으면 대기 시간 증가
    await sleep(response.events.length > 0 ? 1000 : 3000)
  }
}

ExitPlanModeScanner

ExitPlanModeScanner는 원격 세션의 이벤트 스트림에서 계획 완료 신호를 감지하는 스캐너입니다. 원격 Opus가 계획 작성을 완료하고 특정 마커를 출력하면, 이 스캐너가 이를 포착하여 폴링 루프를 종료하고 계획 전달 단계로 전환합니다.

딥 다이브 — 왜 웹소켓 대신 폴링인가?

ULTRAPLAN은 최대 30분간 실행되므로 웹소켓 연결이 중간에 끊길 가능성이 높습니다(네트워크 전환, 노트북 절전 등). 커서 기반 폴링은 연결 중단에 강건하며, 마지막 커서부터 재개하면 이벤트 유실 없이 복구됩니다. 또한 서버 측 구현이 단순하고 HTTP 인프라를 그대로 활용할 수 있습니다.

05

전달 경로

완성된 계획은 두 가지 경로 중 하나로 로컬 세션에 전달됩니다:

경로 1: 원격 실행 (Remote Execution)

계획이 단순한 텍스트가 아니라 실행 가능한 단계들을 포함하는 경우, 원격 세션이 직접 각 단계를 실행하고 결과를 로컬에 전달합니다.

// ultraplan/delivery.ts — 원격 실행 경로
async function deliverViaRemoteExecution(
  session: UltraplanSession
): Promise<PlanResult> {
  const plan = await fetchCompletedPlan(session.id)

  return {
    type: 'remote-execution',
    steps: plan.steps,
    artifacts: plan.artifacts,
    summary: plan.summary,
  }
}

경로 2: 텔레포트 (Teleport)

계획이 로컬 환경에서 실행되어야 하는 경우, 원격 세션의 전체 컨텍스트가 로컬 세션으로 "텔레포트"됩니다. 이는 원격에서 구축한 이해를 로컬 Claude에 이식하는 것과 같습니다.

// ultraplan/delivery.ts — 텔레포트 경로
async function deliverViaTeleport(
  session: UltraplanSession
): Promise<PlanResult> {
  const context = await fetchSessionContext(session.id)

  // 원격 컨텍스트를 로컬 메시지 히스토리에 주입
  injectIntoLocalHistory(context.messages)

  return {
    type: 'teleport',
    injectedMessages: context.messages.length,
    summary: context.summary,
  }
}
딥 다이브 — 원격 실행 vs 텔레포트 선택 기준

두 전달 경로의 선택은 계획의 성격에 따라 결정됩니다. 코드 변경, 파일 생성 등 로컬 파일시스템 접근이 필요한 작업은 텔레포트를 통해 로컬에서 실행됩니다. 반면 아키텍처 분석, 코드 리뷰 등 읽기 전용 작업은 원격에서 실행하고 결과만 전달합니다.

06

정리 & 리소스 관리

ULTRAPLAN 세션이 완료되거나 타임아웃되면, 원격 리소스를 정리하고 로컬 상태를 복원해야 합니다.

// 세션 정리 — 완료/타임아웃/에러 모든 경우 처리
async function cleanupSession(sessionId: string): Promise<void> {
  // 1. 원격 세션 종료 요청
  await terminateRemoteSession(sessionId)

  // 2. 폴링 루프 중단
  stopPolling(sessionId)

  // 3. 로컬 진행 상황 UI 제거
  clearProgressUI()

  // 4. 비용 추적에 원격 세션 토큰 사용량 합산
  const usage = await fetchSessionUsage(sessionId)
  addToLocalCostTracker(usage)

  // 5. 분석 이벤트 기록
  logEvent('ultraplan_completed', {
    sessionId,
    duration: usage.durationMs,
    tokensUsed: usage.totalTokens,
  })
}
주의사항

30분 타임아웃에 도달하면 원격 세션은 강제 종료됩니다. 이 경우 부분적으로 완성된 계획이 전달될 수 있으며, 클라이언트는 이를 사용자에게 "부분 계획"으로 표시해야 합니다.

07

핵심 요약

핵심 포인트

  • ULTRAPLAN은 4단계 파이프라인으로 동작합니다: 트리거 감지 → CCR 세션 실행 → 롱폴 → 플랜 전달
  • 키워드 스캐너는 인용문, 파일 경로, 슬래시 커맨드, 단순 질문을 필터링하여 오탐을 최소화합니다
  • "detached" 패턴으로 원격 세션을 실행하며, ultraplanLaunching 동기 플래그가 중복 실행을 방지합니다
  • 폴링 엔진은 커서 기반으로 동작하여 연결 중단에 강건하며, ExitPlanModeScanner가 완료 신호를 감지합니다
  • 계획 전달은 원격 실행(읽기 전용 작업)과 텔레포트(로컬 실행 필요 작업) 두 경로로 분기됩니다
  • 정리 단계에서 원격 리소스 해제, 비용 합산, 분석 이벤트 기록이 수행됩니다
08

지식 확인

퀴즈 — 5문제

Q1. ULTRAPLAN의 키워드 스캐너가 물음표로 끝나는 입력을 필터링하는 이유는?

  • A) 물음표가 포함된 입력은 파싱할 수 없기 때문에
  • B) 질문에는 계획이 필요하지 않다는 제품 정책 때문에
  • C) 물음표가 정규 표현식을 깨뜨리기 때문에
  • D) "plan"이라는 단어가 포함된 단순 질문이 불필요한 30분 원격 세션을 트리거하는 오탐을 방지하기 위해
ULTRAPLAN은 클라우드 Opus를 30분간 실행하므로 비용이 높습니다. "이 plan 파일이 뭐야?" 같은 단순 질문이 트리거되면 불필요한 비용이 발생하므로, 물음표로 끝나는 단순 질문을 필터링합니다.

Q2. ultraplanLaunching 플래그가 비동기 락 대신 단순 boolean인 이유는?

  • A) 비동기 락이 Node.js에서 지원되지 않기 때문에
  • B) JavaScript의 단일 스레드 특성상 동기 코드 실행 중에는 다른 비동기 콜백이 개입할 수 없으므로 단순 boolean으로 충분
  • C) 성능 최적화를 위해
  • D) TypeScript의 타입 시스템 제약 때문에
JavaScript의 이벤트 루프는 단일 스레드이므로, 동기 코드 블록 내에서 플래그를 설정하면 해당 블록이 완료될 때까지 다른 비동기 작업이 플래그를 읽을 수 없습니다. 따라서 단순 boolean이 효과적인 가드가 됩니다.

Q3. 커서 기반 폴링이 웹소켓보다 ULTRAPLAN에 적합한 이유는?

  • A) 웹소켓이 HTTP/2와 호환되지 않기 때문에
  • B) 폴링이 웹소켓보다 항상 빠르기 때문에
  • C) 30분의 긴 세션에서 네트워크 중단 시 마지막 커서부터 재개할 수 있어 강건하기 때문에
  • D) 서버 비용을 절감하기 위해
30분간의 긴 세션에서 웹소켓 연결은 네트워크 전환, 노트북 절전 등으로 끊길 가능성이 높습니다. 커서 기반 폴링은 연결 상태와 무관하게 마지막 커서 위치부터 재개할 수 있어 이벤트 유실 없이 복구됩니다.

Q4. "텔레포트" 전달 경로는 언제 사용되는가?

  • A) 계획이 로컬 파일시스템 접근(코드 변경, 파일 생성 등)이 필요한 경우
  • B) 네트워크 지연이 높은 경우
  • C) 원격 세션이 타임아웃된 경우
  • D) 사용자가 명시적으로 텔레포트를 요청한 경우
텔레포트는 원격에서 구축한 컨텍스트를 로컬 세션에 주입하여, 로컬 Claude가 해당 이해를 바탕으로 파일시스템 작업을 수행할 수 있게 합니다. 읽기 전용 작업은 원격 실행 경로를 사용합니다.

Q5. ULTRAPLAN의 4단계 파이프라인을 올바른 순서로 나열한 것은?

  • A) 세션 실행 → 트리거 감지 → 플랜 전달 → 롱폴
  • B) 키워드 스캔 → 폴링 → 세션 생성 → 결과 표시
  • C) 트리거 감지 → CCR 세션 실행 → 롱폴 → 플랜 전달
  • D) 플랜 전달 → 롱폴 → 세션 실행 → 트리거 감지
ULTRAPLAN은 트리거 감지(슬래시 커맨드 또는 키워드) → CCR 세션 실행(클라우드 Opus) → 롱폴(커서 기반 모니터링) → 플랜 전달(원격 실행 또는 텔레포트)의 4단계로 동작합니다.
0 / 5