Skip to content

fix(edge): alertAdmins 스로틀 판정 반전 — 30분 창 첫 알림이 삼켜지던 버그 - #180

Merged
seizeh merged 2 commits into
mainfrom
fix/edge-alert-throttle
Aug 8, 2026
Merged

fix(edge): alertAdmins 스로틀 판정 반전 — 30분 창 첫 알림이 삼켜지던 버그#180
seizeh merged 2 commits into
mainfrom
fix/edge-alert-throttle

Conversation

@seizeh

@seizeh seizeh commented Aug 8, 2026

Copy link
Copy Markdown
Owner

무엇을

_shared/edge_alert.ts 의 스로틀 판정이 rate_limit_hit 반환 규약과 반대로 붙어 있었다.

  • 규약: true = 허용(이번 소모가 창의 1회), false = 초과 — _shared/auth.ts rateLimited()data === false 판정과 같은 방향.
  • 종전 코드: limited === true → return각 30분 창의 첫 관리자 알림이 삼켜지고, 2회째부터는 스로틀 없이 무제한 발송.

"알림이 안 왔으니 사고 없음"이라는 운영 판단을 무너뜨리는 관측성 결함이다. v9.0 설계문서 세트 교차 검토 중 발견(문서 3종이 일관되게 적은 "30분 1회" 의도와 코드가 어긋난 사례).

어떻게

  • 판정을 allowed === false → skip 으로 교정(변수명도 allowed 로), fail-open(리미터 오류 시 발송)은 그대로.
  • edge_alert_test.ts 신설 — 허용/초과/리미터 오류 3케이스. 기존 fcm_test.ts 와 같은 방식이라 db-tests.yml denocheck 잡이 자동 실행한다.

검증

  • deno test 3/3 통과, deno check 오류 0건(래칫 상한 ≤1 유지).
  • 영향 함수 4개(verify-post-photo · enroll-pet-identity · send-phone-code · send-push)는 머지 시 deploy-functions.yml 게이트 통과 후 자동 재배포된다.

참고

🤖 Generated with Claude Code

seizeh and others added 2 commits August 8, 2026 10:18
rate_limit_hit 은 true=허용(이번 소모가 창의 1회)/false=초과를 반환하는데
(rateLimited() 의 `data === false` 판정과 같은 방향), edge_alert 는
`limited === true → return` 으로 반대로 읽고 있었다. 결과 — 각 30분 창의
**첫** 관리자 알림이 삼켜지고 2회째부터는 스로틀 없이 무제한 발송.
"알림 없음 = 사고 없음" 판단을 무너뜨리는 관측성 결함이다(v9.0 설계문서
교차 검토 중 발견, 2026-08-08).

- 판정을 `allowed === false → skip` 으로 교정, 변수명도 규약대로 allowed
- edge_alert_test.ts 신설 — 허용/초과/리미터 오류(fail-open) 3케이스로
  반전 회귀 방지 (fcm_test.ts 와 같은 방식, denocheck 잡이 실행)
- 영향 함수: verify-post-photo · enroll-pet-identity · send-phone-code ·
  send-push (머지 시 deploy-functions.yml 이 재배포)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@seizeh
seizeh merged commit 23b3fb5 into main Aug 8, 2026
3 checks passed
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