9ba1f86c34
Añade Execution, Assertion, AssertionResult al paquete fn_operations. Motor de evaluación de assertions con reescritura SQL automática. Bucle reactivo: ExecuteAndReact evalúa assertions y cambia status de entities (corrupted/stale) + auto-crea proposals en registry. CLI fn ops: assertion (add/list/show/delete/eval) y execution (add/list/show). Migración 002_executions_assertions.sql con FTS para assertions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
66 lines
2.2 KiB
SQL
66 lines
2.2 KiB
SQL
-- Executions, assertions, and assertion_results tables.
|
|
-- Closes the autonomous improvement loop: execute -> assert -> analyze.
|
|
|
|
CREATE TABLE IF NOT EXISTS executions (
|
|
id TEXT PRIMARY KEY,
|
|
pipeline_id TEXT NOT NULL,
|
|
relation_id TEXT NOT NULL DEFAULT '',
|
|
status TEXT NOT NULL CHECK(status IN ('success','failure','partial')),
|
|
started_at TEXT NOT NULL,
|
|
ended_at TEXT,
|
|
duration_ms INTEGER,
|
|
records_in INTEGER,
|
|
records_out INTEGER,
|
|
error TEXT NOT NULL DEFAULT '',
|
|
metrics TEXT NOT NULL DEFAULT '{}',
|
|
created_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS assertions (
|
|
id TEXT PRIMARY KEY,
|
|
entity_id TEXT NOT NULL REFERENCES entities(id),
|
|
name TEXT NOT NULL,
|
|
kind TEXT NOT NULL,
|
|
rule TEXT NOT NULL,
|
|
severity TEXT NOT NULL DEFAULT 'warning' CHECK(severity IN ('critical','warning','info')),
|
|
description TEXT NOT NULL DEFAULT '',
|
|
active INTEGER NOT NULL DEFAULT 1,
|
|
created_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS assertion_results (
|
|
id TEXT PRIMARY KEY,
|
|
assertion_id TEXT NOT NULL REFERENCES assertions(id),
|
|
execution_id TEXT NOT NULL DEFAULT '',
|
|
status TEXT NOT NULL CHECK(status IN ('pass','fail','skip')),
|
|
value TEXT NOT NULL DEFAULT '{}',
|
|
message TEXT NOT NULL DEFAULT '',
|
|
evaluated_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE VIRTUAL TABLE IF NOT EXISTS assertions_fts USING fts5(
|
|
id,
|
|
name,
|
|
description,
|
|
rule,
|
|
content='assertions',
|
|
content_rowid='rowid'
|
|
);
|
|
|
|
CREATE TRIGGER IF NOT EXISTS assertions_ai AFTER INSERT ON assertions BEGIN
|
|
INSERT INTO assertions_fts(rowid, id, name, description, rule)
|
|
VALUES (new.rowid, new.id, new.name, new.description, new.rule);
|
|
END;
|
|
|
|
CREATE TRIGGER IF NOT EXISTS assertions_ad AFTER DELETE ON assertions BEGIN
|
|
INSERT INTO assertions_fts(assertions_fts, rowid, id, name, description, rule)
|
|
VALUES ('delete', old.rowid, old.id, old.name, old.description, old.rule);
|
|
END;
|
|
|
|
CREATE TRIGGER IF NOT EXISTS assertions_au AFTER UPDATE ON assertions BEGIN
|
|
INSERT INTO assertions_fts(assertions_fts, rowid, id, name, description, rule)
|
|
VALUES ('delete', old.rowid, old.id, old.name, old.description, old.rule);
|
|
INSERT INTO assertions_fts(rowid, id, name, description, rule)
|
|
VALUES (new.rowid, new.id, new.name, new.description, new.rule);
|
|
END;
|