-- Auto-generated by pql init. CREATE TABLE statements -- for the planning schema; per-table dir keeps the changelog -- self-describing per D-15. CREATE TABLE IF NOT EXISTS is -- idempotent so running schema files from each directory in -- replay order is harmless. -- -- Importer parses the markers below to detect schema drift -- between the producing pql version and the local one — a -- bumped canonical_version means projection rules changed -- and replay must refuse rather than silently corrupt state. -- pql:created_by: 1.4.26 -- pql:canonical_version: 1 CREATE TABLE IF NOT EXISTS decisions ( id TEXT PRIMARY KEY, type TEXT NOT NULL CHECK(type IN ('confirmed','question','rejected')), domain TEXT NOT NULL, title TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','superseded','resolved','open')), date TEXT, file_path TEXT NOT NULL, synced_at TEXT NOT NULL DEFAULT (datetime('now')), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), deleted_at TEXT, hash TEXT, canonical_version INTEGER ); CREATE TABLE IF NOT EXISTS decision_refs ( source_id TEXT NOT NULL REFERENCES decisions(id) ON DELETE CASCADE, target_id TEXT NOT NULL REFERENCES decisions(id) ON DELETE CASCADE, ref_type TEXT NOT NULL CHECK(ref_type IN ('supersedes','references','resolves','depends_on','amends')), note TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), deleted_at TEXT, hash TEXT, canonical_version INTEGER, PRIMARY KEY (source_id, target_id, ref_type) ); CREATE TABLE IF NOT EXISTS tickets ( id TEXT PRIMARY KEY, type TEXT NOT NULL CHECK(type IN ('initiative','epic','story','task','bug')), parent_id TEXT 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, team TEXT, decision_ref TEXT REFERENCES decisions(id), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), deleted_at TEXT, hash TEXT, canonical_version INTEGER ); CREATE TABLE IF NOT EXISTS ticket_deps ( blocker_id TEXT NOT NULL REFERENCES tickets(id), blocked_id TEXT NOT NULL REFERENCES tickets(id), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), deleted_at TEXT, hash TEXT, canonical_version INTEGER, PRIMARY KEY (blocker_id, blocked_id) ); CREATE TABLE IF NOT EXISTS ticket_history ( ticket_id TEXT 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')), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), deleted_at TEXT, hash TEXT UNIQUE, canonical_version INTEGER ); CREATE TABLE IF NOT EXISTS ticket_labels ( ticket_id TEXT NOT NULL REFERENCES tickets(id), label TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')), deleted_at TEXT, hash TEXT, canonical_version INTEGER, PRIMARY KEY (ticket_id, label) ); CREATE TABLE IF NOT EXISTS meta ( key TEXT PRIMARY KEY, value TEXT NOT NULL, updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_tickets_status ON tickets(status); CREATE INDEX IF NOT EXISTS idx_tickets_team ON tickets(team); CREATE INDEX IF NOT EXISTS idx_tickets_decision_ref ON tickets(decision_ref); CREATE INDEX IF NOT EXISTS idx_tickets_assigned ON tickets(assigned_to); CREATE INDEX IF NOT EXISTS idx_decisions_domain ON decisions(domain); CREATE INDEX IF NOT EXISTS idx_decisions_type ON decisions(type); CREATE INDEX IF NOT EXISTS idx_decision_refs_target ON decision_refs(target_id);