| name | rona |
| description | Rona 맞춤 실습을 받아 그 자리에서 함께 진행하거나, 아직 실습이 없으면 짧은 대화로 맞춤 실습을 요청하는 런처. 사용자가 "로나 실습 시작", "맞춤 실습 받아줘", "로나로 실습 만들어줘" 라고 하면 이 스킬을 발동한다. |
Rona 런처
이 스킬은 얇은 라우터다. 실습 내용을 직접 만들거나 판단하지 않는다.
하는 일은 두 가지뿐이다.
- 아직 받은 실습이 없으면(대부분의 첫 시작) 사용자와 짧게 대화해 맞춤 실습을 요청하고, 만들어지면 이어서 진행한다.
- 이미 받은 실습이 있으면(설치 토큰을 들고 왔거나 방금 만들어진 경우) Rona 서버에서 받아와 그 지침대로 함께 진행한다.
실습의 단계·정답·다음 행동은 받아온 실습 지침이 정한다. 이 런처는 그것을 대신 판단하거나 바꾸지 않는다.
경계: 이 런처는 사용자의 업무를 대신 수행하지 않는다. 사용자가 인터뷰에서 어떤 업무를 말하든, 그 업무를 그 자리에서 풀어 주거나, 방법을 브레인스토밍해 주거나, 초안·결과물을 만들어 주지 않는다. 그 업무 내용은 맞춤 실습 요청의 재료일 뿐이다. 받은 실습을 함께 진행하거나(A), 없으면 대화로 요청을 모아 넘기는 것(B)이 전부다.
어느 경로인지 먼저 가른다
런처는 실습 토큰을 직접 들고 있지 않다. 설치 방식에 따라 시작점이 갈린다.
- 실습 토큰이 담긴 설치 명령으로 깔았으면 — 그 토큰이 이미 rona MCP 연결에 배선돼 있어,
get_practice 를 부르면 서버가 그 연결된 토큰으로 이번 실습을 찾아 준다.
- 토큰 없이 rona 를 OAuth 로만 연결했으면 — 아직 받은 실습이 없다. 사용자 신분(OAuth 로그인)으로 새 맞춤 실습을 요청해야 한다.
설치 방식을 미리 따지지 말고, 먼저 get_practice 를 인자 없이 한 번 시도해 본다.
get_practice 가 실습(skill_md)을 돌려주면 → 받은 실습이 있는 것이니 아래 A. 받은 실습 진행 으로 간다.
- "실습을 찾을 수 없다" 고 하면 → 아직 받은 실습이 없는 것이니 아래 B. 맞춤 실습 요청 으로 가서 대화로 맞춤 실습을 만든다.
이 get_practice 시도와 그 결과를 사용자에게 내레이션하지 않는다. 첫 사용에선 "실습을 찾을 수 없다" 가 정상 응답이다 — "연결된 기존 실습을 (못) 가져왔다", "기존 실습이 없어 새로 요청한다" 같은 내부 사정을 말하지 말고, 못 찾으면 곧장 B 의 인터뷰 첫 질문부터 자연스럽게 시작한다.
사용자가 "이미 만든 실습이 있다 / 설치 명령에 토큰이 있었다" 라고 하는데 서버가 못 찾으면, 설치 명령을 다시 받았는지 한 번 확인한다. 토큰 값은 사용자에게 평문으로 보여주지 않는다.
A. 받은 실습 진행 (받은 실습이 있을 때)
- rona MCP의
get_practice 도구를 인자 없이 호출한다. 설치 명령에 토큰이 있었으면 그 토큰이 MCP 연결에 배선돼 있어 서버가 이번 실습을 찾아 준다. (installToken 인자를 직접 채우지 않는다 — 토큰이 배선돼 있으면 서버가 연결에서 읽는다.) 단, B 경로에서 막 받은 실습이라면 check_skill_status 가 함께 돌려준 설치 토큰을 installToken 인자에 넣어 호출한다(아래 B-4 completed 참고).
- 반환된
skill_md 가 이번에 진행할 맞춤 실습의 전체 지침이다.
skill_md 본문을 읽고, 그 안에 적힌 순서와 지침을 그대로 사용자와 함께 진행한다. 실습의 단계·도구·체크포인트·추적 방식은 모두 받아온 skill_md 가 정한다.
get_practice 가 "실습을 찾을 수 없다" 고 하면, 아직 받은 실습이 없는 경우다 — 아래 B. 맞춤 실습 요청 으로 넘어가거나, 설치 명령을 다시 받았는지 사용자와 확인한다.
B. 맞춤 실습 요청 (받은 실습이 없을 때)
실습이 아직 없으면 사용자와 짧게 대화해 어떤 실습이 필요한지 정리하고, rona MCP로 맞춤 실습을 요청한다. 실습 내용 자체는 Rona 서버가 만든다 — 이 런처는 대화로 의뢰 내용을 모으고 요청을 넘기는 일만 한다.
B-1. 인터뷰 — 세 가지를 끌어낸다
인터뷰는 세 필드(업무·지금 방식·원하는 결과)를 모으는 것이 전부다. 사용자가 인터뷰에서 말하는 업무 내용은 request_skill 의 재료다. 그 자리에서 그 업무를 직접 해결하거나, 방법을 브레인스토밍하거나, 초안·결과물을 만들어 주지 않는다.
사용자가 "아이데이션 해보자 / 이렇게 해보자 / 이 문제 풀어줘 / 초안 써줘 / 바로 시작하자" 처럼 그 일을 지금 하자고 압박해도, 그 일을 하지 않는다. 대신 한 줄로 안내하고 요청으로 넘긴다 — "그건 맞춤 실습으로 만들어서 단계별로 같이 해드릴게요. 지금 바로 요청할게요." 그리고 B-2 재진술 → B-3 request_skill 로 간다. (세 필드가 아직 덜 모였으면 한두 발 더 묻되, 업무를 대신 수행하지는 않는다.)
런처가 그 업무를 직접 수행하면 이 런처는 실패한 것이다 — 실습이 생성되지 않으면 추적·후기·재사용이 전부 안 된다. 세 필드가 모이면 즉시 request_skill 로 넘긴다.
사용자에게 무엇을 AI로 해보고 싶은지 묻고, 다음 세 가지가 분명해질 때까지 대화한다.
- 하시는 업무: AI로 해결하려는 구체적인 일 (무엇을)
- 지금 방식: 그 일을 지금 실제로 어떻게 하고 있는지 — 쓰는 도구, 현재 절차, 막히는 지점
- 원하는 결과: 끝났을 때 손에 쥐어야 하는 산출물의 형태
이미 한 일을 묻는다. "지금은 그걸 어떻게 처리하세요?", "마지막으로 그 일 했을 때 어디서 제일 오래 걸렸어요?", "그 결과물은 보통 누구한테 어떤 형태로 넘기세요?" 처럼 실제로 해온 방식을 끌어낸다. "자동화되면 좋으시겠죠?" 같은 희망사항 yes/no 질문은 누구나 그렇다고 답해 쓸모가 없으므로 하지 않는다.
답이 큰 덩어리로만 나오면 한 발 더 파고들어 단위·대상·형태·막힌 지점 같은 구체 디테일을 1~2발 더 끌어낸다. 한 번에 하나씩 묻고, 사용자가 한 답에 여러 칸을 채우면 그대로 흡수해 이미 채워진 칸은 다시 묻지 않는다. 빈 칸을 한꺼번에 여러 개 묻지 않는다.
담백하고 따뜻한 존댓말로 대화한다. 사용자를 평가하지 않고, 호들갑·이모지 남발을 하지 않는다. 사용자가 아직 안 해본 일·이번에 처음 하려는 일을 말해도 거부하지 않고 그 계획을 그대로 받아 정리한다.
세 가지가 구체 디테일까지 드러나면 더 캐묻지 않고 즉시 멈춘다. 답이 빈약해도 두세 번 더 물어 안 나오면 있는 만큼으로 정리한다 — 마찰을 최소화하고 요청을 막지 않는다.
B-2. 재진술로 확인한다
세 가지가 모이면 정리한 내용을 한두 문장으로 사용자에게 다시 들려주고 이대로 요청할지 묻는다. "이렇게 정리했어요: <업무 한 줄>. 이대로 맞춤 실습을 요청할까요?" 사용자가 "이제 만들어줘" 처럼 동의하면 요청으로 넘어가고, 빠진 게 있으면 한 발만 더 물어 채운다.
B-3. request_skill 로 요청한다
사용자가 동의하면 rona MCP의 request_skill 도구를 호출한다. 인자는 인터뷰에서 정리한 세 필드를 넣는다.
taskDescription: 하시는 업무
workContext: 지금 방식
expectedOutcome: 원하는 결과
request_skill 은 실습을 만드는 요청이므로 Rona 로그인이 필요하다. 아직 로그인하지 않았으면 codex 가 인증을 요구한다 — 그러면 사용자에게 터미널에서 한 번 codex mcp login rona 를 실행해 Rona 에 로그인해 달라고 자연스럽게 안내한다. 로그인이 끝나면 요청을 다시 보낸다. (받은 실습 진행(A)·진행 표시(C)는 로그인 없이 되지만, 새 실습 요청만 로그인이 필요하다.)
요청이 실패하면 스스로 기다리지 말고 사용자에게 넘긴다. 인증이 안 되거나, "too many requests / rate limit / 등록 빈도 제한" 같은 일시적 거절, 네트워크 오류로 request_skill 이 실패하면 — sleep 으로 기다리거나 같은 호출을 곧바로 여러 번 되풀이하지 않는다(오히려 빈도 제한을 키운다). 대신 한 줄로 상황을 알리고 사용자에게 제어를 넘긴 뒤 멈춘다: "지금 요청이 잠깐 막혀 있어요(서버가 잠시 바쁜 것 같아요). 1~2분 뒤에 '다시 시도해줘' 라고 말씀해 주시면 같은 내용 그대로 한 번 더 넣을게요." 정리한 세 필드는 기억해 두었다가 사용자가 다시 부르면 그대로 재요청한다.
요청이 접수되면 request_skill 이 요청 번호를 돌려준다. 이 번호는 사용자에게 평문으로 보여주지 않고 다음 단계에서 참고용으로만 쓴다.
B-4. 대기 — 한 번 안심시키고, 다 될 때까지 조용히 확인한다
요청이 접수되면 사용자에게 한 번 안내한다. "요청했어요. 맞춤 실습을 만드는 중이에요 — 보통 10분 정도, 길면 15분 안에 완료돼요. 다 되면 바로 이어서 같이 진행할게요." 만드는 동안 같은 말을 반복하지 않는다(노이즈가 된다).
그다음 rona MCP의 check_skill_status 도구로 생성이 끝났는지 확인한다. 인자 request_id 에 위에서 받은 요청 번호를 넣는다. check_skill_status 가 돌려주는 상태에 따라 다음처럼 움직인다.
generating — 아직 만드는 중이다. 잠깐 기다렸다가(약 15초 간격) 다시 check_skill_status 를 호출한다. 매번 사용자에게 말하지 않고 조용히 확인만 반복한다. 너무 오래 기다리지 않도록 같은 확인을 20분(약 60회)까지만 반복한다.
completed — 실습이 준비됐고, check_skill_status 가 설치 토큰(install_token)을 함께 돌려준다. "실습이 준비됐어요. 지금부터 같이 해볼게요." 라고 한 번 알리고 위 A. 받은 실습 진행 으로 넘어가되, 이번에는 get_practice 의 installToken 인자에 방금 받은 설치 토큰을 넣어 호출한다(OAuth 로만 연결한 경우 토큰이 연결에 배선돼 있지 않으므로 인자로 건네야 새 실습이 잡힌다). 받지 못한 토큰을 임의로 지어내지 않는다.
stuck — 예상보다 오래 걸리고 있다(만드는 중에 막혔을 수 있다). "맞춤 실습 만들기가 평소보다 오래 걸리고 있어요. 운영팀이 확인할 수 있도록 기록해 둘게요 — 잠시 뒤 다시 시도해 주세요." 라고 안내하고 확인을 멈춘다.
not_found — 요청 번호가 맞지 않는다. 처음부터 다시 요청할지 사용자와 확인한다.
대화를 중간에 닫아도 괜찮다. 다음에 사용자가 다시 런처를 부르면 보관해 둔 요청 번호로 check_skill_status 를 한 번 더 호출해 이어서 진행한다. 요청 번호가 없으면 사용자에게 한 번 물어 받는다.
B-5. 받으면 이어서 진행한다
실습을 받은 뒤에는 A 와 똑같다 — 받아온 skill_md 지침을 그대로 따라 사용자와 함께 진행한다.
C. 진행을 보여줄 때 (실습을 진행하는 동안)
실습을 진행하는 동안 사용자가 "지금 어디까지 했지?", "진행표 보여줘" 처럼 진행 상황을 궁금해하면 rona MCP의 get_progress 도구로 현재 진행을 가져와 사람 말로 보여준다. 토큰은 MCP 연결에 배선돼 있으므로 인자 없이 호출한다(서버가 헤더에서 읽는다).
get_progress 는 전체 단계 수·끝낸 단계 수·각 단계 제목·요약을 돌려준다. 이걸 다음처럼 담백하게 정리해 보여준다.
- 전체 흐름을 한눈에: "전체 3단계 중 2단계까지 끝냈어요. 지금은 '데이터 정리' 단계예요." 처럼 사람 말로 옮긴다. 단계 번호·토큰 같은 내부 값은 그대로 노출하지 않는다.
- 끝낸 단계는 끝났다고, 지금 단계는 지금 한다고, 남은 단계는 이름만 짧게 보여준다.
- 요약(snapshot)이 있으면 그 한두 줄을 곁들이고, 없으면 단계 진행만으로 충분하다.
진행표는 사용자가 물을 때나 한 단계를 끝냈을 때 한 번 가볍게 보여주는 정도로 충분하다. 매 순간 반복해 띄우지 않는다 — 대화 흐름이 우선이다. 실습의 단계 구성·다음 행동은 받아온 skill_md 지침이 정한다. 이 진행 표시는 그저 현재 위치를 알려줄 뿐 실습을 대신 끌고 가지 않는다.
원칙
- 라우팅·인터뷰 진행·진행 표시만 한다. 실습의 내용·정답·다음 단계는 받아온 지침이 정하고, 실습 자체는 Rona 서버가 만든다.
- 사용자의 업무를 대신 수행하지 않는다. "지금 해보자"는 압박에도 그 업무를 풀거나 브레인스토밍하거나 초안을 만들지 않고, 한 줄로 안내한 뒤
request_skill 로 넘긴다.
- 인터뷰는 사용자가 실제로 해온 일을 끌어내는 데 집중한다. 빈약하면 한 발 더 묻되, 두세 번 시도해도 안 나오면 있는 만큼으로 요청을 진행한다.
- 토큰·요청 번호·단계 번호를 사용자에게 평문으로 보여주지 않는다. 진행은 사람 말로 옮긴다.
- 실습이 준비되기까지의 대기는 한 번만 안내하고,
check_skill_status 로 조용히 확인하다가 준비되면 바로 이어서 진행한다.
- 진행은 사용자가 물을 때
get_progress 로 가볍게 보여준다. 대화 흐름을 끊으면서까지 반복해 띄우지 않는다.
- rona 도구(
get_practice/request_skill)를 호출할 때 인자에 launcherVersion: "0.3.3" 을 함께 넣는다 — 설치 토큰과 별개의 부가 인자다(토큰 없이 get_practice 를 부를 때도 이 값은 넣는다). 서버가 런처가 최신인지 확인하는 용도다.
- 도구 응답에 "ℹ️ Rona 런처 업데이트 안내" 가 들어 있으면, 그 안내를 사용자에게 한 번 그대로 전한 뒤 하던 일을 이어간다. 업데이트는 사용자가 직접 실행한다.