@plazmodium/odin 0.3.2-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +306 -0
- package/dist/adapters/archive/supabase.d.ts +19 -0
- package/dist/adapters/archive/supabase.d.ts.map +1 -0
- package/dist/adapters/archive/supabase.js +121 -0
- package/dist/adapters/archive/supabase.js.map +1 -0
- package/dist/adapters/archive/types.d.ts +26 -0
- package/dist/adapters/archive/types.d.ts.map +1 -0
- package/dist/adapters/archive/types.js +6 -0
- package/dist/adapters/archive/types.js.map +1 -0
- package/dist/adapters/formal-verification/tla-precheck.d.ts +22 -0
- package/dist/adapters/formal-verification/tla-precheck.d.ts.map +1 -0
- package/dist/adapters/formal-verification/tla-precheck.js +270 -0
- package/dist/adapters/formal-verification/tla-precheck.js.map +1 -0
- package/dist/adapters/formal-verification/types.d.ts +37 -0
- package/dist/adapters/formal-verification/types.d.ts.map +1 -0
- package/dist/adapters/formal-verification/types.js +6 -0
- package/dist/adapters/formal-verification/types.js.map +1 -0
- package/dist/adapters/review/semgrep.d.ts +12 -0
- package/dist/adapters/review/semgrep.d.ts.map +1 -0
- package/dist/adapters/review/semgrep.js +175 -0
- package/dist/adapters/review/semgrep.js.map +1 -0
- package/dist/adapters/review/types.d.ts +14 -0
- package/dist/adapters/review/types.d.ts.map +1 -0
- package/dist/adapters/review/types.js +6 -0
- package/dist/adapters/review/types.js.map +1 -0
- package/dist/adapters/skills/filesystem.d.ts +18 -0
- package/dist/adapters/skills/filesystem.d.ts.map +1 -0
- package/dist/adapters/skills/filesystem.js +398 -0
- package/dist/adapters/skills/filesystem.js.map +1 -0
- package/dist/adapters/skills/types.d.ts +19 -0
- package/dist/adapters/skills/types.d.ts.map +1 -0
- package/dist/adapters/skills/types.js +6 -0
- package/dist/adapters/skills/types.js.map +1 -0
- package/dist/adapters/sql-executor/direct-postgres.d.ts +15 -0
- package/dist/adapters/sql-executor/direct-postgres.d.ts.map +1 -0
- package/dist/adapters/sql-executor/direct-postgres.js +33 -0
- package/dist/adapters/sql-executor/direct-postgres.js.map +1 -0
- package/dist/adapters/sql-executor/supabase-management-api.d.ts +17 -0
- package/dist/adapters/sql-executor/supabase-management-api.d.ts.map +1 -0
- package/dist/adapters/sql-executor/supabase-management-api.js +40 -0
- package/dist/adapters/sql-executor/supabase-management-api.js.map +1 -0
- package/dist/adapters/sql-executor/types.d.ts +15 -0
- package/dist/adapters/sql-executor/types.d.ts.map +1 -0
- package/dist/adapters/sql-executor/types.js +6 -0
- package/dist/adapters/sql-executor/types.js.map +1 -0
- package/dist/adapters/workflow-state/in-memory.d.ts +69 -0
- package/dist/adapters/workflow-state/in-memory.d.ts.map +1 -0
- package/dist/adapters/workflow-state/in-memory.js +444 -0
- package/dist/adapters/workflow-state/in-memory.js.map +1 -0
- package/dist/adapters/workflow-state/supabase.d.ts +55 -0
- package/dist/adapters/workflow-state/supabase.d.ts.map +1 -0
- package/dist/adapters/workflow-state/supabase.js +823 -0
- package/dist/adapters/workflow-state/supabase.js.map +1 -0
- package/dist/adapters/workflow-state/types.d.ts +55 -0
- package/dist/adapters/workflow-state/types.d.ts.map +1 -0
- package/dist/adapters/workflow-state/types.js +6 -0
- package/dist/adapters/workflow-state/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +115 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/actors.d.ts +10 -0
- package/dist/domain/actors.d.ts.map +1 -0
- package/dist/domain/actors.js +60 -0
- package/dist/domain/actors.js.map +1 -0
- package/dist/domain/development-evals.d.ts +9 -0
- package/dist/domain/development-evals.d.ts.map +1 -0
- package/dist/domain/development-evals.js +164 -0
- package/dist/domain/development-evals.js.map +1 -0
- package/dist/domain/matching.d.ts +8 -0
- package/dist/domain/matching.d.ts.map +1 -0
- package/dist/domain/matching.js +24 -0
- package/dist/domain/matching.js.map +1 -0
- package/dist/domain/phases.d.ts +10 -0
- package/dist/domain/phases.d.ts.map +1 -0
- package/dist/domain/phases.js +165 -0
- package/dist/domain/phases.js.map +1 -0
- package/dist/domain/quality-gates.d.ts +7 -0
- package/dist/domain/quality-gates.d.ts.map +1 -0
- package/dist/domain/quality-gates.js +8 -0
- package/dist/domain/quality-gates.js.map +1 -0
- package/dist/domain/resonance.d.ts +33 -0
- package/dist/domain/resonance.d.ts.map +1 -0
- package/dist/domain/resonance.js +100 -0
- package/dist/domain/resonance.js.map +1 -0
- package/dist/domain/tasks.d.ts +9 -0
- package/dist/domain/tasks.d.ts.map +1 -0
- package/dist/domain/tasks.js +57 -0
- package/dist/domain/tasks.js.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +387 -0
- package/dist/init.js.map +1 -0
- package/dist/schemas.d.ts +366 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +184 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +243 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/apply-migrations.d.ts +21 -0
- package/dist/tools/apply-migrations.d.ts.map +1 -0
- package/dist/tools/apply-migrations.js +286 -0
- package/dist/tools/apply-migrations.js.map +1 -0
- package/dist/tools/archive-feature-release.d.ts +13 -0
- package/dist/tools/archive-feature-release.d.ts.map +1 -0
- package/dist/tools/archive-feature-release.js +182 -0
- package/dist/tools/archive-feature-release.js.map +1 -0
- package/dist/tools/capture-learning.d.ts +9 -0
- package/dist/tools/capture-learning.d.ts.map +1 -0
- package/dist/tools/capture-learning.js +53 -0
- package/dist/tools/capture-learning.js.map +1 -0
- package/dist/tools/explore-knowledge.d.ts +9 -0
- package/dist/tools/explore-knowledge.d.ts.map +1 -0
- package/dist/tools/explore-knowledge.js +142 -0
- package/dist/tools/explore-knowledge.js.map +1 -0
- package/dist/tools/get-claims-needing-review.d.ts +8 -0
- package/dist/tools/get-claims-needing-review.d.ts.map +1 -0
- package/dist/tools/get-claims-needing-review.js +21 -0
- package/dist/tools/get-claims-needing-review.js.map +1 -0
- package/dist/tools/get-development-eval-status.d.ts +8 -0
- package/dist/tools/get-development-eval-status.d.ts.map +1 -0
- package/dist/tools/get-development-eval-status.js +49 -0
- package/dist/tools/get-development-eval-status.js.map +1 -0
- package/dist/tools/get-feature-status.d.ts +8 -0
- package/dist/tools/get-feature-status.d.ts.map +1 -0
- package/dist/tools/get-feature-status.js +68 -0
- package/dist/tools/get-feature-status.js.map +1 -0
- package/dist/tools/get-next-phase.d.ts +8 -0
- package/dist/tools/get-next-phase.d.ts.map +1 -0
- package/dist/tools/get-next-phase.js +26 -0
- package/dist/tools/get-next-phase.js.map +1 -0
- package/dist/tools/prepare-phase-context.d.ts +9 -0
- package/dist/tools/prepare-phase-context.d.ts.map +1 -0
- package/dist/tools/prepare-phase-context.js +151 -0
- package/dist/tools/prepare-phase-context.js.map +1 -0
- package/dist/tools/record-commit.d.ts +8 -0
- package/dist/tools/record-commit.d.ts.map +1 -0
- package/dist/tools/record-commit.js +28 -0
- package/dist/tools/record-commit.js.map +1 -0
- package/dist/tools/record-eval-plan.d.ts +8 -0
- package/dist/tools/record-eval-plan.d.ts.map +1 -0
- package/dist/tools/record-eval-plan.js +40 -0
- package/dist/tools/record-eval-plan.js.map +1 -0
- package/dist/tools/record-eval-run.d.ts +8 -0
- package/dist/tools/record-eval-run.d.ts.map +1 -0
- package/dist/tools/record-eval-run.js +42 -0
- package/dist/tools/record-eval-run.js.map +1 -0
- package/dist/tools/record-merge.d.ts +8 -0
- package/dist/tools/record-merge.d.ts.map +1 -0
- package/dist/tools/record-merge.js +16 -0
- package/dist/tools/record-merge.js.map +1 -0
- package/dist/tools/record-phase-artifact.d.ts +8 -0
- package/dist/tools/record-phase-artifact.d.ts.map +1 -0
- package/dist/tools/record-phase-artifact.js +26 -0
- package/dist/tools/record-phase-artifact.js.map +1 -0
- package/dist/tools/record-phase-result.d.ts +9 -0
- package/dist/tools/record-phase-result.d.ts.map +1 -0
- package/dist/tools/record-phase-result.js +122 -0
- package/dist/tools/record-phase-result.js.map +1 -0
- package/dist/tools/record-pull-request.d.ts +8 -0
- package/dist/tools/record-pull-request.d.ts.map +1 -0
- package/dist/tools/record-pull-request.js +16 -0
- package/dist/tools/record-pull-request.js.map +1 -0
- package/dist/tools/record-quality-gate.d.ts +8 -0
- package/dist/tools/record-quality-gate.d.ts.map +1 -0
- package/dist/tools/record-quality-gate.js +26 -0
- package/dist/tools/record-quality-gate.js.map +1 -0
- package/dist/tools/record-watcher-review.d.ts +8 -0
- package/dist/tools/record-watcher-review.d.ts.map +1 -0
- package/dist/tools/record-watcher-review.js +18 -0
- package/dist/tools/record-watcher-review.js.map +1 -0
- package/dist/tools/run-policy-checks.d.ts +8 -0
- package/dist/tools/run-policy-checks.d.ts.map +1 -0
- package/dist/tools/run-policy-checks.js +38 -0
- package/dist/tools/run-policy-checks.js.map +1 -0
- package/dist/tools/run-review-checks.d.ts +9 -0
- package/dist/tools/run-review-checks.d.ts.map +1 -0
- package/dist/tools/run-review-checks.js +45 -0
- package/dist/tools/run-review-checks.js.map +1 -0
- package/dist/tools/start-feature.d.ts +8 -0
- package/dist/tools/start-feature.d.ts.map +1 -0
- package/dist/tools/start-feature.js +33 -0
- package/dist/tools/start-feature.js.map +1 -0
- package/dist/tools/submit-claim.d.ts +8 -0
- package/dist/tools/submit-claim.d.ts.map +1 -0
- package/dist/tools/submit-claim.js +45 -0
- package/dist/tools/submit-claim.js.map +1 -0
- package/dist/tools/verify-claims.d.ts +8 -0
- package/dist/tools/verify-claims.d.ts.map +1 -0
- package/dist/tools/verify-claims.js +39 -0
- package/dist/tools/verify-claims.js.map +1 -0
- package/dist/tools/verify-design.d.ts +8 -0
- package/dist/tools/verify-design.d.ts.map +1 -0
- package/dist/tools/verify-design.js +31 -0
- package/dist/tools/verify-design.js.map +1 -0
- package/dist/types.d.ts +333 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +52 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +24 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +50 -0
- package/dist/utils.js.map +1 -0
- package/migrations/001_schema.sql +795 -0
- package/migrations/002_functions.sql +2126 -0
- package/migrations/003_views.sql +599 -0
- package/migrations/004_seed.sql +106 -0
- package/migrations/005_odin_v2_schema.sql +217 -0
- package/migrations/006_odin_v2_functions.sql +671 -0
- package/migrations/007_odin_v2_phase_alignment.sql +554 -0
- package/migrations/008_related_learnings.sql +80 -0
- package/migrations/README.md +23 -0
- package/package.json +63 -0
|
@@ -0,0 +1,795 @@
|
|
|
1
|
+
-- ============================================================================
|
|
2
|
+
-- Odin SDD Framework - Consolidated Schema
|
|
3
|
+
-- Version: 1.1.0
|
|
4
|
+
-- Created: 2026-02-16
|
|
5
|
+
-- Updated: 2026-02-16 (reconciled with live Supabase DB)
|
|
6
|
+
-- Description: Complete database schema for Odin. Run this first on a fresh
|
|
7
|
+
-- Supabase project. Includes all tables, enums, indexes, RLS policies, and
|
|
8
|
+
-- triggers. Functions and views are in separate files.
|
|
9
|
+
--
|
|
10
|
+
-- Order matters: Enums -> Tables (respecting FK dependencies) -> Indexes -> RLS
|
|
11
|
+
-- ============================================================================
|
|
12
|
+
|
|
13
|
+
-- ============================================================================
|
|
14
|
+
-- ENUMS
|
|
15
|
+
-- ============================================================================
|
|
16
|
+
|
|
17
|
+
-- Workflow phases (0-8)
|
|
18
|
+
CREATE TYPE phase AS ENUM ('0', '1', '2', '3', '4', '5', '6', '7', '8');
|
|
19
|
+
COMMENT ON TYPE phase IS 'Workflow phases: 0=Planning, 1=Discovery, 2=Architect, 3=Guardian, 4=Builder, 5=Integrator, 6=Documenter, 7=Release, 8=Complete';
|
|
20
|
+
|
|
21
|
+
-- Feature status
|
|
22
|
+
CREATE TYPE feature_status AS ENUM ('IN_PROGRESS', 'BLOCKED', 'COMPLETED', 'CANCELLED');
|
|
23
|
+
|
|
24
|
+
-- Feature severity (for prioritization)
|
|
25
|
+
CREATE TYPE severity AS ENUM ('ROUTINE', 'EXPEDITED', 'CRITICAL');
|
|
26
|
+
|
|
27
|
+
-- Blocker types
|
|
28
|
+
CREATE TYPE blocker_type AS ENUM (
|
|
29
|
+
'SPEC_THRASHING',
|
|
30
|
+
'MAX_ITERATIONS_REACHED',
|
|
31
|
+
'TOKEN_BUDGET_EXCEEDED',
|
|
32
|
+
'VALIDATION_FAILED',
|
|
33
|
+
'IMPLEMENTATION_IMPOSSIBLE',
|
|
34
|
+
'TECHNICAL_IMPOSSIBILITY',
|
|
35
|
+
'BREAKING_CHANGE_DETECTED',
|
|
36
|
+
'HUMAN_DECISION_REQUIRED'
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
-- Blocker status
|
|
40
|
+
CREATE TYPE blocker_status AS ENUM ('OPEN', 'IN_PROGRESS', 'RESOLVED', 'ESCALATED');
|
|
41
|
+
|
|
42
|
+
-- Blocker severity
|
|
43
|
+
CREATE TYPE blocker_severity AS ENUM ('LOW', 'MEDIUM', 'HIGH', 'CRITICAL');
|
|
44
|
+
|
|
45
|
+
-- Quality gate status
|
|
46
|
+
CREATE TYPE gate_status AS ENUM ('PENDING', 'APPROVED', 'REJECTED');
|
|
47
|
+
|
|
48
|
+
-- Phase transition types
|
|
49
|
+
CREATE TYPE transition_type AS ENUM ('FORWARD', 'BACKWARD', 'ESCALATION');
|
|
50
|
+
|
|
51
|
+
-- Learning categories
|
|
52
|
+
CREATE TYPE learning_category AS ENUM (
|
|
53
|
+
'DECISION',
|
|
54
|
+
'PATTERN',
|
|
55
|
+
'GOTCHA',
|
|
56
|
+
'CONVENTION',
|
|
57
|
+
'ARCHITECTURE',
|
|
58
|
+
'RATIONALE',
|
|
59
|
+
'OPTIMIZATION',
|
|
60
|
+
'INTEGRATION'
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- Learning importance levels
|
|
64
|
+
CREATE TYPE learning_importance AS ENUM ('HIGH', 'MEDIUM', 'LOW');
|
|
65
|
+
|
|
66
|
+
-- Conflict status (for concurrent feature conflicts)
|
|
67
|
+
CREATE TYPE conflict_status AS ENUM ('DETECTED', 'COORDINATED', 'SERIALIZED', 'RESOLVED');
|
|
68
|
+
|
|
69
|
+
-- Conflict risk levels
|
|
70
|
+
CREATE TYPE conflict_risk AS ENUM ('LOW', 'MEDIUM', 'HIGH');
|
|
71
|
+
|
|
72
|
+
-- Conflict resolution strategies
|
|
73
|
+
CREATE TYPE conflict_strategy AS ENUM ('SERIALIZE', 'COORDINATE', 'ALLOW_PARALLEL');
|
|
74
|
+
|
|
75
|
+
-- Learning conflict status
|
|
76
|
+
CREATE TYPE learning_conflict_status AS ENUM ('OPEN', 'INVESTIGATING', 'RESOLVED', 'DEFERRED');
|
|
77
|
+
|
|
78
|
+
-- Learning conflict types
|
|
79
|
+
CREATE TYPE learning_conflict_type AS ENUM ('CONTRADICTION', 'SCOPE_OVERLAP', 'VERSION_DRIFT');
|
|
80
|
+
|
|
81
|
+
-- Memory categories (for agent memory candidates)
|
|
82
|
+
CREATE TYPE memory_category AS ENUM ('DECISION', 'PATTERN', 'GOTCHA', 'BLOCKER', 'CONVENTION', 'ARCHITECTURE', 'RATIONALE');
|
|
83
|
+
|
|
84
|
+
-- Memory importance levels
|
|
85
|
+
CREATE TYPE memory_importance AS ENUM ('HIGH', 'MEDIUM', 'LOW');
|
|
86
|
+
|
|
87
|
+
-- EVALS health status
|
|
88
|
+
CREATE TYPE eval_health AS ENUM ('HEALTHY', 'CONCERNING', 'CRITICAL');
|
|
89
|
+
|
|
90
|
+
-- Alert severity
|
|
91
|
+
CREATE TYPE alert_severity AS ENUM ('WARNING', 'CRITICAL');
|
|
92
|
+
|
|
93
|
+
-- ============================================================================
|
|
94
|
+
-- CORE TABLES
|
|
95
|
+
-- ============================================================================
|
|
96
|
+
|
|
97
|
+
-- Features: Central entity tracking work items through the SDD workflow
|
|
98
|
+
CREATE TABLE features (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
name TEXT NOT NULL,
|
|
101
|
+
complexity_level INTEGER NOT NULL CHECK (complexity_level IN (1, 2, 3)),
|
|
102
|
+
severity severity NOT NULL DEFAULT 'ROUTINE',
|
|
103
|
+
current_phase phase NOT NULL DEFAULT '0',
|
|
104
|
+
status feature_status NOT NULL DEFAULT 'IN_PROGRESS',
|
|
105
|
+
epic_id TEXT,
|
|
106
|
+
parent_feature_id TEXT REFERENCES features(id) ON DELETE SET NULL,
|
|
107
|
+
requirements_path TEXT,
|
|
108
|
+
spec_path TEXT,
|
|
109
|
+
assigned_agent TEXT,
|
|
110
|
+
-- Git tracking
|
|
111
|
+
branch_name TEXT,
|
|
112
|
+
base_branch TEXT DEFAULT 'main',
|
|
113
|
+
dev_initials TEXT,
|
|
114
|
+
pr_url TEXT,
|
|
115
|
+
pr_number INTEGER,
|
|
116
|
+
merged_at TIMESTAMPTZ,
|
|
117
|
+
author TEXT,
|
|
118
|
+
-- Timestamps
|
|
119
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
120
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
121
|
+
completed_at TIMESTAMPTZ
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
COMMENT ON TABLE features IS 'Central tracking table for features going through the SDD workflow';
|
|
125
|
+
COMMENT ON COLUMN features.complexity_level IS 'L1=bug/small, L2=feature, L3=epic';
|
|
126
|
+
COMMENT ON COLUMN features.branch_name IS 'Git branch name (auto-generated from dev_initials + id)';
|
|
127
|
+
COMMENT ON COLUMN features.author IS 'Human developer name (display name)';
|
|
128
|
+
COMMENT ON COLUMN features.dev_initials IS 'Developer initials for branch naming';
|
|
129
|
+
|
|
130
|
+
-- Phase transitions: Track movement through workflow phases
|
|
131
|
+
CREATE TABLE phase_transitions (
|
|
132
|
+
id SERIAL PRIMARY KEY,
|
|
133
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
134
|
+
from_phase phase NOT NULL,
|
|
135
|
+
to_phase phase NOT NULL,
|
|
136
|
+
transitioned_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
137
|
+
transitioned_by TEXT NOT NULL,
|
|
138
|
+
transition_type transition_type NOT NULL DEFAULT 'FORWARD',
|
|
139
|
+
notes TEXT
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
COMMENT ON TABLE phase_transitions IS 'Audit trail of all phase changes for features';
|
|
143
|
+
|
|
144
|
+
-- Quality gates: Approval checkpoints in the workflow
|
|
145
|
+
CREATE TABLE quality_gates (
|
|
146
|
+
id SERIAL PRIMARY KEY,
|
|
147
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
148
|
+
gate_name TEXT NOT NULL,
|
|
149
|
+
phase phase NOT NULL,
|
|
150
|
+
status gate_status NOT NULL DEFAULT 'PENDING',
|
|
151
|
+
approver TEXT NOT NULL,
|
|
152
|
+
approved_at TIMESTAMPTZ DEFAULT now(),
|
|
153
|
+
approval_notes TEXT,
|
|
154
|
+
decision_log TEXT,
|
|
155
|
+
UNIQUE(feature_id, gate_name, phase)
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
COMMENT ON TABLE quality_gates IS 'Approval gates that must pass before phase transitions';
|
|
159
|
+
|
|
160
|
+
-- Blockers: Issues preventing progress
|
|
161
|
+
CREATE TABLE blockers (
|
|
162
|
+
id SERIAL PRIMARY KEY,
|
|
163
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
164
|
+
blocker_type blocker_type NOT NULL,
|
|
165
|
+
phase phase NOT NULL,
|
|
166
|
+
status blocker_status NOT NULL DEFAULT 'OPEN',
|
|
167
|
+
severity blocker_severity NOT NULL,
|
|
168
|
+
title TEXT NOT NULL,
|
|
169
|
+
description TEXT NOT NULL,
|
|
170
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
171
|
+
created_by TEXT NOT NULL,
|
|
172
|
+
resolved_at TIMESTAMPTZ,
|
|
173
|
+
resolved_by TEXT,
|
|
174
|
+
resolution_notes TEXT,
|
|
175
|
+
escalation_notes TEXT
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
COMMENT ON TABLE blockers IS 'Issues blocking feature progress';
|
|
179
|
+
|
|
180
|
+
-- Work in progress: File-level locking for concurrent feature work
|
|
181
|
+
CREATE TABLE work_in_progress (
|
|
182
|
+
id SERIAL PRIMARY KEY,
|
|
183
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
184
|
+
file_path TEXT NOT NULL,
|
|
185
|
+
lock_type TEXT NOT NULL CHECK (lock_type IN ('FEATURE', 'FILE')),
|
|
186
|
+
locked_by TEXT NOT NULL,
|
|
187
|
+
locked_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
188
|
+
UNIQUE(feature_id, file_path)
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
COMMENT ON TABLE work_in_progress IS 'File-level locking for concurrent feature work';
|
|
192
|
+
|
|
193
|
+
-- Conflict detection: Track detected conflicts between concurrent features
|
|
194
|
+
CREATE TABLE conflict_detection (
|
|
195
|
+
id SERIAL PRIMARY KEY,
|
|
196
|
+
feature_a_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
197
|
+
feature_b_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
198
|
+
file_path TEXT NOT NULL,
|
|
199
|
+
conflict_risk conflict_risk NOT NULL DEFAULT 'MEDIUM',
|
|
200
|
+
detected_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
201
|
+
detected_phase phase NOT NULL,
|
|
202
|
+
status conflict_status NOT NULL DEFAULT 'DETECTED',
|
|
203
|
+
strategy conflict_strategy NOT NULL DEFAULT 'COORDINATE',
|
|
204
|
+
notes TEXT,
|
|
205
|
+
CHECK (feature_a_id < feature_b_id)
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
COMMENT ON TABLE conflict_detection IS 'Conflicts detected between concurrent features on shared files';
|
|
209
|
+
|
|
210
|
+
-- Iteration tracking: Track spec revision iterations
|
|
211
|
+
CREATE TABLE iteration_tracking (
|
|
212
|
+
id SERIAL PRIMARY KEY,
|
|
213
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
214
|
+
iteration_number INTEGER NOT NULL,
|
|
215
|
+
spec_version TEXT NOT NULL,
|
|
216
|
+
spec_score NUMERIC(3,2),
|
|
217
|
+
issues_found INTEGER NOT NULL DEFAULT 0,
|
|
218
|
+
issues_resolved INTEGER NOT NULL DEFAULT 0,
|
|
219
|
+
spec_changes_percent NUMERIC(5,2) NOT NULL DEFAULT 0,
|
|
220
|
+
convergence_detected BOOLEAN NOT NULL DEFAULT false,
|
|
221
|
+
thrashing_detected BOOLEAN NOT NULL DEFAULT false,
|
|
222
|
+
recorded_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
223
|
+
UNIQUE(feature_id, iteration_number)
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
COMMENT ON TABLE iteration_tracking IS 'Tracks iterations (back-and-forth) in spec development';
|
|
227
|
+
|
|
228
|
+
-- Audit log: Comprehensive operation logging
|
|
229
|
+
CREATE TABLE audit_log (
|
|
230
|
+
id SERIAL PRIMARY KEY,
|
|
231
|
+
feature_id TEXT REFERENCES features(id) ON DELETE SET NULL,
|
|
232
|
+
operation TEXT NOT NULL,
|
|
233
|
+
agent_name TEXT NOT NULL,
|
|
234
|
+
timestamp TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
235
|
+
details JSONB
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
COMMENT ON TABLE audit_log IS 'Audit trail for all significant operations';
|
|
239
|
+
|
|
240
|
+
-- ============================================================================
|
|
241
|
+
-- AGENT INVOCATIONS (Duration tracking)
|
|
242
|
+
-- ============================================================================
|
|
243
|
+
|
|
244
|
+
CREATE TABLE agent_invocations (
|
|
245
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
246
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
247
|
+
phase phase NOT NULL,
|
|
248
|
+
agent_name TEXT NOT NULL,
|
|
249
|
+
operation TEXT,
|
|
250
|
+
skills_used TEXT[],
|
|
251
|
+
started_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
252
|
+
ended_at TIMESTAMPTZ,
|
|
253
|
+
duration_ms INTEGER,
|
|
254
|
+
notes TEXT,
|
|
255
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
COMMENT ON TABLE agent_invocations IS 'Track agent work duration per phase (replaces token tracking)';
|
|
259
|
+
COMMENT ON COLUMN agent_invocations.skills_used IS 'Array of skill paths injected (e.g., frontend/nextjs-dev)';
|
|
260
|
+
|
|
261
|
+
-- ============================================================================
|
|
262
|
+
-- GIT COMMIT TRACKING
|
|
263
|
+
-- ============================================================================
|
|
264
|
+
|
|
265
|
+
CREATE TABLE feature_commits (
|
|
266
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
267
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
268
|
+
commit_hash TEXT NOT NULL,
|
|
269
|
+
phase phase NOT NULL,
|
|
270
|
+
message TEXT,
|
|
271
|
+
files_changed INTEGER,
|
|
272
|
+
insertions INTEGER,
|
|
273
|
+
deletions INTEGER,
|
|
274
|
+
committed_at TIMESTAMPTZ DEFAULT now(),
|
|
275
|
+
committed_by TEXT,
|
|
276
|
+
created_at TIMESTAMPTZ DEFAULT now()
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
COMMENT ON TABLE feature_commits IS 'Git commits associated with each feature';
|
|
280
|
+
|
|
281
|
+
-- ============================================================================
|
|
282
|
+
-- PHASE OUTPUTS (Structured agent artifacts)
|
|
283
|
+
-- ============================================================================
|
|
284
|
+
|
|
285
|
+
CREATE TABLE phase_outputs (
|
|
286
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
287
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
288
|
+
phase phase NOT NULL,
|
|
289
|
+
output_type TEXT NOT NULL, -- 'requirements', 'perspectives', 'tasks'
|
|
290
|
+
content JSONB NOT NULL,
|
|
291
|
+
created_by TEXT NOT NULL,
|
|
292
|
+
created_at TIMESTAMPTZ DEFAULT now()
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
COMMENT ON TABLE phase_outputs IS 'Structured outputs from each phase (requirements, perspectives, tasks)';
|
|
296
|
+
COMMENT ON COLUMN phase_outputs.content IS 'JSONB acceptable here: shape varies by output_type';
|
|
297
|
+
|
|
298
|
+
-- ============================================================================
|
|
299
|
+
-- MEMORIES (Knowledge persistence)
|
|
300
|
+
-- ============================================================================
|
|
301
|
+
|
|
302
|
+
CREATE TABLE memories (
|
|
303
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
304
|
+
feature_id VARCHAR(50) REFERENCES features(id) ON DELETE SET NULL,
|
|
305
|
+
category memory_category NOT NULL,
|
|
306
|
+
importance memory_importance NOT NULL DEFAULT 'MEDIUM',
|
|
307
|
+
title VARCHAR(200) NOT NULL,
|
|
308
|
+
content TEXT NOT NULL,
|
|
309
|
+
rationale TEXT,
|
|
310
|
+
tags TEXT[] DEFAULT '{}'::text[],
|
|
311
|
+
phase phase,
|
|
312
|
+
agent VARCHAR(50),
|
|
313
|
+
created_at TIMESTAMPTZ DEFAULT now(),
|
|
314
|
+
updated_at TIMESTAMPTZ DEFAULT now(),
|
|
315
|
+
created_by VARCHAR(100),
|
|
316
|
+
is_archived BOOLEAN DEFAULT false,
|
|
317
|
+
archived_at TIMESTAMPTZ,
|
|
318
|
+
search_vector TSVECTOR
|
|
319
|
+
);
|
|
320
|
+
|
|
321
|
+
COMMENT ON TABLE memories IS 'Structured knowledge persistence for agent memory candidates';
|
|
322
|
+
|
|
323
|
+
-- ============================================================================
|
|
324
|
+
-- FEATURE ARCHIVES (Completed feature documentation)
|
|
325
|
+
-- ============================================================================
|
|
326
|
+
|
|
327
|
+
CREATE TABLE feature_archives (
|
|
328
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
329
|
+
feature_id VARCHAR(50) NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
330
|
+
storage_path TEXT NOT NULL,
|
|
331
|
+
summary TEXT NOT NULL,
|
|
332
|
+
files_archived TEXT[] NOT NULL DEFAULT '{}'::text[],
|
|
333
|
+
total_size_bytes INTEGER DEFAULT 0,
|
|
334
|
+
spec_snapshot JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
335
|
+
release_version VARCHAR(50),
|
|
336
|
+
release_notes TEXT,
|
|
337
|
+
archived_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
338
|
+
archived_by VARCHAR(50) NOT NULL DEFAULT 'Release',
|
|
339
|
+
search_vector TSVECTOR,
|
|
340
|
+
UNIQUE(feature_id)
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
COMMENT ON TABLE feature_archives IS 'Archived documentation for completed features';
|
|
344
|
+
|
|
345
|
+
-- ============================================================================
|
|
346
|
+
-- LEARNINGS (Knowledge evolution)
|
|
347
|
+
-- ============================================================================
|
|
348
|
+
|
|
349
|
+
CREATE TABLE learnings (
|
|
350
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
351
|
+
predecessor_id UUID REFERENCES learnings(id) ON DELETE SET NULL,
|
|
352
|
+
iteration_number INTEGER NOT NULL DEFAULT 1,
|
|
353
|
+
feature_id TEXT REFERENCES features(id) ON DELETE SET NULL,
|
|
354
|
+
task_id TEXT,
|
|
355
|
+
category learning_category NOT NULL,
|
|
356
|
+
title VARCHAR(255) NOT NULL,
|
|
357
|
+
content TEXT NOT NULL,
|
|
358
|
+
delta_summary TEXT,
|
|
359
|
+
confidence_score NUMERIC(3,2) NOT NULL DEFAULT 0.50
|
|
360
|
+
CHECK (confidence_score >= 0.00 AND confidence_score <= 1.00),
|
|
361
|
+
validation_count INTEGER NOT NULL DEFAULT 0,
|
|
362
|
+
last_validated_at TIMESTAMPTZ,
|
|
363
|
+
validated_by TEXT[] DEFAULT '{}'::text[],
|
|
364
|
+
propagated_to TEXT[] DEFAULT '{}'::text[], -- Legacy: kept for backward compat, use relational tables
|
|
365
|
+
propagated_at TIMESTAMPTZ,
|
|
366
|
+
propagation_summary TEXT,
|
|
367
|
+
importance learning_importance NOT NULL DEFAULT 'MEDIUM',
|
|
368
|
+
tags TEXT[] DEFAULT '{}'::text[],
|
|
369
|
+
phase phase,
|
|
370
|
+
agent VARCHAR(100),
|
|
371
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
372
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
373
|
+
created_by VARCHAR(100),
|
|
374
|
+
is_superseded BOOLEAN NOT NULL DEFAULT false,
|
|
375
|
+
superseded_at TIMESTAMPTZ,
|
|
376
|
+
superseded_by UUID REFERENCES learnings(id) ON DELETE SET NULL,
|
|
377
|
+
search_vector TSVECTOR
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
COMMENT ON TABLE learnings IS 'Evolving knowledge base with confidence scoring and validation';
|
|
381
|
+
COMMENT ON COLUMN learnings.predecessor_id IS 'Links to the previous version (L_n -> L_{n+1} chain)';
|
|
382
|
+
COMMENT ON COLUMN learnings.confidence_score IS '0.00-1.00, increases with validation (+0.15) and references (+0.10)';
|
|
383
|
+
COMMENT ON COLUMN learnings.propagated_to IS 'LEGACY: Use learning_propagation_targets instead';
|
|
384
|
+
|
|
385
|
+
-- Learning conflicts: Detect contradicting learnings
|
|
386
|
+
CREATE TABLE learning_conflicts (
|
|
387
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
388
|
+
learning_a_id UUID NOT NULL REFERENCES learnings(id) ON DELETE CASCADE,
|
|
389
|
+
learning_b_id UUID NOT NULL REFERENCES learnings(id) ON DELETE CASCADE,
|
|
390
|
+
conflict_type learning_conflict_type NOT NULL,
|
|
391
|
+
description TEXT NOT NULL,
|
|
392
|
+
detected_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
393
|
+
detected_by VARCHAR(100),
|
|
394
|
+
status learning_conflict_status NOT NULL DEFAULT 'OPEN',
|
|
395
|
+
resolution TEXT,
|
|
396
|
+
resolved_at TIMESTAMPTZ,
|
|
397
|
+
resolved_by VARCHAR(100),
|
|
398
|
+
winning_learning_id UUID REFERENCES learnings(id) ON DELETE SET NULL,
|
|
399
|
+
CHECK (learning_a_id <> learning_b_id),
|
|
400
|
+
UNIQUE(learning_a_id, learning_b_id)
|
|
401
|
+
);
|
|
402
|
+
|
|
403
|
+
COMMENT ON TABLE learning_conflicts IS 'Detected conflicts between learnings that need resolution';
|
|
404
|
+
|
|
405
|
+
-- Learning propagation targets: Where learnings SHOULD go
|
|
406
|
+
CREATE TABLE learning_propagation_targets (
|
|
407
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
408
|
+
learning_id UUID NOT NULL REFERENCES learnings(id) ON DELETE CASCADE,
|
|
409
|
+
target_type TEXT NOT NULL CHECK (target_type IN ('agents_md', 'skill', 'agent_definition')),
|
|
410
|
+
target_path TEXT,
|
|
411
|
+
relevance_score NUMERIC(3,2) NOT NULL CHECK (relevance_score >= 0.00 AND relevance_score <= 1.00),
|
|
412
|
+
created_at TIMESTAMPTZ DEFAULT now(),
|
|
413
|
+
-- Invariant: agents_md => NULL path, skill/agent_definition => NOT NULL path
|
|
414
|
+
CHECK (
|
|
415
|
+
(target_type = 'agents_md' AND target_path IS NULL)
|
|
416
|
+
OR (target_type IN ('skill', 'agent_definition') AND target_path IS NOT NULL)
|
|
417
|
+
)
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
COMMENT ON TABLE learning_propagation_targets IS 'Declared targets for learning propagation (where they SHOULD go)';
|
|
421
|
+
|
|
422
|
+
-- Learning propagations: Where learnings HAVE BEEN propagated
|
|
423
|
+
CREATE TABLE learning_propagations (
|
|
424
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
425
|
+
learning_id UUID NOT NULL REFERENCES learnings(id) ON DELETE CASCADE,
|
|
426
|
+
target_type TEXT NOT NULL CHECK (target_type IN ('agents_md', 'skill', 'agent_definition')),
|
|
427
|
+
target_path TEXT,
|
|
428
|
+
propagated_at TIMESTAMPTZ DEFAULT now(),
|
|
429
|
+
propagated_by TEXT NOT NULL,
|
|
430
|
+
section TEXT NOT NULL,
|
|
431
|
+
created_at TIMESTAMPTZ DEFAULT now(),
|
|
432
|
+
CHECK (
|
|
433
|
+
(target_type = 'agents_md' AND target_path IS NULL)
|
|
434
|
+
OR (target_type IN ('skill', 'agent_definition') AND target_path IS NOT NULL)
|
|
435
|
+
)
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
COMMENT ON TABLE learning_propagations IS 'Completed propagation records (audit trail)';
|
|
439
|
+
|
|
440
|
+
-- ============================================================================
|
|
441
|
+
-- EVALS (Performance diagnostics)
|
|
442
|
+
-- ============================================================================
|
|
443
|
+
|
|
444
|
+
-- Feature evaluations: Performance snapshots for completed features
|
|
445
|
+
CREATE TABLE feature_evals (
|
|
446
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
447
|
+
feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
|
|
448
|
+
computed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
449
|
+
efficiency_score NUMERIC(5,2) CHECK (efficiency_score >= 0 AND efficiency_score <= 100),
|
|
450
|
+
quality_score NUMERIC(5,2) CHECK (quality_score >= 0 AND quality_score <= 100),
|
|
451
|
+
overall_score NUMERIC(5,2) CHECK (overall_score >= 0 AND overall_score <= 100),
|
|
452
|
+
health_status eval_health NOT NULL,
|
|
453
|
+
efficiency_breakdown JSONB NOT NULL DEFAULT '{}',
|
|
454
|
+
quality_breakdown JSONB NOT NULL DEFAULT '{}',
|
|
455
|
+
learning_metrics JSONB NOT NULL DEFAULT '{}',
|
|
456
|
+
raw_metrics JSONB NOT NULL DEFAULT '{}'
|
|
457
|
+
);
|
|
458
|
+
|
|
459
|
+
COMMENT ON TABLE feature_evals IS 'Performance evaluation snapshots for features';
|
|
460
|
+
|
|
461
|
+
-- System health evaluations: Periodic system-wide health
|
|
462
|
+
CREATE TABLE system_health_evals (
|
|
463
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
464
|
+
computed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
465
|
+
period_days INTEGER NOT NULL CHECK (period_days IN (7, 30, 90)),
|
|
466
|
+
overall_health_score NUMERIC(5,2) NOT NULL CHECK (overall_health_score >= 0 AND overall_health_score <= 100),
|
|
467
|
+
health_status eval_health NOT NULL,
|
|
468
|
+
workflow_metrics JSONB NOT NULL DEFAULT '{}',
|
|
469
|
+
quality_metrics JSONB NOT NULL DEFAULT '{}',
|
|
470
|
+
learning_metrics JSONB NOT NULL DEFAULT '{}',
|
|
471
|
+
alerts JSONB NOT NULL DEFAULT '[]'
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
COMMENT ON TABLE system_health_evals IS 'Periodic system-wide health snapshots';
|
|
475
|
+
|
|
476
|
+
-- Agent evaluations: Agent performance by time period
|
|
477
|
+
CREATE TABLE agent_evals (
|
|
478
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
479
|
+
agent_name VARCHAR(50) NOT NULL,
|
|
480
|
+
period_start TIMESTAMPTZ NOT NULL,
|
|
481
|
+
period_end TIMESTAMPTZ NOT NULL,
|
|
482
|
+
metrics JSONB NOT NULL DEFAULT '{}',
|
|
483
|
+
performance_score NUMERIC(5,2) CHECK (performance_score >= 0 AND performance_score <= 100),
|
|
484
|
+
UNIQUE(agent_name, period_start, period_end)
|
|
485
|
+
);
|
|
486
|
+
|
|
487
|
+
COMMENT ON TABLE agent_evals IS 'Agent performance metrics aggregated by time period';
|
|
488
|
+
|
|
489
|
+
-- Eval alerts: Active alerts from threshold breaches
|
|
490
|
+
CREATE TABLE eval_alerts (
|
|
491
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
492
|
+
severity alert_severity NOT NULL,
|
|
493
|
+
dimension VARCHAR(100) NOT NULL,
|
|
494
|
+
message TEXT NOT NULL,
|
|
495
|
+
current_value NUMERIC NOT NULL,
|
|
496
|
+
threshold NUMERIC NOT NULL,
|
|
497
|
+
source_type VARCHAR(20) NOT NULL CHECK (source_type IN ('feature', 'system', 'agent')),
|
|
498
|
+
source_id UUID,
|
|
499
|
+
feature_id TEXT REFERENCES features(id) ON DELETE SET NULL,
|
|
500
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
501
|
+
acknowledged_at TIMESTAMPTZ,
|
|
502
|
+
acknowledged_by VARCHAR(100),
|
|
503
|
+
resolved_at TIMESTAMPTZ,
|
|
504
|
+
resolved_by VARCHAR(100),
|
|
505
|
+
resolution_notes TEXT
|
|
506
|
+
);
|
|
507
|
+
|
|
508
|
+
COMMENT ON TABLE eval_alerts IS 'Active alerts from evaluation threshold breaches';
|
|
509
|
+
|
|
510
|
+
-- ============================================================================
|
|
511
|
+
-- BATCH EXECUTION (Code mode analytics)
|
|
512
|
+
-- ============================================================================
|
|
513
|
+
|
|
514
|
+
-- Batch executions: Analytics log for batch script runs
|
|
515
|
+
CREATE TABLE batch_executions (
|
|
516
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
517
|
+
script_name VARCHAR(100),
|
|
518
|
+
script_hash VARCHAR(64),
|
|
519
|
+
template_used VARCHAR(100),
|
|
520
|
+
total_steps INTEGER NOT NULL,
|
|
521
|
+
completed_steps INTEGER NOT NULL,
|
|
522
|
+
success BOOLEAN NOT NULL,
|
|
523
|
+
failed_step INTEGER,
|
|
524
|
+
error_message TEXT,
|
|
525
|
+
duration_ms INTEGER,
|
|
526
|
+
feature_id TEXT REFERENCES features(id) ON DELETE SET NULL,
|
|
527
|
+
agent_name VARCHAR(100),
|
|
528
|
+
executed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
529
|
+
script_json JSONB,
|
|
530
|
+
results_json JSONB
|
|
531
|
+
);
|
|
532
|
+
|
|
533
|
+
COMMENT ON TABLE batch_executions IS 'Analytics log for batch script executions';
|
|
534
|
+
|
|
535
|
+
-- Batch templates: Pre-defined batch scripts
|
|
536
|
+
CREATE TABLE batch_templates (
|
|
537
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
538
|
+
name VARCHAR(100) NOT NULL UNIQUE,
|
|
539
|
+
description TEXT NOT NULL,
|
|
540
|
+
version VARCHAR(20) NOT NULL DEFAULT '1.0.0',
|
|
541
|
+
params JSONB NOT NULL DEFAULT '[]',
|
|
542
|
+
steps JSONB NOT NULL,
|
|
543
|
+
output_config JSONB NOT NULL DEFAULT '{}',
|
|
544
|
+
usage_count INTEGER NOT NULL DEFAULT 0,
|
|
545
|
+
last_used_at TIMESTAMPTZ,
|
|
546
|
+
avg_duration_ms NUMERIC,
|
|
547
|
+
success_rate NUMERIC(5,2),
|
|
548
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
549
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
550
|
+
created_by VARCHAR(100),
|
|
551
|
+
is_active BOOLEAN NOT NULL DEFAULT true
|
|
552
|
+
);
|
|
553
|
+
|
|
554
|
+
COMMENT ON TABLE batch_templates IS 'Pre-defined batch script templates';
|
|
555
|
+
|
|
556
|
+
-- ============================================================================
|
|
557
|
+
-- INDEXES
|
|
558
|
+
-- ============================================================================
|
|
559
|
+
|
|
560
|
+
-- Features
|
|
561
|
+
CREATE INDEX idx_features_status ON features(status);
|
|
562
|
+
CREATE INDEX idx_features_phase ON features(current_phase);
|
|
563
|
+
CREATE INDEX idx_features_epic ON features(epic_id) WHERE epic_id IS NOT NULL;
|
|
564
|
+
CREATE INDEX idx_features_created ON features(created_at DESC);
|
|
565
|
+
|
|
566
|
+
-- Phase transitions
|
|
567
|
+
CREATE INDEX idx_phase_transitions_feature ON phase_transitions(feature_id, transitioned_at DESC);
|
|
568
|
+
CREATE INDEX idx_phase_transitions_type ON phase_transitions(transition_type);
|
|
569
|
+
|
|
570
|
+
-- Quality gates
|
|
571
|
+
CREATE INDEX idx_quality_gates_feature ON quality_gates(feature_id);
|
|
572
|
+
CREATE INDEX idx_quality_gates_status ON quality_gates(status);
|
|
573
|
+
|
|
574
|
+
-- Blockers
|
|
575
|
+
CREATE INDEX idx_blockers_feature ON blockers(feature_id);
|
|
576
|
+
CREATE INDEX idx_blockers_status ON blockers(status);
|
|
577
|
+
CREATE INDEX idx_blockers_severity ON blockers(severity);
|
|
578
|
+
|
|
579
|
+
-- Work in progress
|
|
580
|
+
CREATE INDEX idx_wip_feature ON work_in_progress(feature_id);
|
|
581
|
+
CREATE INDEX idx_wip_locked_by ON work_in_progress(locked_by);
|
|
582
|
+
|
|
583
|
+
-- Conflict detection
|
|
584
|
+
CREATE INDEX idx_conflicts_features ON conflict_detection(feature_a_id, feature_b_id);
|
|
585
|
+
CREATE INDEX idx_conflicts_risk ON conflict_detection(conflict_risk);
|
|
586
|
+
CREATE INDEX idx_conflicts_status ON conflict_detection(status);
|
|
587
|
+
|
|
588
|
+
-- Iteration tracking
|
|
589
|
+
CREATE INDEX idx_iteration_feature ON iteration_tracking(feature_id, iteration_number);
|
|
590
|
+
|
|
591
|
+
-- Audit log
|
|
592
|
+
CREATE INDEX idx_audit_feature ON audit_log(feature_id, timestamp DESC);
|
|
593
|
+
CREATE INDEX idx_audit_timestamp ON audit_log(timestamp DESC);
|
|
594
|
+
CREATE INDEX idx_audit_operation ON audit_log(operation);
|
|
595
|
+
|
|
596
|
+
-- Agent invocations
|
|
597
|
+
CREATE INDEX idx_agent_invocations_feature ON agent_invocations(feature_id);
|
|
598
|
+
CREATE INDEX idx_agent_invocations_agent ON agent_invocations(agent_name);
|
|
599
|
+
CREATE INDEX idx_agent_invocations_phase ON agent_invocations(feature_id, phase);
|
|
600
|
+
|
|
601
|
+
-- Feature commits
|
|
602
|
+
CREATE INDEX idx_feature_commits_feature_id ON feature_commits(feature_id);
|
|
603
|
+
CREATE INDEX idx_feature_commits_phase ON feature_commits(feature_id, phase);
|
|
604
|
+
|
|
605
|
+
-- Phase outputs
|
|
606
|
+
CREATE UNIQUE INDEX idx_phase_outputs_unique ON phase_outputs(feature_id, phase, output_type);
|
|
607
|
+
CREATE INDEX idx_phase_outputs_feature ON phase_outputs(feature_id);
|
|
608
|
+
|
|
609
|
+
-- Memories
|
|
610
|
+
CREATE INDEX idx_memories_feature ON memories(feature_id);
|
|
611
|
+
CREATE INDEX idx_memories_category ON memories(category);
|
|
612
|
+
CREATE INDEX idx_memories_importance ON memories(importance);
|
|
613
|
+
CREATE INDEX idx_memories_created ON memories(created_at DESC);
|
|
614
|
+
CREATE INDEX idx_memories_active ON memories(is_archived) WHERE is_archived = false;
|
|
615
|
+
CREATE INDEX idx_memories_category_importance ON memories(category, importance) WHERE is_archived = false;
|
|
616
|
+
CREATE INDEX idx_memories_tags ON memories USING gin(tags);
|
|
617
|
+
CREATE INDEX idx_memories_search ON memories USING gin(search_vector);
|
|
618
|
+
|
|
619
|
+
-- Feature archives
|
|
620
|
+
CREATE INDEX idx_feature_archives_feature_id ON feature_archives(feature_id);
|
|
621
|
+
CREATE INDEX idx_feature_archives_archived_at ON feature_archives(archived_at DESC);
|
|
622
|
+
CREATE INDEX idx_feature_archives_release_version ON feature_archives(release_version);
|
|
623
|
+
CREATE INDEX idx_feature_archives_search ON feature_archives USING gin(search_vector);
|
|
624
|
+
|
|
625
|
+
-- Learnings
|
|
626
|
+
CREATE INDEX idx_learnings_feature ON learnings(feature_id) WHERE feature_id IS NOT NULL;
|
|
627
|
+
CREATE INDEX idx_learnings_predecessor ON learnings(predecessor_id) WHERE predecessor_id IS NOT NULL;
|
|
628
|
+
CREATE INDEX idx_learnings_category ON learnings(category);
|
|
629
|
+
CREATE INDEX idx_learnings_confidence ON learnings(confidence_score DESC) WHERE NOT is_superseded;
|
|
630
|
+
CREATE INDEX idx_learnings_active ON learnings(created_at DESC) WHERE NOT is_superseded;
|
|
631
|
+
CREATE INDEX idx_learnings_importance ON learnings(importance);
|
|
632
|
+
CREATE INDEX idx_learnings_superseded_by ON learnings(superseded_by) WHERE superseded_by IS NOT NULL;
|
|
633
|
+
CREATE INDEX idx_learnings_propagation_queue ON learnings(confidence_score DESC)
|
|
634
|
+
WHERE confidence_score >= 0.80 AND array_length(propagated_to, 1) IS NULL AND NOT is_superseded;
|
|
635
|
+
CREATE INDEX idx_learnings_tags ON learnings USING gin(tags);
|
|
636
|
+
CREATE INDEX idx_learnings_search ON learnings USING gin(search_vector);
|
|
637
|
+
|
|
638
|
+
-- Learning conflicts
|
|
639
|
+
CREATE INDEX idx_learning_conflicts_learning_a ON learning_conflicts(learning_a_id);
|
|
640
|
+
CREATE INDEX idx_learning_conflicts_learning_b ON learning_conflicts(learning_b_id);
|
|
641
|
+
CREATE INDEX idx_learning_conflicts_status ON learning_conflicts(status);
|
|
642
|
+
|
|
643
|
+
-- Learning propagation targets (partial unique indexes for NULL-safe dedup)
|
|
644
|
+
CREATE UNIQUE INDEX idx_lpt_unique_agents_md ON learning_propagation_targets(learning_id)
|
|
645
|
+
WHERE target_type = 'agents_md';
|
|
646
|
+
CREATE UNIQUE INDEX idx_lpt_unique_skill_agent ON learning_propagation_targets(learning_id, target_type, target_path)
|
|
647
|
+
WHERE target_type IN ('skill', 'agent_definition');
|
|
648
|
+
CREATE INDEX idx_lpt_learning_id ON learning_propagation_targets(learning_id);
|
|
649
|
+
CREATE INDEX idx_lpt_target ON learning_propagation_targets(target_type, target_path);
|
|
650
|
+
|
|
651
|
+
-- Learning propagations (partial unique indexes)
|
|
652
|
+
CREATE UNIQUE INDEX idx_lp_unique_agents_md ON learning_propagations(learning_id)
|
|
653
|
+
WHERE target_type = 'agents_md';
|
|
654
|
+
CREATE UNIQUE INDEX idx_lp_unique_skill_agent ON learning_propagations(learning_id, target_type, target_path)
|
|
655
|
+
WHERE target_type IN ('skill', 'agent_definition');
|
|
656
|
+
CREATE INDEX idx_lp_learning_id ON learning_propagations(learning_id);
|
|
657
|
+
CREATE INDEX idx_lp_target ON learning_propagations(target_type, target_path);
|
|
658
|
+
|
|
659
|
+
-- Feature evals
|
|
660
|
+
CREATE INDEX idx_feature_evals_feature ON feature_evals(feature_id);
|
|
661
|
+
CREATE INDEX idx_feature_evals_computed ON feature_evals(computed_at DESC);
|
|
662
|
+
CREATE INDEX idx_feature_evals_health ON feature_evals(health_status);
|
|
663
|
+
|
|
664
|
+
-- System health
|
|
665
|
+
CREATE INDEX idx_system_health_computed ON system_health_evals(computed_at DESC);
|
|
666
|
+
CREATE INDEX idx_system_health_period ON system_health_evals(period_days, computed_at DESC);
|
|
667
|
+
CREATE INDEX idx_system_health_status ON system_health_evals(health_status);
|
|
668
|
+
|
|
669
|
+
-- Agent evals
|
|
670
|
+
CREATE INDEX idx_agent_evals_agent ON agent_evals(agent_name);
|
|
671
|
+
CREATE INDEX idx_agent_evals_period ON agent_evals(period_end DESC);
|
|
672
|
+
|
|
673
|
+
-- Eval alerts
|
|
674
|
+
CREATE INDEX idx_eval_alerts_active ON eval_alerts(created_at DESC) WHERE resolved_at IS NULL;
|
|
675
|
+
CREATE INDEX idx_eval_alerts_severity ON eval_alerts(severity) WHERE resolved_at IS NULL;
|
|
676
|
+
CREATE INDEX idx_eval_alerts_feature ON eval_alerts(feature_id) WHERE feature_id IS NOT NULL;
|
|
677
|
+
|
|
678
|
+
-- Batch executions
|
|
679
|
+
CREATE INDEX idx_batch_executions_template ON batch_executions(template_used);
|
|
680
|
+
CREATE INDEX idx_batch_executions_agent ON batch_executions(agent_name);
|
|
681
|
+
CREATE INDEX idx_batch_executions_feature ON batch_executions(feature_id);
|
|
682
|
+
CREATE INDEX idx_batch_executions_time ON batch_executions(executed_at DESC);
|
|
683
|
+
CREATE INDEX idx_batch_executions_success ON batch_executions(success, executed_at DESC);
|
|
684
|
+
|
|
685
|
+
-- Batch templates
|
|
686
|
+
CREATE INDEX idx_batch_templates_name ON batch_templates(name);
|
|
687
|
+
CREATE INDEX idx_batch_templates_active ON batch_templates(is_active, usage_count DESC);
|
|
688
|
+
|
|
689
|
+
-- ============================================================================
|
|
690
|
+
-- ROW LEVEL SECURITY
|
|
691
|
+
-- ============================================================================
|
|
692
|
+
|
|
693
|
+
ALTER TABLE features ENABLE ROW LEVEL SECURITY;
|
|
694
|
+
ALTER TABLE phase_transitions ENABLE ROW LEVEL SECURITY;
|
|
695
|
+
ALTER TABLE quality_gates ENABLE ROW LEVEL SECURITY;
|
|
696
|
+
ALTER TABLE blockers ENABLE ROW LEVEL SECURITY;
|
|
697
|
+
ALTER TABLE work_in_progress ENABLE ROW LEVEL SECURITY;
|
|
698
|
+
ALTER TABLE conflict_detection ENABLE ROW LEVEL SECURITY;
|
|
699
|
+
ALTER TABLE iteration_tracking ENABLE ROW LEVEL SECURITY;
|
|
700
|
+
ALTER TABLE audit_log ENABLE ROW LEVEL SECURITY;
|
|
701
|
+
ALTER TABLE agent_invocations ENABLE ROW LEVEL SECURITY;
|
|
702
|
+
ALTER TABLE feature_commits ENABLE ROW LEVEL SECURITY;
|
|
703
|
+
ALTER TABLE phase_outputs ENABLE ROW LEVEL SECURITY;
|
|
704
|
+
ALTER TABLE memories ENABLE ROW LEVEL SECURITY;
|
|
705
|
+
ALTER TABLE feature_archives ENABLE ROW LEVEL SECURITY;
|
|
706
|
+
ALTER TABLE learnings ENABLE ROW LEVEL SECURITY;
|
|
707
|
+
ALTER TABLE learning_conflicts ENABLE ROW LEVEL SECURITY;
|
|
708
|
+
ALTER TABLE learning_propagation_targets ENABLE ROW LEVEL SECURITY;
|
|
709
|
+
ALTER TABLE learning_propagations ENABLE ROW LEVEL SECURITY;
|
|
710
|
+
ALTER TABLE feature_evals ENABLE ROW LEVEL SECURITY;
|
|
711
|
+
ALTER TABLE system_health_evals ENABLE ROW LEVEL SECURITY;
|
|
712
|
+
ALTER TABLE agent_evals ENABLE ROW LEVEL SECURITY;
|
|
713
|
+
ALTER TABLE eval_alerts ENABLE ROW LEVEL SECURITY;
|
|
714
|
+
ALTER TABLE batch_executions ENABLE ROW LEVEL SECURITY;
|
|
715
|
+
ALTER TABLE batch_templates ENABLE ROW LEVEL SECURITY;
|
|
716
|
+
|
|
717
|
+
-- Service role policies (full access for API)
|
|
718
|
+
CREATE POLICY "Service role full access on features" ON features FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
719
|
+
CREATE POLICY "Service role full access on phase_transitions" ON phase_transitions FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
720
|
+
CREATE POLICY "Service role full access on quality_gates" ON quality_gates FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
721
|
+
CREATE POLICY "Service role full access on blockers" ON blockers FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
722
|
+
CREATE POLICY "Service role full access on work_in_progress" ON work_in_progress FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
723
|
+
CREATE POLICY "Service role full access on conflict_detection" ON conflict_detection FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
724
|
+
CREATE POLICY "Service role full access on iteration_tracking" ON iteration_tracking FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
725
|
+
CREATE POLICY "Service role full access on audit_log" ON audit_log FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
726
|
+
CREATE POLICY "Service role full access on agent_invocations" ON agent_invocations FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
727
|
+
CREATE POLICY "Service role full access on feature_commits" ON feature_commits FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
728
|
+
CREATE POLICY "Service role full access on phase_outputs" ON phase_outputs FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
729
|
+
CREATE POLICY "Service role full access on memories" ON memories FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
730
|
+
CREATE POLICY "Service role full access on feature_archives" ON feature_archives FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
731
|
+
CREATE POLICY "Service role full access on learnings" ON learnings FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
732
|
+
CREATE POLICY "Service role full access on learning_conflicts" ON learning_conflicts FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
733
|
+
CREATE POLICY "Service role full access on learning_propagation_targets" ON learning_propagation_targets FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
734
|
+
CREATE POLICY "Service role full access on learning_propagations" ON learning_propagations FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
735
|
+
CREATE POLICY "Service role full access on feature_evals" ON feature_evals FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
736
|
+
CREATE POLICY "Service role full access on system_health_evals" ON system_health_evals FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
737
|
+
CREATE POLICY "Service role full access on agent_evals" ON agent_evals FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
738
|
+
CREATE POLICY "Service role full access on eval_alerts" ON eval_alerts FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
739
|
+
CREATE POLICY "Service role full access on batch_executions" ON batch_executions FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
740
|
+
CREATE POLICY "Service role full access on batch_templates" ON batch_templates FOR ALL TO service_role USING (true) WITH CHECK (true);
|
|
741
|
+
|
|
742
|
+
-- ============================================================================
|
|
743
|
+
-- TRIGGER FUNCTIONS
|
|
744
|
+
-- ============================================================================
|
|
745
|
+
|
|
746
|
+
-- Generic updated_at trigger function (used by features, memories)
|
|
747
|
+
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
748
|
+
RETURNS TRIGGER AS $$
|
|
749
|
+
BEGIN
|
|
750
|
+
NEW.updated_at = NOW();
|
|
751
|
+
RETURN NEW;
|
|
752
|
+
END;
|
|
753
|
+
$$ LANGUAGE plpgsql SET search_path = public;
|
|
754
|
+
|
|
755
|
+
-- Learnings-specific updated_at trigger function
|
|
756
|
+
CREATE OR REPLACE FUNCTION update_learnings_updated_at()
|
|
757
|
+
RETURNS TRIGGER AS $$
|
|
758
|
+
BEGIN
|
|
759
|
+
NEW.updated_at = now();
|
|
760
|
+
RETURN NEW;
|
|
761
|
+
END;
|
|
762
|
+
$$ LANGUAGE plpgsql SET search_path = public;
|
|
763
|
+
|
|
764
|
+
-- Batch templates updated_at trigger function
|
|
765
|
+
CREATE OR REPLACE FUNCTION update_batch_templates_updated_at()
|
|
766
|
+
RETURNS TRIGGER AS $$
|
|
767
|
+
BEGIN
|
|
768
|
+
NEW.updated_at = now();
|
|
769
|
+
RETURN NEW;
|
|
770
|
+
END;
|
|
771
|
+
$$ LANGUAGE plpgsql SET search_path = public;
|
|
772
|
+
|
|
773
|
+
-- ============================================================================
|
|
774
|
+
-- TRIGGERS
|
|
775
|
+
-- ============================================================================
|
|
776
|
+
|
|
777
|
+
CREATE TRIGGER features_updated_at
|
|
778
|
+
BEFORE UPDATE ON features
|
|
779
|
+
FOR EACH ROW
|
|
780
|
+
EXECUTE FUNCTION update_updated_at_column();
|
|
781
|
+
|
|
782
|
+
CREATE TRIGGER memories_updated_at
|
|
783
|
+
BEFORE UPDATE ON memories
|
|
784
|
+
FOR EACH ROW
|
|
785
|
+
EXECUTE FUNCTION update_updated_at_column();
|
|
786
|
+
|
|
787
|
+
CREATE TRIGGER learnings_updated_at
|
|
788
|
+
BEFORE UPDATE ON learnings
|
|
789
|
+
FOR EACH ROW
|
|
790
|
+
EXECUTE FUNCTION update_learnings_updated_at();
|
|
791
|
+
|
|
792
|
+
CREATE TRIGGER batch_templates_updated_at
|
|
793
|
+
BEFORE UPDATE ON batch_templates
|
|
794
|
+
FOR EACH ROW
|
|
795
|
+
EXECUTE FUNCTION update_batch_templates_updated_at();
|