대사
핵심 요약
대사는 내부 데이터 불일치를 찾아 Finding으로 기록합니다. 자동 금융 복구나 외부 PG 정산까지 증명한다는 뜻은 아닙니다.
검사 범위·완전성·DB 오류를 함께 확인하세요. 부분 조회나 쿼리 실패를 ‘이상 없음’으로 안내하면 안 됩니다.
영속 권한 일관성 엔진 — admin 전용, 수동 트리거, be-cloudflare/src/reconciliation_impl.rs에서. 돈, entitlement, 이벤트 상태를 비교하고 드리프트를 findings로 저장합니다; 돈과 entitlement findings는 절대 자동 수정되지 않습니다.
엔드포인트 (admin)
| 메서드 | 경로 | 용도 |
|---|---|---|
POST | /api/v1/admin/reconciliation/run | 모든 검사 실행; 실행 + findings를 즉시 반환(자동 수정은 기록된 같은 배치에서 적용). |
GET | /api/v1/admin/reconciliation/reports | 실행 목록. |
GET | /api/v1/admin/reconciliation/report/:id | 하나의 실행 + 그 findings. |
7개 검사
| 검사 | 감지 | 자동 수정? |
|---|---|---|
paid_no_entitlement | 라이선스 활성 상품의 paid 주문에 라이선스 행이 없음/누락(구독도 검사) | needs_review — 돈/entitlement |
unpaid_but_entitled | 미지급 주문에 유효 라이선스 첨부(수동 발급 제외) | needs_review |
refunded_but_valid_entitlement | 전액 환불된 주문의 라이선스가 폐기되지 않음 | needs_review |
subscription_expired_but_renewed | 만료 처리된 구독이 갱신 결제를 가짐 | needs_review |
duplicate_issuance_per_payment | 한 주문에 여러 라이선스 | needs_review |
unprocessed_inbox_events | processing >10분(중도 사망) → 자동 failed 표시; 오래된 received/failed → 리뷰(재전달이 돈에 영향 가능) | 오래된 processing → auto_fixed; 오래된 received/failed → needs_review |
failed_or_stuck_outbox | dead_letter 행; claimed 리스 만료; 오래된 pending | 오래된 claim 재큐 → auto_fixed; dead_letter/오래된 것 → needs_review |
Finding 상태
auto_fixed— 안전한 상태 정규화만(오래된 리스). finding insert와 같은 배치에서 적용됩니다.needs_review— 돈이나 entitlement를 건드리는 모든 것. 수동 해결, SLA 없음, 담당자 없음, 스위퍼 잡 없음 — 제한 사항 §4.14–4.15 참조.open— 스키마 유효 정보 상태; 이 wave의 검사는 이를 출력하지 않습니다.
각 실행은 {run, findings, auto_fixed}를 기록하는 무결성 체인 audit_events 엔트리(reconciliation_run)를 씁니다.
셀러 가시 표면
셀러는 recon 리포트를 보지 않습니다 — 자기 일관된 뷰만 봅니다: GET /orders, /orders/:id/refund-attempts, /settlements, /dashboard/stats. Recon은 플랫폼 운영자 도구입니다.
런북
일상 모니터링(보안 이벤트, outbox 상태) → 모니터링. Findings에 대한 조치(환불, 폐기, 재구동) → 인시던트 대응.