63457e6afc
주제(study_topic) 메타를 발행 레이어에 실어 viewer 가 주제/회차 단위 퀴즈를 구성하게 한다(현재 topic 이름 미발행이라 불가). plan study-viewer-port S-1. - publish_projection: KIND_TOPIC + project_topic(topic_id·name·exam_round_size). 회차는 미발행 = viewer 가 pub_content(study_question) 의 exam_name/exam_round 로 파생(추가 발행 불요). topic_id = project_question.topic_id 와 동일 DS 식별자라 viewer 문항→주제 상관 키(pub_id 는 opaque 라 상관 키 아님). - publish_enqueue: enqueue_topic_publish + backfill_publish_topics(bounded page, deleted_at IS NULL). 멱등 = 워커 (payload_hash, deleted) 디둡. - study_topics 저작훅(전부 study_publish_enabled 게이트): create(flush→enqueue→ commit) / update(재투영, payload 무변경은 디둡이 rev 안 올림=churn 0) / delete(tombstone, raw DELETE 금지·워커 경유). - scripts/backfill_publish_topics.py: 기존 주제 1회 outbox 적재(overflow 가드). 워커·/published/feed 는 kind-generic(무변경, 실측). flag on 환경 배포 시 주제 발행 시작 → S-3 viewer 수용(generic upsert·kind-filtered read) 선행 전제, 게이트 PASS 됨. 백필 실행·배포순서 cutover 는 deploy 게이트(소프트락)라 본 슬라이스 미포함. py_compile PASS · project_topic payload 단위검증. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>