Implement self-correcting memory architecture with critic engine
Adds: - Critic Engine (critic.js): Validates output against correction store - Auto-detection: Identifies uncorrected patterns (quantitative without proof, vague quantification, etc.) - Auto-storage: New patterns immediately stored as corrections - NocoDB Schema: Tables for corrections, preferences, episodes, decisions, validation - Memory Service (memory-service.js): NocoDB integration layer - Response Generator (response-generator.js): End-to-end pipeline with critic - Correction Store: JSON-based with README documentation Behavior: - ALL output validated before delivery - Quantitative claims without evidence → auto-corrected - Corrections immediately block future occurrences - System learns from its own mistakes Test: node architecture/test-critic.js
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
-- NocoDB Schema for Self-Correcting Memory Architecture
|
||||
-- Tables: corrections, memory_preferences, memory_episodes, memory_decisions
|
||||
|
||||
-- ============================================
|
||||
-- TABLE: corrections
|
||||
-- Stores known mistakes and auto-detected patterns
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS corrections (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
pattern VARCHAR(500) NOT NULL, -- Regex pattern to match
|
||||
exclude_pattern VARCHAR(500), -- Pattern that excludes match
|
||||
severity VARCHAR(20) NOT NULL, -- error, warning, auto-correct
|
||||
message VARCHAR(500) NOT NULL, -- What to tell user
|
||||
suggestion VARCHAR(500), -- How to fix
|
||||
blocking BOOLEAN DEFAULT TRUE, -- Block output if matched?
|
||||
auto_detected BOOLEAN DEFAULT FALSE, -- Was this auto-detected?
|
||||
manual_entry BOOLEAN DEFAULT FALSE, -- Was this manually added?
|
||||
hit_count INTEGER DEFAULT 0, -- How many times triggered
|
||||
last_triggered TIMESTAMP, -- Last time this fired
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
context VARCHAR(200) -- Task/workflow context
|
||||
);
|
||||
|
||||
-- Indexes for fast lookup
|
||||
CREATE INDEX IF NOT EXISTS idx_corrections_severity ON corrections(severity);
|
||||
CREATE INDEX IF NOT EXISTS idx_corrections_blocking ON corrections(blocking);
|
||||
CREATE INDEX IF NOT EXISTS idx_corrections_auto ON corrections(auto_detected);
|
||||
|
||||
-- ============================================
|
||||
-- TABLE: memory_preferences
|
||||
-- Persistent user preferences (Layer 2)
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS memory_preferences (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
category VARCHAR(50) NOT NULL, -- identity, pref, goal, knowledge
|
||||
key VARCHAR(100) NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
importance INTEGER DEFAULT 5, -- 1-10 scale
|
||||
confidence FLOAT DEFAULT 1.0, -- 0.0-1.0
|
||||
tags JSON, -- Array of tags
|
||||
access_count INTEGER DEFAULT 0, -- How often retrieved
|
||||
last_accessed TIMESTAMP,
|
||||
confirmed_count INTEGER DEFAULT 0, -- Times user confirmed
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_prefs_category ON memory_preferences(category);
|
||||
CREATE INDEX IF NOT EXISTS idx_prefs_importance ON memory_preferences(importance);
|
||||
|
||||
-- ============================================
|
||||
-- TABLE: memory_episodes
|
||||
-- Episodic memory - what happened when
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS memory_episodes (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
date DATE NOT NULL,
|
||||
summary TEXT NOT NULL, -- Brief summary
|
||||
details TEXT, -- Full details
|
||||
project VARCHAR(100), -- Which project
|
||||
outcomes JSON, -- What resulted
|
||||
corrections_triggered JSON, -- Array of correction IDs
|
||||
vector_embedding JSON, -- For semantic search (future)
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_episodes_date ON memory_episodes(date);
|
||||
CREATE INDEX IF NOT EXISTS idx_episodes_project ON memory_episodes(project);
|
||||
|
||||
-- ============================================
|
||||
-- TABLE: memory_decisions
|
||||
-- Architectural/technical decisions
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS memory_decisions (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
date DATE NOT NULL,
|
||||
project VARCHAR(100),
|
||||
decision TEXT NOT NULL, -- What was decided
|
||||
alternatives JSON, -- What was considered
|
||||
rationale TEXT NOT NULL, -- Why this choice
|
||||
status VARCHAR(20) DEFAULT 'active', -- active, reversed, deprecated
|
||||
reversed_by VARCHAR(50), -- If reversed, link to new decision
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_decisions_project ON memory_decisions(project);
|
||||
CREATE INDEX IF NOT EXISTS idx_decisions_status ON memory_decisions(status);
|
||||
|
||||
-- ============================================
|
||||
-- TABLE: validation_runs
|
||||
-- Track critic engine performance
|
||||
-- ============================================
|
||||
CREATE TABLE IF NOT EXISTS validation_runs (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
session_id VARCHAR(50),
|
||||
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
input_length INTEGER,
|
||||
output_length INTEGER,
|
||||
violations_found INTEGER DEFAULT 0,
|
||||
new_patterns_detected INTEGER DEFAULT 0,
|
||||
corrections_auto_stored INTEGER DEFAULT 0,
|
||||
processing_time_ms INTEGER, -- How long validation took
|
||||
blocked BOOLEAN DEFAULT FALSE, -- Was output blocked?
|
||||
workflow VARCHAR(50) -- Which workflow was active
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_validation_session ON validation_runs(session_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_validation_timestamp ON validation_runs(timestamp);
|
||||
|
||||
-- ============================================
|
||||
-- SEED DATA: Initial correction patterns
|
||||
-- ============================================
|
||||
|
||||
-- Critical patterns (always blocking)
|
||||
INSERT INTO corrections (id, pattern, severity, message, suggestion, blocking, auto_detected) VALUES
|
||||
('uncorrected_quantitative', '\\d+\\s*(%|percent|x\\s|times|fold)', 'auto-correct', 'Quantitative claim requires evidence citation', 'Add source or measurement method', TRUE, TRUE),
|
||||
('unverified_done', '\\b(done|complete|finished|shipped)\\b(?!(?:.*\\b(verified|tested|validated|checked)\\b))', 'error', '"Done" claims require verification evidence', 'Add verification steps completed', TRUE, FALSE),
|
||||
('unverified_performance', '\\b\\d+\\s*(%|percent|times|x\\s)\\s*(?:faster|slower|better|improved)', 'auto-correct', 'Performance claim requires benchmark data', 'Add benchmark methodology and results', TRUE, TRUE)
|
||||
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- ============================================
|
||||
-- VIEWS: Useful queries
|
||||
-- ============================================
|
||||
|
||||
-- High-impact corrections (blocking + high hit count)
|
||||
CREATE OR REPLACE VIEW high_impact_corrections AS
|
||||
SELECT id, pattern, message, hit_count, last_triggered, created_at
|
||||
FROM corrections
|
||||
WHERE blocking = TRUE AND hit_count > 5
|
||||
ORDER BY hit_count DESC;
|
||||
|
||||
-- Recent auto-detected patterns needing review
|
||||
CREATE OR REPLACE VIEW auto_patterns_for_review AS
|
||||
SELECT id, pattern, message, created_at, hit_count
|
||||
FROM corrections
|
||||
WHERE auto_detected = TRUE AND manual_entry = FALSE
|
||||
AND created_at > CURRENT_TIMESTAMP - INTERVAL '7 days'
|
||||
ORDER BY hit_count DESC;
|
||||
Reference in New Issue
Block a user