@su-record/vibe 2.7.18 → 2.7.20

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 (345) hide show
  1. package/.env.example +37 -37
  2. package/CLAUDE.md +153 -153
  3. package/LICENSE +21 -21
  4. package/README.md +451 -449
  5. package/agents/architect-low.md +41 -41
  6. package/agents/architect-medium.md +59 -59
  7. package/agents/architect.md +80 -80
  8. package/agents/build-error-resolver.md +115 -115
  9. package/agents/compounder.md +261 -261
  10. package/agents/diagrammer.md +178 -178
  11. package/agents/docs/api-documenter.md +99 -99
  12. package/agents/docs/changelog-writer.md +93 -93
  13. package/agents/e2e-tester.md +294 -294
  14. package/agents/event/event-comms.md +78 -0
  15. package/agents/event/event-content.md +68 -0
  16. package/agents/event/event-image.md +95 -0
  17. package/agents/event/event-ops.md +84 -0
  18. package/agents/event/event-scheduler.md +69 -0
  19. package/agents/event/event-speaker.md +86 -0
  20. package/agents/explorer-low.md +42 -42
  21. package/agents/explorer-medium.md +59 -59
  22. package/agents/explorer.md +48 -48
  23. package/agents/implementer-low.md +43 -43
  24. package/agents/implementer-medium.md +52 -52
  25. package/agents/implementer.md +54 -54
  26. package/agents/junior-mentor.md +141 -141
  27. package/agents/planning/requirements-analyst.md +84 -84
  28. package/agents/planning/ux-advisor.md +83 -83
  29. package/agents/qa/acceptance-tester.md +86 -86
  30. package/agents/qa/edge-case-finder.md +93 -93
  31. package/agents/refactor-cleaner.md +143 -143
  32. package/agents/research/best-practices-agent.md +199 -199
  33. package/agents/research/codebase-patterns-agent.md +157 -157
  34. package/agents/research/framework-docs-agent.md +188 -188
  35. package/agents/research/security-advisory-agent.md +213 -213
  36. package/agents/review/architecture-reviewer.md +107 -107
  37. package/agents/review/complexity-reviewer.md +116 -116
  38. package/agents/review/data-integrity-reviewer.md +88 -88
  39. package/agents/review/git-history-reviewer.md +103 -103
  40. package/agents/review/performance-reviewer.md +86 -86
  41. package/agents/review/python-reviewer.md +150 -150
  42. package/agents/review/rails-reviewer.md +139 -139
  43. package/agents/review/react-reviewer.md +144 -144
  44. package/agents/review/security-reviewer.md +80 -80
  45. package/agents/review/simplicity-reviewer.md +140 -140
  46. package/agents/review/test-coverage-reviewer.md +116 -116
  47. package/agents/review/typescript-reviewer.md +127 -127
  48. package/agents/searcher.md +54 -54
  49. package/agents/simplifier.md +120 -120
  50. package/agents/tester.md +49 -49
  51. package/agents/ui/ui-a11y-auditor.md +93 -93
  52. package/agents/ui/ui-antipattern-detector.md +94 -94
  53. package/agents/ui/ui-dataviz-advisor.md +69 -69
  54. package/agents/ui/ui-design-system-gen.md +57 -57
  55. package/agents/ui/ui-industry-analyzer.md +49 -49
  56. package/agents/ui/ui-layout-architect.md +65 -65
  57. package/agents/ui/ui-stack-implementer.md +68 -68
  58. package/agents/ui/ux-compliance-reviewer.md +81 -81
  59. package/agents/ui-previewer.md +258 -258
  60. package/commands/vibe.analyze.md +379 -379
  61. package/commands/vibe.event.md +163 -0
  62. package/commands/vibe.review.md +607 -607
  63. package/commands/vibe.run.md +2217 -2124
  64. package/commands/vibe.spec.md +1195 -1195
  65. package/commands/vibe.spec.review.md +569 -569
  66. package/commands/vibe.trace.md +50 -0
  67. package/commands/vibe.utils.md +413 -413
  68. package/commands/vibe.verify.md +484 -484
  69. package/dist/__tests__/architecture.test.d.ts +2 -0
  70. package/dist/__tests__/architecture.test.d.ts.map +1 -0
  71. package/dist/__tests__/architecture.test.js +207 -0
  72. package/dist/__tests__/architecture.test.js.map +1 -0
  73. package/dist/cli/auth.js +3 -3
  74. package/dist/cli/auth.js.map +1 -1
  75. package/dist/cli/collaborator.js +52 -52
  76. package/dist/cli/commands/evolution.js +12 -12
  77. package/dist/cli/commands/info.d.ts.map +1 -1
  78. package/dist/cli/commands/info.js +45 -81
  79. package/dist/cli/commands/info.js.map +1 -1
  80. package/dist/cli/commands/init.js +5 -5
  81. package/dist/cli/commands/remove.js +14 -14
  82. package/dist/cli/commands/sentinel.js +27 -27
  83. package/dist/cli/commands/skills.js +5 -5
  84. package/dist/cli/commands/slack.js +10 -10
  85. package/dist/cli/commands/telegram.js +12 -12
  86. package/dist/cli/detect.d.ts.map +1 -1
  87. package/dist/cli/detect.js +55 -32
  88. package/dist/cli/detect.js.map +1 -1
  89. package/dist/cli/index.d.ts +1 -1
  90. package/dist/cli/index.d.ts.map +1 -1
  91. package/dist/cli/index.js +52 -52
  92. package/dist/cli/index.js.map +1 -1
  93. package/dist/cli/llm/claude-commands.js +16 -16
  94. package/dist/cli/llm/config.js +18 -18
  95. package/dist/cli/llm/gemini-commands.js +16 -16
  96. package/dist/cli/llm/gpt-commands.js +19 -19
  97. package/dist/cli/llm/help.js +21 -21
  98. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  99. package/dist/cli/postinstall/constants.js +24 -0
  100. package/dist/cli/postinstall/constants.js.map +1 -1
  101. package/dist/cli/postinstall/cursor-agents.js +32 -32
  102. package/dist/cli/postinstall/cursor-rules.js +83 -83
  103. package/dist/cli/postinstall/cursor-skills.js +743 -743
  104. package/dist/cli/setup/Provisioner.js +42 -42
  105. package/dist/infra/lib/AutomationLevel.d.ts +48 -0
  106. package/dist/infra/lib/AutomationLevel.d.ts.map +1 -0
  107. package/dist/infra/lib/AutomationLevel.js +157 -0
  108. package/dist/infra/lib/AutomationLevel.js.map +1 -0
  109. package/dist/infra/lib/DecisionTracer.d.ts +81 -0
  110. package/dist/infra/lib/DecisionTracer.d.ts.map +1 -0
  111. package/dist/infra/lib/DecisionTracer.js +135 -0
  112. package/dist/infra/lib/DecisionTracer.js.map +1 -0
  113. package/dist/infra/lib/DeepInit.js +24 -24
  114. package/dist/infra/lib/InteractiveCheckpoint.d.ts +75 -0
  115. package/dist/infra/lib/InteractiveCheckpoint.d.ts.map +1 -0
  116. package/dist/infra/lib/InteractiveCheckpoint.js +179 -0
  117. package/dist/infra/lib/InteractiveCheckpoint.js.map +1 -0
  118. package/dist/infra/lib/IterationTracker.d.ts +44 -0
  119. package/dist/infra/lib/IterationTracker.d.ts.map +1 -1
  120. package/dist/infra/lib/IterationTracker.js +267 -12
  121. package/dist/infra/lib/IterationTracker.js.map +1 -1
  122. package/dist/infra/lib/LoopBreaker.d.ts +56 -0
  123. package/dist/infra/lib/LoopBreaker.d.ts.map +1 -0
  124. package/dist/infra/lib/LoopBreaker.js +109 -0
  125. package/dist/infra/lib/LoopBreaker.js.map +1 -0
  126. package/dist/infra/lib/PythonParser.js +108 -108
  127. package/dist/infra/lib/ReviewRace.js +96 -96
  128. package/dist/infra/lib/SkillFrontmatter.js +28 -28
  129. package/dist/infra/lib/SkillQualityGate.js +9 -9
  130. package/dist/infra/lib/SkillRepository.js +159 -159
  131. package/dist/infra/lib/UltraQA.js +99 -99
  132. package/dist/infra/lib/VerificationLoop.d.ts +105 -0
  133. package/dist/infra/lib/VerificationLoop.d.ts.map +1 -0
  134. package/dist/infra/lib/VerificationLoop.js +189 -0
  135. package/dist/infra/lib/VerificationLoop.js.map +1 -0
  136. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts +2 -0
  137. package/dist/infra/lib/__tests__/AutomationLevel.test.d.ts.map +1 -0
  138. package/dist/infra/lib/__tests__/AutomationLevel.test.js +297 -0
  139. package/dist/infra/lib/__tests__/AutomationLevel.test.js.map +1 -0
  140. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts +2 -0
  141. package/dist/infra/lib/__tests__/DecisionTracer.test.d.ts.map +1 -0
  142. package/dist/infra/lib/__tests__/DecisionTracer.test.js +274 -0
  143. package/dist/infra/lib/__tests__/DecisionTracer.test.js.map +1 -0
  144. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts +2 -0
  145. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.d.ts.map +1 -0
  146. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js +350 -0
  147. package/dist/infra/lib/__tests__/InteractiveCheckpoint.test.js.map +1 -0
  148. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts +2 -0
  149. package/dist/infra/lib/__tests__/LoopBreaker.test.d.ts.map +1 -0
  150. package/dist/infra/lib/__tests__/LoopBreaker.test.js +340 -0
  151. package/dist/infra/lib/__tests__/LoopBreaker.test.js.map +1 -0
  152. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts +2 -0
  153. package/dist/infra/lib/__tests__/VerificationLoop.test.d.ts.map +1 -0
  154. package/dist/infra/lib/__tests__/VerificationLoop.test.js +486 -0
  155. package/dist/infra/lib/__tests__/VerificationLoop.test.js.map +1 -0
  156. package/dist/infra/lib/autonomy/AuditStore.js +41 -41
  157. package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
  158. package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
  159. package/dist/infra/lib/autonomy/PolicyEngine.d.ts +3 -3
  160. package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
  161. package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
  162. package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
  163. package/dist/infra/lib/embedding/VectorStore.js +22 -22
  164. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js +4 -0
  165. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js.map +1 -1
  166. package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
  167. package/dist/infra/lib/evolution/DeprecationDetector.d.ts +68 -0
  168. package/dist/infra/lib/evolution/DeprecationDetector.d.ts.map +1 -0
  169. package/dist/infra/lib/evolution/DeprecationDetector.js +207 -0
  170. package/dist/infra/lib/evolution/DeprecationDetector.js.map +1 -0
  171. package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
  172. package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
  173. package/dist/infra/lib/evolution/InsightStore.js +90 -90
  174. package/dist/infra/lib/evolution/ParityTester.d.ts +74 -0
  175. package/dist/infra/lib/evolution/ParityTester.d.ts.map +1 -0
  176. package/dist/infra/lib/evolution/ParityTester.js +238 -0
  177. package/dist/infra/lib/evolution/ParityTester.js.map +1 -0
  178. package/dist/infra/lib/evolution/RollbackManager.js +5 -5
  179. package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
  180. package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
  181. package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
  182. package/dist/infra/lib/evolution/UsageTracker.js +28 -28
  183. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts +2 -0
  184. package/dist/infra/lib/evolution/__tests__/deprecation.test.d.ts.map +1 -0
  185. package/dist/infra/lib/evolution/__tests__/deprecation.test.js +251 -0
  186. package/dist/infra/lib/evolution/__tests__/deprecation.test.js.map +1 -0
  187. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts +2 -0
  188. package/dist/infra/lib/evolution/__tests__/parity.test.d.ts.map +1 -0
  189. package/dist/infra/lib/evolution/__tests__/parity.test.js +319 -0
  190. package/dist/infra/lib/evolution/__tests__/parity.test.js.map +1 -0
  191. package/dist/infra/lib/evolution/index.d.ts +4 -0
  192. package/dist/infra/lib/evolution/index.d.ts.map +1 -1
  193. package/dist/infra/lib/evolution/index.js +3 -0
  194. package/dist/infra/lib/evolution/index.js.map +1 -1
  195. package/dist/infra/lib/gemini/orchestration.js +5 -5
  196. package/dist/infra/lib/gpt/orchestration.js +4 -4
  197. package/dist/infra/lib/gpt/specializations.d.ts +1 -1
  198. package/dist/infra/lib/gpt/specializations.js +1 -1
  199. package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
  200. package/dist/infra/lib/memory/MemorySearch.js +57 -57
  201. package/dist/infra/lib/memory/MemoryStorage.js +181 -181
  202. package/dist/infra/lib/memory/ObservationStore.js +28 -28
  203. package/dist/infra/lib/memory/ReflectionStore.js +30 -30
  204. package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
  205. package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
  206. package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
  207. package/dist/infra/lib/telemetry/SkillTelemetry.d.ts +6 -0
  208. package/dist/infra/lib/telemetry/SkillTelemetry.d.ts.map +1 -1
  209. package/dist/infra/lib/telemetry/SkillTelemetry.js +11 -0
  210. package/dist/infra/lib/telemetry/SkillTelemetry.js.map +1 -1
  211. package/dist/infra/orchestrator/AgentManager.js +12 -12
  212. package/dist/infra/orchestrator/AgentRegistry.js +65 -65
  213. package/dist/infra/orchestrator/BackgroundManager.d.ts.map +1 -1
  214. package/dist/infra/orchestrator/BackgroundManager.js +2 -0
  215. package/dist/infra/orchestrator/BackgroundManager.js.map +1 -1
  216. package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
  217. package/dist/infra/orchestrator/PhasePipeline.js +1 -1
  218. package/dist/infra/orchestrator/PhasePipeline.js.map +1 -1
  219. package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
  220. package/dist/infra/orchestrator/parallelResearch.js +24 -24
  221. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  222. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  223. package/dist/tools/index.d.ts +16 -19
  224. package/dist/tools/index.d.ts.map +1 -1
  225. package/dist/tools/index.js +15 -27
  226. package/dist/tools/index.js.map +1 -1
  227. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  228. package/dist/tools/memory/getMemoryGraph.js +12 -12
  229. package/dist/tools/memory/getSessionContext.js +9 -9
  230. package/dist/tools/memory/linkMemories.js +14 -14
  231. package/dist/tools/memory/listMemories.js +4 -4
  232. package/dist/tools/memory/recallMemory.js +4 -4
  233. package/dist/tools/memory/saveMemory.js +4 -4
  234. package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
  235. package/dist/tools/memory/startSession.js +1 -1
  236. package/dist/tools/memory/startSession.js.map +1 -1
  237. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  238. package/dist/tools/semantic/astGrep.test.js +6 -6
  239. package/dist/tools/spec/index.d.ts +0 -4
  240. package/dist/tools/spec/index.d.ts.map +1 -1
  241. package/dist/tools/spec/index.js +0 -4
  242. package/dist/tools/spec/index.js.map +1 -1
  243. package/dist/tools/spec/prdParser.test.js +171 -171
  244. package/dist/tools/spec/specGenerator.js +169 -169
  245. package/dist/tools/spec/traceabilityMatrix.js +64 -64
  246. package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
  247. package/hooks/gemini-hooks.json +73 -73
  248. package/hooks/hooks.json +137 -137
  249. package/hooks/scripts/code-check.js +77 -77
  250. package/hooks/scripts/context-save.js +212 -212
  251. package/hooks/scripts/evolution-engine.js +69 -0
  252. package/hooks/scripts/hud-status.js +291 -291
  253. package/hooks/scripts/keyword-detector.js +214 -214
  254. package/hooks/scripts/llm-orchestrate.js +475 -475
  255. package/hooks/scripts/post-edit.js +32 -32
  256. package/hooks/scripts/pre-tool-guard.js +125 -125
  257. package/hooks/scripts/prompt-dispatcher.js +185 -185
  258. package/hooks/scripts/sentinel-guard.js +104 -104
  259. package/hooks/scripts/session-start.js +106 -106
  260. package/hooks/scripts/skill-injector.js +83 -0
  261. package/hooks/scripts/stop-notify.js +209 -209
  262. package/hooks/scripts/utils.js +100 -100
  263. package/languages/csharp-unity.md +515 -515
  264. package/languages/gdscript-godot.md +470 -470
  265. package/languages/ruby-rails.md +489 -489
  266. package/languages/typescript-angular.md +433 -433
  267. package/languages/typescript-astro.md +416 -416
  268. package/languages/typescript-electron.md +406 -406
  269. package/languages/typescript-nestjs.md +524 -524
  270. package/languages/typescript-svelte.md +407 -407
  271. package/languages/typescript-tauri.md +365 -365
  272. package/package.json +101 -123
  273. package/skills/agents-md/SKILL.md +120 -120
  274. package/skills/arch-guard/SKILL.md +180 -180
  275. package/skills/brand-assets/SKILL.md +146 -146
  276. package/skills/capability-loop/SKILL.md +167 -167
  277. package/skills/characterization-test/SKILL.md +206 -206
  278. package/skills/commerce-patterns/SKILL.md +63 -63
  279. package/skills/commit-push-pr/SKILL.md +75 -75
  280. package/skills/context7-usage/SKILL.md +105 -105
  281. package/skills/core-capabilities/SKILL.md +13 -13
  282. package/skills/e2e-commerce/SKILL.md +61 -61
  283. package/skills/event-comms/SKILL.md +161 -0
  284. package/skills/event-ops/SKILL.md +197 -0
  285. package/skills/event-planning/SKILL.md +131 -0
  286. package/skills/exec-plan/SKILL.md +147 -147
  287. package/skills/frontend-design/SKILL.md +12 -12
  288. package/skills/git-worktree/SKILL.md +72 -72
  289. package/skills/handoff/SKILL.md +109 -109
  290. package/skills/parallel-research/SKILL.md +87 -87
  291. package/skills/priority-todos/SKILL.md +63 -63
  292. package/skills/seo-checklist/SKILL.md +57 -57
  293. package/skills/techdebt/SKILL.md +122 -122
  294. package/skills/tool-fallback/SKILL.md +103 -103
  295. package/skills/typescript-advanced-types/SKILL.md +66 -66
  296. package/skills/ui-ux-pro-max/SKILL.md +221 -221
  297. package/skills/vercel-react-best-practices/SKILL.md +59 -59
  298. package/skills/video-production/SKILL.md +51 -51
  299. package/vibe/config.json +29 -29
  300. package/vibe/constitution.md +227 -227
  301. package/vibe/rules/principles/communication-guide.md +98 -98
  302. package/vibe/rules/principles/development-philosophy.md +52 -52
  303. package/vibe/rules/principles/quick-start.md +102 -102
  304. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  305. package/vibe/rules/quality/checklist.md +276 -276
  306. package/vibe/rules/quality/performance.md +236 -236
  307. package/vibe/rules/quality/testing-strategy.md +440 -440
  308. package/vibe/rules/standards/anti-patterns.md +541 -541
  309. package/vibe/rules/standards/code-structure.md +291 -291
  310. package/vibe/rules/standards/complexity-metrics.md +313 -313
  311. package/vibe/rules/standards/git-workflow.md +237 -237
  312. package/vibe/rules/standards/naming-conventions.md +198 -198
  313. package/vibe/rules/standards/security.md +305 -305
  314. package/vibe/rules/writing/document-style.md +74 -74
  315. package/vibe/setup.sh +31 -31
  316. package/vibe/templates/constitution-template.md +252 -252
  317. package/vibe/templates/contract-backend-template.md +526 -526
  318. package/vibe/templates/contract-frontend-template.md +599 -599
  319. package/vibe/templates/feature-template.md +96 -96
  320. package/vibe/templates/spec-template.md +221 -221
  321. package/vibe/ui-ux-data/charts.csv +26 -26
  322. package/vibe/ui-ux-data/colors.csv +97 -97
  323. package/vibe/ui-ux-data/icons.csv +101 -101
  324. package/vibe/ui-ux-data/landing.csv +31 -31
  325. package/vibe/ui-ux-data/products.csv +96 -96
  326. package/vibe/ui-ux-data/react-performance.csv +45 -45
  327. package/vibe/ui-ux-data/stacks/astro.csv +54 -54
  328. package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
  329. package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
  330. package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
  331. package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
  332. package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
  333. package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
  334. package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
  335. package/vibe/ui-ux-data/stacks/react.csv +54 -54
  336. package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
  337. package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
  338. package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
  339. package/vibe/ui-ux-data/stacks/vue.csv +50 -50
  340. package/vibe/ui-ux-data/styles.csv +68 -68
  341. package/vibe/ui-ux-data/typography.csv +57 -57
  342. package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
  343. package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
  344. package/vibe/ui-ux-data/version.json +31 -31
  345. package/vibe/ui-ux-data/web-interface.csv +31 -31
@@ -0,0 +1,486 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { createLoop, calculateAchievementRate, recordVerification, getUnmetRequirements, formatVerificationResult, formatLoopSummary, isImproving, DEFAULT_VERIFICATION_CONFIG, } from '../VerificationLoop.js';
3
+ // ══════════════════════════════════════════════════
4
+ // Fixtures
5
+ // ══════════════════════════════════════════════════
6
+ function makeReq(id, status, score, description = `Req ${id}`, evidence = 'test evidence') {
7
+ return { id, description, status, score, evidence };
8
+ }
9
+ // ══════════════════════════════════════════════════
10
+ // calculateAchievementRate
11
+ // ══════════════════════════════════════════════════
12
+ describe('calculateAchievementRate', () => {
13
+ it('should return 100 when all requirements pass', () => {
14
+ const reqs = [
15
+ makeReq('REQ-001', 'pass', 100),
16
+ makeReq('REQ-002', 'pass', 100),
17
+ makeReq('REQ-003', 'pass', 100),
18
+ ];
19
+ expect(calculateAchievementRate(reqs)).toBe(100);
20
+ });
21
+ it('should return 0 when all requirements fail', () => {
22
+ const reqs = [
23
+ makeReq('REQ-001', 'fail', 0),
24
+ makeReq('REQ-002', 'fail', 0),
25
+ ];
26
+ expect(calculateAchievementRate(reqs)).toBe(0);
27
+ });
28
+ it('should return weighted average for mixed results', () => {
29
+ const reqs = [
30
+ makeReq('REQ-001', 'pass', 100),
31
+ makeReq('REQ-002', 'fail', 0),
32
+ makeReq('REQ-003', 'partial', 50),
33
+ ];
34
+ // (100 + 0 + 50) / 3 = 50
35
+ expect(calculateAchievementRate(reqs)).toBe(50);
36
+ });
37
+ it('should exclude skipped requirements from calculation', () => {
38
+ const reqs = [
39
+ makeReq('REQ-001', 'pass', 100),
40
+ makeReq('REQ-002', 'skip', 0),
41
+ makeReq('REQ-003', 'skip', 0),
42
+ ];
43
+ // Only REQ-001 counts: 100 / 1 = 100
44
+ expect(calculateAchievementRate(reqs)).toBe(100);
45
+ });
46
+ it('should return 100 when all requirements are skipped', () => {
47
+ const reqs = [
48
+ makeReq('REQ-001', 'skip', 0),
49
+ makeReq('REQ-002', 'skip', 0),
50
+ ];
51
+ expect(calculateAchievementRate(reqs)).toBe(100);
52
+ });
53
+ it('should return 100 for empty requirements array', () => {
54
+ expect(calculateAchievementRate([])).toBe(100);
55
+ });
56
+ it('should round to nearest integer', () => {
57
+ const reqs = [
58
+ makeReq('REQ-001', 'pass', 100),
59
+ makeReq('REQ-002', 'pass', 100),
60
+ makeReq('REQ-003', 'fail', 0),
61
+ ];
62
+ // (100 + 100 + 0) / 3 = 66.666...
63
+ expect(calculateAchievementRate(reqs)).toBe(67);
64
+ });
65
+ it('should handle partial scores mixed with skips', () => {
66
+ const reqs = [
67
+ makeReq('REQ-001', 'partial', 60),
68
+ makeReq('REQ-002', 'partial', 80),
69
+ makeReq('REQ-003', 'skip', 0),
70
+ ];
71
+ // (60 + 80) / 2 = 70
72
+ expect(calculateAchievementRate(reqs)).toBe(70);
73
+ });
74
+ });
75
+ // ══════════════════════════════════════════════════
76
+ // createLoop
77
+ // ══════════════════════════════════════════════════
78
+ describe('createLoop', () => {
79
+ it('should create loop with default config', () => {
80
+ const state = createLoop('my-feature');
81
+ expect(state.feature).toBe('my-feature');
82
+ expect(state.config).toEqual(DEFAULT_VERIFICATION_CONFIG);
83
+ expect(state.history).toHaveLength(0);
84
+ expect(state.status).toBe('pending');
85
+ expect(state.startedAt).toBeDefined();
86
+ expect(state.completedAt).toBeUndefined();
87
+ });
88
+ it('should merge partial config overrides', () => {
89
+ const state = createLoop('feature', { threshold: 80, autoRetry: true });
90
+ expect(state.config.threshold).toBe(80);
91
+ expect(state.config.autoRetry).toBe(true);
92
+ expect(state.config.maxIterations).toBe(DEFAULT_VERIFICATION_CONFIG.maxIterations);
93
+ });
94
+ it('should start with empty history', () => {
95
+ const state = createLoop('feature');
96
+ expect(state.history).toEqual([]);
97
+ });
98
+ });
99
+ // ══════════════════════════════════════════════════
100
+ // recordVerification — pass on first try
101
+ // ══════════════════════════════════════════════════
102
+ describe('recordVerification — pass on first try', () => {
103
+ it('should return passed action when rate meets threshold', () => {
104
+ const state = createLoop('feature', { threshold: 90 });
105
+ const reqs = [
106
+ makeReq('REQ-001', 'pass', 100),
107
+ makeReq('REQ-002', 'pass', 100),
108
+ ];
109
+ const { state: newState, action } = recordVerification(state, reqs);
110
+ expect(action.type).toBe('passed');
111
+ expect(action.rate).toBe(100);
112
+ expect(newState.status).toBe('passed');
113
+ expect(newState.completedAt).toBeDefined();
114
+ expect(newState.history).toHaveLength(1);
115
+ });
116
+ it('should record the result in history', () => {
117
+ const state = createLoop('feature');
118
+ const reqs = [makeReq('REQ-001', 'pass', 100)];
119
+ const { state: newState } = recordVerification(state, reqs);
120
+ expect(newState.history[0].iteration).toBe(1);
121
+ expect(newState.history[0].achievementRate).toBe(100);
122
+ expect(newState.history[0].requirements).toEqual(reqs);
123
+ expect(newState.history[0].timestamp).toBeDefined();
124
+ });
125
+ it('should pass exactly at threshold', () => {
126
+ const state = createLoop('feature', { threshold: 90 });
127
+ const reqs = [
128
+ makeReq('REQ-001', 'pass', 100),
129
+ makeReq('REQ-002', 'pass', 100),
130
+ makeReq('REQ-003', 'partial', 70),
131
+ ];
132
+ // (100 + 100 + 70) / 3 = 90
133
+ const { action } = recordVerification(state, reqs);
134
+ expect(action.type).toBe('passed');
135
+ });
136
+ });
137
+ // ══════════════════════════════════════════════════
138
+ // recordVerification — retry flow
139
+ // ══════════════════════════════════════════════════
140
+ describe('recordVerification — retry flow', () => {
141
+ it('should return retry action when rate is below threshold and iterations remain', () => {
142
+ const state = createLoop('feature', { threshold: 90, maxIterations: 3 });
143
+ const reqs = [
144
+ makeReq('REQ-001', 'pass', 100),
145
+ makeReq('REQ-002', 'fail', 0),
146
+ ];
147
+ const { state: newState, action } = recordVerification(state, reqs);
148
+ expect(action.type).toBe('retry');
149
+ expect(newState.status).toBe('running');
150
+ expect(newState.completedAt).toBeUndefined();
151
+ });
152
+ it('should include failed requirements in retry action', () => {
153
+ const state = createLoop('feature', { threshold: 90, maxIterations: 3 });
154
+ const failReq = makeReq('REQ-002', 'fail', 0);
155
+ const partialReq = makeReq('REQ-003', 'partial', 50);
156
+ const reqs = [
157
+ makeReq('REQ-001', 'pass', 100),
158
+ failReq,
159
+ partialReq,
160
+ ];
161
+ const { action } = recordVerification(state, reqs);
162
+ expect(action.type).toBe('retry');
163
+ if (action.type === 'retry') {
164
+ expect(action.failedRequirements).toHaveLength(2);
165
+ expect(action.failedRequirements.map(r => r.id)).toContain('REQ-002');
166
+ expect(action.failedRequirements.map(r => r.id)).toContain('REQ-003');
167
+ }
168
+ });
169
+ it('should pass after retrying with improved requirements', () => {
170
+ let state = createLoop('feature', { threshold: 80, maxIterations: 3 });
171
+ // First iteration: 50% — retry
172
+ const firstReqs = [
173
+ makeReq('REQ-001', 'pass', 100),
174
+ makeReq('REQ-002', 'fail', 0),
175
+ ];
176
+ const result1 = recordVerification(state, firstReqs);
177
+ expect(result1.action.type).toBe('retry');
178
+ state = result1.state;
179
+ // Second iteration: 100% — passed
180
+ const secondReqs = [
181
+ makeReq('REQ-001', 'pass', 100),
182
+ makeReq('REQ-002', 'pass', 100),
183
+ ];
184
+ const result2 = recordVerification(state, secondReqs);
185
+ expect(result2.action.type).toBe('passed');
186
+ expect(result2.state.status).toBe('passed');
187
+ expect(result2.state.history).toHaveLength(2);
188
+ });
189
+ it('should track correct iteration numbers', () => {
190
+ let state = createLoop('feature', { threshold: 100, maxIterations: 5 });
191
+ for (let i = 1; i <= 3; i++) {
192
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
193
+ const result = recordVerification(state, reqs);
194
+ expect(result.state.history[i - 1].iteration).toBe(i);
195
+ state = result.state;
196
+ }
197
+ });
198
+ });
199
+ // ══════════════════════════════════════════════════
200
+ // recordVerification — max iterations
201
+ // ══════════════════════════════════════════════════
202
+ describe('recordVerification — max iterations', () => {
203
+ it('should return max_iterations action when limit is reached', () => {
204
+ let state = createLoop('feature', { threshold: 90, maxIterations: 2 });
205
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
206
+ const result1 = recordVerification(state, reqs);
207
+ expect(result1.action.type).toBe('retry');
208
+ state = result1.state;
209
+ const result2 = recordVerification(state, reqs);
210
+ expect(result2.action.type).toBe('max_iterations');
211
+ expect(result2.state.status).toBe('max_iterations');
212
+ expect(result2.state.completedAt).toBeDefined();
213
+ });
214
+ it('should include history in max_iterations action', () => {
215
+ let state = createLoop('feature', { threshold: 100, maxIterations: 1 });
216
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
217
+ const { action } = recordVerification(state, reqs);
218
+ expect(action.type).toBe('max_iterations');
219
+ if (action.type === 'max_iterations') {
220
+ expect(action.history).toHaveLength(1);
221
+ }
222
+ });
223
+ it('should not return retry action after maxIterations is exhausted', () => {
224
+ let state = createLoop('feature', { threshold: 90, maxIterations: 3 });
225
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
226
+ for (let i = 0; i < 2; i++) {
227
+ const result = recordVerification(state, reqs);
228
+ state = result.state;
229
+ }
230
+ const finalResult = recordVerification(state, reqs);
231
+ expect(finalResult.action.type).toBe('max_iterations');
232
+ });
233
+ });
234
+ // ══════════════════════════════════════════════════
235
+ // getUnmetRequirements
236
+ // ══════════════════════════════════════════════════
237
+ describe('getUnmetRequirements', () => {
238
+ it('should return fail and partial requirements', () => {
239
+ const state = createLoop('feature');
240
+ const reqs = [
241
+ makeReq('REQ-001', 'pass', 100),
242
+ makeReq('REQ-002', 'fail', 0),
243
+ makeReq('REQ-003', 'partial', 50),
244
+ makeReq('REQ-004', 'skip', 0),
245
+ ];
246
+ const { state: newState } = recordVerification(state, reqs);
247
+ const unmet = getUnmetRequirements(newState.history[0]);
248
+ expect(unmet).toHaveLength(2);
249
+ expect(unmet.map(r => r.id)).toContain('REQ-002');
250
+ expect(unmet.map(r => r.id)).toContain('REQ-003');
251
+ });
252
+ it('should return empty array when all requirements pass', () => {
253
+ const state = createLoop('feature');
254
+ const reqs = [
255
+ makeReq('REQ-001', 'pass', 100),
256
+ makeReq('REQ-002', 'pass', 100),
257
+ ];
258
+ const { state: newState } = recordVerification(state, reqs);
259
+ const unmet = getUnmetRequirements(newState.history[0]);
260
+ expect(unmet).toHaveLength(0);
261
+ });
262
+ it('should not include skipped requirements', () => {
263
+ const state = createLoop('feature');
264
+ const reqs = [makeReq('REQ-001', 'skip', 0)];
265
+ const { state: newState } = recordVerification(state, reqs);
266
+ const unmet = getUnmetRequirements(newState.history[0]);
267
+ expect(unmet).toHaveLength(0);
268
+ });
269
+ });
270
+ // ══════════════════════════════════════════════════
271
+ // isImproving
272
+ // ══════════════════════════════════════════════════
273
+ describe('isImproving', () => {
274
+ it('should return false with fewer than 2 iterations', () => {
275
+ const state = createLoop('feature');
276
+ expect(isImproving(state)).toBe(false);
277
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
278
+ const { state: afterOne } = recordVerification(state, reqs);
279
+ expect(isImproving(afterOne)).toBe(false);
280
+ });
281
+ it('should return true when rate increases by at least 1%', () => {
282
+ let state = createLoop('feature', { threshold: 100, maxIterations: 5 });
283
+ const firstReqs = [makeReq('REQ-001', 'fail', 0), makeReq('REQ-002', 'pass', 100)];
284
+ state = recordVerification(state, firstReqs).state;
285
+ const secondReqs = [makeReq('REQ-001', 'pass', 100), makeReq('REQ-002', 'pass', 100)];
286
+ state = recordVerification(state, secondReqs).state;
287
+ expect(isImproving(state)).toBe(true);
288
+ });
289
+ it('should return false when rate stays the same', () => {
290
+ let state = createLoop('feature', { threshold: 100, maxIterations: 5 });
291
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
292
+ state = recordVerification(state, reqs).state;
293
+ state = recordVerification(state, reqs).state;
294
+ expect(isImproving(state)).toBe(false);
295
+ });
296
+ it('should return false when rate decreases', () => {
297
+ let state = createLoop('feature', { threshold: 100, maxIterations: 5 });
298
+ const firstReqs = [makeReq('REQ-001', 'pass', 100), makeReq('REQ-002', 'pass', 100)];
299
+ state = recordVerification(state, firstReqs).state;
300
+ const secondReqs = [makeReq('REQ-001', 'fail', 0), makeReq('REQ-002', 'fail', 0)];
301
+ state = recordVerification(state, secondReqs).state;
302
+ expect(isImproving(state)).toBe(false);
303
+ });
304
+ it('should require at least 1% increase (not less)', () => {
305
+ let state = createLoop('feature', { threshold: 100, maxIterations: 5 });
306
+ // First: 50%
307
+ const firstReqs = [makeReq('REQ-001', 'pass', 50)];
308
+ state = recordVerification(state, firstReqs).state;
309
+ // Second: 50% same — no improvement
310
+ const secondReqs = [makeReq('REQ-001', 'pass', 50)];
311
+ state = recordVerification(state, secondReqs).state;
312
+ expect(isImproving(state)).toBe(false);
313
+ });
314
+ });
315
+ // ══════════════════════════════════════════════════
316
+ // formatVerificationResult
317
+ // ══════════════════════════════════════════════════
318
+ describe('formatVerificationResult', () => {
319
+ it('should include iteration number', () => {
320
+ const state = createLoop('feature');
321
+ const reqs = [makeReq('REQ-001', 'pass', 100)];
322
+ const { state: newState } = recordVerification(state, reqs);
323
+ const result = newState.history[0];
324
+ const formatted = formatVerificationResult(result, DEFAULT_VERIFICATION_CONFIG);
325
+ expect(formatted).toContain('Iteration 1');
326
+ });
327
+ it('should show PASSED label when above threshold', () => {
328
+ const state = createLoop('feature', { threshold: 90 });
329
+ const reqs = [makeReq('REQ-001', 'pass', 100)];
330
+ const { state: newState } = recordVerification(state, reqs);
331
+ const formatted = formatVerificationResult(newState.history[0], newState.config);
332
+ expect(formatted).toContain('PASSED');
333
+ });
334
+ it('should show BELOW THRESHOLD label when below threshold', () => {
335
+ const state = createLoop('feature', { threshold: 90 });
336
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
337
+ const { state: newState } = recordVerification(state, reqs);
338
+ const formatted = formatVerificationResult(newState.history[0], newState.config);
339
+ expect(formatted).toContain('BELOW THRESHOLD');
340
+ });
341
+ it('should include requirement IDs and descriptions', () => {
342
+ const state = createLoop('feature');
343
+ const reqs = [makeReq('REQ-001', 'pass', 100, 'Must do X')];
344
+ const { state: newState } = recordVerification(state, reqs);
345
+ const formatted = formatVerificationResult(newState.history[0], DEFAULT_VERIFICATION_CONFIG);
346
+ expect(formatted).toContain('REQ-001');
347
+ expect(formatted).toContain('Must do X');
348
+ });
349
+ it('should show pass icon for passing requirements', () => {
350
+ const state = createLoop('feature');
351
+ const reqs = [makeReq('REQ-001', 'pass', 100)];
352
+ const { state: newState } = recordVerification(state, reqs);
353
+ const formatted = formatVerificationResult(newState.history[0], DEFAULT_VERIFICATION_CONFIG);
354
+ expect(formatted).toContain('✅');
355
+ });
356
+ it('should show fail icon for failing requirements', () => {
357
+ const state = createLoop('feature', { threshold: 100, maxIterations: 3 });
358
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
359
+ const { state: newState } = recordVerification(state, reqs);
360
+ const formatted = formatVerificationResult(newState.history[0], newState.config);
361
+ expect(formatted).toContain('❌');
362
+ });
363
+ it('should show warning icon for partial requirements', () => {
364
+ const state = createLoop('feature', { threshold: 100, maxIterations: 3 });
365
+ const reqs = [makeReq('REQ-001', 'partial', 50)];
366
+ const { state: newState } = recordVerification(state, reqs);
367
+ const formatted = formatVerificationResult(newState.history[0], newState.config);
368
+ expect(formatted).toContain('⚠️');
369
+ });
370
+ it('should show skip icon for skipped requirements', () => {
371
+ const state = createLoop('feature');
372
+ const reqs = [makeReq('REQ-001', 'skip', 0)];
373
+ const { state: newState } = recordVerification(state, reqs);
374
+ const formatted = formatVerificationResult(newState.history[0], DEFAULT_VERIFICATION_CONFIG);
375
+ expect(formatted).toContain('⏭️');
376
+ });
377
+ it('should show summary counts', () => {
378
+ const state = createLoop('feature', { threshold: 100, maxIterations: 3 });
379
+ const reqs = [
380
+ makeReq('REQ-001', 'pass', 100),
381
+ makeReq('REQ-002', 'fail', 0),
382
+ makeReq('REQ-003', 'partial', 50),
383
+ makeReq('REQ-004', 'skip', 0),
384
+ ];
385
+ const { state: newState } = recordVerification(state, reqs);
386
+ const formatted = formatVerificationResult(newState.history[0], newState.config);
387
+ expect(formatted).toContain('1 pass');
388
+ expect(formatted).toContain('1 fail');
389
+ expect(formatted).toContain('1 partial');
390
+ expect(formatted).toContain('1 skip');
391
+ });
392
+ it('should include evidence for failing requirements', () => {
393
+ const state = createLoop('feature', { threshold: 100, maxIterations: 3 });
394
+ const reqs = [makeReq('REQ-001', 'fail', 0, 'Req desc', 'Missing implementation')];
395
+ const { state: newState } = recordVerification(state, reqs);
396
+ const formatted = formatVerificationResult(newState.history[0], newState.config);
397
+ expect(formatted).toContain('Missing implementation');
398
+ });
399
+ });
400
+ // ══════════════════════════════════════════════════
401
+ // formatLoopSummary
402
+ // ══════════════════════════════════════════════════
403
+ describe('formatLoopSummary', () => {
404
+ it('should include feature name', () => {
405
+ const state = createLoop('my-feature');
406
+ const formatted = formatLoopSummary(state);
407
+ expect(formatted).toContain('my-feature');
408
+ });
409
+ it('should include status', () => {
410
+ const state = createLoop('feature');
411
+ const formatted = formatLoopSummary(state);
412
+ expect(formatted).toContain('PENDING');
413
+ });
414
+ it('should show history when present', () => {
415
+ let state = createLoop('feature', { threshold: 100, maxIterations: 5 });
416
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
417
+ state = recordVerification(state, reqs).state;
418
+ const formatted = formatLoopSummary(state);
419
+ expect(formatted).toContain('Iteration 1');
420
+ });
421
+ it('should show completion status when passed', () => {
422
+ const state = createLoop('feature', { threshold: 0 });
423
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
424
+ const { state: doneState } = recordVerification(state, reqs);
425
+ const formatted = formatLoopSummary(doneState);
426
+ expect(formatted).toContain('PASSED');
427
+ });
428
+ it('should include threshold and iteration config', () => {
429
+ const state = createLoop('feature', { threshold: 85, maxIterations: 5 });
430
+ const formatted = formatLoopSummary(state);
431
+ expect(formatted).toContain('85%');
432
+ expect(formatted).toContain('5');
433
+ });
434
+ });
435
+ // ══════════════════════════════════════════════════
436
+ // Edge cases
437
+ // ══════════════════════════════════════════════════
438
+ describe('edge cases', () => {
439
+ it('should handle empty requirements gracefully (100% rate)', () => {
440
+ const state = createLoop('feature', { threshold: 90 });
441
+ const { action } = recordVerification(state, []);
442
+ expect(action.type).toBe('passed');
443
+ expect(action.rate).toBe(100);
444
+ });
445
+ it('should handle all-skipped requirements as passing', () => {
446
+ const state = createLoop('feature', { threshold: 90 });
447
+ const reqs = [
448
+ makeReq('REQ-001', 'skip', 0),
449
+ makeReq('REQ-002', 'skip', 0),
450
+ ];
451
+ const { action } = recordVerification(state, reqs);
452
+ expect(action.type).toBe('passed');
453
+ expect(action.rate).toBe(100);
454
+ });
455
+ it('should not mutate the original state', () => {
456
+ const state = createLoop('feature', { threshold: 90, maxIterations: 3 });
457
+ const originalHistory = state.history;
458
+ const reqs = [makeReq('REQ-001', 'pass', 100)];
459
+ recordVerification(state, reqs);
460
+ expect(state.history).toBe(originalHistory);
461
+ expect(state.history).toHaveLength(0);
462
+ expect(state.status).toBe('pending');
463
+ });
464
+ it('should handle maxIterations of 1', () => {
465
+ const state = createLoop('feature', { threshold: 100, maxIterations: 1 });
466
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
467
+ const { action } = recordVerification(state, reqs);
468
+ expect(action.type).toBe('max_iterations');
469
+ });
470
+ it('should handle threshold of 0 (always passes)', () => {
471
+ const state = createLoop('feature', { threshold: 0 });
472
+ const reqs = [makeReq('REQ-001', 'fail', 0)];
473
+ const { action } = recordVerification(state, reqs);
474
+ expect(action.type).toBe('passed');
475
+ });
476
+ it('should handle threshold of 100 (requires perfect score)', () => {
477
+ const state = createLoop('feature', { threshold: 100, maxIterations: 3 });
478
+ const reqs = [
479
+ makeReq('REQ-001', 'pass', 100),
480
+ makeReq('REQ-002', 'fail', 0),
481
+ ];
482
+ const { action } = recordVerification(state, reqs);
483
+ expect(action.type).toBe('retry');
484
+ });
485
+ });
486
+ //# sourceMappingURL=VerificationLoop.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerificationLoop.test.js","sourceRoot":"","sources":["../../../../src/infra/lib/__tests__/VerificationLoop.test.ts"],"names":[],"mappings":"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"}
@@ -16,55 +16,55 @@ export class AuditStore {
16
16
  constructor(storage) {
17
17
  this.db = storage.getDatabase();
18
18
  this.initTables();
19
- this.insertStmt = this.db.prepare(`
20
- INSERT INTO audit_events
21
- (id, correlationId, causationId, eventType, agentId, actionType, riskLevel, payload, outcome, createdAt)
22
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
19
+ this.insertStmt = this.db.prepare(`
20
+ INSERT INTO audit_events
21
+ (id, correlationId, causationId, eventType, agentId, actionType, riskLevel, payload, outcome, createdAt)
22
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
23
23
  `);
24
24
  }
25
25
  initTables() {
26
- this.db.exec(`
27
- CREATE TABLE IF NOT EXISTS audit_events (
28
- id TEXT PRIMARY KEY,
29
- correlationId TEXT NOT NULL,
30
- causationId TEXT,
31
- eventType TEXT NOT NULL,
32
- agentId TEXT,
33
- actionType TEXT,
34
- riskLevel TEXT,
35
- payload TEXT NOT NULL,
36
- outcome TEXT CHECK(outcome IS NULL OR outcome IN ('allowed', 'blocked', 'pending', 'expired')),
37
- createdAt TEXT NOT NULL
38
- );
39
- CREATE INDEX IF NOT EXISTS idx_audit_agent_time ON audit_events(agentId, createdAt);
40
- CREATE INDEX IF NOT EXISTS idx_audit_type_time ON audit_events(eventType, createdAt);
41
- CREATE INDEX IF NOT EXISTS idx_audit_correlation ON audit_events(correlationId);
26
+ this.db.exec(`
27
+ CREATE TABLE IF NOT EXISTS audit_events (
28
+ id TEXT PRIMARY KEY,
29
+ correlationId TEXT NOT NULL,
30
+ causationId TEXT,
31
+ eventType TEXT NOT NULL,
32
+ agentId TEXT,
33
+ actionType TEXT,
34
+ riskLevel TEXT,
35
+ payload TEXT NOT NULL,
36
+ outcome TEXT CHECK(outcome IS NULL OR outcome IN ('allowed', 'blocked', 'pending', 'expired')),
37
+ createdAt TEXT NOT NULL
38
+ );
39
+ CREATE INDEX IF NOT EXISTS idx_audit_agent_time ON audit_events(agentId, createdAt);
40
+ CREATE INDEX IF NOT EXISTS idx_audit_type_time ON audit_events(eventType, createdAt);
41
+ CREATE INDEX IF NOT EXISTS idx_audit_correlation ON audit_events(correlationId);
42
42
  `);
43
43
  try {
44
- this.db.exec(`
45
- CREATE VIRTUAL TABLE IF NOT EXISTS audit_events_fts USING fts5(
46
- eventType, agentId, payload,
47
- content='audit_events', content_rowid='rowid'
48
- );
44
+ this.db.exec(`
45
+ CREATE VIRTUAL TABLE IF NOT EXISTS audit_events_fts USING fts5(
46
+ eventType, agentId, payload,
47
+ content='audit_events', content_rowid='rowid'
48
+ );
49
49
  `);
50
- this.db.exec(`
51
- CREATE TRIGGER IF NOT EXISTS audit_events_fts_ai AFTER INSERT ON audit_events BEGIN
52
- INSERT INTO audit_events_fts(rowid, eventType, agentId, payload)
53
- VALUES (new.rowid, new.eventType, new.agentId, new.payload);
54
- END;
50
+ this.db.exec(`
51
+ CREATE TRIGGER IF NOT EXISTS audit_events_fts_ai AFTER INSERT ON audit_events BEGIN
52
+ INSERT INTO audit_events_fts(rowid, eventType, agentId, payload)
53
+ VALUES (new.rowid, new.eventType, new.agentId, new.payload);
54
+ END;
55
55
  `);
56
56
  this.fts5Available = true;
57
57
  }
58
58
  catch {
59
59
  this.fts5Available = false;
60
60
  }
61
- this.db.exec(`
62
- CREATE TRIGGER IF NOT EXISTS prevent_audit_update
63
- BEFORE UPDATE ON audit_events
64
- BEGIN SELECT RAISE(ABORT, 'Audit logs are immutable'); END;
65
- CREATE TRIGGER IF NOT EXISTS prevent_audit_delete
66
- BEFORE DELETE ON audit_events
67
- BEGIN SELECT RAISE(ABORT, 'Audit logs are immutable'); END;
61
+ this.db.exec(`
62
+ CREATE TRIGGER IF NOT EXISTS prevent_audit_update
63
+ BEFORE UPDATE ON audit_events
64
+ BEGIN SELECT RAISE(ABORT, 'Audit logs are immutable'); END;
65
+ CREATE TRIGGER IF NOT EXISTS prevent_audit_delete
66
+ BEFORE DELETE ON audit_events
67
+ BEGIN SELECT RAISE(ABORT, 'Audit logs are immutable'); END;
68
68
  `);
69
69
  }
70
70
  static redactSensitive(payload) {
@@ -170,10 +170,10 @@ export class AuditStore {
170
170
  const pageSize = Math.min(limit || DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);
171
171
  try {
172
172
  return this.db
173
- .prepare(`SELECT a.* FROM audit_events a
174
- JOIN audit_events_fts f ON a.rowid = f.rowid
175
- WHERE audit_events_fts MATCH ?
176
- ORDER BY rank
173
+ .prepare(`SELECT a.* FROM audit_events a
174
+ JOIN audit_events_fts f ON a.rowid = f.rowid
175
+ WHERE audit_events_fts MATCH ?
176
+ ORDER BY rank
177
177
  LIMIT ?`)
178
178
  .all(sanitized, pageSize);
179
179
  }