-- Commonwealth Project Ticketing Database Schema -- Access via: python3 db/connectors/sqlite_connector.py -- DO NOT use sqlite3 CLI (crashes in Claude Code due to std::bad_alloc bug) PRAGMA journal_mode=WAL; PRAGMA foreign_keys=ON; CREATE TABLE IF NOT EXISTS tickets ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL CHECK(type IN ('initiative', 'epic', 'story', 'task', 'bug')), parent_id INTEGER REFERENCES tickets(id), title TEXT NOT NULL, description TEXT, status TEXT NOT NULL DEFAULT 'backlog' CHECK(status IN ('backlog', 'ready', 'in_progress', 'review', 'done', 'cancelled')), priority TEXT DEFAULT 'medium' CHECK(priority IN ('critical', 'high', 'medium', 'low')), assigned_to TEXT, decision_ref TEXT, -- e.g. 'D-010' or 'Q-001' sprint_id INTEGER REFERENCES sprints(id), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS sprints ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, goal TEXT, start_date TEXT, end_date TEXT, status TEXT NOT NULL DEFAULT 'planning' CHECK(status IN ('planning', 'active', 'completed', 'cancelled')), created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS ticket_deps ( blocker_id INTEGER NOT NULL REFERENCES tickets(id), blocked_id INTEGER NOT NULL REFERENCES tickets(id), PRIMARY KEY (blocker_id, blocked_id) ); CREATE TABLE IF NOT EXISTS ticket_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, ticket_id INTEGER NOT NULL REFERENCES tickets(id), field TEXT NOT NULL, old_value TEXT, new_value TEXT, changed_by TEXT, changed_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS ticket_labels ( ticket_id INTEGER NOT NULL REFERENCES tickets(id), label TEXT NOT NULL, PRIMARY KEY (ticket_id, label) ); CREATE INDEX IF NOT EXISTS idx_tickets_status ON tickets(status); CREATE INDEX IF NOT EXISTS idx_tickets_type ON tickets(type); CREATE INDEX IF NOT EXISTS idx_tickets_parent ON tickets(parent_id); CREATE INDEX IF NOT EXISTS idx_tickets_sprint ON tickets(sprint_id); CREATE INDEX IF NOT EXISTS idx_tickets_assigned ON tickets(assigned_to); CREATE INDEX IF NOT EXISTS idx_tickets_decision ON tickets(decision_ref); CREATE INDEX IF NOT EXISTS idx_history_ticket ON ticket_history(ticket_id);