claw-code/.guardrails/mcp-server/internal/database/migrations/001_create_tables.up.sql

85 lines
3.1 KiB
SQL

-- Initial schema creation
-- Documents table
CREATE TABLE IF NOT EXISTS documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
slug VARCHAR(255) UNIQUE NOT NULL,
title VARCHAR(500) NOT NULL,
content TEXT NOT NULL,
search_vector tsvector,
category VARCHAR(50) NOT NULL CHECK (category IN ('workflow', 'standard', 'guide', 'reference')),
path VARCHAR(500) NOT NULL,
version INTEGER DEFAULT 1,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
-- Prevention rules table
CREATE TABLE IF NOT EXISTS prevention_rules (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
rule_id VARCHAR(50) UNIQUE NOT NULL CHECK (LENGTH(TRIM(rule_id)) > 0),
name VARCHAR(255) NOT NULL,
pattern TEXT NOT NULL,
pattern_hash VARCHAR(64),
message TEXT NOT NULL,
severity VARCHAR(10) NOT NULL CHECK (severity IN ('error', 'warning', 'info')),
enabled BOOLEAN NOT NULL DEFAULT true,
document_id UUID REFERENCES documents(id) ON DELETE SET NULL,
category VARCHAR(50),
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
-- Failure registry table (partitioned by time)
CREATE TABLE IF NOT EXISTS failure_registry (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
failure_id VARCHAR(50) UNIQUE NOT NULL,
category VARCHAR(50) NOT NULL,
severity VARCHAR(10) NOT NULL CHECK (severity IN ('critical', 'high', 'medium', 'low')),
error_message TEXT NOT NULL,
root_cause TEXT,
affected_files TEXT[],
regression_pattern VARCHAR(255),
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'resolved', 'deprecated')),
project_slug VARCHAR(100),
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
) PARTITION BY RANGE (created_at);
-- Projects table
CREATE TABLE IF NOT EXISTS projects (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) UNIQUE NOT NULL,
slug VARCHAR(100) UNIQUE NOT NULL CHECK (LENGTH(TRIM(slug)) > 0),
guardrail_context TEXT,
active_rules VARCHAR(50)[],
metadata JSONB DEFAULT '{}',
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
-- Audit log table (partitioned by time)
CREATE TABLE IF NOT EXISTS audit_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
event_id VARCHAR(50) NOT NULL,
timestamp TIMESTAMP NOT NULL DEFAULT NOW(),
event_type VARCHAR(50) NOT NULL,
severity VARCHAR(20) NOT NULL,
actor VARCHAR(64) NOT NULL,
action VARCHAR(50) NOT NULL,
resource VARCHAR(255),
status VARCHAR(20) NOT NULL,
details JSONB DEFAULT '{}',
client_ip INET,
request_id VARCHAR(50),
created_at TIMESTAMP NOT NULL DEFAULT NOW()
) PARTITION BY RANGE (timestamp);
-- Create initial partition for current month
CREATE TABLE IF NOT EXISTS failure_registry_y2026m02 PARTITION OF failure_registry
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
CREATE TABLE IF NOT EXISTS audit_log_y2026m02 PARTITION OF audit_log
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');