diff --git a/src/database/migrations/001_drop_unused_ai_columns.sql b/src/database/migrations/001_drop_unused_ai_columns.sql new file mode 100644 index 0000000..a6b0ebe --- /dev/null +++ b/src/database/migrations/001_drop_unused_ai_columns.sql @@ -0,0 +1,10 @@ +-- Migration: 001_drop_unused_ai_columns.sql +-- Date: 2026-05-30 +-- Description: Drop columns that are written but never read from messages table +-- - ai_moderation_raw: raw LLM response, never consumed +-- - ai_policy_version: hardcoded string, never used for decisions +-- - ai_evidence: JSON evidence array, never read after write + +ALTER TABLE messages DROP COLUMN IF EXISTS ai_moderation_raw; +ALTER TABLE messages DROP COLUMN IF EXISTS ai_policy_version; +ALTER TABLE messages DROP COLUMN IF EXISTS ai_evidence; diff --git a/src/database/schema.ts b/src/database/schema.ts index b04957b..eb55396 100644 --- a/src/database/schema.ts +++ b/src/database/schema.ts @@ -76,7 +76,6 @@ export const pgMessagesTable = pgTable( .default("pending"), ai_moderation_flags: pgText("ai_moderation_flags"), ai_moderation_score: pgReal("ai_moderation_score"), - ai_moderation_raw: pgText("ai_moderation_raw"), ai_analysis: pgText("ai_analysis"), ai_categories: pgText("ai_categories"), ai_severity: pgText("ai_severity", { @@ -86,8 +85,6 @@ export const pgMessagesTable = pgTable( ai_recommended_action: pgText("ai_recommended_action", { enum: ["none", "monitor", "warn", "review", "delete", "escalate"], }), - ai_policy_version: pgText("ai_policy_version"), - ai_evidence: pgText("ai_evidence"), ai_analyzed_at: pgBigint("ai_analyzed_at", { mode: "number" }), ai_error: pgText("ai_error"), }, @@ -306,7 +303,6 @@ export const sqliteMessagesTable = sqliteTable( .default("pending"), ai_moderation_flags: sqliteText("ai_moderation_flags"), ai_moderation_score: sqliteReal("ai_moderation_score"), - ai_moderation_raw: sqliteText("ai_moderation_raw"), ai_analysis: sqliteText("ai_analysis"), ai_categories: sqliteText("ai_categories"), ai_severity: sqliteText("ai_severity", { @@ -316,8 +312,6 @@ export const sqliteMessagesTable = sqliteTable( ai_recommended_action: sqliteText("ai_recommended_action", { enum: ["none", "monitor", "warn", "review", "delete", "escalate"], }), - ai_policy_version: sqliteText("ai_policy_version"), - ai_evidence: sqliteText("ai_evidence"), ai_analyzed_at: sqliteInteger("ai_analyzed_at"), ai_error: sqliteText("ai_error"), }, diff --git a/src/moderation/aiAnalysisWorker.ts b/src/moderation/aiAnalysisWorker.ts index 9f92634..7b543ae 100644 --- a/src/moderation/aiAnalysisWorker.ts +++ b/src/moderation/aiAnalysisWorker.ts @@ -103,8 +103,11 @@ export default async function processAnalysisRequest({ status: analysisResult.status, flags: JSON.stringify(analysisResult.flags), score: analysisResult.score, - raw: JSON.stringify(result.raw), analysis: analysisResult.analysis, + categories: analysisResult.categories, + severity: analysisResult.severity, + confidence: analysisResult.confidence, + recommendedAction: analysisResult.recommendedAction, analyzedAt: Date.now(), error: null, }, diff --git a/src/moderation/aiAnalyzer.ts b/src/moderation/aiAnalyzer.ts index f042ed0..6f43cf7 100644 --- a/src/moderation/aiAnalyzer.ts +++ b/src/moderation/aiAnalyzer.ts @@ -304,14 +304,11 @@ async function processIndividualFallback( status: r.status, flags: JSON.stringify(r.flags), score: r.score, - raw: JSON.stringify(analysisResult.raw), analysis: r.analysis, categories: r.categories, severity: r.severity, confidence: r.confidence, recommendedAction: r.recommendedAction, - policyVersion: r.policyVersion, - evidence: r.evidence, analyzedAt: Date.now(), error: null, }, @@ -361,15 +358,12 @@ async function processIndividualFallback( status: "error", flags: JSON.stringify(["individual_analysis_exhausted"]), score: 0, - raw: null, analysis: "Individual fallback exhausted all retries: LLM consistently dropped this message even in single-target mode", categories: ["individual_analysis_exhausted"], severity: "none", confidence: 0, recommendedAction: "review", - policyVersion: "default-2026-05-30", - evidence: [], analyzedAt: Date.now(), error: lastError, }, diff --git a/src/moderation/messageStore.ts b/src/moderation/messageStore.ts index 8c0146d..5d43bf4 100644 --- a/src/moderation/messageStore.ts +++ b/src/moderation/messageStore.ts @@ -184,7 +184,6 @@ export async function updateMessageAsEdited( ai_status: "pending", ai_moderation_flags: null, ai_moderation_score: null, - ai_moderation_raw: null, ai_analysis: null, ai_analyzed_at: null, ai_error: null, @@ -392,14 +391,11 @@ interface AIAnalysisUpdate { status: "pending" | "clean" | "warn" | "flagged" | "error"; flags?: string | null; score?: number | null; - raw?: string | null; analysis?: string | null; categories?: string[] | string | null; severity?: MessageRecord["ai_severity"] | null; confidence?: number | null; recommendedAction?: MessageRecord["ai_recommended_action"] | null; - policyVersion?: string | null; - evidence?: string[] | string | null; analyzedAt?: number | null; error?: string | null; } @@ -423,14 +419,11 @@ export async function updateMessageAIAnalysis( ai_status: result.status, ai_moderation_flags: result.flags ?? null, ai_moderation_score: result.score ?? null, - ai_moderation_raw: result.raw ?? null, ai_analysis: result.analysis ?? null, ai_categories: stringifyAIList(result.categories), ai_severity: result.severity ?? null, ai_confidence: result.confidence ?? result.score ?? null, ai_recommended_action: result.recommendedAction ?? null, - ai_policy_version: result.policyVersion ?? null, - ai_evidence: stringifyAIList(result.evidence), ai_analyzed_at: result.analyzedAt ?? Date.now(), ai_error: result.error ?? null, }) diff --git a/src/moderation/types.ts b/src/moderation/types.ts index 8f87128..a5f3c38 100644 --- a/src/moderation/types.ts +++ b/src/moderation/types.ts @@ -33,14 +33,11 @@ export interface MessageRecord { ai_status?: AIStatus | null; ai_moderation_flags?: string | null; ai_moderation_score?: number | null; - ai_moderation_raw?: string | null; ai_analysis?: string | null; ai_categories?: string | null; ai_severity?: AISeverity | null; ai_confidence?: number | null; ai_recommended_action?: AIRecommendedAction | null; - ai_policy_version?: string | null; - ai_evidence?: string | null; ai_analyzed_at?: number | null; ai_error?: string | null; } diff --git a/src/routes/analysisRoutes.ts b/src/routes/analysisRoutes.ts index d58c670..4d3ced1 100644 --- a/src/routes/analysisRoutes.ts +++ b/src/routes/analysisRoutes.ts @@ -90,7 +90,6 @@ export function createAnalysisRoutes(): Router { status: "pending", flags: null, score: null, - raw: null, analysis: null, analyzedAt: null, error: null,