-- 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() );