정산 복구
settlement_runs(마이그레이션 020)가 정산을 재개 가능한 상태기계로 만들어요 — 고아 주문 점유는 불가능해요.
상태기계
CREATED → CLAIMING → CLAIMED → VALIDATING → COMMITTED
↘ RELEASING → RELEASED (해제 자체도 재개 가능)
↘ FAILED / NEEDS_REVIEW (recovery_action='release' → 스위퍼 재시도)1
2
3
2
3
- 미커밋 점유 주문은
orders.settlement_id='run:<run_id>'— 항상 특정 run으로 해석돼요. run 행 없는run:*태그는 스위퍼가 해제하는 좀비 점유예요. lease_owner/lease_expires_at/fence가 모든 전이와 주문 UPDATE를 펜싱해요 — stale writer는 해제/커밋 불가.- 수수료 스냅샷은 run 생성 시 고정, 커밋 직전
0 ≤ fee ≤ gross,net ≥ 0재검증 — 비정상 정산은 절대 커밋하지 않아요.
운영자 조치
http
POST /api/v1/settlements # seller 스코프 — stale run 인라인 재개 또는 409
POST /api/v1/admin/settlements/sweep # admin — 해제 완료 + 좀비 'run:*' 정리
POST /api/v1/admin/settlements/:id/mark-paid {payout_ref} # 지급 확정 CAS + ref 충돌 4091
2
3
2
3
스위퍼로 부족하면 RELEASE_STALE_SETTLEMENT_CLAIM op(승인 필수)로 settlement_run 또는 개별 order를 해제해요.
증적과 드리프트
settlement.commit증적은 레코드 배치 커밋 직후 체인 봉인돼요 (audit-evidence).- 커밋 후 재검증이
SUM(amount-refunded)·주문 수를 스냅샷과 대조해요 — 불일치 →NEEDS_REVIEW(금전은 커밋됨; 조사 우선, 맹목 재실행 금지). fee_rate.change증적이 요율 쓰기를 모두 기록하므로 run의 수수료 스냅샷을 시점 요율과 감사할 수 있어요.