Skip to content

feat: 엣지 실패 관리자 알림 — ai_unavailable·video_too_large·internal_error - #137

Open
seizeh wants to merge 1 commit into
fix/pet-identity-hardeningfrom
feat/edge-failure-alerts
Open

feat: 엣지 실패 관리자 알림 — ai_unavailable·video_too_large·internal_error#137
seizeh wants to merge 1 commit into
fix/pet-identity-hardeningfrom
feat/edge-failure-alerts

Conversation

@seizeh

@seizeh seizeh commented Jul 29, 2026

Copy link
Copy Markdown
Owner

배경

seizeh/pmdart#157 의 남은 절반(베타 진입 조건). 사용자가 겪은 엣지 함수 실패가 console.error(24h 로그)에만 남아 운영자가 못 봤다 — 데이터 수집이 목적인 베타에서 실패가 안 보이면 목적의 절반이 사라진다.

변경

_shared/edge_alert.tsalertAdmins(admin, key, title, body)

  • 활성 관리자(user_type='admin') 전원에게 notifications INSERT → 기존 파이프라인(trg_notifications_push → pg_net → send-push → FCM)으로 인앱+푸시 자동 전달. 새 인프라 0.
  • 타입은 기존 system_notice(앱 표기 '공지') 재사용 — 새 타입은 CHECK 제약·클라 매핑 동시 수정이 필요해(과거 트리거가 조용히 삼킨 전례) 회피. 마이그레이션·클라 변경 불필요.
  • 같은 key 30분 1회 스로틀(rate_limit_hit('edgealert:<key>') 재사용) — Gemini 장애 폭주가 알림 폭주로 번지지 않게. 리미터 오류는 fail-open.
  • 절대 throw 하지 않음 — 알림 실패가 본 흐름(인증 응답)을 깨지 않는다.

배선 (7곳)

  • enroll-pet-identity: ai_unavailable(Gemini), video_too_large(실측값 포함), internal_error(프레임 업로드/RPC)
  • verify-post-photo: ai_unavailable(Gemini), internal_error(사진 업로드/RPC)

검증

  • 배포 완료(아래) — Deno 번들링 통과.
  • 운영 DB 스모크(트랜잭션 롤백): rate_limit_hit('edgealert:…', 1, 60) 호출 가능, 활성 관리자 존재, system_notice INSERT 가 push_status='pending' 으로 큐잉되는 것 확인.
  • 실전 확인 1회 권장: 베타 전 아무 실패나 유도(예: 잘못된 mime 로 Gemini 400) → 관리자 폰에 '공지' 푸시 도착.

배포

enroll-pet-identity v24, verify-post-photo v20 ACTIVE.

스택 PR: base = fix/pet-identity-hardening(#134) — 같은 파일을 수정하므로 #134 머지 후 자동 리타겟.

관련: seizeh/pmdart#157(앱 크래시 리포팅은 seizeh/pmdart#213), launch-checklist §7 첫 항목

🤖 Generated with Claude Code

pmdart#157 의 남은 절반(베타 진입 조건): 사용자가 겪은 엣지 함수 실패가
console.error 에만 남아 운영자가 못 보던 것을, 기존 알림 파이프라인
(notifications INSERT → trg_notifications_push → FCM)으로 관리자에게 표출.

- _shared/edge_alert.ts: alertAdmins(admin, key, title, body).
  · 타입은 기존 system_notice 재사용 — 새 타입은 CHECK 제약·클라 매핑
    동시 수정이 필요해(과거 트리거가 조용히 삼킨 전례) 회피.
  · 같은 key 30분 1회 스로틀(rate_limit_hit 재사용) — 장애 폭주가
    알림 폭주로 번지지 않게. 리미터 오류는 fail-open.
  · 절대 throw 안 함 — 알림 실패가 본 흐름을 깨지 않는다.
- enroll-pet-identity: ai_unavailable·video_too_large·internal_error(업로드/RPC).
- verify-post-photo: ai_unavailable·internal_error(업로드/RPC).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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