로컬 우선 · 계정 없음 · 서버 없음

agent-receipt

AI 코딩 세션을 계약하고, 끝나면 판정하고, 검증 가능한 영수증으로 남깁니다.
허용/금지 범위(계약)와 실제 git diff를 대조해 세션을 4값 판정(PASS·경고·FAIL·미완)으로 닫습니다, AI의 자기보고가 아니라 diff가 증거. 판정은 10초 요약 증거 페이지(리뷰어가 읽는 순서 그대로 4버킷)로 공유되고, 승인·반려 기록받은 쪽 원클릭 재검증(verify-proof)·쌓인 영수증 상태판(inbox)까지, 흐름은 네 동사면 끝: begin · done · share · review. 같은 엔진이 보고서의 인용·숫자·커밋 주장까지 검증하고, 세션이 태운 실제 비용도 보여줍니다. 서버 없이, 계정 없이, 전부 내 컴퓨터에서.
믿는 근거, 결정론 판정(같은 입력=같은 판정) · 봉인 영수증(sha256 재검증) · 제3자 봉인(Rekor) · in-toto · Merkle. 전부 로컬.
npm install -g @promptia-labs/agent-receipt
agent-receipt cost가 세션 기록(Anthropic이 직접 남긴 usage)을 읽어 이렇게 뽑아 줍니다. 예시 세션입니다.

🔎 지금 날조 하나 잡아 보기

브라우저 안에서만 돌아갑니다. 서버로 아무것도 안 보냅니다.

🧾 남이 준 영수증, 설치 없이 검사하기

검증 영수증(JSON)을 여기 올리면 봉인값(contentHash·receiptId)을 그 자리에서 다시 계산합니다. 파일은 브라우저 안에만 머무릅니다. 샘플 영수증을 받아 넣어 보고, 딱 한 글자만 고쳐 다시 넣어 보세요. 변조가 그대로 잡힙니다.
.json 파일을 여기 끌어다 놓거나
클릭해서 고르세요
§ 세 가지 감사

agent-receipt는 세 가지를 남깁니다

하나의 철학, "AI가 한 일과 한 말을, 나중에 누구든 검증할 수 있는 로컬 영수증으로." 그 아래 세 축이 붙고, v0.20부터 영수증은 검토가 끝난 문서가 됩니다(승인/반려 기록·inbox 상태판·받는 쪽 원클릭 검증).

🧾 변경 감사 Change Audit

AI가 저장소에서 실제로 무엇을 바꿨나, 계약 범위와 대조하고, 해시체인 원장에 남기고, git엔 안 보이는 행동(실패·거부까지)도 기록. 막는 사고 →

🔎 근거 감사 Evidence Audit

AI가 댄 근거가 진짜인가, 인용·숫자·날짜·git 주장·버전을 15종 결정론 검사로 출처와 대조. LLM에게 LLM을 채점시키지 않음. 검사 종류 →

💰 비용 감사 Cost Audit

이번 세션에 실제 얼마를 썼나, 세션 기록의 usage를 정가로 환산해 어디서 새는지 짚고, 새 세션으로 갈 타이밍을 알려줌. 비용 보기 →

§ 비용

이 세션에 얼마 썼는지, 진짜 숫자로

Claude Code는 세션마다 기록을 디스크에 남깁니다. 그 안에는 Anthropic이 직접 적어 둔 usage 데이터(메시지별 토큰과 모델)가 들어 있죠. agent-receipt는 그걸 읽어 정가로 환산해 보여줄 뿐, 서버로 보내지도 저장하지도 않습니다.

긴 세션에서 돈이 나가는 곳은 새로 짠 코드가 아닙니다. 턴마다 불어난 대화 전체를 매번 다시 태우는 데서 나가죠(위 예시는 그 비중이 80%). 이게 눈에 보이면 언제 새 세션으로 갈아탈지 판단할 수 있습니다. ‘오늘’ 줄은 오늘 돌린 세션을 그대로 다 더한 값입니다. 월말 청구서를 기다릴 것 없이, 지금 얼마 나가고 있는지 바로 보이죠. 캐시 읽기 숫자가 크다고 낭비가 아닙니다. 오히려 캐시가 그만큼(90%) 아껴 줬다는 뜻이에요. 그래서 지어낸 ‘절감액’은 쓰지 않습니다. 실제로 잰 숫자만 보여드립니다.

§ 사고 기록부

무엇을 막아주는가

기능을 나열하는 대신, 실제로 벌어지는 사고를 놓고 이야기합니다. 아래 도장은 기계가 하는 동작 그대로입니다. 차단은 명령을 실패(exit 1)시키거나 커밋을 막는다는 뜻이고, 기록은 막지는 않되 증거로 남긴다는 뜻입니다.

📋 AI가 “SOC2 Type II 통과”라고 적음, 실제론 Type I만 끝남

인용한 문장을 출처와 글자 그대로 맞춰 봅니다. 출처에 없으면 그 자리에서 실패로 처리하죠.

CI 차단 · exit 1
🔀 AI가 “커밋 abc가 payment.ts를 고쳤다”고 적음, 이력엔 없음

그 커밋이 진짜 있는지, 그 파일을 정말 건드렸는지, diff에 그 내용이 있는지까지 git 이력에서 직접 확인합니다.

CI 차단 · exit 1
📁 AI가 계약 범위 밖 파일을 건드림

미리 정한 ‘손대도 되는 경로’와 실제 diff를 맞춰 봅니다. 커밋 직전에 막고, --no-verify로 우회해도 증거 영수증은 그대로 남죠. guard: block을 켜면 금지된 경로에 쓰려는 순간 도구가 실행되기 전에 멈춰 세우고, 에이전트는 이유를 읽고 물러섭니다. 거부된 시도까지 해시체인에 남습니다.

실시간 차단 · opt-in 영수증 기록
🔑 AI가 .env를 읽으려다 실패하고, 밖으로 뭔가 보내려 함

git에는 흔적이 안 남는 행동입니다. 실패했든 거부됐든 무슨 종류의 행동이었는지만 기록합니다(값 자체는 저장하지 않습니다). 읽기와 전송은 기록만 하고, 실시간으로 막는 건 금지 경로에 쓰는 것뿐입니다. 할 수 있는 만큼만 정직하게 말합니다.

⚠ READ_SECRET_FILE   .env  (실패 시도)
⚠ EXTERNAL_NETWORK_CALL   api.exfil.example
기록, 차단 아님
🔁 AI가 같은 파일을 11번 다시 읽고, 같은 테스트를 4번 되풀이함

기록을 되짚어 세어 봅니다. 고치지도 않고 다시 읽은 파일, 똑같이 반복한 명령, 되풀이된 실패까지. 물론 정상적인 재확인일 수도 있으니 판단은 사람 몫입니다. 그래서 횟수만 세어 보여줄 뿐, ‘얼마 아꼈다’ 같은 잴 수 없는 숫자는 지어내지 않습니다.

리포트, 차단 아님
📦 AI가 시키지도 않은 npm publish를 치려 함

명령의 첫 토큰으로 push·publish·네트워크 클래스를 분류해 기록합니다(따옴표 속 "git push"는 안 잡음). forbid_actions+block을 켜면 실행 전에 멈추고, 거부 메시지가 스스로 "우회 가능한 신호등"이라고 자백합니다.

실시간 차단 · opt-in 기록 기본
§ 한 레이어, 두 감사

AI가 한 일과 AI가 한 말

agent-receipt는 AI가 한 코드 작업과 보고서 속 근거를, 나중에 누구든 따로 검증할 수 있는 증거로 남기는 로컬 감사 도구입니다. 그 아래에 두 축이 있습니다.

감사답하는 질문
AI 작업 감사
Change Audit
AI가 내 저장소에서 실제로 무엇을 했나? 계약 범위와 맞춰 보고, 해시체인 원장에 남기고, 제3자(Rekor)에 봉인하고, git엔 안 보이는 행동(실패·거부까지)도 기록합니다. 원하면 실시간 가드를 켜서 금지 경로 쓰기를 미리 막을 수도 있죠.
AI 근거 감사
Evidence Audit
AI가 댄 근거가 진짜인가? 15가지 검사로 확인합니다, 각 검사엔 증거 등급(A 재계산·B 대조·C 형식)이 붙고, 판단할 근거가 없으면 보류합니다. LLM에게 LLM을 채점시키지 않아요. 같은 입력이면 언제나 같은 답.
§ 지원 도구

Claude Code만이 아닙니다, Cursor까지

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 훅을 그대로 연결

Cursor가 파일을 저장할 때마다 그 행동이 agent-receipt로 넘어옵니다. 설치 명령 한 줄이면 배선이 끝나죠.

🪟 Windows와 WSL 사이에 다리

Cursor는 Windows에서 돌고 도구는 WSL에 있어도 괜찮습니다. --wsl-bridge가 둘을 이어 주고, 전송 도중 payload가 깨져도 그대로 복구해 기록합니다.

🧩 벤더 중립 설계

도구마다 다른 envelope를 공통 모양으로 정규화합니다. 새 도구가 늘어도 감사 방식은 바뀌지 않아요.

§ 대상

누구를 위한 제품인가

🏗 AI로 납품하는 에이전시·외주팀

AI가 계약 범위를 넘지 않았는지, 실제로 무엇을 바꿨는지 말싸움 없이 증명합니다. 클라이언트에게 그대로 건넬 증거 HTML(share-proof)까지 나오죠.

📊 AI 리서치·보고서로 의사결정하는 팀

지어낸 인용이나 틀린 숫자·버전·커밋이 결정에 끼어들기 전에 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/    # 받은 쪽: 오프라인 한 명령으로 위조 검사
§ 커널

15종 결정론 검사 + 증거 등급 A/B/C

검사 하나하나가 커널 레지스트리에 등록돼 있습니다. 코드가 곧 명세죠(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 / signatureSHA-256 무결성 · 진짜 Ed25519 전자서명 검증
commit / fileChanged / diffContains"커밋 X 존재 / 파일 Y 변경 / diff에 Z 포함", 실제 git 이력 대조
schema / versionJSON 스키마 부분집합 정합 · 진짜 semver 범위(^3.23.8 ⊨ 3.24.0)
file / artifact주장한 경로 실재 · 빌드 산출물이 선언한 형태(크기/해시)와 정합
receipt인용한 영수증이 실재하고 봉인 재계산까지 통과
linkURL 형식만 봅니다, 참고용이라 증거로는 안 칩니다
§ 0.16 · 더 단단한 증거

숫자로 증명하고 · 조항에 매핑하고 · 위조를 잡습니다

"믿어라"가 아니라 "재현해 봐라". 검사기 자신의 정확도부터 규제 조항·공급망 증명·행위 차단까지, 0.16에서 늘어난 것들입니다. 전부 결정론·로컬·정직 라벨.

📊 벤치 하네스 bench

검사기가 얼마나 정확한지 숫자로 냅니다, 라벨셋에서 정밀·재현율 + N회 재현성(같은 입력이면 1000번 돌려 1000번 같은 판정). 재현성이 깨지면 CI가 exit 1. 시드셋 정확도는 표본내, 세계 정확도 주장 아님.

🅰 증거 등급 A / B / C + 보류

모든 통과가 같은 무게가 아닙니다. A=재계산(수치·해시·서명) > B=대조(인용·git) > C=형식. 판단할 근거가 없으면 보류(abstain), 과대보증하지 않습니다.

🌳 Merkle 투명로그

원장의 과거를 몰래 고치고 이후를 다시 계산해도, 예전에 게시한 root와 일관성증명이 그 재체인(포크)을 잡습니다. RFC6962 · 포함증명 O(log n) · ledger merkle.

🔗 in-toto 증명 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·명시 배선).

📡 OpenTelemetry 방출 otel

검증 이벤트를 OTLP로 방출해 기존 관측 파이프라인·GenAI 대시보드에 편입합니다. SDK 미번들(deps 0)·결정론 traceId.

💸 모델치환 감사 cost --audit-swap

선언한 모델과 실제 응답 모델이 다르면 비용차를 계산합니다, premium을 약속하고 싼 모델을 서빙한 다운그레이드(과대청구 의심)를 잡아냅니다.

§ 0.17→0.20 · 검토가 끝난 영수증

판정하고 · 읽히게 만들고 · 검토를 기록합니다

영수증을 "생성하는" 데서 멈추지 않습니다, 세션을 판정으로 닫고, 리뷰어가 10초에 읽게 만들고, 승인·반려까지 기록으로 남깁니다. 전부 로컬·전부 결정론·자가보고엔 항상 라벨.

⚖️ 세션 판정 4값 0.17

done이 세션을 PASS · 경고 · FAIL · 미완(◌)으로 닫습니다, 점수가 아니라 게이트(숫자 점수는 테스트가 금지). 모든 판정엔 [rule-id] 사실이 붙고, 미완이면 고치는 법까지 한 줄.

📜 판정 규칙 명문 + exit 게이트 0.18

12개 규칙 전부가 코드 레지스트리+문서로 공개(둘이 어긋나면 테스트 실패). 경고는 실패로 자동 승격되지 않습니다, 원하면 fail_on_done으로 CI exit 게이트만 opt-in.

💡 왜 비쌌나 0.18

세션 비용을 입력·출력·캐시읽기·캐시생성으로 분해(합계 공식이 총액과 동일, 두 숫자가 싸울 수 없음) + 발동 조건을 자백하는 고정 신호. 판정어 0, "낭비" 같은 말은 테스트가 금지.

🧾 10초 증거 페이지 0.19–0.20

share 한 장이 계약을 문장으로(한/영), 신호를 리뷰어가 읽는 순서 4버킷(범위→계약이 지정한 고위험→검사→행위)으로, 세션 타임라인까지. --client=같은 봉인값의 축약 뷰(뺀 걸 명시) · --bundle=전달 폴더+검증 안내서.

✍️ 승인·반려 기록 review 0.20

review approve|reject|note, 영수증이 "검토가 끝난 문서"가 됩니다. 기록은 자가보고(권위 아님) 라벨과 함께 inbox 배지·증거 페이지·PR 코멘트에 표시.

📥 영수증 상태판 inbox 0.20

쌓인 영수증을 판정·금지경로·고위험·검토 상태로 거르고, 사실 조건명 프리셋(FAIL만·금지경로 접촉·고위험+검사없음·미검토)을 URL로 공유. 서버 0 · 중립 카운트(판단 아님).

🔁 받은 쪽 원클릭 재검증 verify-proof 0.20

전달받은 증거 묶음을 오프라인 한 명령으로 재검사, 봉인 재계산·전자서명·evidence replay. 실패 사유는 사람말로("생성 후 누군가 고쳤습니다").

🚦 행위 클래스 신호등 0.20

git push·npm publish·네트워크 명령을 첫 토큰으로 분류(따옴표 속 문자열은 안 잡음), forbid_actions를 켜면 기록/차단. 자물쇠가 아니라 신호등이라고 스스로 자백합니다.

§ 정직한 경계

이건 무엇이 아닙니다

§ FAQ

자주 묻는 질문

왜 다른 LLM으로 검사하지 않나요?

모델이 모델을 검사하면 "네, 정확합니다"라는 환각을 자기도 낼 수 있습니다. 여기의 모든 판정은 재계산 가능한 산술·문자열·암호 연산, 같은 입력이면 어느 컴퓨터에서든 같은 답. 그래서 CI 게이트가 됩니다(exit 코드엔 기분이 없습니다).

통과(pass)는 정확히 뭘 보장하나요?

충실성이지 진실이 아닙니다. "주장이 인용한 출처/재계산과 일치한다"는 뜻. 출처 자체가 틀렸다면 충실한 인용도 통과합니다, 그걸 잡아준다고 말하는 순간이 거짓말이라, 그렇게 말하지 않습니다.

내 데이터는 어디로 가나요?

아무 데도 안 갑니다. 로컬 우선: 계정·서버·텔레메트리 없음. 네트워크는 명시적 옵트인 둘뿐, --fetch(인용 URL 재확인)와 anchor --upload(영수증 해시를 공개 로그 Rekor에 등록).