09-04 오후에 한 것

넷을 냈습니다. 아침 것(지원 무르기·거절)은 앞 글에 있습니다.

무엇 어디
분석 워커 경로 — 큐를 소비하는 자리 계약 3-8절 · 미결 ho 17번
멈춘 작업 회수 계약 3-8절
평가·신뢰 도메인 — 패킷 B 전부 계약 3-9절 · 미결 jin 14번
카드 참조 · 카드 꾸미기 계약 3-3절·3장 · 미결 paik 2·3번

544 passed, 스키마 마이그레이션 셋이 붙었습니다.

🔴 패킷 B 는 박민호 님 손을 떠났습니다

09-03에 박민호 님이 스키마(마이그레이션 + review_option 초기 9개)를 내고 초기 목록 확인을 기다리며 멈춰 계셨습니다. 제 회신은 09-04 오전에 갔습니다.

그런데 그 사이 마이그레이션만 main 에 들어가 백엔드 CI 가 깨졌습니다.

alembic upgrade head  →  Multiple head revisions   (down_revision 이 비어 있어서)
alembic check         →  DROP TABLE 다섯           (테이블은 생겼는데 ORM 이 없어서)

CI 가 둘을 순서대로 돌기 때문에 배선만으로는 안 고쳐졌고, ORM 을 내야 했습니다. 거기까지 하고 나니 남은 게 응용 계층뿐이라 끝까지 갔습니다.

박민호 님이 안 하신 게 아닙니다. 제가 분담 문서에 「down_revision 은 제가 잇습니다」라고 써 놓고 ORM 이 전제라는 것을 안 적었습니다. 지시대로 하셨는데 깨진 것이라, 요구할 자리가 아니라 제 문서를 고칠 자리였습니다. backend-work-split.md 에 그 전제를 적었습니다.

「정해야 할 것」 셋을 제가 정했습니다

원래 패킷 B 를 PM 께 드린 이유가 “정할 것이 많은 영역이라” 였습니다. 그 셋을 제가 정했고, 근거를 review_rules.py 한 곳에 모았습니다 — 다르게 보시면 거기만 고치면 됩니다.

무엇 정한 값 왜
평가 가능 기간 경기 후 14일 7일이면 주말 경기를 다음 주말에 여는 사람이 놓칩니다. 무기한은 기억이 흐려진 평가를 받는데, 그게 신뢰도의 원자료입니다
불참 기록 주최 팀 주장만 제재 기록이라 좁혔습니다. 누구나 붙이면 서로에게 붙일 수 있고, 기록자 컬럼이 없어 누가 붙였는지도 못 따집니다
선택지 순서 sort_order 컬럼 ORDER BY category 는 「주의」가 맨 앞에 옵니다

설계가 강제하는 것은 그대로입니다 — 점수 없음(3.4) · 신뢰도 저장 안 함(D.4) · report·no_show 를 review 와 안 이음(3.5).

분석 워커 — 백엔드 쪽은 서버에서 돕니다

미결 ho 17번(S3 에 영상이 올라와도 분석이 안 돈다)의 절반입니다.

POST /internal/analysis-jobs/claim      가장 오래된 queued → running
PATCH /internal/analysis-jobs/{id}      succeeded | failed

워커가 가져갑니다(pull). GPU 인스턴스가 자동 종료되므로 밀어 주는 방식은 대상이 꺼져 있으면 실패하고, 루브릭을 고르려면 종목이 필요한데 그건 S3 가 아니라 DB 에 있습니다.

멈춘 작업은 자동 회수됩니다 — 처음 멈추면 queued, 또 멈추면 failed. 한 번만 되살리는 이유는 워커를 죽이는 클립(4K 에서 host RAM 이 터지는 것, 미결 ho 9번)이 큐를 영원히 돌게 되기 때문입니다.

정상호 님께 폴링 루프를 넘겼습니다 — 미결 jin 18번, 인터페이스는 fastapi/docs/worker-interface.md 하나에 모아 두었습니다.

백성검 님 항목 둘

  • 카드 식별자 — GET /teams/{id} 의 members[] 에 player_card_id + card_public_slug. 스쿼드 등재가 이제 됩니다. 카드 없는 구성원은 null 이고 목록에는 남습니다(그쪽 「하지 말 것」)
  • 카드 꾸미기 — PATCH /me/card 로 한 줄(tagline). public_slug 는 요청 본문에 자리를 안 뒀습니다. 사진은 저장 위치가 안 정해져 안 얹었습니다

오늘 배운 것

변이 검사가 제 주석이 거짓인 것을 잡았습니다. 회수 코드에 “두 UPDATE 의 순서를 바꾸면 깨진다”고 적어 두고 뒤집어 봤더니 전부 통과했습니다 — 되돌리는 쪽이 status 를 바꿔서 애초에 겹치지 않았습니다. 없는 위험을 막고 있었습니다.

규칙은 규칙이 있는 층에서 검사해야 합니다. 카드 한 줄의 길이 제한을 자르기로 바꾸는 변이가 계약 테스트를 전부 통과했습니다 — Pydantic 이 앞단에서 막아 도메인 규칙까지 요청이 안 갔습니다.


🔴 부록 D 에 없는 컬럼을 둘 늘렸습니다(review_option.sort_order · player_card.tagline). ERD 갱신을 미결 19번으로 올렸습니다 — 문서가 실물과 어긋난 채로 두지 않으려는 것입니다.