auto: 일일 백업 2026-09-08 02:00

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hyowons
2026-09-08 02:00:02 +09:00
parent d786f75487
commit db1639596b
138 changed files with 2003 additions and 1716 deletions
@@ -51,6 +51,24 @@ launchd/cron 이 이 줄을 그대로 결과로 받는다.
- **실패 알림** — 후잉 웹훅이 거절(HTTP 에러, 본문 `fail` / `Error :`)한 건. 실패 1건당 1메시지, 4건 이상이면 앞 3건 + 초과분 요약. `_format_sync_failure()` 포맷.
- **raw 폴백 알림** — 후잉은 200 받았지만 structured 매칭 실패로 raw 모드로 넘어간 건. sync 사이클당 **1메시지**(최대 3건 나열, 초과 시 카운트). parser / carrier_to_account / merchant_map 보완 신호. `_format_raw_fallback()` 포맷.
- **기초잔액(자본) 분개 보류 알림** (2026-09-07) — 분개의 좌·우 어느 쪽이든 `순자산` 계정(`기초잔액(효원)`/`기초잔액(가희)`)이면 **후잉에 넣지 않고 알림만** 보낸다(관리자님 지시). `_format_capital_blocked()` 포맷, 기록은 `whooing_failures.json` 의 `capital_blocked` 키.
- 배경: `merchant_map` 의 `방효원` exact 룰(`left: 기초잔액(효원)`, "본인 명의 자체이체")은 **짝이 되는 출금 SMS 가 같이 와서 상계되는 것**을 전제한다. 짝이 없으면 자본 한쪽만 남아 **순자산이 조용히 부풀려진다.** 2026-09-07 카카오뱅크 879,993 실사고 — 처제 대납금 상환인데 입금자명이 "방효원"이라 이 룰에 걸렸고, 금액이 08/27 클럽호핑과 정확히 일치해서 겨우 눈에 걸렸다(어중간한 금액이면 지나갔다).
- ⚠️ **커서는 `latest_skip` 으로 진행시킨다** — 재시도해도 같은 룰이 같은 결과를 내므로 여기서 커서를 막으면 **이 메시지 뒤의 모든 거래가 영구히 멈춘다.** `blocked_at` 을 세우지 않는 이유.
- 후잉엔 아무것도 안 들어가므로 그 계좌의 **잔액 불일치 알림이 뒤이어 뜬다** — 알림을 놓쳐도 두 번째 그물이 있다.
- 분개는 관리자님이 직접: 진짜 자체이체면 **실제 출금 계좌**를 상대편으로, 아니면 성격에 맞는 계정으로.
- **은행이자 자동 분개 + 보류 알림** — 자산 계정에서 `diff < 0` 이고 `|diff| <= 5,000` 이면 차액 전액을 `계정 ← 기타수익 / 이자` 로 분개한다(카카오·신한·하나). 잔돈 단위 이자 SMS 가 안 오는 걸 메우는 장치.
- ⚠️ **같은 사이클에 raw 폴백이 있던 계정은 분개하지 않고 알림만 보낸다** (2026-09-07 추가). 입금 SMS 는 structured 매칭에 실패해 raw 로 넘어가는데, 후잉은 200 만 주고 분개를 만들지 않는다. 그러면 diff 가 그 입금액만큼 음수가 되고, 이 heuristic 이 **그걸 이자로 오인해 가짜 수익을 원장에 굳혀버린다.**
- 실사고: 2026-08-14 카카오뱅크 `+3,700원 은행이자` — 한재성 입금 10,900 미기록이 원인(기존 +7,200 드리프트와 상쇄돼 diff 가 −3,700). **진짜 8월 이자는 08/10 에 SMS 로 6,735원이 이미 들어와 있었다.** 한 달에 이자가 두 번 나올 리 없다는 게 판별점.
- 판별 원칙: **진짜 은행이자는 SMS 로 온다**(06/10 1,711원·07/10 1,552원·08/10 6,735원). SMS 없이 자동분개된 건은 원래 1~300원대 잔돈이어야 정상이고, 네 자리 이상이면 의심한다.
- **잔액 불일치 알림** — SMS 잔액(자산)·누적사용액(카드)과 후잉 잔액이 어긋난 건. `_format_balance_mismatch()` 포맷. 차이가 직전과 같으면 재알림하지 않는다.
- **누적 연속성 검사** (2026-09-07): 카드(부채) 계정에서 `diff < 0`(사용 거래 누락 의심)일 때만 `_cumulative_gap_scan()` 이 돌아 **어느 승인 사이에 얼마가 빠졌는지**까지 알림에 붙인다. 현대카드 SMS 의 `누적`은 승인마다 `직전 누적 + 승인액`이어야 하므로, 어긋난 구간이 곧 **문자가 안 오는 승인**(톨비 등)이다. 잔액 비교만으로는 "얼마 틀어졌다"까지만 알 수 있어 발생 시점을 못 짚었다.
- ⚠️ **양의 격차만 센다** — 카드대금 상환·정산은 누적을 떨어뜨리는데 이걸 격차로 세면 오탐이다.
- ⚠️ **이미 손으로 보정해 둔 건은 구간에서 차감한다** — 메모가 SMS 원문으로 파싱되지 않는 항목(`현대카드 잔액차 보정: 톨비` 등)을 앞선 구간부터 소진시킨다. 안 그러면 톨비를 넣어준 뒤에도 같은 구간이 영원히 미해결로 뜬다. 한 보정이 여러 구간에 중복 차감되지 않게 순서대로 소비한다.
- ⚠️ **호출 조건을 넓히지 말 것** — 후잉 entries 조회가 들어가므로 평시(diff 0)엔 돌지 않는다.
- 자동 분개는 하지 않는다. 톨비인지 다른 누락인지는 관리자님이 판단한다.
같은 SMS 1건이 두 알림에 동시에 걸리는 일은 없다 (`if ok / else` mutually exclusive). 한 사이클에서 서로 다른 SMS 들이 각각 raw · 실패로 나뉘면 두 메시지가 함께 간다.
`--dry-run` 시에는 둘 다 발송 안 함.