@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.
Files changed (219) hide show
  1. package/README.md +306 -0
  2. package/dist/adapters/archive/supabase.d.ts +19 -0
  3. package/dist/adapters/archive/supabase.d.ts.map +1 -0
  4. package/dist/adapters/archive/supabase.js +121 -0
  5. package/dist/adapters/archive/supabase.js.map +1 -0
  6. package/dist/adapters/archive/types.d.ts +26 -0
  7. package/dist/adapters/archive/types.d.ts.map +1 -0
  8. package/dist/adapters/archive/types.js +6 -0
  9. package/dist/adapters/archive/types.js.map +1 -0
  10. package/dist/adapters/formal-verification/tla-precheck.d.ts +22 -0
  11. package/dist/adapters/formal-verification/tla-precheck.d.ts.map +1 -0
  12. package/dist/adapters/formal-verification/tla-precheck.js +270 -0
  13. package/dist/adapters/formal-verification/tla-precheck.js.map +1 -0
  14. package/dist/adapters/formal-verification/types.d.ts +37 -0
  15. package/dist/adapters/formal-verification/types.d.ts.map +1 -0
  16. package/dist/adapters/formal-verification/types.js +6 -0
  17. package/dist/adapters/formal-verification/types.js.map +1 -0
  18. package/dist/adapters/review/semgrep.d.ts +12 -0
  19. package/dist/adapters/review/semgrep.d.ts.map +1 -0
  20. package/dist/adapters/review/semgrep.js +175 -0
  21. package/dist/adapters/review/semgrep.js.map +1 -0
  22. package/dist/adapters/review/types.d.ts +14 -0
  23. package/dist/adapters/review/types.d.ts.map +1 -0
  24. package/dist/adapters/review/types.js +6 -0
  25. package/dist/adapters/review/types.js.map +1 -0
  26. package/dist/adapters/skills/filesystem.d.ts +18 -0
  27. package/dist/adapters/skills/filesystem.d.ts.map +1 -0
  28. package/dist/adapters/skills/filesystem.js +398 -0
  29. package/dist/adapters/skills/filesystem.js.map +1 -0
  30. package/dist/adapters/skills/types.d.ts +19 -0
  31. package/dist/adapters/skills/types.d.ts.map +1 -0
  32. package/dist/adapters/skills/types.js +6 -0
  33. package/dist/adapters/skills/types.js.map +1 -0
  34. package/dist/adapters/sql-executor/direct-postgres.d.ts +15 -0
  35. package/dist/adapters/sql-executor/direct-postgres.d.ts.map +1 -0
  36. package/dist/adapters/sql-executor/direct-postgres.js +33 -0
  37. package/dist/adapters/sql-executor/direct-postgres.js.map +1 -0
  38. package/dist/adapters/sql-executor/supabase-management-api.d.ts +17 -0
  39. package/dist/adapters/sql-executor/supabase-management-api.d.ts.map +1 -0
  40. package/dist/adapters/sql-executor/supabase-management-api.js +40 -0
  41. package/dist/adapters/sql-executor/supabase-management-api.js.map +1 -0
  42. package/dist/adapters/sql-executor/types.d.ts +15 -0
  43. package/dist/adapters/sql-executor/types.d.ts.map +1 -0
  44. package/dist/adapters/sql-executor/types.js +6 -0
  45. package/dist/adapters/sql-executor/types.js.map +1 -0
  46. package/dist/adapters/workflow-state/in-memory.d.ts +69 -0
  47. package/dist/adapters/workflow-state/in-memory.d.ts.map +1 -0
  48. package/dist/adapters/workflow-state/in-memory.js +444 -0
  49. package/dist/adapters/workflow-state/in-memory.js.map +1 -0
  50. package/dist/adapters/workflow-state/supabase.d.ts +55 -0
  51. package/dist/adapters/workflow-state/supabase.d.ts.map +1 -0
  52. package/dist/adapters/workflow-state/supabase.js +823 -0
  53. package/dist/adapters/workflow-state/supabase.js.map +1 -0
  54. package/dist/adapters/workflow-state/types.d.ts +55 -0
  55. package/dist/adapters/workflow-state/types.d.ts.map +1 -0
  56. package/dist/adapters/workflow-state/types.js +6 -0
  57. package/dist/adapters/workflow-state/types.js.map +1 -0
  58. package/dist/cli.d.ts +3 -0
  59. package/dist/cli.d.ts.map +1 -0
  60. package/dist/cli.js +52 -0
  61. package/dist/cli.js.map +1 -0
  62. package/dist/config.d.ts +44 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +115 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/domain/actors.d.ts +10 -0
  67. package/dist/domain/actors.d.ts.map +1 -0
  68. package/dist/domain/actors.js +60 -0
  69. package/dist/domain/actors.js.map +1 -0
  70. package/dist/domain/development-evals.d.ts +9 -0
  71. package/dist/domain/development-evals.d.ts.map +1 -0
  72. package/dist/domain/development-evals.js +164 -0
  73. package/dist/domain/development-evals.js.map +1 -0
  74. package/dist/domain/matching.d.ts +8 -0
  75. package/dist/domain/matching.d.ts.map +1 -0
  76. package/dist/domain/matching.js +24 -0
  77. package/dist/domain/matching.js.map +1 -0
  78. package/dist/domain/phases.d.ts +10 -0
  79. package/dist/domain/phases.d.ts.map +1 -0
  80. package/dist/domain/phases.js +165 -0
  81. package/dist/domain/phases.js.map +1 -0
  82. package/dist/domain/quality-gates.d.ts +7 -0
  83. package/dist/domain/quality-gates.d.ts.map +1 -0
  84. package/dist/domain/quality-gates.js +8 -0
  85. package/dist/domain/quality-gates.js.map +1 -0
  86. package/dist/domain/resonance.d.ts +33 -0
  87. package/dist/domain/resonance.d.ts.map +1 -0
  88. package/dist/domain/resonance.js +100 -0
  89. package/dist/domain/resonance.js.map +1 -0
  90. package/dist/domain/tasks.d.ts +9 -0
  91. package/dist/domain/tasks.d.ts.map +1 -0
  92. package/dist/domain/tasks.js +57 -0
  93. package/dist/domain/tasks.js.map +1 -0
  94. package/dist/init.d.ts +7 -0
  95. package/dist/init.d.ts.map +1 -0
  96. package/dist/init.js +387 -0
  97. package/dist/init.js.map +1 -0
  98. package/dist/schemas.d.ts +366 -0
  99. package/dist/schemas.d.ts.map +1 -0
  100. package/dist/schemas.js +184 -0
  101. package/dist/schemas.js.map +1 -0
  102. package/dist/server.d.ts +7 -0
  103. package/dist/server.d.ts.map +1 -0
  104. package/dist/server.js +243 -0
  105. package/dist/server.js.map +1 -0
  106. package/dist/tools/apply-migrations.d.ts +21 -0
  107. package/dist/tools/apply-migrations.d.ts.map +1 -0
  108. package/dist/tools/apply-migrations.js +286 -0
  109. package/dist/tools/apply-migrations.js.map +1 -0
  110. package/dist/tools/archive-feature-release.d.ts +13 -0
  111. package/dist/tools/archive-feature-release.d.ts.map +1 -0
  112. package/dist/tools/archive-feature-release.js +182 -0
  113. package/dist/tools/archive-feature-release.js.map +1 -0
  114. package/dist/tools/capture-learning.d.ts +9 -0
  115. package/dist/tools/capture-learning.d.ts.map +1 -0
  116. package/dist/tools/capture-learning.js +53 -0
  117. package/dist/tools/capture-learning.js.map +1 -0
  118. package/dist/tools/explore-knowledge.d.ts +9 -0
  119. package/dist/tools/explore-knowledge.d.ts.map +1 -0
  120. package/dist/tools/explore-knowledge.js +142 -0
  121. package/dist/tools/explore-knowledge.js.map +1 -0
  122. package/dist/tools/get-claims-needing-review.d.ts +8 -0
  123. package/dist/tools/get-claims-needing-review.d.ts.map +1 -0
  124. package/dist/tools/get-claims-needing-review.js +21 -0
  125. package/dist/tools/get-claims-needing-review.js.map +1 -0
  126. package/dist/tools/get-development-eval-status.d.ts +8 -0
  127. package/dist/tools/get-development-eval-status.d.ts.map +1 -0
  128. package/dist/tools/get-development-eval-status.js +49 -0
  129. package/dist/tools/get-development-eval-status.js.map +1 -0
  130. package/dist/tools/get-feature-status.d.ts +8 -0
  131. package/dist/tools/get-feature-status.d.ts.map +1 -0
  132. package/dist/tools/get-feature-status.js +68 -0
  133. package/dist/tools/get-feature-status.js.map +1 -0
  134. package/dist/tools/get-next-phase.d.ts +8 -0
  135. package/dist/tools/get-next-phase.d.ts.map +1 -0
  136. package/dist/tools/get-next-phase.js +26 -0
  137. package/dist/tools/get-next-phase.js.map +1 -0
  138. package/dist/tools/prepare-phase-context.d.ts +9 -0
  139. package/dist/tools/prepare-phase-context.d.ts.map +1 -0
  140. package/dist/tools/prepare-phase-context.js +151 -0
  141. package/dist/tools/prepare-phase-context.js.map +1 -0
  142. package/dist/tools/record-commit.d.ts +8 -0
  143. package/dist/tools/record-commit.d.ts.map +1 -0
  144. package/dist/tools/record-commit.js +28 -0
  145. package/dist/tools/record-commit.js.map +1 -0
  146. package/dist/tools/record-eval-plan.d.ts +8 -0
  147. package/dist/tools/record-eval-plan.d.ts.map +1 -0
  148. package/dist/tools/record-eval-plan.js +40 -0
  149. package/dist/tools/record-eval-plan.js.map +1 -0
  150. package/dist/tools/record-eval-run.d.ts +8 -0
  151. package/dist/tools/record-eval-run.d.ts.map +1 -0
  152. package/dist/tools/record-eval-run.js +42 -0
  153. package/dist/tools/record-eval-run.js.map +1 -0
  154. package/dist/tools/record-merge.d.ts +8 -0
  155. package/dist/tools/record-merge.d.ts.map +1 -0
  156. package/dist/tools/record-merge.js +16 -0
  157. package/dist/tools/record-merge.js.map +1 -0
  158. package/dist/tools/record-phase-artifact.d.ts +8 -0
  159. package/dist/tools/record-phase-artifact.d.ts.map +1 -0
  160. package/dist/tools/record-phase-artifact.js +26 -0
  161. package/dist/tools/record-phase-artifact.js.map +1 -0
  162. package/dist/tools/record-phase-result.d.ts +9 -0
  163. package/dist/tools/record-phase-result.d.ts.map +1 -0
  164. package/dist/tools/record-phase-result.js +122 -0
  165. package/dist/tools/record-phase-result.js.map +1 -0
  166. package/dist/tools/record-pull-request.d.ts +8 -0
  167. package/dist/tools/record-pull-request.d.ts.map +1 -0
  168. package/dist/tools/record-pull-request.js +16 -0
  169. package/dist/tools/record-pull-request.js.map +1 -0
  170. package/dist/tools/record-quality-gate.d.ts +8 -0
  171. package/dist/tools/record-quality-gate.d.ts.map +1 -0
  172. package/dist/tools/record-quality-gate.js +26 -0
  173. package/dist/tools/record-quality-gate.js.map +1 -0
  174. package/dist/tools/record-watcher-review.d.ts +8 -0
  175. package/dist/tools/record-watcher-review.d.ts.map +1 -0
  176. package/dist/tools/record-watcher-review.js +18 -0
  177. package/dist/tools/record-watcher-review.js.map +1 -0
  178. package/dist/tools/run-policy-checks.d.ts +8 -0
  179. package/dist/tools/run-policy-checks.d.ts.map +1 -0
  180. package/dist/tools/run-policy-checks.js +38 -0
  181. package/dist/tools/run-policy-checks.js.map +1 -0
  182. package/dist/tools/run-review-checks.d.ts +9 -0
  183. package/dist/tools/run-review-checks.d.ts.map +1 -0
  184. package/dist/tools/run-review-checks.js +45 -0
  185. package/dist/tools/run-review-checks.js.map +1 -0
  186. package/dist/tools/start-feature.d.ts +8 -0
  187. package/dist/tools/start-feature.d.ts.map +1 -0
  188. package/dist/tools/start-feature.js +33 -0
  189. package/dist/tools/start-feature.js.map +1 -0
  190. package/dist/tools/submit-claim.d.ts +8 -0
  191. package/dist/tools/submit-claim.d.ts.map +1 -0
  192. package/dist/tools/submit-claim.js +45 -0
  193. package/dist/tools/submit-claim.js.map +1 -0
  194. package/dist/tools/verify-claims.d.ts +8 -0
  195. package/dist/tools/verify-claims.d.ts.map +1 -0
  196. package/dist/tools/verify-claims.js +39 -0
  197. package/dist/tools/verify-claims.js.map +1 -0
  198. package/dist/tools/verify-design.d.ts +8 -0
  199. package/dist/tools/verify-design.d.ts.map +1 -0
  200. package/dist/tools/verify-design.js +31 -0
  201. package/dist/tools/verify-design.js.map +1 -0
  202. package/dist/types.d.ts +333 -0
  203. package/dist/types.d.ts.map +1 -0
  204. package/dist/types.js +52 -0
  205. package/dist/types.js.map +1 -0
  206. package/dist/utils.d.ts +24 -0
  207. package/dist/utils.d.ts.map +1 -0
  208. package/dist/utils.js +50 -0
  209. package/dist/utils.js.map +1 -0
  210. package/migrations/001_schema.sql +795 -0
  211. package/migrations/002_functions.sql +2126 -0
  212. package/migrations/003_views.sql +599 -0
  213. package/migrations/004_seed.sql +106 -0
  214. package/migrations/005_odin_v2_schema.sql +217 -0
  215. package/migrations/006_odin_v2_functions.sql +671 -0
  216. package/migrations/007_odin_v2_phase_alignment.sql +554 -0
  217. package/migrations/008_related_learnings.sql +80 -0
  218. package/migrations/README.md +23 -0
  219. package/package.json +63 -0
@@ -0,0 +1,217 @@
1
+ -- ============================================================================
2
+ -- Odin v2 Schema Extensions
3
+ -- Version: 2.0.0
4
+ -- Created: 2026-03-05
5
+ -- Description: Extends Odin schema for v2 features:
6
+ -- - 11-phase workflow (adds Product and Reviewer phases)
7
+ -- - Agent claims and watcher verification
8
+ -- - Security findings from SAST tools (Semgrep)
9
+ --
10
+ -- Dependencies: Requires 001_schema.sql to be run first
11
+ --
12
+ -- IMPORTANT: DO NOT RUN ON SUPABASE UNTIL READY FOR DEPLOYMENT
13
+ -- ============================================================================
14
+
15
+ -- ============================================================================
16
+ -- PHASE ENUM EXTENSION
17
+ -- ============================================================================
18
+
19
+ -- Add new phase values for 11-phase workflow
20
+ -- Current: 0=Planning, 1=Discovery, 2=Architect, 3=Guardian, 4=Builder,
21
+ -- 5=Integrator, 6=Documenter, 7=Release, 8=Complete
22
+ --
23
+ -- New: 0=Planning, 1=Product, 2=Discovery, 3=Architect, 4=Guardian,
24
+ -- 5=Builder, 6=Reviewer, 7=Integrator, 8=Documenter, 9=Release, 10=Complete
25
+ --
26
+ -- NOTE: PostgreSQL enums cannot be reordered. We add '9' and '10' at the end.
27
+ -- The phase numbers retain their VALUES but the MEANINGS change:
28
+ -- - Old phase 1 (Discovery) -> New phase 2
29
+ -- - Old phase 5 (Integrator) -> New phase 7
30
+ -- - etc.
31
+ --
32
+ -- MIGRATION STRATEGY: Existing features will need phase value remapping.
33
+ -- The follow-up migration 007_odin_v2_phase_alignment.sql handles this.
34
+
35
+ ALTER TYPE phase ADD VALUE IF NOT EXISTS '9';
36
+ ALTER TYPE phase ADD VALUE IF NOT EXISTS '10';
37
+
38
+ -- Update phase comment to reflect new meanings
39
+ COMMENT ON TYPE phase IS 'Workflow phases (v2): 0=Planning, 1=Product, 2=Discovery, 3=Architect, 4=Guardian, 5=Builder, 6=Reviewer, 7=Integrator, 8=Documenter, 9=Release, 10=Complete';
40
+
41
+ -- ============================================================================
42
+ -- NEW ENUMS
43
+ -- ============================================================================
44
+
45
+ -- Claim types emitted by agents
46
+ CREATE TYPE claim_type AS ENUM (
47
+ 'CODE_ADDED',
48
+ 'CODE_MODIFIED',
49
+ 'CODE_DELETED',
50
+ 'TEST_ADDED',
51
+ 'TEST_PASSED',
52
+ 'TEST_FAILED',
53
+ 'BUILD_SUCCEEDED',
54
+ 'BUILD_FAILED',
55
+ 'SECURITY_CHECKED',
56
+ 'SECURITY_FINDING_RESOLVED',
57
+ 'INTEGRATION_VERIFIED',
58
+ 'ARCHIVE_CREATED',
59
+ 'PR_CREATED'
60
+ );
61
+ COMMENT ON TYPE claim_type IS 'Types of claims agents can make about their work';
62
+
63
+ -- Verification status for policy engine and watcher verdicts
64
+ CREATE TYPE verification_status AS ENUM (
65
+ 'PENDING',
66
+ 'PASS',
67
+ 'FAIL',
68
+ 'NEEDS_REVIEW'
69
+ );
70
+ COMMENT ON TYPE verification_status IS 'Status of claim verification: PENDING (not yet checked), PASS (verified), FAIL (verification failed), NEEDS_REVIEW (escalate to LLM watcher)';
71
+
72
+ -- Security finding severity levels
73
+ CREATE TYPE finding_severity AS ENUM (
74
+ 'INFO',
75
+ 'LOW',
76
+ 'MEDIUM',
77
+ 'HIGH',
78
+ 'CRITICAL'
79
+ );
80
+ COMMENT ON TYPE finding_severity IS 'Severity levels for security findings from SAST tools';
81
+
82
+ -- ============================================================================
83
+ -- NEW TABLES: WATCHER SYSTEM
84
+ -- ============================================================================
85
+
86
+ -- Agent claims: structured assertions about work performed
87
+ CREATE TABLE agent_claims (
88
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
89
+ feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
90
+ phase phase NOT NULL,
91
+ agent_name TEXT NOT NULL,
92
+ invocation_id UUID REFERENCES agent_invocations(id) ON DELETE SET NULL,
93
+ claim_type claim_type NOT NULL,
94
+ claim_description TEXT NOT NULL,
95
+ evidence_refs JSONB DEFAULT '{}'::jsonb,
96
+ risk_level TEXT NOT NULL DEFAULT 'LOW' CHECK (risk_level IN ('LOW', 'MEDIUM', 'HIGH')),
97
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
98
+ );
99
+
100
+ COMMENT ON TABLE agent_claims IS 'Structured claims emitted by agents (Builder, Integrator, Release) for verification by Policy Engine and Watchers';
101
+ COMMENT ON COLUMN agent_claims.evidence_refs IS 'JSON object with evidence references: {commit_sha, file_paths, test_output_hash, etc.}';
102
+ COMMENT ON COLUMN agent_claims.risk_level IS 'Risk level determines escalation: HIGH always goes to LLM watcher';
103
+
104
+ CREATE INDEX idx_agent_claims_feature ON agent_claims(feature_id);
105
+ CREATE INDEX idx_agent_claims_phase ON agent_claims(phase);
106
+ CREATE INDEX idx_agent_claims_created ON agent_claims(created_at DESC);
107
+ CREATE INDEX idx_agent_claims_risk ON agent_claims(risk_level) WHERE risk_level = 'HIGH';
108
+
109
+ -- Policy verdicts: deterministic verification results
110
+ CREATE TABLE policy_verdicts (
111
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
112
+ claim_id UUID NOT NULL REFERENCES agent_claims(id) ON DELETE CASCADE,
113
+ verdict verification_status NOT NULL,
114
+ rule_name TEXT NOT NULL,
115
+ reason TEXT,
116
+ evidence_checked JSONB DEFAULT '{}'::jsonb,
117
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
118
+ );
119
+
120
+ COMMENT ON TABLE policy_verdicts IS 'Results from deterministic Policy Engine checks on agent claims';
121
+ COMMENT ON COLUMN policy_verdicts.rule_name IS 'Name of the policy rule that was applied';
122
+ COMMENT ON COLUMN policy_verdicts.evidence_checked IS 'Evidence that was examined during verification';
123
+
124
+ CREATE INDEX idx_policy_verdicts_claim ON policy_verdicts(claim_id);
125
+ CREATE INDEX idx_policy_verdicts_verdict ON policy_verdicts(verdict);
126
+ CREATE INDEX idx_policy_verdicts_needs_review ON policy_verdicts(claim_id) WHERE verdict = 'NEEDS_REVIEW';
127
+
128
+ -- Watcher reviews: LLM-based escalation results
129
+ CREATE TABLE watcher_reviews (
130
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
131
+ claim_id UUID NOT NULL REFERENCES agent_claims(id) ON DELETE CASCADE,
132
+ verdict verification_status NOT NULL,
133
+ confidence DECIMAL(3,2) CHECK (confidence >= 0 AND confidence <= 1),
134
+ reasoning TEXT NOT NULL,
135
+ watcher_agent TEXT NOT NULL,
136
+ reviewed_at TIMESTAMPTZ NOT NULL DEFAULT now()
137
+ );
138
+
139
+ COMMENT ON TABLE watcher_reviews IS 'Results from LLM Watcher reviews on escalated claims';
140
+ COMMENT ON COLUMN watcher_reviews.confidence IS 'Confidence score from 0.00 to 1.00';
141
+ COMMENT ON COLUMN watcher_reviews.reasoning IS 'Explanation of the watcher verdict';
142
+ COMMENT ON COLUMN watcher_reviews.watcher_agent IS 'Name of the watcher agent that performed the review';
143
+
144
+ CREATE INDEX idx_watcher_reviews_claim ON watcher_reviews(claim_id);
145
+ CREATE INDEX idx_watcher_reviews_verdict ON watcher_reviews(verdict);
146
+ CREATE INDEX idx_watcher_reviews_date ON watcher_reviews(reviewed_at DESC);
147
+
148
+ -- ============================================================================
149
+ -- NEW TABLES: SECURITY FINDINGS
150
+ -- ============================================================================
151
+
152
+ -- Security findings: results from SAST tools (Semgrep, etc.)
153
+ CREATE TABLE security_findings (
154
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
155
+ feature_id TEXT NOT NULL REFERENCES features(id) ON DELETE CASCADE,
156
+ phase phase NOT NULL DEFAULT '6', -- Reviewer phase
157
+ tool TEXT NOT NULL,
158
+ rule_id TEXT,
159
+ severity finding_severity NOT NULL,
160
+ file_path TEXT,
161
+ line_number INTEGER,
162
+ column_number INTEGER,
163
+ end_line INTEGER,
164
+ end_column INTEGER,
165
+ message TEXT NOT NULL,
166
+ snippet TEXT,
167
+ fix_suggestion TEXT,
168
+ resolved BOOLEAN NOT NULL DEFAULT false,
169
+ resolved_by TEXT,
170
+ resolved_at TIMESTAMPTZ,
171
+ resolution_note TEXT,
172
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
173
+ );
174
+
175
+ COMMENT ON TABLE security_findings IS 'Security findings from SAST tools (Semgrep). HIGH/CRITICAL block progression to Integrator.';
176
+ COMMENT ON COLUMN security_findings.tool IS 'SAST tool that generated the finding (e.g., semgrep, bandit)';
177
+ COMMENT ON COLUMN security_findings.rule_id IS 'Identifier of the security rule that triggered';
178
+ COMMENT ON COLUMN security_findings.snippet IS 'Code snippet showing the vulnerable code';
179
+ COMMENT ON COLUMN security_findings.fix_suggestion IS 'Suggested fix from the SAST tool (if available)';
180
+
181
+ CREATE INDEX idx_security_findings_feature ON security_findings(feature_id);
182
+ CREATE INDEX idx_security_findings_severity ON security_findings(severity);
183
+ CREATE INDEX idx_security_findings_resolved ON security_findings(resolved);
184
+ CREATE INDEX idx_security_findings_blocking ON security_findings(feature_id)
185
+ WHERE resolved = false AND severity IN ('HIGH', 'CRITICAL');
186
+ CREATE INDEX idx_security_findings_tool ON security_findings(tool);
187
+
188
+ -- ============================================================================
189
+ -- ROW LEVEL SECURITY
190
+ -- ============================================================================
191
+
192
+ ALTER TABLE agent_claims ENABLE ROW LEVEL SECURITY;
193
+ CREATE POLICY "Service role full access on agent_claims"
194
+ ON agent_claims FOR ALL TO service_role USING (true) WITH CHECK (true);
195
+
196
+ ALTER TABLE policy_verdicts ENABLE ROW LEVEL SECURITY;
197
+ CREATE POLICY "Service role full access on policy_verdicts"
198
+ ON policy_verdicts FOR ALL TO service_role USING (true) WITH CHECK (true);
199
+
200
+ ALTER TABLE watcher_reviews ENABLE ROW LEVEL SECURITY;
201
+ CREATE POLICY "Service role full access on watcher_reviews"
202
+ ON watcher_reviews FOR ALL TO service_role USING (true) WITH CHECK (true);
203
+
204
+ ALTER TABLE security_findings ENABLE ROW LEVEL SECURITY;
205
+ CREATE POLICY "Service role full access on security_findings"
206
+ ON security_findings FOR ALL TO service_role USING (true) WITH CHECK (true);
207
+
208
+ -- ============================================================================
209
+ -- AUDIT LOG SUPPORT
210
+ -- ============================================================================
211
+
212
+ -- Add claim-related operations to audit log (uses existing audit_log table)
213
+ -- These will be logged via functions, not triggers, to maintain control
214
+
215
+ -- ============================================================================
216
+ -- END OF SCHEMA
217
+ -- ============================================================================