Skip to content

feat: 피드백 시도 상관관계 + 실패 신호 가드 전 컨슈머 확장 - #212

Merged
Jaeho-Site merged 3 commits into
devfrom
feat/attempt-correlation-guard
Aug 22, 2026
Merged

feat: 피드백 시도 상관관계 + 실패 신호 가드 전 컨슈머 확장#212
Jaeho-Site merged 3 commits into
devfrom
feat/attempt-correlation-guard

Conversation

@Jaeho-Site

Copy link
Copy Markdown
Contributor

변경 사항

F3/F4 리뷰가 이관한 후속 2건의 묶음.

F5 — 피드백 시도 상관관계 (attemptId 왕복)

  • Core: generate.feedback 발행마다 attemptId(UUID)를 세션(feedback_attempt_id, V30)에 기록하고 payload 동봉. 발행은 attemptId 커밋 이후(afterCommit 동기화) — 즉시 FAILED 콜백이 이전 값과 대조돼 오드롭되는 경합 차단
  • AI: 요청의 attemptId 를 성공/FAILED 콜백에 에코
  • Core 수신: FAILED 콜백의 attemptId 가 현재 시도와 다르면(양쪽 non-null) 마커 재마킹·SSE 없이 드롭. null(구버전)은 검사 skip, 성공 콜백은 미검사(exists UNIQUE 충분)
  • 같은 계열: POOL stale FAILED — 재발행(이어하기 복구) 후 지연 실패가 이미 시딩된 건강한 세션을 종료시키던 기존 결함에 시딩 가드

F6 — 실패 신호 가드 확장

  • 분석 4종(resume/web/repository/cover_letter)을 consume_with_failure_signal 로 전환 — 도메인 분류는 공용 analysis_failed_payload 팩토리가 보존(4벌 중복 제거), expected_errors 로 일상 실패(빈 PDF·404 URL)는 warning 레벨 + trace_id·error_code 포함 로그
  • voice/tts: 직접-발행 모델 유지 + 멱등 마킹 이후 전 구간unmark_on_error 로 래핑 — 콜백 0건 DLQ 재주입 삼킴 방지 (재주입의 재과금·세그먼트 재전송 부작용은 messaging.md §6 에 수동 복구 전용으로 명시)
  • 계약 불변: 메시징 변화는 양방향 nullable attemptId 필드뿐 — 기존 컨슈머·콜백 테스트 전부 무변경 그린

검증

  • ai: 387 passed (+6: attemptId 에코 2, web/cover_letter UNEXPECTED 2, voice/tts 전 구간 unmark 2 외), 컨슈머 스모크 101, black 클린
  • backend: 239 passed (+4: stale 드롭/일치/구버전 통과/pool 시딩 드롭). 로컬 실패 4건은 Docker(Testcontainers) 부재 환경 실패로 baseline 동일, 신규 0
  • 코드 리뷰 8건 판정 중 7건 반영(발행-커밋 역전, V30 추적 포함, voice/tts 무방비 구간, 관측성 회귀 복원, pool 가드, 중복 2건 공용화), 1건 수용(재주입 부작용 — 문서 명시)

문서

  • messaging.md §5.10/§5.11(attemptId·stale 규칙)·§6, database.md(V30), ai/backend CLAUDE.md
  • frontend/·infra/ 변경 없음, REST 계약 불변(openapi 재생성 불요)

분석 4종(resume/web/repository/cover_letter)을 공용 가드로 전환 — 도메인
분류는 공용 analysis_failed_payload 팩토리가 보존하고, expected_errors 로
일상 실패는 warning 레벨(trace_id·error_code 포함)로 기록한다. voice/tts 는
직접-발행 모델을 유지하되 멱등 마킹 이후 전 구간을 unmark_on_error 로 감싸
콜백 0건 DLQ 재주입 삼킴을 막는다(재주입은 재과금·세그먼트 재전송 동반 —
수동 복구 전용). feedback 은 요청의 attemptId 를 성공/FAILED 콜백에 에코 —
Core 가 대체된 이전 시도의 지연 FAILED 를 드롭하는 근거. 테스트 +6.
generate.feedback 발행마다 attemptId(UUID)를 세션(feedback_attempt_id, V30)에
기록하고 payload 에 동봉 — 발행은 attemptId 커밋 이후(afterCommit 동기화)로
지연해 즉시 FAILED 가 이전 값과 대조돼 오드롭되는 경합을 막는다. 콜백의
attemptId 가 현재와 다르면(양쪽 non-null) FAILED 를 드롭해 대체된 이전
시도의 지연 실패가 마커를 되씌우지 않게 한다(null 은 구버전 호환 통과,
성공 콜백 미검사). 같은 계열의 POOL stale FAILED 도 풀 시딩 후엔 세션을
종료하지 않고 드롭. 테스트 +5.
messaging.md §5.10/§5.11 attemptId 필드·stale 드롭 규칙, §6 분석 4종 가드·
voice/tts unmark_on_error(재주입 부작용 명시). database.md V30 컬럼.
@Jaeho-Site
Jaeho-Site merged commit 2916032 into dev Aug 22, 2026
5 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