agent-receipt cost가 세션 기록(Anthropic이 직접 남긴 usage)을 읽어 이렇게 뽑아 줍니다. 예시 세션입니다.하나의 철학, "AI가 한 일과 한 말을, 나중에 누구든 검증할 수 있는 로컬 영수증으로." 그 아래 세 축이 붙고, v0.20부터 영수증은 검토가 끝난 문서가 됩니다(승인/반려 기록·inbox 상태판·받는 쪽 원클릭 검증).
AI가 저장소에서 실제로 무엇을 바꿨나, 계약 범위와 대조하고, 해시체인 원장에 남기고, git엔 안 보이는 행동(실패·거부까지)도 기록. 막는 사고 →
AI가 댄 근거가 진짜인가, 인용·숫자·날짜·git 주장·버전을 15종 결정론 검사로 출처와 대조. LLM에게 LLM을 채점시키지 않음. 검사 종류 →
이번 세션에 실제 얼마를 썼나, 세션 기록의 usage를 정가로 환산해 어디서 새는지 짚고, 새 세션으로 갈 타이밍을 알려줌. 비용 보기 →
Claude Code는 세션마다 기록을 디스크에 남깁니다. 그 안에는 Anthropic이 직접 적어 둔 usage 데이터(메시지별 토큰과 모델)가 들어 있죠. agent-receipt는 그걸 읽어 정가로 환산해 보여줄 뿐, 서버로 보내지도 저장하지도 않습니다.
긴 세션에서 돈이 나가는 곳은 새로 짠 코드가 아닙니다. 턴마다 불어난 대화 전체를 매번 다시 태우는 데서 나가죠(위 예시는 그 비중이 80%). 이게 눈에 보이면 언제 새 세션으로 갈아탈지 판단할 수 있습니다. ‘오늘’ 줄은 오늘 돌린 세션을 그대로 다 더한 값입니다. 월말 청구서를 기다릴 것 없이, 지금 얼마 나가고 있는지 바로 보이죠. 캐시 읽기 숫자가 크다고 낭비가 아닙니다. 오히려 캐시가 그만큼(90%) 아껴 줬다는 뜻이에요. 그래서 지어낸 ‘절감액’은 쓰지 않습니다. 실제로 잰 숫자만 보여드립니다.
기능을 나열하는 대신, 실제로 벌어지는 사고를 놓고 이야기합니다. 아래 도장은 기계가 하는 동작 그대로입니다. 차단은 명령을 실패(exit 1)시키거나 커밋을 막는다는 뜻이고, 기록은 막지는 않되 증거로 남긴다는 뜻입니다.
인용한 문장을 출처와 글자 그대로 맞춰 봅니다. 출처에 없으면 그 자리에서 실패로 처리하죠.
그 커밋이 진짜 있는지, 그 파일을 정말 건드렸는지, diff에 그 내용이 있는지까지 git 이력에서 직접 확인합니다.
미리 정한 ‘손대도 되는 경로’와 실제 diff를 맞춰 봅니다. 커밋 직전에 막고, --no-verify로 우회해도 증거 영수증은 그대로 남죠. guard: block을 켜면 금지된 경로에 쓰려는 순간 도구가 실행되기 전에 멈춰 세우고, 에이전트는 이유를 읽고 물러섭니다. 거부된 시도까지 해시체인에 남습니다.
git에는 흔적이 안 남는 행동입니다. 실패했든 거부됐든 무슨 종류의 행동이었는지만 기록합니다(값 자체는 저장하지 않습니다). 읽기와 전송은 기록만 하고, 실시간으로 막는 건 금지 경로에 쓰는 것뿐입니다. 할 수 있는 만큼만 정직하게 말합니다.
⚠ READ_SECRET_FILE .env (실패 시도) ⚠ EXTERNAL_NETWORK_CALL api.exfil.example
기록을 되짚어 세어 봅니다. 고치지도 않고 다시 읽은 파일, 똑같이 반복한 명령, 되풀이된 실패까지. 물론 정상적인 재확인일 수도 있으니 판단은 사람 몫입니다. 그래서 횟수만 세어 보여줄 뿐, ‘얼마 아꼈다’ 같은 잴 수 없는 숫자는 지어내지 않습니다.
npm publish를 치려 함명령의 첫 토큰으로 push·publish·네트워크 클래스를 분류해 기록합니다(따옴표 속 "git push"는 안 잡음). forbid_actions+block을 켜면 실행 전에 멈추고, 거부 메시지가 스스로 "우회 가능한 신호등"이라고 자백합니다.
agent-receipt는 AI가 한 코드 작업과 보고서 속 근거를, 나중에 누구든 따로 검증할 수 있는 증거로 남기는 로컬 감사 도구입니다. 그 아래에 두 축이 있습니다.
| 감사 | 답하는 질문 |
|---|---|
| AI 작업 감사 Change Audit | AI가 내 저장소에서 실제로 무엇을 했나? 계약 범위와 맞춰 보고, 해시체인 원장에 남기고, 제3자(Rekor)에 봉인하고, git엔 안 보이는 행동(실패·거부까지)도 기록합니다. 원하면 실시간 가드를 켜서 금지 경로 쓰기를 미리 막을 수도 있죠. |
| AI 근거 감사 Evidence Audit | AI가 댄 근거가 진짜인가? 15가지 검사로 확인합니다, 각 검사엔 증거 등급(A 재계산·B 대조·C 형식)이 붙고, 판단할 근거가 없으면 보류합니다. LLM에게 LLM을 채점시키지 않아요. 같은 입력이면 언제나 같은 답. |
agent-receipt는 특정 도구에 매여 있지 않습니다. Claude Code는 물론, Cursor가 파일을 편집할 때도 같은 방식으로 붙잡아 하나의 원장에 남깁니다. 도구가 Windows에서 돌든 WSL에서 돌든 상관없죠.
# Windows의 Cursor를 WSL의 agent-receipt로 잇기, 한 줄이면 끝 agent-receipt capture install-cursor --wsl-bridge # Cursor(Windows) ─ afterFileEdit ─▶ wsl.exe ─▶ 🧾 agent-receipt (WSL) # 전송 도중 글자가 깨져도(BOM·인코딩) 알아서 복구합니다
Cursor가 파일을 저장할 때마다 그 행동이 agent-receipt로 넘어옵니다. 설치 명령 한 줄이면 배선이 끝나죠.
Cursor는 Windows에서 돌고 도구는 WSL에 있어도 괜찮습니다. --wsl-bridge가 둘을 이어 주고, 전송 도중 payload가 깨져도 그대로 복구해 기록합니다.
도구마다 다른 envelope를 공통 모양으로 정규화합니다. 새 도구가 늘어도 감사 방식은 바뀌지 않아요.
AI가 계약 범위를 넘지 않았는지, 실제로 무엇을 바꿨는지 말싸움 없이 증명합니다. 클라이언트에게 그대로 건넬 증거 HTML(share-proof)까지 나오죠.
지어낸 인용이나 틀린 숫자·버전·커밋이 결정에 끼어들기 전에 CI에서 걸러냅니다. 통과한 것들은 영수증으로 차곡차곡 쌓이고요.
AI가 어떤 민감 파일을 읽었는지, 밖으로 뭘 보내려 했는지, 어디를 바꿨는지 전부 로컬에 증거로 남깁니다. 서버도 계정도 없이, 원하면 제3자 공개 로그(Rekor) 봉인까지.
명령어 목록이 아니라, 실제 업무 흐름입니다.
# 시나리오 A, AI가 쓴 보고서를 믿고 결정하기 전에 agent-receipt research verify --file report.md --out vr/r1.json # 지어낸 게 하나라도 있으면 → exit 1 (CI가 그대로 막아 줍니다) agent-receipt graph view --dir vr --out browser.html # 쌓인 결과 한눈에 보기 (증거 브라우저) agent-receipt graph diff --base-dir vr-old --head-dir vr # 새로 생긴 실패만 잡아내는 회귀 게이트 # 시나리오 B, AI에게 코드를 맡기고, 커밋·납품하기 전에 (네 동사면 끝) agent-receipt quickstart --write # 처음 한 번: 계약+정책+기록 훅 (인쇄 우선·멱등) agent-receipt begin --objective "환불 API" # 기준점 + 세션 목적(자가보고로 기록) …에이전트가 일하는 동안… agent-receipt done # 4값 판정 + 봉인 영수증 + 다음 행동 ①②③ agent-receipt share --client # 10초 증거 페이지(축약 뷰, 같은 봉인값 명시) agent-receipt review approve --receipt … # 승인/반려/메모, 검토가 기록으로 남음 # 시나리오 C, 쌓인 세션 굴리기 · 받은 증거 검사하기 agent-receipt inbox --out inbox.html # 상태판: FAIL만·금지경로·미검토 프리셋으로 거르기 agent-receipt share --bundle # 전달 폴더(영수증+서명+검증 안내서) agent-receipt verify-proof received-pb/ # 받은 쪽: 오프라인 한 명령으로 위조 검사
검사 하나하나가 커널 레지스트리에 등록돼 있습니다. 코드가 곧 명세죠(agent-receipt spec --format json). 각 검사는 등급(A=재계산·B=대조·C=형식)을 달고, 실증도 실패도 아니면 보류(abstain)로 남겨 과대보증을 막습니다.
| 종류 | 검증 내용 |
|---|---|
| citation | 인용문이 출처에 실제로 있나 |
| number 등급 A | 주장한 수가 출처에 있거나 재계산(합계·평균·비율·중앙값·표준편차·거듭제곱…)과 일치하나 |
| range 0.16 신규 | 주장한 수가 명시한 상·하한 [min, max] 안에 드나(경계 포함) |
| date | 표기가 달라도 같은 날인가("Mar 1, 2026" ≡ "2026-03-01") |
| hash / signature | SHA-256 무결성 · 진짜 Ed25519 전자서명 검증 |
| commit / fileChanged / diffContains | "커밋 X 존재 / 파일 Y 변경 / diff에 Z 포함", 실제 git 이력 대조 |
| schema / version | JSON 스키마 부분집합 정합 · 진짜 semver 범위(^3.23.8 ⊨ 3.24.0) |
| file / artifact | 주장한 경로 실재 · 빌드 산출물이 선언한 형태(크기/해시)와 정합 |
| receipt | 인용한 영수증이 실재하고 봉인 재계산까지 통과 |
| link | URL 형식만 봅니다, 참고용이라 증거로는 안 칩니다 |
"믿어라"가 아니라 "재현해 봐라". 검사기 자신의 정확도부터 규제 조항·공급망 증명·행위 차단까지, 0.16에서 늘어난 것들입니다. 전부 결정론·로컬·정직 라벨.
bench검사기가 얼마나 정확한지 숫자로 냅니다, 라벨셋에서 정밀·재현율 + N회 재현성(같은 입력이면 1000번 돌려 1000번 같은 판정). 재현성이 깨지면 CI가 exit 1. 시드셋 정확도는 표본내, 세계 정확도 주장 아님.
모든 통과가 같은 무게가 아닙니다. A=재계산(수치·해시·서명) > B=대조(인용·git) > C=형식. 판단할 근거가 없으면 보류(abstain), 과대보증하지 않습니다.
원장의 과거를 몰래 고치고 이후를 다시 계산해도, 예전에 게시한 root와 일관성증명이 그 재체인(포크)을 잡습니다. RFC6962 · 포함증명 O(log n) · ledger merkle.
predicate검증 영수증을 표준 타입 claim-verification/v1으로 감싸 공급망 증명 생태계(in-toto·Sigstore)에 그대로 얹습니다. subject digest = 봉인 영수증 해시.
controls --crosswalk각 검증 능력을 EU AI Act·SOC 2·ISO 42001 조항에 증거로 매핑합니다, 준수 단정이 아니라 '관련 증거', 조항마다 "does not prove" 명시.
gate검증이 실패하면 행위를 중단합니다, CI는 exit 1, 훅 모드는 PreToolUse deny로 도구 실행 전에 막습니다(opt-in·명시 배선).
otel검증 이벤트를 OTLP로 방출해 기존 관측 파이프라인·GenAI 대시보드에 편입합니다. SDK 미번들(deps 0)·결정론 traceId.
cost --audit-swap선언한 모델과 실제 응답 모델이 다르면 비용차를 계산합니다, premium을 약속하고 싼 모델을 서빙한 다운그레이드(과대청구 의심)를 잡아냅니다.
영수증을 "생성하는" 데서 멈추지 않습니다, 세션을 판정으로 닫고, 리뷰어가 10초에 읽게 만들고, 승인·반려까지 기록으로 남깁니다. 전부 로컬·전부 결정론·자가보고엔 항상 라벨.
done이 세션을 PASS · 경고 · FAIL · 미완(◌)으로 닫습니다, 점수가 아니라 게이트(숫자 점수는 테스트가 금지). 모든 판정엔 [rule-id] 사실이 붙고, 미완이면 고치는 법까지 한 줄.
12개 규칙 전부가 코드 레지스트리+문서로 공개(둘이 어긋나면 테스트 실패). 경고는 실패로 자동 승격되지 않습니다, 원하면 fail_on_done으로 CI exit 게이트만 opt-in.
세션 비용을 입력·출력·캐시읽기·캐시생성으로 분해(합계 공식이 총액과 동일, 두 숫자가 싸울 수 없음) + 발동 조건을 자백하는 고정 신호. 판정어 0, "낭비" 같은 말은 테스트가 금지.
share 한 장이 계약을 문장으로(한/영), 신호를 리뷰어가 읽는 순서 4버킷(범위→계약이 지정한 고위험→검사→행위)으로, 세션 타임라인까지. --client=같은 봉인값의 축약 뷰(뺀 걸 명시) · --bundle=전달 폴더+검증 안내서.
review 0.20review approve|reject|note, 영수증이 "검토가 끝난 문서"가 됩니다. 기록은 자가보고(권위 아님) 라벨과 함께 inbox 배지·증거 페이지·PR 코멘트에 표시.
inbox 0.20쌓인 영수증을 판정·금지경로·고위험·검토 상태로 거르고, 사실 조건명 프리셋(FAIL만·금지경로 접촉·고위험+검사없음·미검토)을 URL로 공유. 서버 0 · 중립 카운트(판단 아님).
verify-proof 0.20전달받은 증거 묶음을 오프라인 한 명령으로 재검사, 봉인 재계산·전자서명·evidence replay. 실패 사유는 사람말로("생성 후 누군가 고쳤습니다").
git push·npm publish·네트워크 명령을 첫 토큰으로 분류(따옴표 속 문자열은 안 잡음), forbid_actions를 켜면 기록/차단. 자물쇠가 아니라 신호등이라고 스스로 자백합니다.
카드를 누르면 플레이그라운드에서 그 자리에서 판정해 봅니다.
모델이 모델을 검사하면 "네, 정확합니다"라는 환각을 자기도 낼 수 있습니다. 여기의 모든 판정은 재계산 가능한 산술·문자열·암호 연산, 같은 입력이면 어느 컴퓨터에서든 같은 답. 그래서 CI 게이트가 됩니다(exit 코드엔 기분이 없습니다).
충실성이지 진실이 아닙니다. "주장이 인용한 출처/재계산과 일치한다"는 뜻. 출처 자체가 틀렸다면 충실한 인용도 통과합니다, 그걸 잡아준다고 말하는 순간이 거짓말이라, 그렇게 말하지 않습니다.
아무 데도 안 갑니다. 로컬 우선: 계정·서버·텔레메트리 없음. 네트워크는 명시적 옵트인 둘뿐, --fetch(인용 URL 재확인)와 anchor --upload(영수증 해시를 공개 로그 Rekor에 등록).