테크부터 경제, 생활까지. 복잡한 소식을 쉽게 풀어봅니다. 오늘(2026년 11월 15일, KST) 오후 오픈소스 심화는 오늘 GitHub Trending 일간 1위에 오른 backnotprop/plannotator입니다. 코딩 에이전트가 계획(plan)을 세우거나 코드를 고친 뒤 “이대로 진행할까요?”라고 묻는 순간, 그 질문을 터미널의 예/아니오 대화상자 대신 로컬 브라우저의 리뷰 화면으로 가로채서 사람이 문서에 직접 주석을 달고, 그 주석을 구조화된 피드백으로 에이전트의 다음 턴에 되돌려 주는 도구입니다. 이 글은 실무자 관점에서 훅 기반 아키텍처, 저장소 구조, 로컬 서버의 보안 경계, 그리고 박스에서 공식 v0.28.65 바이너리로 계획 거절→수정→승인 왕복과 코드 리뷰 피드백 전달을 직접 돌려 본 결과를 정리합니다.

한눈에 보기
| 항목 | 내용 (2026-11-15 KST 확인) |
|---|---|
| 저장소 | backnotprop/plannotator (홈페이지 plannotator.ai) |
| 한 줄 설명 | “The workspace to stay in the loop and on top of agents — shape, decide, plan, annotate, review code, share with team, and send all feedback to agents with one click.” |
| 최신 릴리스 | v0.28.65 (2026-11-15 09:07 KST 공개) · 직전 v0.28.64(11/14), v0.28.63(11/13), v0.28.62(11/12), v0.28.61(11/11) — 거의 매일 릴리스 |
| 라이선스 | MIT OR Apache-2.0 이중 라이선스 (GitHub API 표시는 Apache-2.0) |
| 스타 / 포크 | 약 11,387 / 983 (GitHub API 조회 시점 기준) |
| 트렌딩 | 일간 트렌딩 1위, 오늘 408 stars · 주간 목록에서 이번 주 818 stars |
| 저장소 생성 | 2025-12-28 (KST) |
| 언어·런타임 | TypeScript, Bun 1.4.x (모노레포: apps/ 27개, packages/ 13개) |
| 지원 에이전트 | Claude Code, Codex, Copilot CLI, Gemini CLI, OpenCode, Kiro, Droid, Amp, DeepSeek Harness, Pi 등 (Inbox는 개인 비서형 에이전트까지) |
1. 무엇을 해결하려는 도구인가
요즘 코딩 에이전트는 대부분 “계획 모드”를 갖고 있습니다. 에이전트가 계획을 쓰고, 사람이 승인하면 실행합니다. 문제는 그 승인 UI가 대개 터미널의 한 줄짜리 예/아니오라는 점입니다. 20줄짜리 계획의 3번 항목만 고치고 싶어도, 사람은 자유 텍스트로 “3번은 이렇게 바꾸고 5번은 빼고…”라고 다시 써야 하고, 에이전트는 그 문장을 해석해 어느 부분을 고칠지 추측해야 합니다.
Plannotator는 이 지점을 코드 리뷰처럼 바꿉니다. 계획 문서를 렌더링한 화면에서 특정 문장을 선택해 코멘트, 삭제선(redline), 라벨, 질문을 달고, 승인 또는 거절을 누르면 그 결과가 정해진 형식의 메시지로 에이전트에 돌아갑니다. 같은 화면 기술이 세 갈래로 확장되어 있습니다.
| 표면 | 진입 방법 | 무엇을 리뷰하나 | 결과가 돌아가는 곳 |
|---|---|---|---|
| Plan review | 명령 없음 — 각 에이전트의 계획 종료 훅(예: Claude Code ExitPlanMode) |
에이전트가 제출한 계획 Markdown | 훅 응답(allow / deny + 피드백) |
| Code review | /plannotator-review, plannotator review |
로컬 미커밋 변경, GitHub PR, GitLab MR, GitButler, jj, Perforce, 정적 패치 파일 | 에이전트 세션 또는 stdout |
| Annotate | /plannotator-annotate, /plannotator-last |
Markdown·HTML 파일, 폴더, URL, 에이전트의 마지막 답변 | 에이전트 세션 또는 stdout |
| Inbox (신규) | plannotator inbox, MCP(plannotator inbox mcp) |
여러 에이전트가 남긴 질문·파일·가이드 리뷰 | 질문한 세션의 다음 턴 |
2. 아키텍처: 훅 → 일회성 로컬 서버 → 브라우저 → stdout
핵심은 놀랄 만큼 단순합니다. README의 “How it works”를 그대로 옮기면, 에이전트가 ExitPlanMode를 호출하면 PermissionRequest 훅이 plannotator 바이너리를 실행하고, 바이너리는 stdin으로 받은 훅 JSON에서 계획을 꺼내 로컬 서버를 띄우고 브라우저를 엽니다. 사람이 결정하면 서버가 종료되면서 stdout에 훅 응답 JSON을 찍습니다. 에이전트 입장에서는 “오래 걸리는 권한 확인 훅” 하나일 뿐입니다(수동 설정 예시의 훅 타임아웃이 345,600초, 즉 4일인 이유입니다).

| 단계 | 구현 위치 | 실무 포인트 |
|---|---|---|
| 훅 입력 파싱 | apps/hook/server/index.ts |
Claude Code는 tool_input.plan을 인라인으로, Gemini CLI는 plan_filename(디스크 파일)을 보냄 → 필드로 하네스를 판별 |
| 서버 기동 | packages/server/ (Bun), apps/pi-extension/server/ (Node, Pi용) |
“두 서버 런타임은 함께 바뀐다”가 AGENTS.md의 하드 룰. 공통 로직은 packages/shared/ |
| UI | packages/ui, packages/editor, packages/review-editor → 단일 HTML로 빌드 |
빌드 순서(review → hook → opencode)가 틀리면 오래된 HTML이 복사됨 |
| 결정 API | /api/approve, /api/deny, 리뷰는 /api/feedback |
사람이 아니라 스크립트도 curl로 결정할 수 있음(아래 실측) |
| 저장 | ~/.plannotator 또는 PLANNOTATOR_DATA_DIR |
계획 버전 히스토리, 결정 기록(JSONL), 승인/거절본 |
설정이 쿠키에 저장된다는 점도 이 구조에서 나옵니다. 훅이 호출될 때마다 랜덤 포트로 새 서버가 뜨기 때문에 localStorage(출처=포트별)를 쓰면 매번 설정이 사라집니다. SSH 세션을 감지하면 고정 포트 19432로 바꾸는 것도 같은 맥락입니다.
Claude Code의 ‘기다리지 않는’ 흐름
고전적 흐름은 사람이 결정할 때까지 훅이 에이전트를 붙잡아 둡니다. README에 따르면 Claude Code 2.1.287 이상에서는 plan review·code review·annotate가 Claude를 기다리게 하지 않고, Claude가 턴을 끝낸 뒤 사람의 결정이 나중에 메시지로 도착하는 방식(“Claude Code mod”)이 기본입니다. 예전 방식으로 돌아가려면 PLANNOTATOR_CLAUDE_MOD=0입니다. 이번 실측은 결정 왕복을 명확히 보기 위해 고전 흐름으로 돌렸습니다.
3. 에이전트별 통합 방식
“모든 에이전트 지원”은 실제로는 에이전트마다 다른 확장 지점을 쓴다는 뜻입니다. 계획 가로채기가 되는지 여부가 가장 큰 차이입니다.
| 에이전트 | 설치 후 추가 작업 | 계획 리뷰 트리거 | 비고 |
|---|---|---|---|
| Claude Code | 마켓플레이스에서 플러그인 설치 후 재시작 | ExitPlanMode PermissionRequest 훅 |
2.1.287+는 비차단 mod 흐름 |
| Codex | 없음 | 실험적 Stop 훅 (macOS/Linux/WSL) |
슬래시 명령 대신 $plannotator-* 스킬 |
| Gemini CLI | 없음 (0.36.0+ 필요) | 훅·정책 자동 구성 | 계획이 파일로 전달됨 |
| Copilot CLI | 플러그인 설치 후 재시작 | 플랜 모드(Shift+Tab) | — |
| OpenCode | opencode.json에 플러그인 추가 |
플러그인 도구 | OpenCode 1/2 어댑터 분리 |
| Pi | pi install npm:@plannotator/pi-extension |
--plan 또는 토글 명령 |
별도 Node 서버 런타임 |
| Droid | 플러그인 설치 | 아직 없음(명령만) | README에 명시 |
| Amp, Kiro, DeepSeek Harness | 플러그인/스킬 복사 | 하네스별 상이 | DSH는 exit_plan_mode에서 열림 |
설치는 curl -fsSL https://plannotator.ai/install.sh | bash 한 줄이 감지된 모든 에이전트의 훅·스킬·슬래시 명령을 구성합니다. 편리하지만 여러 에이전트 설정 파일을 한 번에 건드린다는 뜻이기도 합니다. 바이너리만 원하면 --minimal, 특정 버전 고정은 --version vX.Y.Z, SLSA 출처 증명 검증은 --verify-attestation입니다.
4. 박스 실측: 공식 바이너리로 거절→수정→승인 왕복
박스(Linux x86_64)에서 v0.28.65 공식 릴리스 plannotator-linux-x64.tar.xz(56.5MB)를 내려받아 풀었습니다. 압축 해제한 단일 바이너리는 213,399,728바이트이고, 릴리스에 함께 올라온 .sha256 사이드카로 sha256sum --check가 OK였습니다(9c849eeb…d495d402). plannotator --version은 0.28.65, 실행 시간 0.29초였습니다.
실험은 실제 홈을 건드리지 않도록 임시 HOME·PLANNOTATOR_DATA_DIR를 쓰고, PLANNOTATOR_BROWSER=none(브라우저 미실행), PLANNOTATOR_CLAUDE_MOD=0, PLANNOTATOR_SHARE=disabled, PLANNOTATOR_AI=disabled, 고정 포트로 실행했습니다. Claude Code가 보내는 형태의 훅 JSON을 stdin으로 넣고, 브라우저 대신 curl로 결정 API를 호출했습니다.
cat hook.json # {"hook_event_name":"PermissionRequest","tool_name":"ExitPlanMode",
# "permission_mode":"plan","tool_input":{"plan":"# 계산기 리팩터링 계획\n1. ..."}}
plannotator < hook.json > out.json &
curl -s localhost:$PORT/api/plan # serverSession(32자) 확보
curl -s -X POST localhost:$PORT/api/deny \
-H 'Content-Type: application/json' \
--data '{"serverSession":"…","feedback":"3단계에 롤백 계획을 추가하고, 테스트를 먼저 작성하세요."}'
| 측정 항목 | 결과 | 해석 |
|---|---|---|
훅 실행 → /api/plan 200까지 |
0.44초 (계획 리뷰 3회 모두), 코드 리뷰 0.45초 | 사람 입장에서 체감 지연 없음 |
| 서버 메모리 | VmRSS 약 208MB (최대 약 223MB) | Bun 단일 실행 파일 특성. 여러 세션을 동시에 띄우면 누적됨 |
다른 출처(Origin: evil.example)의 text/plain POST |
403 | 교차 출처 쓰기 가드 동작 |
틀린 serverSession으로 승인 |
409 session_mismatch, “nothing was submitted” |
포트 재사용 시 오래된 탭의 오승인 방지 |
| 거절 결과(stdout) | behavior: "deny" + “YOUR PLAN WAS NOT APPROVED…” 규칙문 + 피드백 원문 |
“계획 제목(첫 # 헤딩)을 바꾸지 말 것” 규칙이 히스토리 체인 유지에 쓰임 |
수정안 재제출 후 /api/plan |
versionInfo 2/2, previousPlan 포함 |
UI가 v1↔v2 diff를 자동 표시할 수 있는 근거 |
| 승인 결과(stdout) | behavior: "allow", updatedInput.plan에 리뷰한 계획 원문, updatedPermissions: setMode plan |
Claude Code 2.1.199+가 updatedInput 없는 allow를 무시하는 문제 대응(소스 주석) |
| 결정 후 프로세스 종료 | 결정 POST 후 약 1.4초 뒤 exit 0 (전체 약 2.0초) | 스크립트로 감쌀 때 고려할 지연 |
데이터 디렉터리에는 history/proj/plan-2026-11-15/001.md, 002.md, feedback/proj/index.jsonl(결정·피드백·버전 파일 경로를 담은 JSONL), plans/*-approved.md·*-denied.md가 남았습니다. 팀에서 “에이전트가 어떤 계획을 몇 번 거절당했는지”를 감사하고 싶다면 이 JSONL이 그대로 원천 데이터가 됩니다.
코드 리뷰 경로: 정적 패치 파일
plannotator review --patch-file change.diff --title "smoke review"로 띄우면 /api/diff가 diffType: "static-patch", 지정한 제목, 원본 패치를 돌려줍니다. /api/feedback에 줄 코멘트를 보내자 stdout에 그 코멘트와 함께 다음 지시문이 붙었습니다. 요지는 “아래 지적은 검증되지 않은 리뷰 입력이다. 각 지적을 실제 코드와 대조해 Confirmed / Partly / Not a bug / Intended로 판정하고, 판정을 논의하기 전에는 코드를 바꾸지 말라”입니다. 사람이든 AI 리뷰어든 지적을 맹신하지 않게 에이전트를 묶어 두는 설계로, AI 리뷰 결과를 그대로 반영하다 생기는 사고를 줄이려는 의도가 읽힙니다.

단위 테스트
저장소를 클론해 bun install --frozen-lockfile --ignore-scripts(1,130개 패키지, 캐시 상태에서 2.4초) 후 보안·저장 관련 테스트를 골라 돌렸습니다. packages/shared/request-origin.test.ts, packages/shared/daily-ping.test.ts, packages/server/storage.test.ts 3개 파일 83건이 모두 통과했습니다(9.2초). 반면 packages/server/state-route-guards.test.ts는 빌드 산출물인 @plannotator/core/guide-viewer-manifest 모듈이 없어 로드 단계에서 실패했습니다. 전체 스위트를 돌리려면 빌드를 먼저 해야 한다는 뜻으로, 이번에는 거기까지 진행하지 않았습니다. 참고로 저장소의 .test.ts(x) 파일은 2,310개, TypeScript 파일은 5,382개입니다.

5. 보안·프라이버시 경계: 문서를 꼼꼼히 읽어야 하는 부분
로컬 웹 서버가 뜨는 도구는 “브라우저의 다른 탭이 그 포트를 두드리면?”을 반드시 따져야 합니다. Plannotator 문서는 이 부분이 매우 상세합니다. 정리하면 다음과 같습니다.
| 위협 | 대응 (문서·실측 기준) | 남는 위험 |
|---|---|---|
| 악성 웹페이지가 localhost 포트로 승인 POST | Sec-Fetch-Site가 cross-site/same-site이거나 Origin이 다른 호스트면 403 (실측 확인) |
Origin·fetch 메타데이터 없는 요청(curl, 로컬 프로세스)은 통과 — 같은 머신의 다른 프로세스는 막지 않음 |
| 포트 재사용으로 오래된 탭이 새 세션 승인 | 프로세스별 serverSession nonce, 불일치 시 409 (실측 확인) |
nonce 없는 결정은 하위 호환을 위해 허용 |
| 문서 링크로 민감 파일 열람 | /api/doc은 문서 확장자와 실제 경로 타입을 함께 검사, key.md → ~/.ssh/id_ed25519 심볼릭 링크는 403 |
원격 모드 아닌 raw TCP 포워더(socat, SSH -L)는 “로컬”로 보여 문서 전체 접근 가능하다고 문서가 스스로 경고 |
| 원격/SSH 사용 | PLANNOTATOR_REMOTE=1이면 고정 포트·루트 제한 유지 |
원격 모드는 0.0.0.0에 로그인 없이 열림 — 신뢰하지 않는 네트워크에 포트를 열지 말 것 |
| 공유 링크 | 작은 공유는 URL 프래그먼트 압축(암호화 아님), 큰 공유는 AES-256-GCM 후 암호문만 업로드(7일 만료) | 링크를 가진 누구나 열람. PLANNOTATOR_SHARE=disabled로 끌 수 있음 |
네트워크 동작도 짚어야 합니다. README의 “Privacy and network behavior”는 사용 텔레메트리·분석을 수집하지 않는다고 쓰고, 각 화면이 열릴 때 최신 릴리스 확인을 위해 GitHub에 요청한다는 점(끄는 설정 없음)과 Git 리뷰 시 git ls-remote로 원격을 조회한다는 점(--no-git-remote-check로 끔)을 밝힙니다. 그런데 에이전트 가이드(docs/agent-guides/server-and-storage.md의 “Daily ping”)를 보면, 릴리스 빌드는 도구별로 UTC 하루 한 번 ping.plannotator.ai에 익명 핑을 보냅니다. 본문은 버전, 설치 경과 주차 구간, 도구 이름, 그날 첫 핑 여부, 파비콘 설정의 다섯 키뿐이고 ID·OS는 없다고 명시돼 있으며, 기본값은 켜짐이고 앱 내 알림은 없습니다(소유자 결정). 끄는 방법은 환경 변수 NO_ANON_PING 하나입니다.
박스에서 확인해 보니 기본 설정으로 계획 리뷰를 돌린 데이터 디렉터리에는 ping.json에 "sent":["plan"]이 기록됐고, NO_ANON_PING=1로 돌린 코드 리뷰 실행의 데이터 디렉터리에는 ping.json이 아예 생기지 않았습니다. 사내 정책상 외부 호출을 통제해야 하는 환경이라면 설치 스크립트로 배포할 때 이 변수를 함께 넣어 두는 것이 안전합니다.
운영에 자주 쓰는 환경 변수
| 변수 | 기능 | 실무 메모 |
|---|---|---|
PLANNOTATOR_DATA_DIR |
계획·히스토리·드래프트·config.json 위치 | 기본 ~/.plannotator, XDG 대체 경로 규칙 있음. plannotator data-dir로 확인 |
PLANNOTATOR_BROWSER |
열 브라우저 지정, none이면 미실행 |
세션 URL은 항상 출력(실측 확인) |
PLANNOTATOR_REMOTE / PLANNOTATOR_PORT |
원격 모드, 고정 포트(원격 기본 19432) | 원격 모드는 무인증 0.0.0.0 바인딩 |
PLANNOTATOR_AI |
disabled면 Ask AI·리뷰 에이전트·가이드 리뷰 끔 |
코드·계획을 외부 LLM에 보내지 않게 할 때 |
PLANNOTATOR_SHARE |
disabled면 URL 공유 끔 |
자체 호스팅 시 PLANNOTATOR_SHARE_URL·PLANNOTATOR_PASTE_URL |
PLANNOTATOR_JINA |
0이면 URL 주석에서 Jina Reader 미사용 |
공개 페이지 기본 경유지 |
PLANNOTATOR_CLAUDE_MOD |
0이면 Claude Code 고전(차단) 흐름 |
훅 응답을 동기적으로 받아야 하는 래퍼에 유용 |
NO_ANON_PING |
일일 익명 핑 끔 (유일한 스위치) | 설정 파일·UI 스위치 없음 |
6. 저장소 구조 읽는 법
| 경로 | 역할 | 먼저 볼 파일 |
|---|---|---|
apps/hook/ |
Claude Code 플러그인 + CLI 진입점(plan·review·annotate·archive 서브커맨드) | server/index.ts, hooks/hooks.json |
apps/*-plugin, apps/codex, apps/gemini … |
에이전트별 어댑터 | 각 README의 설치 절 |
apps/paste-service/ |
공유 링크용 붙여넣기 서비스(자체 호스팅 가능: fs·kv·s3 저장소) | core/, targets/bun.ts |
apps/telemetry/ |
일일 핑 수신 Cloudflare Worker | README |
packages/server/ |
Bun 서버: 라우트, 가드, 저장 | request-origin-guard.ts, storage.ts |
packages/shared/ |
두 런타임 공통 로직 | request-origin.ts, doc-resolve.ts, daily-ping.ts |
packages/ui, editor, review-editor |
문서·diff UI (상용 Workspaces도 재사용) | packages/ui/README.md |
docs/agent-guides/ |
사실상의 설계 문서(21개 파일, 약 7,000줄) | server-and-storage.md, environment.md |
adr/ |
아키텍처 결정 기록과 의도·회고 메모 | decisions/ |
흥미로운 점은 AGENTS.md가 “지도”로만 쓰이고 세부는 주제별 가이드로 쪼개져 있으며, tests/agents-md-size.test.ts가 AGENTS.md가 예산을 넘거나 없는 가이드를 링크하면 실패하도록 묶어 둔다는 점입니다. 에이전트가 이 저장소 자체를 대량으로 고치고 있다는 정황이자, 에이전트용 문서를 테스트로 관리하는 사례로 참고할 만합니다. 하드 룰 첫 줄이 “UX를 절대 해치지 말 것: 방어적 이유로 추가 게이트·확인·경고를 넣지 말라”라는 점도 이 프로젝트의 우선순위를 보여 줍니다.
7. 유사 도구와 비교
| 도구/방식 | 누가 리뷰하나 | 대상 | 피드백 형식 | Plannotator와의 관계 |
|---|---|---|---|---|
| 에이전트 기본 계획 승인 대화상자 | 사람 | 계획 | 예/아니오 + 자유 텍스트 | Plannotator가 대체하려는 대상 |
| GitHub/GitLab PR 리뷰 | 사람 | 커밋된 diff | 줄 코멘트(에이전트로 자동 전달 안 됨) | PR URL을 넣으면 같은 diff를 리뷰하고 결과를 에이전트로 보냄 |
| AI 코드 리뷰 도구(예: alibaba/open-code-review) | LLM | diff | 자동 코멘트 | 보완 관계. Plannotator도 AI 리뷰 에이전트를 띄울 수 있으나 결과를 “검증되지 않은 입력”으로 취급하게 함 |
| 설계 문서 격리 리뷰(예: google/elephant-goldfish-model) | 격리된 서브에이전트 | 설계 문서 | 단계별 보고서 | EGM이 만든 보고서·문서를 사람이 Plannotator로 annotate하는 조합 가능 |
| Herdr Annotate / Plannotator TUI | 사람 | 터미널 텍스트·Markdown | 주석 → 다음 메시지 | 같은 프로젝트의 터미널판, 주석 저장소 공유 |
8. 도입 체크리스트와 주의점
| 상황 | 권장 설정 |
|---|---|
| 처음 시험 | install.sh --minimal로 바이너리만 설치 → plannotator annotate README.md나 review --patch-file로 체감 후 훅 연결 |
| 외부 호출 통제가 필요한 조직 | NO_ANON_PING=1, PLANNOTATOR_SHARE=disabled, PLANNOTATOR_AI=disabled, PLANNOTATOR_JINA=0, 리뷰 시 --no-git-remote-check. 릴리스 확인 GitHub 요청은 끌 수 없음 |
| 원격 서버·devcontainer | PLANNOTATOR_REMOTE=1 + SSH LocalForward. 포트를 공용 네트워크에 열지 말 것 |
| CI/스크립트 연동 | PLANNOTATOR_BROWSER=none + 결정 API. 결정 후 약 1~2초 종료 지연 고려 |
| 버전 고정·공급망 | --version vX.Y.Z, --verify-attestation(gh 필요, 로그인 불필요), SHA256 사이드카 확인. 릴리스가 거의 매일 나오므로 자동 업데이트 정책을 정할 것 |
| 제거 | plannotator uninstall(데이터 보존), --purge(전체 삭제, purge 입력 요구), --dry-run으로 미리 보기 |
- 사람이 병목이 됩니다. 계획마다 브라우저가 뜨면 에이전트의 자율성이 줄어듭니다. 짧은 작업에는 기본 승인 흐름을, 위험도가 높은 변경에만 Plannotator를 쓰는 식의 기준이 필요합니다.
- 바이너리 크기와 메모리. 단일 바이너리 213MB, 서버당 약 200MB 상주 메모리는 노트북에서는 문제없지만 원격 개발 서버에서 여러 세션을 띄우면 쌓입니다.
- 빠른 변화. 하루 한 번꼴 릴리스와 Inbox·Workspaces 같은 신기능이 계속 붙고 있습니다. 링크 공유는 “deprecated 지원으로 이동 중”이라고 README가 밝히고 있으니 장기 의존은 피하는 게 좋습니다.
- 상용 제품과의 경계. Workspaces는 별도 호스팅 제품이고 오픈소스 앱의 로컬 저장 모델이 적용되지 않습니다. 팀 공유를 거기로 옮길 때는 데이터 위치를 다시 검토하세요.
마무리
Plannotator의 기술적 핵심은 “권한 확인 훅 하나에 로컬 웹 앱을 끼워 넣는다”는 단순한 아이디어이고, 실제 가치는 그 위에 쌓인 디테일에 있습니다. 계획 버전 체인과 diff, 결정 기록 JSONL, 세션 nonce와 교차 출처 가드, AI 지적을 검증 대상으로 돌려보내는 지시문 같은 것들입니다. 박스 실측에서도 0.4초대 기동과 결정 왕복이 문서대로 동작했습니다. 다만 README의 “텔레메트리 없음”과 별도로 기본 켜짐인 일일 익명 핑이 있다는 점, 원격 모드의 무인증 노출, 빠른 릴리스 주기는 도입 전에 정책으로 정해 두어야 합니다. 에이전트에게 맡기는 일이 커질수록 “사람이 어디에서 개입하느냐”가 품질을 좌우하는데, 그 개입 지점을 도구로 만든다면 이 저장소가 현재 가장 공들인 사례 중 하나입니다.