Reelier
공식에이전트가 주장을 하면, Reelier가 영수증을 작성합니다 — 에이전트의 도구 호출 워크플로를 한 번 기록하고, 0토큰으로 결정론적으로 재생하며, 실행 간 차이를 비교하여 드리프트를 감지합니다.
Reelier MCP(으)로 무엇을 할 수 있나요?
- 스캔 에이전트 기록에서 재생 가능한 워크플로 찾기 —
reelier_scan은 도구 호출 시퀀스가 포함된 과거 Claude Code, Codex, Windsurf 또는 OpenClaw 세션을 발견하여 스킬로 컴파일할 수 있게 합니다. - 세션을 결정론적 스킬로 컴파일하기 —
reelier_from_session은 기록된 추적을SKILL.md파일로 변환하며, 각 단계에 어서션을 포함하고 LLM을 사용하지 않습니다. - 스킬을 제로 토큰으로 재생하기 —
reelier_replay는 컴파일된 스킬을 밀리초 단위로 결정론적으로 실행하며, 기본적으로 읽기 전용이며 바이트 단위로 동일한 영수증을 생성합니다. - 두 실행을 비교하여 드리프트 감지하기 —
reelier_diff는 재생 결과를 단계별로 비교하여 SAME 또는 DRIFTED를 실패한 어서션과 함께 보고하고, 드리프트 발생 시 0이 아닌 종료 코드를 반환합니다. - 공유 가능한 퍼머링크를 위해 영수증 푸시하기 —
reelier_push는 실행 영수증을 원장에 동기화하며, 선택적으로 검증된 재생 배지를 생성합니다.
문서
Reelier
에이전트는 주장합니다. Reelier는 영수증을 작성합니다.
작동했던 실행을 기록하고, 결정론적으로 재생합니다 — 0 토큰, 바이트 단위로 동일, 모든 단계에 영수증 — 그리고 reelier diff이(가) 변경이 발생한 날을 포착합니다.
에이전트의 도구 호출 워크플로우를 위한 CI + 스냅샷 테스트라고 생각하세요.
에이전트는 매 실행마다 동일한 워크플로우를 다시 도출하며 토큰을 소모하고 조용히 변경됩니다. Reelier는 작동했던 실행을 SKILL.md 파일로 컴파일하여 결정론적으로 재생하고(LLM 없음, 0 토큰, 모든 단계가 영수증으로 확인됨), 실행 결과를 비교하여 일치하지 않는 날을 포착합니다. "실행되었다"는 것이 증명이 되지 않는, 반복적인 프로덕션 워크플로우를 사용하는 에이전트를 위한 도구입니다.
설치 → 60초 만에 첫 영수증 받기
npm i -g reelier && reelier init
reelier init은(는) 먼저 사용자가 이미 수행한 작업을 검색하여 — Claude Code, Codex, Windsurf, OpenClaw 전반에서 — 실제 과거 세션을 재생 가능한 스킬로 전환할 것을 제안합니다. 그러한 기록이 없다면? 설정 없이 데모를 실행하고 실제 영수증과 함께 종료합니다:
Your receipt:
skill: reelier-init-demo
steps: 2 total, 2 passed, 0 unchecked, 0 failed
replay time: 44ms [measured]
LLM tokens: 0 [measured]
An agent doing a comparable task re-reasons every run (~2.8s, ~18k tokens on
our benchmark). Your replay: 44ms, 0 tokens.
또는 Docker로 실행 — Node 설치 불필요
docker run --rm ghcr.io/seldonframe/reelier --help
# Replay a skill from the current directory:
docker run --rm -v "$PWD:/work" -w /work ghcr.io/seldonframe/reelier run my.skill.md
# Record from your agent history (mount it read-only):
docker run --rm -v "$HOME/.claude:/root/.claude:ro" -v "$PWD:/work" -w /work \
ghcr.io/seldonframe/reelier scan
이유
- 에이전트는 매 실행마다 작업을 다시 학습하고 조용히 변경됩니다. 매 실행마다 워크플로우를 다시 도출하며, 사소한 "합리적인" 수정이 누적되어 장기 운영자가 상처 조직이라고 부르는 현상이 발생합니다. 컴파일된 스킬은 다시 학습하지 않으며 변경될 수 없습니다.
- 진짜 문제는 비용입니다. *"그거 비용이 얼마나 들었어?"*는 긴 에이전트 실행 시 가장 먼저 받는 답변입니다. Reelier는 0 토큰으로 영수증과 함께 재생합니다.
- 취약한 RPA가 아닙니다. 픽셀이 아닌 도구 호출(입출력이 JSON으로 타입 지정됨)을 재생하며, 모든 단계가 자체 assertion을 가지므로, 손상된 단계는 조용히 통과하지 않고 크게 실패합니다.
- 모델을 업그레이드했나요? 재생은 고정되어 있습니다 — 새 모델에서 다시 기록하고
reelier diff을(를) 사용하여 동결된 기준선과 비교합니다: 프로덕션에 도달하기 전에 단계별로 동일함 또는 변경됨을 확인합니다. - "결정론적인 것은 그냥 코드여야 한다." 동의합니다 — 에이전트가 이미 작성했습니다. Reelier는 실제 작동하는 실행을 캡처하여 테스트된 파일로 만듭니다. 수동 코딩 없이 결정론을 달성합니다.
작동 방식 — 기록 → 컴파일 → 재생 → 비교 → 영수증
reelier init # 60s: record → compile → replay → your receipt
reelier run <name>.skill.md # replay deterministically — 0 tokens (read-only by default)
reelier diff <name> # SAME or DRIFTED, per step — exit 1 on drift
reelier push <name>.skill.md # sync receipts to your ledger (opt-in)
- 기록 — 세 가지 방법:
reelier mcp --wrap "<your mcp server>"(에이전트 도구 앞의 무손실 프록시), 기존 세션에서 직접 (reelier scan/reelier from-session), 또는 안내식reelier init. - 컴파일 —
reelier compile이(가) 트레이스를SKILL.md파일로 결정론적으로 변환하며(LLM 호출 0회), 모든 단계에 assertion이 포함된 레시피와 컴파일러가 추측하지 않고 솔직하게 열린 질문으로 출력한 공백(리터럴 날짜, UUID, "이것이 변수여야 하는가?"로 표시된 타임스탬프 포함)을 제공합니다. - 재생 —
reelier run이(가) 레벨 0에서 실행합니다: LLM 없음, 밀리초 단위, 바이트 단위 동일. 기본적으로 읽기 전용 — 쓰기 단계(idempotent-write)는--allow-writes을(를) 전달하지 않는 한 다시 실행되지 않습니다. - 비교 —
reelier diff이(가) 스킬의 두 실행을 비교하고 단계별로 동일함 또는 변경됨을 실패한 assertion과 함께 이유로 보고합니다. 변경 시 종료 코드 1을 반환하여 예약된 재생을 차단합니다. - 영수증 — 모든 실행은 영수증입니다(단계별 결과, 타이밍, 0 토큰).
reelier push은(는) 선택적으로 영수증을 영수증 원장에 동기화하여 공유 가능한 영구 링크와 삽입 가능한 검증된 재생 배지를 제공합니다.
에이전트 스킬 변환
지시 스킬 + 기록된 실행 하나를 결정론적 재생으로 전환 — 모델을 제외한 스킬:
reelier mcp --wrap "<your mcp server>" # record: agent runs the skill's task once
reelier compile trace.jsonl --from-skill ./my-skill/SKILL.md
# → my-skill.skill.md — name + description carried from your SKILL.md,
# steps ONLY from the recorded run (never generated from instruction text)
모든 에이전트에서 세션 가져오기
에이전트의 자체 세션 로그에 이미 재생 가능한 워크플로우가 있습니다. reelier scan이(가) 이를 찾고, reelier from-session이(가) 하나를 스킬로 전환합니다. 파일 콘텐츠에서 형식을 감지하므로 지원되는 에이전트에 플래그가 필요하지 않습니다:
reelier scan # discovers sessions from every known agent under your home dir
reelier from-session ~/.claude/projects/*/*.jsonl # Claude Code
reelier from-session ~/.codex/sessions/**/rollout-*.jsonl # Codex CLI
reelier from-session ~/.openclaw/agents/*/sessions/*.jsonl # OpenClaw
| 에이전트 | 세션 위치 | 상태 |
|---|---|---|
| Claude Code | ~/.claude/projects/<project>/<uuid>.jsonl | 지원됨 |
| Codex CLI | ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl | 지원됨 |
| OpenClaw | ~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl | 지원됨 |
| Cursor | .../User/globalStorage/state.vscdb (SQLite, 문서화되지 않음) | 감지됨, 아직 파싱 불가 |
| Windsurf | .../User/globalStorage/state.vscdb (SQLite, 문서화되지 않음) | 감지됨, 아직 파싱 불가 |
재생 가능한 호출(Reelier 자체 내장 기능 또는 mcp__<server>__<tool> 호출)만 스킬로 컴파일됩니다 — 네이티브 파일/셸/검색 작업은 건너뛴 것으로 보고되며, 단계로 조작되지 않습니다. 자동 감지 대신 형식을 강제하려면 --agent <claude-code|codex|openclaw>을(를) 전달하고, reelier scan / reelier from-session --agent cursor (또는 --agent windsurf)은 문서화되지 않은 바이너리 형식을 추측하지 않고 디스크의 내용을 솔직하게 보고합니다.
세 가지 테스트, 하나의 스킬
하나의 기록된 스킬로 세 가지 다른 질문을 할 수 있습니다:
- 결정론 —
reelier run <skill.md>이(가) 기록한 assertion에 대해 재생합니다. 동일한 단계, 동일한 assertion, 0 토큰. 답변: 이것이 여전히 예전처럼 작동하는가? - 복구 —
reelier run <skill.md> --fail N[=status]이(가) 해당 단계의 실제 도구 호출을 발송하는 대신N단계(기본 상태500;--fail N=429으로 재정의, 반복 가능)에서 합성 실패를 주입한 다음, 실제 실패 시 도달할 동일한 에스컬레이션 래더를 실행합니다. 네트워크 외부에서는 실제로 아무 일도 일어나지 않습니다 — 모의 단계는 도구를 호출하지 않으므로--allow-writes및 부작용 없이 쓰기 단계의 복구 테스트를 수행할 수 있습니다. 답변: 이것이 고장 나면, 스킬이 이를 감지하고 복구할까? (모의 실행은 로컬 테스트 전용입니다 —reelier push은(는) 게시를 거부합니다. 아래 참조.) - 변경 —
reelier run <skill.md> --wrap "<your mcp server>"이(가) 기록된 트레이스 대신 실시간 읽기 전용 종속성에 대해 재생합니다. 아래의reelier manifest과(와) 함께 사용하면 실제 재생 전에 도구 스키마가 변경되는 것을 포착할 수 있습니다.
분류 체계는 Mads Hansen의 출시 게시물 리뷰에 따른 것입니다.
도구 스키마 변경: reelier manifest
스킬의 단계는 특정 인수 형태로 특정 도구를 호출합니다. 래핑된 MCP 서버의 도구 스키마가 기록 이후 변경된 경우, 재생은 잘못된 인수를 조용히 채우는 대신 크게 거부해야 합니다. reelier manifest은(는) 스킬의 단계가 실제로 사용하는 모든 도구에 대한 스키마 다이제스트를 기록합니다:
reelier manifest <skill.md> --wrap "<your mcp server>" # stamp/refresh the manifest from live servers
reelier run <skill.md> --wrap "<your mcp server>" # preflight checks the manifest BEFORE step 1 runs
스탬프된 도구의 스키마가 변경되었거나 도구가 사라진 경우, reelier run은(는) 실행 전에 안전하게 실패합니다 — MANIFEST DRIFT — refusing to replay. --ignore-manifest은(는) 변경이 괜찮다는 것을 알 때 사용하는 명시적인 비상 override입니다. 이는 여전히 실행에 기록되므로(manifestIgnored: true) 조용한 우회가 아닙니다. 매니페스트가 전혀 없는 스킬은 권고 노트만 받습니다 — 모든 매니페스트 이전 스킬은 수정 없이 계속 작동합니다.
단계별 쓰기 승인: reelier approve
--allow-writes/--yes은(는) 포괄적인 플래그입니다 — "이 실행이 쓸 수 있다"는 의미이지 "이 정확한 쓰기가 검토되었다"는 의미가 아닙니다. reelier approve은(는) 승인을 특정 단계의 도구 + 인수 템플릿에 해시 바인딩합니다:
reelier approve <skill.md> # walk each write/destructive step, y/N to approve
reelier approve <skill.md> --all # approve every write step non-interactively
도구/인수가 스탬프된 해시와 여전히 일치하는 승인된 단계는 플래그 없이 실행됩니다. 승인 이후 단계의 도구 또는 인수가 변경된 경우, 재생은 안전하게 실패합니다 — Approval mismatch — 어떤 플래그도 이를 재정의하지 않습니다. 다시 검토하고 재승인해야 합니다. approve: 필드가 없는 쓰기 단계는 오늘날의 정확한 --allow-writes/--yes 동작을 변경 없이 유지합니다.
값 assertion, 형태뿐만 아니라
스킬의 assertion은 재생을 증명으로 만듭니다. 문법은 상태, 구조, 그리고 값을 확인합니다:
- assert: status == 200
- assert: json.results is array
- assert: json.count >= 1 # numeric range
- assert: json.plan is string # type
- assert: json.id matches /^usr_/ # value pattern
- assert: body contains "ok"
코딩 에이전트 내부에서 사용 (MCP)
reelier serve은(는) Reelier 자체 명령을 MCP 도구로 노출하므로 Claude Code / Cursor / Windsurf / Codex가 세션 중에 호출할 수 있습니다:
{ "mcpServers": { "reelier": { "command": "npx", "args": ["-y", "reelier", "serve"] } } }
에이전트는 reelier_scan, reelier_from_session, reelier_replay, reelier_diff, reelier_push을(를) 사용할 수 있으며, 각각을 언제 사용해야 하는지(그리고 언제 사용하지 말아야 하는지) 정확히 알려주는 설명이 포함되어 있습니다. 결정론적 작업을 한 번 기록한 다음, 다시 추론하는 대신 재생합니다.
도구
- reelier_scan — 재생 가능한 도구 호출 워크플로우를 위해 에이전트 세션 기록(Claude Code, Codex, Windsurf, OpenClaw)을 스캔합니다.
- reelier_from_session — 기록된 세션을 모든 단계에 assertion이 있는 재생 가능한 SKILL.md로 컴파일합니다.
- reelier_replay — 0 LLM 토큰으로 스킬을 결정론적으로 재생합니다(기본적으로 읽기 전용; 쓰기는
--allow-writes뒤에서 제어됨). - reelier_diff — 두 실행을 비교합니다: 단계별로 동일함 또는 변경됨, 실패한 assertion을 이유로 제시; 변경 시 종료 1.
- reelier_push — 공유 가능한 영구 링크를 위해 실행 영수증을 원장에 동기화합니다(선택 사항).
측정된 증명
실제 라이브 일대일 벤치마크(에이전트 대 Reelier, 동일 작업, 동일 데이터)에서 — 전체 표 + 방법론은 examples/benchmark에서 확인:
- 1,000 / 1,000 재생이 바이트 단위로 동일 (N=1000 꼬리 분산 테스트)
- 재생당 0 토큰 — 가정이 아닌 실행 기록에서 검증됨
- 약 50배 저렴 (재생당 $0.000000 대 에이전트 암 평균 실행당 $0.019068)
- 약 59배 빠름 (48ms 대 평균 지연 시간 2,842ms)
- 실제 변경이 약 $0.001로 자가 복구되었으며, 이후 모든 재생은 무료
지연 시간은 네트워크에 따라 다릅니다 — 레벨-0 재생은 스킬의 도구 호출을 다시 실행하므로 실제 시간은 연결 상태에 따라 달라집니다. 변하지 않는 것: 0 LLM 토큰, 매 실행 동일한 단계, 그리고 영수증. 독립적으로 입증됨 — arXiv 2605.14237에서 동일한 기록 및 재생 패턴에 대해 93.3–99.98% 토큰 감소를 발견했습니다.
모든 모델과 작동 (BYOK)
레벨-0 재생(기본값)은 모델을 호출하지 않습니다 — 구조상 0 토큰입니다. 에스컬레이션(--max-level 1|2)은 선택 사항이며 하나의 좁은 BYOK 표면(--llm-base-url + --llm-model)을 통해 통신합니다: 네이티브 Anthropic Messages 어댑터 및 기타 모든 것(OpenRouter, Ollama, Gemini의 OpenAI 엔드포인트, Groq, vLLM, LM Studio, Kimi 등)을 위한 OpenAI 호환 어댑터. 더 강력한 모델을 지정하면 모든 스킬의 다음 자가 복구가 무료로 더 스마트해집니다.
소유하세요 — MIT, BYOK, 로컬 우선
어디서나 사용하고, 무엇에든 임베드하세요 — 카피레프트 제약 없음, 법적 검토 불필요. 스킬, 트레이스 및 실행 기록은 사용자의 데이터입니다 — 폴더를 복사하는 것이 곧 떠나는 것입니다. 형식은 SPEC.md에 규범적인 RFC 스타일 참조로 지정되어 있으므로 누구나 소스 코드를 읽지 않고도 내보내거나 사용할 수 있습니다.
기여
이슈 및 PR 환영 — 형식은 SPEC.md를 참조하세요(코드보다 사양이 우선합니다. 사양이 아닌 코드를 수정하세요). npm test이(가) 전체 스위트를 실행합니다. PR 전에 npm run build && npx tsc --noEmit.
git clone https://github.com/seldonframe/reelier && cd reelier
npm install && npm test
스타 기록
라이선스
MIT — 영원히 포크, 임베드, 감사 및 자체 호스팅이 자유롭습니다. (버전 ≤0.16.0은 AGPL-3.0으로 출시되었으며 그대로 유지됩니다.)
Reelier가 재실행을 절약했다면, 별표를 눌러주세요 ⭐ — 다른 빌더들이 찾는 방법입니다.