ALTER TABLE pieces ADD COLUMN research_text TEXT NOT NULL DEFAULT ''; ALTER TABLE pieces ADD COLUMN revision INTEGER NOT NULL DEFAULT 1 CHECK (revision >= 1); ALTER TABLE pieces ADD COLUMN archived_from_status TEXT CHECK ( archived_from_status IS NULL OR archived_from_status IN ('inbox', 'preparing', 'ready') ); CREATE TABLE piece_media ( id TEXT PRIMARY KEY, piece_id TEXT NOT NULL REFERENCES pieces(id) ON DELETE CASCADE, storage_name TEXT NOT NULL UNIQUE, original_name TEXT NOT NULL, mime_type TEXT NOT NULL CHECK (mime_type IN ('image/jpeg', 'image/png', 'image/webp', 'image/gif')), byte_size INTEGER NOT NULL CHECK (byte_size > 0 AND byte_size <= 5242880), alt_text TEXT NOT NULL DEFAULT '', position INTEGER NOT NULL CHECK (position >= 0), created_at_utc TEXT NOT NULL, UNIQUE (piece_id, position) ); CREATE INDEX idx_piece_media_piece ON piece_media(piece_id, position); CREATE INDEX idx_piece_topics_topic ON piece_topics(topic_id, piece_id); CREATE INDEX idx_piece_categories_category ON piece_category_suggestions(category_id, piece_id); CREATE INDEX idx_piece_sources_piece ON piece_sources(piece_id, position);