-- 001_schema_update.sql -- Comprehensive schema update for Math Wiki System maturation (Phase 1-4) -- Designed to be idempotent: safe to run multiple times. -- 1. Create new tables (IF NOT EXISTS) CREATE TABLE IF NOT EXISTS unit_feedback ( id INTEGER PRIMARY KEY AUTOINCREMENT, wiki_unit_id TEXT, problem_text TEXT NOT NULL, issue_type TEXT CHECK(issue_type IN ('wrong', 'unclear', 'outdated', 'other')), user_comment TEXT, solver_output_json TEXT, validation_result_json TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, resolved BOOLEAN DEFAULT FALSE ); CREATE INDEX IF NOT EXISTS idx_feedback_unit ON unit_feedback(wiki_unit_id, resolved); CREATE TABLE IF NOT EXISTS flagged_solutions ( id INTEGER PRIMARY KEY AUTOINCREMENT, problem_text TEXT NOT NULL, solver_output_json TEXT NOT NULL, validation_result_json TEXT NOT NULL, used_knowledge_ids TEXT NOT NULL, flagged_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, reviewed BOOLEAN DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS wiki_unit_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, wiki_unit_id TEXT NOT NULL, version INTEGER NOT NULL, content TEXT NOT NULL, source TEXT NOT NULL, edited_by TEXT DEFAULT 'system', edited_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, change_reason TEXT, FOREIGN KEY(wiki_unit_id) REFERENCES wiki_units(id) ); CREATE INDEX IF NOT EXISTS idx_history_unit ON wiki_unit_history(wiki_unit_id, version); CREATE TABLE IF NOT EXISTS solution_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, problem_text TEXT NOT NULL, problem_hash TEXT NOT NULL, classified_topic TEXT NOT NULL, retrieved_ids TEXT NOT NULL, used_knowledge_ids TEXT NOT NULL, solver_confidence TEXT NOT NULL, validation_valid BOOLEAN NOT NULL, validation_issues TEXT, wiki_assisted BOOLEAN NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_logs_created ON solution_logs(created_at); CREATE INDEX IF NOT EXISTS idx_logs_unit_usage ON solution_logs(used_knowledge_ids); CREATE TABLE IF NOT EXISTS wiki_drafts ( id INTEGER PRIMARY KEY AUTOINCREMENT, draft_id TEXT UNIQUE NOT NULL, source_url TEXT, source_text TEXT NOT NULL, proposed_units_json TEXT NOT NULL, topic_hint TEXT, status TEXT DEFAULT 'pending', reviewed_by TEXT, reviewed_at TIMESTAMP, final_units_json TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 2. Add new columns to wiki_units (conditional) -- Note: SQLite does not support IF NOT EXISTS on ADD COLUMN. -- Applications should check PRAGMA table_info before executing each ALTER. -- Alternatively, wrap each in a BEGIN/EXCEPTION block if using sqlite3 CLI. -- Columns to add: source (already present in running system after initial migration), created_at, updated_at, deleted, version, last_edited_by -- For manual execution, uncomment and run if column missing: /* ALTER TABLE wiki_units ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP; ALTER TABLE wiki_units ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP; ALTER TABLE wiki_units ADD COLUMN deleted BOOLEAN DEFAULT FALSE; ALTER TABLE wiki_units ADD COLUMN version INTEGER DEFAULT 1; ALTER TABLE wiki_units ADD COLUMN last_edited_by TEXT DEFAULT 'system'; */ -- 3. Create indexes for new columns if needed CREATE INDEX IF NOT EXISTS idx_active_units ON wiki_units(deleted); CREATE INDEX IF NOT EXISTS idx_unit_version ON wiki_units(version); -- 4. Backfill existing rows (if columns just added) -- Ensure no NULL values break queries: -- UPDATE wiki_units SET deleted = FALSE WHERE deleted IS NULL; -- UPDATE wiki_units SET version = 1 WHERE version IS NULL; -- UPDATE wiki_units SET last_edited_by = 'system' WHERE last_edited_by IS NULL; -- Migration complete.