-- Migration 141: Trinity Console Issue Tracker (Task #166) -- Filed by Chronicler #89 on REQ-2026-04-14-issue-tracker. -- Creates issues + attachments + comments tables. CREATE TABLE IF NOT EXISTS issues ( id SERIAL PRIMARY KEY, issue_number INTEGER UNIQUE, title VARCHAR(255) NOT NULL, description TEXT, status VARCHAR(20) DEFAULT 'open', -- open, in_progress, blocked, resolved, closed priority VARCHAR(20) DEFAULT 'medium', -- critical, high, medium, low category VARCHAR(50) DEFAULT 'general', -- bug, feature, content, infrastructure, holly, general submitted_by VARCHAR(100) NOT NULL, -- Discord username assigned_to VARCHAR(100) DEFAULT 'unassigned', created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), resolved_at TIMESTAMPTZ, resolved_by VARCHAR(100) ); CREATE INDEX IF NOT EXISTS idx_issues_status ON issues (status); CREATE INDEX IF NOT EXISTS idx_issues_priority ON issues (priority); CREATE INDEX IF NOT EXISTS idx_issues_category ON issues (category); CREATE INDEX IF NOT EXISTS idx_issues_submitter ON issues (submitted_by); CREATE TABLE IF NOT EXISTS issue_attachments ( id SERIAL PRIMARY KEY, issue_id INTEGER REFERENCES issues(id) ON DELETE CASCADE, filename VARCHAR(255) NOT NULL, original_name VARCHAR(255), mime_type VARCHAR(100), file_size INTEGER, uploaded_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_issue_attachments_issue ON issue_attachments (issue_id); CREATE TABLE IF NOT EXISTS issue_comments ( id SERIAL PRIMARY KEY, issue_id INTEGER REFERENCES issues(id) ON DELETE CASCADE, author VARCHAR(100) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_issue_comments_issue ON issue_comments (issue_id);