-- 공개 부트스트랩 장애의 재시도 이력을 support_ticket 본문과 분리해 append-only로 보존한다. -- 브라우저가 보낼 수 있는 값은 API의 폐쇄 enum으로 더 제한하므로 이 테이블에는 -- 응답 원문, URL, 쿠키, 계정 식별자 같은 고객 데이터가 들어가지 않는다. CREATE TABLE IF NOT EXISTS app.support_ticket_event ( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, ticket_id UUID NOT NULL REFERENCES app.support_ticket(id) ON DELETE CASCADE, observer_kind TEXT NOT NULL CHECK (observer_kind = 'public_browser'), event_kind TEXT NOT NULL CHECK ( event_kind IN ('auth_restore_failure', 'boot_render_failure') ), status_code SMALLINT NOT NULL CHECK (status_code IN (500, 502, 503, 504)), attempt TEXT NOT NULL CHECK (attempt IN ('automatic', 'retry')), source_path TEXT NOT NULL CHECK (source_path = '/ops/public-bootstrap'), created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_support_ticket_event_ticket_latest ON app.support_ticket_event(ticket_id, created_at DESC); ALTER TABLE app.support_ticket_event ENABLE ROW LEVEL SECURITY; DROP POLICY IF EXISTS p_support_ticket_event_select ON app.support_ticket_event; CREATE POLICY p_support_ticket_event_select ON app.support_ticket_event FOR SELECT USING (app.current_role_name() = 'admin'); DROP POLICY IF EXISTS p_support_ticket_event_insert ON app.support_ticket_event; CREATE POLICY p_support_ticket_event_insert ON app.support_ticket_event FOR INSERT WITH CHECK (app.current_role_name() = 'admin');