CREATE TABLE IF NOT EXISTS repositories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, url TEXT NOT NULL UNIQUE, description TEXT, branch TEXT NOT NULL DEFAULT 'main', status TEXT NOT NULL DEFAULT 'registered', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS repository_snapshots ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, commit_hash TEXT NOT NULL, branch TEXT NOT NULL, source_path TEXT NOT NULL, file_count INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS analysis_runs ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, snapshot_id INTEGER REFERENCES repository_snapshots(id) ON DELETE SET NULL, status TEXT NOT NULL, started_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, completed_at TEXT, error_message TEXT, scanner_version TEXT NOT NULL DEFAULT 'deterministic-v0.1' ); CREATE TABLE IF NOT EXISTS observed_facts ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, analysis_run_id INTEGER NOT NULL REFERENCES analysis_runs(id) ON DELETE CASCADE, snapshot_id INTEGER REFERENCES repository_snapshots(id) ON DELETE CASCADE, kind TEXT NOT NULL, path TEXT NOT NULL DEFAULT '', name TEXT NOT NULL, value TEXT NOT NULL DEFAULT '', metadata TEXT NOT NULL DEFAULT '{}', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS content_chunks ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, analysis_run_id INTEGER NOT NULL REFERENCES analysis_runs(id) ON DELETE CASCADE, snapshot_id INTEGER REFERENCES repository_snapshots(id) ON DELETE CASCADE, path TEXT NOT NULL, kind TEXT NOT NULL, start_line INTEGER NOT NULL, end_line INTEGER NOT NULL, text TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS candidate_abilities ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, analysis_run_id INTEGER NOT NULL REFERENCES analysis_runs(id) ON DELETE CASCADE, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', primary_class TEXT NOT NULL DEFAULT 'ability', attributes TEXT NOT NULL DEFAULT '[]', confidence REAL NOT NULL DEFAULT 0.0, status TEXT NOT NULL DEFAULT 'candidate', source_refs TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS candidate_capabilities ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, analysis_run_id INTEGER NOT NULL REFERENCES analysis_runs(id) ON DELETE CASCADE, ability_id INTEGER NOT NULL REFERENCES candidate_abilities(id) ON DELETE CASCADE, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', inputs TEXT NOT NULL DEFAULT '[]', outputs TEXT NOT NULL DEFAULT '[]', primary_class TEXT NOT NULL DEFAULT 'capability', attributes TEXT NOT NULL DEFAULT '[]', confidence REAL NOT NULL DEFAULT 0.0, status TEXT NOT NULL DEFAULT 'candidate', source_refs TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS candidate_features ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, analysis_run_id INTEGER NOT NULL REFERENCES analysis_runs(id) ON DELETE CASCADE, capability_id INTEGER NOT NULL REFERENCES candidate_capabilities(id) ON DELETE CASCADE, name TEXT NOT NULL, type TEXT NOT NULL, primary_class TEXT NOT NULL DEFAULT '', attributes TEXT NOT NULL DEFAULT '[]', location TEXT NOT NULL DEFAULT '', confidence REAL NOT NULL DEFAULT 0.0, status TEXT NOT NULL DEFAULT 'candidate', source_refs TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS candidate_evidence ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, analysis_run_id INTEGER NOT NULL REFERENCES analysis_runs(id) ON DELETE CASCADE, capability_id INTEGER NOT NULL REFERENCES candidate_capabilities(id) ON DELETE CASCADE, target_kind TEXT NOT NULL DEFAULT 'capability', target_id INTEGER, type TEXT NOT NULL, reference TEXT NOT NULL, reference_kind TEXT NOT NULL DEFAULT 'source', reference_id INTEGER, strength TEXT NOT NULL DEFAULT 'medium', status TEXT NOT NULL DEFAULT 'candidate', source_refs TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS review_decisions ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, analysis_run_id INTEGER REFERENCES analysis_runs(id) ON DELETE SET NULL, action TEXT NOT NULL, notes TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS repository_scopes ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL UNIQUE REFERENCES repositories(id) ON DELETE CASCADE, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', primary_class TEXT NOT NULL DEFAULT 'ability', attributes TEXT NOT NULL DEFAULT '[]', confidence REAL NOT NULL DEFAULT 1.0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS approved_abilities ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', confidence REAL NOT NULL DEFAULT 1.0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS approved_capabilities ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, ability_id INTEGER NOT NULL REFERENCES approved_abilities(id) ON DELETE CASCADE, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', inputs TEXT NOT NULL DEFAULT '[]', outputs TEXT NOT NULL DEFAULT '[]', primary_class TEXT NOT NULL DEFAULT 'capability', attributes TEXT NOT NULL DEFAULT '[]', confidence REAL NOT NULL DEFAULT 1.0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS approved_features ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, capability_id INTEGER NOT NULL REFERENCES approved_capabilities(id) ON DELETE CASCADE, name TEXT NOT NULL, type TEXT NOT NULL, primary_class TEXT NOT NULL DEFAULT '', attributes TEXT NOT NULL DEFAULT '[]', location TEXT NOT NULL DEFAULT '', confidence REAL NOT NULL DEFAULT 1.0, source_refs TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS approved_evidence ( id INTEGER PRIMARY KEY AUTOINCREMENT, repository_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE, capability_id INTEGER NOT NULL REFERENCES approved_capabilities(id) ON DELETE CASCADE, target_kind TEXT NOT NULL DEFAULT 'capability', target_id INTEGER, type TEXT NOT NULL, reference TEXT NOT NULL, reference_kind TEXT NOT NULL DEFAULT 'source', reference_id INTEGER, strength TEXT NOT NULL DEFAULT 'medium', source_refs TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_repositories_status ON repositories(status); CREATE INDEX IF NOT EXISTS idx_snapshots_repository ON repository_snapshots(repository_id); CREATE INDEX IF NOT EXISTS idx_analysis_runs_repository ON analysis_runs(repository_id); CREATE INDEX IF NOT EXISTS idx_observed_facts_repository ON observed_facts(repository_id); CREATE INDEX IF NOT EXISTS idx_observed_facts_run ON observed_facts(analysis_run_id); CREATE INDEX IF NOT EXISTS idx_content_chunks_repository ON content_chunks(repository_id); CREATE INDEX IF NOT EXISTS idx_content_chunks_run ON content_chunks(analysis_run_id); CREATE INDEX IF NOT EXISTS idx_candidate_abilities_repository ON candidate_abilities(repository_id); CREATE INDEX IF NOT EXISTS idx_candidate_capabilities_repository ON candidate_capabilities(repository_id); CREATE INDEX IF NOT EXISTS idx_candidate_features_repository ON candidate_features(repository_id); CREATE INDEX IF NOT EXISTS idx_candidate_evidence_repository ON candidate_evidence(repository_id); CREATE INDEX IF NOT EXISTS idx_review_decisions_repository ON review_decisions(repository_id); CREATE INDEX IF NOT EXISTS idx_scopes_repository ON repository_scopes(repository_id); CREATE INDEX IF NOT EXISTS idx_abilities_repository ON approved_abilities(repository_id); CREATE INDEX IF NOT EXISTS idx_capabilities_repository ON approved_capabilities(repository_id); CREATE INDEX IF NOT EXISTS idx_features_repository ON approved_features(repository_id); CREATE INDEX IF NOT EXISTS idx_evidence_repository ON approved_evidence(repository_id);