@telora/factory 0.4.5

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 (301) hide show
  1. package/dist/audit.d.ts +69 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +376 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/builder-completion.d.ts +35 -0
  6. package/dist/builder-completion.d.ts.map +1 -0
  7. package/dist/builder-completion.js +375 -0
  8. package/dist/builder-completion.js.map +1 -0
  9. package/dist/builder-spawner.d.ts +40 -0
  10. package/dist/builder-spawner.d.ts.map +1 -0
  11. package/dist/builder-spawner.js +493 -0
  12. package/dist/builder-spawner.js.map +1 -0
  13. package/dist/completion-gate.d.ts +52 -0
  14. package/dist/completion-gate.d.ts.map +1 -0
  15. package/dist/completion-gate.js +336 -0
  16. package/dist/completion-gate.js.map +1 -0
  17. package/dist/completion-report.d.ts +36 -0
  18. package/dist/completion-report.d.ts.map +1 -0
  19. package/dist/completion-report.js +348 -0
  20. package/dist/completion-report.js.map +1 -0
  21. package/dist/completion.d.ts +58 -0
  22. package/dist/completion.d.ts.map +1 -0
  23. package/dist/completion.js +287 -0
  24. package/dist/completion.js.map +1 -0
  25. package/dist/config.d.ts +16 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +57 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/context-manager.d.ts +152 -0
  30. package/dist/context-manager.d.ts.map +1 -0
  31. package/dist/context-manager.js +421 -0
  32. package/dist/context-manager.js.map +1 -0
  33. package/dist/crash-detection.d.ts +70 -0
  34. package/dist/crash-detection.d.ts.map +1 -0
  35. package/dist/crash-detection.js +123 -0
  36. package/dist/crash-detection.js.map +1 -0
  37. package/dist/crash-recovery.d.ts +83 -0
  38. package/dist/crash-recovery.d.ts.map +1 -0
  39. package/dist/crash-recovery.js +522 -0
  40. package/dist/crash-recovery.js.map +1 -0
  41. package/dist/crash-resolution.d.ts +34 -0
  42. package/dist/crash-resolution.d.ts.map +1 -0
  43. package/dist/crash-resolution.js +382 -0
  44. package/dist/crash-resolution.js.map +1 -0
  45. package/dist/escalation.d.ts +150 -0
  46. package/dist/escalation.d.ts.map +1 -0
  47. package/dist/escalation.js +352 -0
  48. package/dist/escalation.js.map +1 -0
  49. package/dist/execution-target.d.ts +31 -0
  50. package/dist/execution-target.d.ts.map +1 -0
  51. package/dist/execution-target.js +71 -0
  52. package/dist/execution-target.js.map +1 -0
  53. package/dist/execution-unit-init.d.ts +28 -0
  54. package/dist/execution-unit-init.d.ts.map +1 -0
  55. package/dist/execution-unit-init.js +115 -0
  56. package/dist/execution-unit-init.js.map +1 -0
  57. package/dist/execution.d.ts +17 -0
  58. package/dist/execution.d.ts.map +1 -0
  59. package/dist/execution.js +20 -0
  60. package/dist/execution.js.map +1 -0
  61. package/dist/factory-engine.d.ts +100 -0
  62. package/dist/factory-engine.d.ts.map +1 -0
  63. package/dist/factory-engine.js +243 -0
  64. package/dist/factory-engine.js.map +1 -0
  65. package/dist/gap-detection.d.ts +43 -0
  66. package/dist/gap-detection.d.ts.map +1 -0
  67. package/dist/gap-detection.js +149 -0
  68. package/dist/gap-detection.js.map +1 -0
  69. package/dist/gate-context.d.ts +23 -0
  70. package/dist/gate-context.d.ts.map +1 -0
  71. package/dist/gate-context.js +63 -0
  72. package/dist/gate-context.js.map +1 -0
  73. package/dist/gate-engine.d.ts +55 -0
  74. package/dist/gate-engine.d.ts.map +1 -0
  75. package/dist/gate-engine.js +191 -0
  76. package/dist/gate-engine.js.map +1 -0
  77. package/dist/gates/adversarial.d.ts +59 -0
  78. package/dist/gates/adversarial.d.ts.map +1 -0
  79. package/dist/gates/adversarial.js +426 -0
  80. package/dist/gates/adversarial.js.map +1 -0
  81. package/dist/gates/adversary-spawner.d.ts +35 -0
  82. package/dist/gates/adversary-spawner.d.ts.map +1 -0
  83. package/dist/gates/adversary-spawner.js +286 -0
  84. package/dist/gates/adversary-spawner.js.map +1 -0
  85. package/dist/gates/adversary-test-dir.d.ts +41 -0
  86. package/dist/gates/adversary-test-dir.d.ts.map +1 -0
  87. package/dist/gates/adversary-test-dir.js +150 -0
  88. package/dist/gates/adversary-test-dir.js.map +1 -0
  89. package/dist/gates/behavioral-parser.d.ts +32 -0
  90. package/dist/gates/behavioral-parser.d.ts.map +1 -0
  91. package/dist/gates/behavioral-parser.js +190 -0
  92. package/dist/gates/behavioral-parser.js.map +1 -0
  93. package/dist/gates/behavioral-runner.d.ts +36 -0
  94. package/dist/gates/behavioral-runner.d.ts.map +1 -0
  95. package/dist/gates/behavioral-runner.js +306 -0
  96. package/dist/gates/behavioral-runner.js.map +1 -0
  97. package/dist/gates/behavioral.d.ts +37 -0
  98. package/dist/gates/behavioral.d.ts.map +1 -0
  99. package/dist/gates/behavioral.js +485 -0
  100. package/dist/gates/behavioral.js.map +1 -0
  101. package/dist/gates/deterministic.d.ts +24 -0
  102. package/dist/gates/deterministic.d.ts.map +1 -0
  103. package/dist/gates/deterministic.js +186 -0
  104. package/dist/gates/deterministic.js.map +1 -0
  105. package/dist/git-factory.d.ts +59 -0
  106. package/dist/git-factory.d.ts.map +1 -0
  107. package/dist/git-factory.js +102 -0
  108. package/dist/git-factory.js.map +1 -0
  109. package/dist/guard-evaluation.d.ts +48 -0
  110. package/dist/guard-evaluation.d.ts.map +1 -0
  111. package/dist/guard-evaluation.js +416 -0
  112. package/dist/guard-evaluation.js.map +1 -0
  113. package/dist/index.d.ts +30 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +39 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/instance-completion.d.ts +34 -0
  118. package/dist/instance-completion.d.ts.map +1 -0
  119. package/dist/instance-completion.js +366 -0
  120. package/dist/instance-completion.js.map +1 -0
  121. package/dist/instance-lifecycle.d.ts +15 -0
  122. package/dist/instance-lifecycle.d.ts.map +1 -0
  123. package/dist/instance-lifecycle.js +18 -0
  124. package/dist/instance-lifecycle.js.map +1 -0
  125. package/dist/instance-phase-dispatch.d.ts +75 -0
  126. package/dist/instance-phase-dispatch.d.ts.map +1 -0
  127. package/dist/instance-phase-dispatch.js +674 -0
  128. package/dist/instance-phase-dispatch.js.map +1 -0
  129. package/dist/instance-poll-loop.d.ts +43 -0
  130. package/dist/instance-poll-loop.d.ts.map +1 -0
  131. package/dist/instance-poll-loop.js +360 -0
  132. package/dist/instance-poll-loop.js.map +1 -0
  133. package/dist/instance-state-machine.d.ts +52 -0
  134. package/dist/instance-state-machine.d.ts.map +1 -0
  135. package/dist/instance-state-machine.js +235 -0
  136. package/dist/instance-state-machine.js.map +1 -0
  137. package/dist/log-manager.d.ts +28 -0
  138. package/dist/log-manager.d.ts.map +1 -0
  139. package/dist/log-manager.js +71 -0
  140. package/dist/log-manager.js.map +1 -0
  141. package/dist/pipeline-evaluator.d.ts +61 -0
  142. package/dist/pipeline-evaluator.d.ts.map +1 -0
  143. package/dist/pipeline-evaluator.js +107 -0
  144. package/dist/pipeline-evaluator.js.map +1 -0
  145. package/dist/pipeline-metrics.d.ts +52 -0
  146. package/dist/pipeline-metrics.d.ts.map +1 -0
  147. package/dist/pipeline-metrics.js +40 -0
  148. package/dist/pipeline-metrics.js.map +1 -0
  149. package/dist/pipeline-traversal.d.ts +43 -0
  150. package/dist/pipeline-traversal.d.ts.map +1 -0
  151. package/dist/pipeline-traversal.js +68 -0
  152. package/dist/pipeline-traversal.js.map +1 -0
  153. package/dist/plan-parser.d.ts +76 -0
  154. package/dist/plan-parser.d.ts.map +1 -0
  155. package/dist/plan-parser.js +223 -0
  156. package/dist/plan-parser.js.map +1 -0
  157. package/dist/planning-phase.d.ts +52 -0
  158. package/dist/planning-phase.d.ts.map +1 -0
  159. package/dist/planning-phase.js +444 -0
  160. package/dist/planning-phase.js.map +1 -0
  161. package/dist/planning-prompt.d.ts +64 -0
  162. package/dist/planning-prompt.d.ts.map +1 -0
  163. package/dist/planning-prompt.js +251 -0
  164. package/dist/planning-prompt.js.map +1 -0
  165. package/dist/planning.d.ts +16 -0
  166. package/dist/planning.d.ts.map +1 -0
  167. package/dist/planning.js +17 -0
  168. package/dist/planning.js.map +1 -0
  169. package/dist/process-runner.d.ts +41 -0
  170. package/dist/process-runner.d.ts.map +1 -0
  171. package/dist/process-runner.js +81 -0
  172. package/dist/process-runner.js.map +1 -0
  173. package/dist/product-config.d.ts +34 -0
  174. package/dist/product-config.d.ts.map +1 -0
  175. package/dist/product-config.js +43 -0
  176. package/dist/product-config.js.map +1 -0
  177. package/dist/queries/cycle-evaluations.d.ts +23 -0
  178. package/dist/queries/cycle-evaluations.d.ts.map +1 -0
  179. package/dist/queries/cycle-evaluations.js +37 -0
  180. package/dist/queries/cycle-evaluations.js.map +1 -0
  181. package/dist/queries/escalations.d.ts +30 -0
  182. package/dist/queries/escalations.d.ts.map +1 -0
  183. package/dist/queries/escalations.js +42 -0
  184. package/dist/queries/escalations.js.map +1 -0
  185. package/dist/queries/execution-units.d.ts +76 -0
  186. package/dist/queries/execution-units.d.ts.map +1 -0
  187. package/dist/queries/execution-units.js +109 -0
  188. package/dist/queries/execution-units.js.map +1 -0
  189. package/dist/queries/gate-results.d.ts +32 -0
  190. package/dist/queries/gate-results.d.ts.map +1 -0
  191. package/dist/queries/gate-results.js +44 -0
  192. package/dist/queries/gate-results.js.map +1 -0
  193. package/dist/queries/instances.d.ts +51 -0
  194. package/dist/queries/instances.d.ts.map +1 -0
  195. package/dist/queries/instances.js +77 -0
  196. package/dist/queries/instances.js.map +1 -0
  197. package/dist/queries/sessions.d.ts +50 -0
  198. package/dist/queries/sessions.d.ts.map +1 -0
  199. package/dist/queries/sessions.js +81 -0
  200. package/dist/queries/sessions.js.map +1 -0
  201. package/dist/queries/shared.d.ts +38 -0
  202. package/dist/queries/shared.d.ts.map +1 -0
  203. package/dist/queries/shared.js +119 -0
  204. package/dist/queries/shared.js.map +1 -0
  205. package/dist/queries/specs.d.ts +12 -0
  206. package/dist/queries/specs.d.ts.map +1 -0
  207. package/dist/queries/specs.js +21 -0
  208. package/dist/queries/specs.js.map +1 -0
  209. package/dist/queries/strategies.d.ts +14 -0
  210. package/dist/queries/strategies.d.ts.map +1 -0
  211. package/dist/queries/strategies.js +18 -0
  212. package/dist/queries/strategies.js.map +1 -0
  213. package/dist/queries/work-units.d.ts +42 -0
  214. package/dist/queries/work-units.d.ts.map +1 -0
  215. package/dist/queries/work-units.js +57 -0
  216. package/dist/queries/work-units.js.map +1 -0
  217. package/dist/queries/workflows.d.ts +29 -0
  218. package/dist/queries/workflows.d.ts.map +1 -0
  219. package/dist/queries/workflows.js +103 -0
  220. package/dist/queries/workflows.js.map +1 -0
  221. package/dist/remediation-units.d.ts +40 -0
  222. package/dist/remediation-units.d.ts.map +1 -0
  223. package/dist/remediation-units.js +263 -0
  224. package/dist/remediation-units.js.map +1 -0
  225. package/dist/replanning.d.ts +72 -0
  226. package/dist/replanning.d.ts.map +1 -0
  227. package/dist/replanning.js +403 -0
  228. package/dist/replanning.js.map +1 -0
  229. package/dist/resource-limits.d.ts +62 -0
  230. package/dist/resource-limits.d.ts.map +1 -0
  231. package/dist/resource-limits.js +322 -0
  232. package/dist/resource-limits.js.map +1 -0
  233. package/dist/scheduler.d.ts +98 -0
  234. package/dist/scheduler.d.ts.map +1 -0
  235. package/dist/scheduler.js +203 -0
  236. package/dist/scheduler.js.map +1 -0
  237. package/dist/session-adapter.d.ts +89 -0
  238. package/dist/session-adapter.d.ts.map +1 -0
  239. package/dist/session-adapter.js +108 -0
  240. package/dist/session-adapter.js.map +1 -0
  241. package/dist/sop-generator.d.ts +29 -0
  242. package/dist/sop-generator.d.ts.map +1 -0
  243. package/dist/sop-generator.js +235 -0
  244. package/dist/sop-generator.js.map +1 -0
  245. package/dist/spec-profiles.d.ts +41 -0
  246. package/dist/spec-profiles.d.ts.map +1 -0
  247. package/dist/spec-profiles.js +131 -0
  248. package/dist/spec-profiles.js.map +1 -0
  249. package/dist/strategy-design-graph.d.ts +23 -0
  250. package/dist/strategy-design-graph.d.ts.map +1 -0
  251. package/dist/strategy-design-graph.js +205 -0
  252. package/dist/strategy-design-graph.js.map +1 -0
  253. package/dist/strategy-design-prompt.d.ts +28 -0
  254. package/dist/strategy-design-prompt.d.ts.map +1 -0
  255. package/dist/strategy-design-prompt.js +108 -0
  256. package/dist/strategy-design-prompt.js.map +1 -0
  257. package/dist/strategy-design-schema.d.ts +767 -0
  258. package/dist/strategy-design-schema.d.ts.map +1 -0
  259. package/dist/strategy-design-schema.js +126 -0
  260. package/dist/strategy-design-schema.js.map +1 -0
  261. package/dist/strategy-design.d.ts +69 -0
  262. package/dist/strategy-design.d.ts.map +1 -0
  263. package/dist/strategy-design.js +411 -0
  264. package/dist/strategy-design.js.map +1 -0
  265. package/dist/strategy-gating.d.ts +31 -0
  266. package/dist/strategy-gating.d.ts.map +1 -0
  267. package/dist/strategy-gating.js +276 -0
  268. package/dist/strategy-gating.js.map +1 -0
  269. package/dist/team-prompt-builder.d.ts +47 -0
  270. package/dist/team-prompt-builder.d.ts.map +1 -0
  271. package/dist/team-prompt-builder.js +362 -0
  272. package/dist/team-prompt-builder.js.map +1 -0
  273. package/dist/trace-engine.d.ts +40 -0
  274. package/dist/trace-engine.d.ts.map +1 -0
  275. package/dist/trace-engine.js +344 -0
  276. package/dist/trace-engine.js.map +1 -0
  277. package/dist/types.d.ts +612 -0
  278. package/dist/types.d.ts.map +1 -0
  279. package/dist/types.js +9 -0
  280. package/dist/types.js.map +1 -0
  281. package/dist/unit-session-lifecycle.d.ts +78 -0
  282. package/dist/unit-session-lifecycle.d.ts.map +1 -0
  283. package/dist/unit-session-lifecycle.js +141 -0
  284. package/dist/unit-session-lifecycle.js.map +1 -0
  285. package/dist/unit-session.d.ts +30 -0
  286. package/dist/unit-session.d.ts.map +1 -0
  287. package/dist/unit-session.js +370 -0
  288. package/dist/unit-session.js.map +1 -0
  289. package/dist/watchdogs.d.ts +33 -0
  290. package/dist/watchdogs.d.ts.map +1 -0
  291. package/dist/watchdogs.js +170 -0
  292. package/dist/watchdogs.js.map +1 -0
  293. package/dist/work-unit-scheduler.d.ts +34 -0
  294. package/dist/work-unit-scheduler.d.ts.map +1 -0
  295. package/dist/work-unit-scheduler.js +91 -0
  296. package/dist/work-unit-scheduler.js.map +1 -0
  297. package/dist/workflow-transition.d.ts +90 -0
  298. package/dist/workflow-transition.d.ts.map +1 -0
  299. package/dist/workflow-transition.js +340 -0
  300. package/dist/workflow-transition.js.map +1 -0
  301. package/package.json +65 -0
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Gate context formatter.
3
+ *
4
+ * Builds a human-readable summary of which gate layers were enabled on a
5
+ * blueprint and what they validate. Used to give AI reviewers and planners
6
+ * context about which validation dimensions the gate system already handles,
7
+ * so they do not flag test coverage, type safety, or E2E behavior as gaps.
8
+ *
9
+ * This module has no dependencies other than types, so it can be safely
10
+ * imported by any prompt builder without pulling in the full gate stack.
11
+ */
12
+ /**
13
+ * Build a human-readable summary of which gates were enabled on this blueprint
14
+ * and what they validated.
15
+ *
16
+ * Called only when all strategy-level gates have already passed, so every
17
+ * gate listed here is known to have succeeded before the review runs.
18
+ *
19
+ * Returns an empty string if no gates are enabled (caller should skip the section).
20
+ */
21
+ export function formatGateContext(blueprint) {
22
+ const enabled = new Set(blueprint.gatesEnabled);
23
+ if (enabled.size === 0)
24
+ return '';
25
+ const lines = [
26
+ '## Gate Validation Already Completed',
27
+ '',
28
+ 'Before this review, the factory gate system ran the following automated',
29
+ 'validation layers. All enabled gates PASSED before this review was invoked.',
30
+ '',
31
+ 'These dimensions are ALREADY VALIDATED by the gate layer. Do NOT flag them',
32
+ 'as specification gaps:',
33
+ '- Test coverage and test results',
34
+ '- TypeScript type correctness',
35
+ '- Build validity',
36
+ '- Runtime behavioral correctness (E2E)',
37
+ '- Adversarial edge cases',
38
+ '',
39
+ ];
40
+ if (enabled.has('deterministic')) {
41
+ const cmds = blueprint.deterministicConfig?.commands ??
42
+ ['npm run typecheck', 'npm run lint', 'npm test', 'npm run build'];
43
+ lines.push('### Deterministic Gates: PASSED');
44
+ for (const cmd of cmds) {
45
+ lines.push(`- \`${cmd}\``);
46
+ }
47
+ lines.push('');
48
+ }
49
+ if (enabled.has('behavioral')) {
50
+ const glob = blueprint.behavioralConfig?.testGlob ?? 'tests/**/*.spec.ts';
51
+ lines.push('### Behavioral Gates: PASSED');
52
+ lines.push(`- Playwright E2E tests matching \`${glob}\``);
53
+ lines.push('');
54
+ }
55
+ if (enabled.has('adversarial')) {
56
+ const sessions = blueprint.adversarialConfig?.maxSessions ?? 3;
57
+ lines.push('### Adversarial Gates: PASSED');
58
+ lines.push(`- AI adversary (up to ${sessions} session(s)) generated and ran break-attempt Playwright tests`);
59
+ lines.push('');
60
+ }
61
+ return lines.join('\n');
62
+ }
63
+ //# sourceMappingURL=gate-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-context.js","sourceRoot":"","sources":["../src/gate-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAA2B;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,KAAK,GAAa;QACtB,sCAAsC;QACtC,EAAE;QACF,yEAAyE;QACzE,6EAA6E;QAC7E,EAAE;QACF,4EAA4E;QAC5E,wBAAwB;QACxB,kCAAkC;QAClC,+BAA+B;QAC/B,kBAAkB;QAClB,wCAAwC;QACxC,0BAA0B;QAC1B,EAAE;KACH,CAAC;IAEF,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,mBAAmB,EAAE,QAAQ;YAClD,CAAC,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,EAAE,QAAQ,IAAI,oBAAoB,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,qCAAqC,IAAI,IAAI,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,iBAAiB,EAAE,WAAW,IAAI,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CACR,yBAAyB,QAAQ,+DAA+D,CACjG,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Gate evaluation engine orchestrator.
3
+ *
4
+ * Orchestrates the 3-layer gate architecture for a work unit:
5
+ * 1. Deterministic gates (typecheck, lint, test, build)
6
+ * 2. Behavioral gates (Playwright E2E against dev server)
7
+ * 3. Adversarial gates (AI-generated break-attempt tests)
8
+ *
9
+ * Each layer only runs after the previous layer passes. Results are recorded
10
+ * to factory_gate_results via the API layer. On failure, gate output is
11
+ * formatted as structured feedback for the builder session to use in its
12
+ * next iteration.
13
+ */
14
+ import type { ResourceGovernor } from '@telora/daemon-core';
15
+ import type { FactoryInstanceState, FactoryConfig, GateType, GateCheckResult } from './types.js';
16
+ /** Result of evaluating all gate layers for a work unit. */
17
+ export interface GateEvaluationResult {
18
+ /** Whether all enabled gate layers passed. */
19
+ passed: boolean;
20
+ /** Per-layer results in order of evaluation. */
21
+ layers: GateLayerResult[];
22
+ /** Formatted feedback string for the builder on failure. */
23
+ failureFeedback: string | null;
24
+ }
25
+ /** Result of a single gate layer. */
26
+ interface GateLayerResult {
27
+ gateType: GateType;
28
+ passed: boolean;
29
+ results: GateCheckResult[];
30
+ durationMs: number;
31
+ }
32
+ /** Context for attributing gate results to the right entity. */
33
+ export interface GateContext {
34
+ /** Strategy being evaluated. */
35
+ strategyId: string;
36
+ /** Factory instance ID. */
37
+ instanceId: string;
38
+ /** Current iteration number. */
39
+ iteration: number;
40
+ }
41
+ /**
42
+ * Evaluate all gate layers for a strategy or work unit.
43
+ *
44
+ * Runs enabled gate layers sequentially (deterministic -> behavioral -> adversarial).
45
+ * Each layer only runs if the previous layer passed. Records all results to the
46
+ * database via the API layer.
47
+ *
48
+ * @param ctx Context identifying what is being gated (strategy or work unit).
49
+ * @param instanceState The parent factory instance state.
50
+ * @param config Factory configuration.
51
+ * @returns The evaluation result with pass/fail and optional failure feedback.
52
+ */
53
+ export declare function evaluateGates(ctx: GateContext, instanceState: FactoryInstanceState, config: FactoryConfig, governor?: ResourceGovernor | null): Promise<GateEvaluationResult>;
54
+ export {};
55
+ //# sourceMappingURL=gate-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-engine.d.ts","sourceRoot":"","sources":["../src/gate-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,QAAQ,EACR,eAAe,EAChB,MAAM,YAAY,CAAC;AAWpB,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,4DAA4D;IAC5D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,qCAAqC;AACrC,UAAU,eAAe;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,oBAAoB,EACnC,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAoF/B"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Gate evaluation engine orchestrator.
3
+ *
4
+ * Orchestrates the 3-layer gate architecture for a work unit:
5
+ * 1. Deterministic gates (typecheck, lint, test, build)
6
+ * 2. Behavioral gates (Playwright E2E against dev server)
7
+ * 3. Adversarial gates (AI-generated break-attempt tests)
8
+ *
9
+ * Each layer only runs after the previous layer passes. Results are recorded
10
+ * to factory_gate_results via the API layer. On failure, gate output is
11
+ * formatted as structured feedback for the builder session to use in its
12
+ * next iteration.
13
+ */
14
+ import { createGateResult } from './queries/gate-results.js';
15
+ import { runDeterministicGates } from './gates/deterministic.js';
16
+ import { runBehavioralGates } from './gates/behavioral.js';
17
+ import { runAdversarialGates } from './gates/adversarial.js';
18
+ import { resolveExecutionProfile } from './spec-profiles.js';
19
+ /**
20
+ * Evaluate all gate layers for a strategy or work unit.
21
+ *
22
+ * Runs enabled gate layers sequentially (deterministic -> behavioral -> adversarial).
23
+ * Each layer only runs if the previous layer passed. Records all results to the
24
+ * database via the API layer.
25
+ *
26
+ * @param ctx Context identifying what is being gated (strategy or work unit).
27
+ * @param instanceState The parent factory instance state.
28
+ * @param config Factory configuration.
29
+ * @returns The evaluation result with pass/fail and optional failure feedback.
30
+ */
31
+ export async function evaluateGates(ctx, instanceState, config, governor) {
32
+ const blueprint = instanceState.blueprint;
33
+ const worktreePath = instanceState.worktreePath;
34
+ const specification = instanceState.specification ?? '';
35
+ const label = `strategy ${ctx.strategyId}`;
36
+ if (!worktreePath) {
37
+ return {
38
+ passed: false,
39
+ layers: [],
40
+ failureFeedback: 'No worktree path set on instance -- cannot evaluate gates.',
41
+ };
42
+ }
43
+ // Start with blueprint-enabled gates, then intersect with execution profile.
44
+ const blueprintGates = new Set(blueprint.gatesEnabled);
45
+ const profile = resolveExecutionProfile(instanceState.specType ?? null, blueprint);
46
+ const profileGates = new Set(Object.entries(profile.gatesEnabled)
47
+ .filter(([, enabled]) => enabled)
48
+ .map(([name]) => name));
49
+ const enabledGates = new Set([...blueprintGates].filter((g) => profileGates.has(g)));
50
+ const skipped = [...blueprintGates].filter((g) => !profileGates.has(g));
51
+ if (skipped.length > 0) {
52
+ console.log(`[gate-engine] Spec type "${instanceState.specType}" profile disables gates: [${skipped.join(', ')}]`);
53
+ }
54
+ const layers = [];
55
+ console.log(`[gate-engine] Evaluating gates for ${label} ` +
56
+ `(iteration ${ctx.iteration}, enabled: [${[...enabledGates].join(', ')}])`);
57
+ // Layer 1: Deterministic
58
+ if (enabledGates.has('deterministic')) {
59
+ const layerResult = await runLayer('deterministic', () => runDeterministicGates(worktreePath, blueprint.deterministicConfig, blueprint.traceChecks), ctx);
60
+ layers.push(layerResult);
61
+ if (!layerResult.passed)
62
+ return buildResult(false, layers);
63
+ }
64
+ // Layer 2: Behavioral
65
+ if (enabledGates.has('behavioral')) {
66
+ const layerResult = await runLayer('behavioral', () => runBehavioralGates(worktreePath, blueprint.behavioralConfig), ctx);
67
+ layers.push(layerResult);
68
+ if (!layerResult.passed)
69
+ return buildResult(false, layers);
70
+ }
71
+ // Layer 3: Adversarial
72
+ if (enabledGates.has('adversarial')) {
73
+ const layerResult = await runLayer('adversarial', () => runAdversarialGates(worktreePath, specification, blueprint.adversarialConfig, instanceState.instanceId, config.claudeCodePath, governor), ctx);
74
+ layers.push(layerResult);
75
+ if (!layerResult.passed)
76
+ return buildResult(false, layers);
77
+ }
78
+ if (layers.length === 0) {
79
+ console.log('[gate-engine] No gates enabled -- auto-passing');
80
+ }
81
+ return buildResult(true, layers);
82
+ }
83
+ // ============================================================================
84
+ // Layer runner
85
+ // ============================================================================
86
+ /**
87
+ * Run a single gate layer and record results to the database.
88
+ */
89
+ async function runLayer(gateType, runner, ctx) {
90
+ const startTime = Date.now();
91
+ console.log(`[gate-engine] Running ${gateType} gates...`);
92
+ try {
93
+ const { passed, results } = await runner();
94
+ const durationMs = Date.now() - startTime;
95
+ // Record each check result to the database
96
+ for (const check of results) {
97
+ try {
98
+ await createGateResult({
99
+ strategyId: ctx.strategyId,
100
+ instanceId: ctx.instanceId,
101
+ gateType,
102
+ iteration: ctx.iteration,
103
+ passed: check.passed,
104
+ checkName: check.checkName,
105
+ output: check.output,
106
+ durationMs: check.durationMs,
107
+ isAdversaryGenerated: check.isAdversaryGenerated,
108
+ });
109
+ }
110
+ catch (err) {
111
+ console.warn(`[gate-engine] Failed to record gate result for ${check.checkName}:`, err.message);
112
+ }
113
+ }
114
+ console.log(`[gate-engine] ${gateType} gates ${passed ? 'PASSED' : 'FAILED'} ` +
115
+ `(${results.length} check(s), ${durationMs}ms)`);
116
+ return { gateType, passed, results, durationMs };
117
+ }
118
+ catch (err) {
119
+ const durationMs = Date.now() - startTime;
120
+ const errorResult = {
121
+ checkName: `${gateType}-error`,
122
+ passed: false,
123
+ output: `Gate layer threw an error: ${err.message}`,
124
+ durationMs,
125
+ isAdversaryGenerated: false,
126
+ };
127
+ try {
128
+ await createGateResult({
129
+ strategyId: ctx.strategyId,
130
+ instanceId: ctx.instanceId,
131
+ gateType,
132
+ iteration: ctx.iteration,
133
+ passed: false,
134
+ checkName: errorResult.checkName,
135
+ output: errorResult.output,
136
+ durationMs,
137
+ });
138
+ }
139
+ catch {
140
+ // Best effort
141
+ }
142
+ console.error(`[gate-engine] ${gateType} gates ERROR: ${err.message} (${durationMs}ms)`);
143
+ return { gateType, passed: false, results: [errorResult], durationMs };
144
+ }
145
+ }
146
+ // ============================================================================
147
+ // Result builder
148
+ // ============================================================================
149
+ /**
150
+ * Build the final evaluation result with optional failure feedback.
151
+ */
152
+ function buildResult(passed, layers) {
153
+ if (passed) {
154
+ return { passed: true, layers, failureFeedback: null };
155
+ }
156
+ // Format failure feedback for the builder
157
+ const feedback = formatFailureFeedback(layers);
158
+ return { passed: false, layers, failureFeedback: feedback };
159
+ }
160
+ /**
161
+ * Format gate failure output into structured feedback for the builder session.
162
+ *
163
+ * The builder receives this as context for its next iteration attempt.
164
+ * Format: markdown-like sections with check names, pass/fail status,
165
+ * and relevant output.
166
+ */
167
+ function formatFailureFeedback(layers) {
168
+ const sections = [];
169
+ for (const layer of layers) {
170
+ if (layer.passed) {
171
+ sections.push(`## ${layer.gateType} gates: PASSED`);
172
+ continue;
173
+ }
174
+ sections.push(`## ${layer.gateType} gates: FAILED`);
175
+ for (const check of layer.results) {
176
+ const status = check.passed ? 'PASS' : 'FAIL';
177
+ sections.push(`### [${status}] ${check.checkName}`);
178
+ if (!check.passed && check.output) {
179
+ // Include failure output, truncated if very long
180
+ const output = check.output.length > 5000
181
+ ? '...[truncated]...\n' + check.output.slice(-5000)
182
+ : check.output;
183
+ sections.push('```');
184
+ sections.push(output);
185
+ sections.push('```');
186
+ }
187
+ }
188
+ }
189
+ return sections.join('\n');
190
+ }
191
+ //# sourceMappingURL=gate-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-engine.js","sourceRoot":"","sources":["../src/gate-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Adversarial gate evaluation.
3
+ *
4
+ * Spawns a separate Claude Code session (the "adversary") that tries to
5
+ * break the builder's implementation by writing Playwright tests. Tests
6
+ * accumulate in an external directory OUTSIDE the worktree so builder
7
+ * agents never see adversary-generated test files.
8
+ *
9
+ * External test directory: `{worktreePath}-adversary/` (sibling to the
10
+ * factory worktree). This directory is created on first adversary run
11
+ * and cleaned up when the instance completes.
12
+ *
13
+ * The adversary prompt contains ONLY:
14
+ * 1. The factory specification text
15
+ * 2. The current source file contents from the worktree
16
+ *
17
+ * Builder reasoning, logs, and stream.jsonl are NEVER included.
18
+ *
19
+ * After each adversary session, ALL accumulated adversary tests are run
20
+ * (not just the new ones). Results are marked with isAdversaryGenerated=true.
21
+ */
22
+ import type { ResourceGovernor } from '@telora/daemon-core';
23
+ import type { AdversarialGateConfig, GateCheckResult } from '../types.js';
24
+ /**
25
+ * Derive the external adversary test directory path from a worktree path.
26
+ *
27
+ * Returns `{worktreePath}-adversary/` -- a sibling directory that lives
28
+ * outside the git worktree so builder agents never see adversary tests.
29
+ */
30
+ export declare function getAdversaryTestDir(worktreePath: string): string;
31
+ /**
32
+ * Remove the external adversary test directory for a completed instance.
33
+ *
34
+ * Safe to call even if the directory does not exist. Callers should invoke
35
+ * this alongside worktree removal when an instance reaches a terminal state.
36
+ */
37
+ export declare function cleanupAdversaryTestDir(worktreePath: string): void;
38
+ /**
39
+ * Run adversarial gates for a work unit's implementation.
40
+ *
41
+ * Spawns up to `config.maxSessions` adversary Claude Code sessions, each
42
+ * writing Playwright tests to an external directory outside the worktree.
43
+ * After all sessions complete, runs ALL accumulated adversary tests and
44
+ * returns the results.
45
+ *
46
+ * Each adversary session is tracked with session_type='adversary'.
47
+ *
48
+ * @param worktreePath Absolute path to the factory worktree.
49
+ * @param specification The factory specification text.
50
+ * @param config Adversarial gate config from the blueprint (nullable).
51
+ * @param instanceId Factory instance ID (for session tracking).
52
+ * @param claudeCodePath Path to the Claude Code CLI executable.
53
+ * @returns Overall pass/fail and individual check results.
54
+ */
55
+ export declare function runAdversarialGates(worktreePath: string, specification: string, config: AdversarialGateConfig | null, instanceId: string, claudeCodePath: string, governor?: ResourceGovernor | null): Promise<{
56
+ passed: boolean;
57
+ results: GateCheckResult[];
58
+ }>;
59
+ //# sourceMappingURL=adversarial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adversarial.d.ts","sourceRoot":"","sources":["../../src/gates/adversarial.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAgC1E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAalE;AAiTD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,qBAAqB,GAAG,IAAI,EACpC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAgJ1D"}