Skip to content

fix: 적립 이행 점검이 기록된 입금을 못 읽던 문제 - #458

Merged
easygap merged 1 commit into
mainfrom
fix/contribution-health-wiring
Aug 26, 2026
Merged

fix: 적립 이행 점검이 기록된 입금을 못 읽던 문제#458
easygap merged 1 commit into
mainfrom
fix/contribution-health-wiring

Conversation

@easygap

@easygap easygap commented Aug 26, 2026

Copy link
Copy Markdown
Owner

문제

kr_pocket 첫 적립금을 기록한 뒤에도 헬스가 계속 이렇게 보고했다.

확인: basket: 'kr_pocket' monthly 적립 100,000원 미실행 — 트랙 개시 47일 동안 입금 기록 0건

cash_flows에는 분명히 행이 있었다.

원인

get_cash_flows(occurred_at, amount) 튜플 목록을 반환하는데, 적립 이행 점검이 객체로 읽었다.

last_flow = max((getattr(f, "occurred_at", None) for f in flows ...), default=None)

튜플에는 그 속성이 없으니 항상 None이 잡히고, 점검은 그걸 '입금 이력 없음'으로 해석했다.

왜 이게 나쁜가

크래시도 예외도 없이 틀린 사실을 단정적으로 말한다. 입금을 실제로 한 사람은 헬스를 안 믿게 되고, 안 한 사람은 같은 문구를 보고도 진짜인지 알 수 없다. 경보가 정보를 잃는다.

이번 세션에 넣은 점검이라 운영에 노출된 시간은 짧았지만, 형태가 docs/OPERATING_PRINCIPLES.md에 적어 둔 이 저장소의 대표 실패 패턴과 똑같다 — 오류 0건인데 사실이 틀림.

조치

튜플 언패킹으로 고치고, 반환 형태를 테스트로 고정했다.

  • get_cash_flows(datetime, float) 튜플을 준다는 계약
  • 객체 접근이 None을 준다는 것까지 명시 — 계약이 바뀌면 호출부가 조용히 None을 얻는 자리다
  • 기록한 입금이 실제로 점검에 잡히는지(배선 회귀 방지)

검증

--mode health  →  ✅ OK (종전 ⚠️ ATTENTION 오탐)
CI 환경 재현(settings.yaml 치움) 전체 스위트 1968개 통과

kr_pocket 첫 적립금을 기록한 뒤에도 헬스가 '입금 기록 0건'이라고 계속 보고했다.
get_cash_flows는 (occurred_at, amount) 튜플 목록을 주는데 점검 쪽이 객체로 읽어
(getattr(f, "occurred_at")) 항상 None을 잡았다.

증상이 고약하다. 크래시도 예외도 없이 '입금이 없다'는 틀린 사실을 단정적으로
말한다. 입금을 실제로 한 사람은 헬스를 믿지 않게 되고, 안 한 사람은 같은 문구를
보고도 진짜인지 알 수 없다 — 경보가 정보를 잃는다.

반환 형태를 테스트로 고정했다. 튜플 언패킹이 맞는지, 그리고 기록한 입금이 실제로
점검에 잡히는지 두 가지를 건다. 객체 접근이 None을 준다는 것까지 명시해 뒀다.
계약이 바뀌면 호출부가 조용히 None을 얻는 자리이기 때문이다.
@easygap
easygap merged commit 8d58261 into main Aug 26, 2026
1 check passed
@easygap
easygap deleted the fix/contribution-health-wiring branch August 26, 2026 08:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant