-- 367_published.sql
-- 발행 레이어(docsrv-viewer-publish) projection 테이블. 뷰어가 read API로 당겨 자기 SQLite로 복제.
-- kind-discriminated 단일 테이블(study_question | study_explanation | ... 후속 news/document).
--   pub_id    = opaque+stable(워커가 (kind,source_id)당 1회 부여, republish=rev bump에도 불변) = 뷰어 dedup키=progress키.
--   source_id = 내부 소스 행 id (pub_id→내부 역매핑, ingest write-back 해소용).
--   rev       = 발행 워커 커밋순 gapless 커서(pg_advisory_lock 단일 라이터). 뷰어 feed = WHERE rev>since.
--   payload_hash = sha256(정렬 JSON). (payload_hash, deleted) 디둡 — no-op 재투영 억제, tombstone 보존.
--   deleted   = tombstone(삭제/만료도 feed 1급 이벤트). schema_version = 엔벨로프 버전(미지원 가시거부).
CREATE TABLE IF NOT EXISTS published (
    id             BIGSERIAL    PRIMARY KEY,
    kind           VARCHAR(40)  NOT NULL,
    source_id      BIGINT       NOT NULL,
    pub_id         TEXT         NOT NULL,
    payload        JSONB        NOT NULL,
    payload_hash   TEXT         NOT NULL,
    schema_version SMALLINT     NOT NULL DEFAULT 1,
    rev            BIGINT       NOT NULL,
    deleted        BOOLEAN      NOT NULL DEFAULT false,
    created_at     TIMESTAMPTZ  NOT NULL DEFAULT now(),
    updated_at     TIMESTAMPTZ  NOT NULL DEFAULT now()
);
