CREATE TABLE product_feedback ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), community_id UUID REFERENCES communities(id) ON DELETE SET NULL, event_id BYTEA NOT NULL CHECK (length(event_id) = 32), submitter_pubkey BYTEA NOT NULL CHECK (length(submitter_pubkey) = 32), category TEXT CHECK (category IN ('bug', 'praise', 'needs-work')), body TEXT NOT NULL CHECK (length(btrim(body)) > 0), tags JSONB NOT NULL DEFAULT '[]'::jsonb CHECK (jsonb_typeof(tags) = 'array'), event_created_at TIMESTAMPTZ NOT NULL, received_at TIMESTAMPTZ NOT NULL DEFAULT now(), -- Operator-managed lifecycle status. status TEXT NOT NULL DEFAULT 'new' CHECK (status IN ('new', 'reviewed', 'archived')), UNIQUE (event_id) ); CREATE INDEX idx_product_feedback_received ON product_feedback (received_at DESC, id); CREATE INDEX idx_product_feedback_community_received ON product_feedback (community_id, received_at DESC, id);