@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,336 @@
1
+ /**
2
+ * Instance-level completion gate.
3
+ *
4
+ * Runs after ALL work units are completed but BEFORE the instance transitions
5
+ * to 'completed'. An AI reviewer evaluates the full specification against
6
+ * the entire codebase diff and determines whether everything is actually done.
7
+ *
8
+ * On failure, gaps are converted to remediation work units and the instance
9
+ * goes back to 'building'.
10
+ */
11
+ import { randomUUID } from 'node:crypto';
12
+ import { z } from 'zod';
13
+ import { buildPlanningEnv, extractWorkPlanJson } from './planning.js';
14
+ import { formatGateContext } from './gate-context.js';
15
+ import { spawnAsync } from './process-runner.js';
16
+ import { runGit } from './git-factory.js';
17
+ import { createWorkUnits, getInstanceWorkUnits } from './queries/work-units.js';
18
+ import { resolveTraceChecks, runTraceChecks, formatTraceOutput } from './trace-engine.js';
19
+ import { generateFactorySOP } from './sop-generator.js';
20
+ // ============================================================================
21
+ // Constants
22
+ // ============================================================================
23
+ /** Timeout for the completion gate Claude Code session (5 minutes). */
24
+ const GATE_TIMEOUT_MS = 300_000;
25
+ /** Maximum diff size in characters before truncation. */
26
+ const MAX_DIFF_CHARS = 50_000;
27
+ /** Log prefix for this module. */
28
+ const LOG_PREFIX = '[completion-gate]';
29
+ // ============================================================================
30
+ // Zod schemas
31
+ // ============================================================================
32
+ const CompletionGapSchema = z.object({
33
+ area: z.string().min(1),
34
+ description: z.string().min(1),
35
+ severity: z.enum(['critical', 'important']),
36
+ suggestedFix: z.string().min(1),
37
+ });
38
+ const CompletionGateResultSchema = z.object({
39
+ passed: z.boolean(),
40
+ confidence: z.enum(['high', 'medium', 'low']),
41
+ summary: z.string().min(1),
42
+ gaps: z.array(CompletionGapSchema),
43
+ suggestions: z.array(z.string()),
44
+ });
45
+ // ============================================================================
46
+ // Diff generator
47
+ // ============================================================================
48
+ /**
49
+ * Generate the full diff between the factory branch and main.
50
+ *
51
+ * Includes a stat summary header followed by the full diff.
52
+ * Truncates to MAX_DIFF_CHARS to avoid blowing up the review prompt.
53
+ */
54
+ export function generateInstanceDiff(worktreePath, branchName) {
55
+ // Get stat summary
56
+ const statResult = runGit(['diff', `main...${branchName}`, '--stat'], worktreePath);
57
+ // Get full diff
58
+ const diffResult = runGit(['diff', `main...${branchName}`], worktreePath);
59
+ const stat = statResult.success ? statResult.output : '[stat unavailable]';
60
+ const diff = diffResult.success ? diffResult.output : '';
61
+ if (!diff) {
62
+ return '[No changes detected between factory branch and main]';
63
+ }
64
+ let combined = `## Diff Summary\n${stat}\n\n## Full Diff\n${diff}`;
65
+ if (combined.length > MAX_DIFF_CHARS) {
66
+ combined =
67
+ combined.slice(0, MAX_DIFF_CHARS) +
68
+ `\n\n[diff truncated at ${MAX_DIFF_CHARS} chars -- review codebase directly for full changes]`;
69
+ }
70
+ return combined;
71
+ }
72
+ export { formatGateContext } from './gate-context.js';
73
+ // ============================================================================
74
+ // Review prompt builder
75
+ // ============================================================================
76
+ /**
77
+ * Build the prompt for the completion gate AI reviewer.
78
+ */
79
+ export function buildCompletionReviewPrompt(specification, blueprint, workUnits, diffText, strategies, gateContext) {
80
+ const parts = [
81
+ 'You are a completion reviewer for a software factory system.',
82
+ 'Your task is to identify any requirement described in the specification that has',
83
+ 'no corresponding implementation in the diff.',
84
+ '',
85
+ '## Specification',
86
+ specification,
87
+ ];
88
+ if (blueprint.operationalNotes) {
89
+ parts.push('', '## Operational Notes', blueprint.operationalNotes);
90
+ }
91
+ // Pipeline SOP (generated from promise contracts)
92
+ const sop = generateFactorySOP(blueprint.pipelineGraph);
93
+ if (sop) {
94
+ parts.push('', sop);
95
+ }
96
+ // Strategy-aware work unit summary
97
+ if (strategies && strategies.length > 0) {
98
+ parts.push('', '## Strategies and Work Units');
99
+ const sorted = [...strategies].sort((a, b) => a.priorityRank - b.priorityRank);
100
+ for (const s of sorted) {
101
+ parts.push(``, `### Strategy: ${s.name}`);
102
+ if (s.description)
103
+ parts.push(s.description);
104
+ const strategyUnits = workUnits.filter((wu) => wu.strategyId === s.id && !wu.infrastructureOwned);
105
+ if (strategyUnits.length > 0) {
106
+ parts.push('', 'Work units:');
107
+ for (const wu of strategyUnits) {
108
+ parts.push(`- ${wu.title} (${wu.iterationCount} iteration(s)): ${wu.description ?? 'No description'}`);
109
+ }
110
+ }
111
+ }
112
+ // Include any orphan work units (no strategy)
113
+ const orphans = workUnits.filter((wu) => !wu.strategyId && !wu.infrastructureOwned);
114
+ if (orphans.length > 0) {
115
+ parts.push('', '### Unscoped Work Units');
116
+ for (const wu of orphans) {
117
+ parts.push(`- ${wu.title} (${wu.iterationCount} iteration(s)): ${wu.description ?? 'No description'}`);
118
+ }
119
+ }
120
+ }
121
+ else {
122
+ // Legacy: flat work unit summary
123
+ parts.push('', '## Work Units Completed');
124
+ const agentUnits = workUnits.filter(wu => !wu.infrastructureOwned);
125
+ for (const wu of agentUnits) {
126
+ parts.push(`- ${wu.title} (${wu.iterationCount} iteration(s)): ${wu.description ?? 'No description'}`);
127
+ }
128
+ }
129
+ parts.push('', '## Changes Made', diffText);
130
+ if (gateContext) {
131
+ parts.push('', gateContext);
132
+ }
133
+ // Infrastructure gate ownership context
134
+ parts.push('', '## Infrastructure-Owned Gate Verification', '', 'The factory engine pre-creates a "Gate verification" work unit per strategy.', 'This unit is infrastructure-owned and resolved automatically by the gate engine.', 'Do NOT flag missing gate verification, build validation, typecheck, lint, or', 'test execution work units as gaps -- these are handled by factory infrastructure.');
135
+ parts.push('', '## Instructions', '', 'For each requirement described in the specification, check whether there is evidence', 'of a corresponding implementation in the diff. If evidence exists, the requirement is', 'implemented. If no evidence exists anywhere in the diff, it is a gap.', '', 'A gap is only valid if:', '1. A specific capability is described in the specification, AND', '2. Nothing in the diff implements it', '', 'Do NOT assess whether the implementation is thorough, well-tested, or high quality --', 'gates already answered those questions. Your only job is spec requirement presence.', '', 'For each gap found:', '- Classify as "critical" (a spec requirement with no implementation) or "important" (partially addressed)', '- Provide a specific suggested fix description', '', '## Output Format', 'Return ONLY a JSON object (no markdown fencing, no commentary):', '```', '{', ' "passed": true/false,', ' "confidence": "high" | "medium" | "low",', ' "summary": "Overall assessment of spec requirement coverage",', ' "gaps": [', ' {', ' "area": "The spec requirement that is absent",', ' "description": "What the spec says and why nothing in the diff addresses it",', ' "severity": "critical" | "important",', ' "suggestedFix": "How to fix it"', ' }', ' ],', ' "suggestions": ["Optional non-blocking improvements"]', '}', '```', '', 'Rules:', '- Set "passed" to true ONLY if every spec requirement has corresponding implementation in the diff', '- If there are critical gaps (spec requirements with no implementation), "passed" must be false', '- Important gaps alone do not force "passed" to false (use judgment)', '- Return ONLY the JSON object, nothing else');
136
+ return parts.join('\n');
137
+ }
138
+ // ============================================================================
139
+ // Main gate function
140
+ // ============================================================================
141
+ /**
142
+ * Run the instance-level completion gate.
143
+ *
144
+ * Spawns Claude Code in --print mode to review the full diff against
145
+ * the specification. Returns a validated CompletionGateResult or null
146
+ * on any failure.
147
+ *
148
+ * @param state The factory instance state (needs worktreePath, branchName, specification, blueprint)
149
+ * @param config Factory configuration
150
+ * @param workUnits All work units for the instance (for context)
151
+ * @returns Validated CompletionGateResult or null on failure
152
+ */
153
+ export async function runCompletionGate(state, config, workUnits, governor) {
154
+ if (!state.worktreePath || !state.branchName || !state.specification) {
155
+ console.warn(`${LOG_PREFIX} Missing worktree/branch/spec on instance ${state.instanceId}`);
156
+ return null;
157
+ }
158
+ // Step 1: Run trace checks (deterministic, fast) -- short-circuits AI review on failure
159
+ if (state.blueprint.traceChecks.length > 0) {
160
+ const resolved = resolveTraceChecks(state.blueprint.traceChecks);
161
+ if (resolved.length > 0) {
162
+ console.log(`${LOG_PREFIX} Running ${resolved.length} trace check(s) before AI review...`);
163
+ const traceResults = await runTraceChecks(resolved, state.worktreePath);
164
+ const traceFailed = traceResults.filter((r) => !r.passed);
165
+ if (traceFailed.length > 0) {
166
+ console.log(`${LOG_PREFIX} ${traceFailed.length} trace check(s) failed -- skipping AI review`);
167
+ return {
168
+ passed: false,
169
+ confidence: 'high',
170
+ summary: `${traceFailed.length} cross-boundary dependency trace(s) failed`,
171
+ gaps: traceFailed.map((t) => ({
172
+ area: t.checkName,
173
+ description: formatTraceOutput(t),
174
+ severity: 'critical',
175
+ suggestedFix: t.missingTargets.length > 0
176
+ ? `Add missing targets: ${t.missingTargets.map((m) => m.value).join(', ')}`
177
+ : 'Fix the trace check errors',
178
+ })),
179
+ suggestions: [],
180
+ };
181
+ }
182
+ console.log(`${LOG_PREFIX} All trace checks passed`);
183
+ }
184
+ }
185
+ // Step 2: Generate diff and run AI review
186
+ console.log(`${LOG_PREFIX} Generating instance diff for ${state.branchName}...`);
187
+ const diffText = generateInstanceDiff(state.worktreePath, state.branchName);
188
+ // Fetch strategies for strategy-aware review prompt
189
+ let strategies;
190
+ const hasStrategies = workUnits.some((wu) => wu.strategyId !== null);
191
+ if (hasStrategies) {
192
+ try {
193
+ const { getStrategiesByFactoryInstance } = await import('./strategy-design.js');
194
+ strategies = await getStrategiesByFactoryInstance(state.instanceId);
195
+ }
196
+ catch {
197
+ // Non-fatal: proceed without strategy context
198
+ }
199
+ }
200
+ // Build prompt -- include gate context so the reviewer knows what was already validated
201
+ const gateContext = formatGateContext(state.blueprint);
202
+ const prompt = buildCompletionReviewPrompt(state.specification, state.blueprint, workUnits, diffText, strategies, gateContext);
203
+ // Spawn Claude Code
204
+ let rawOutput;
205
+ if (governor)
206
+ await governor.acquireSlot('factory');
207
+ try {
208
+ const args = ['--print', '--output-format', 'json', '--verbose'];
209
+ const env = buildPlanningEnv(config);
210
+ console.log(`${LOG_PREFIX} Spawning Claude Code for completion review...`);
211
+ rawOutput = await spawnAsync(config.claudeCodePath, args, {
212
+ input: prompt,
213
+ encoding: 'utf-8',
214
+ timeout: GATE_TIMEOUT_MS,
215
+ cwd: state.worktreePath,
216
+ env,
217
+ });
218
+ }
219
+ catch (err) {
220
+ const execErr = err;
221
+ if (execErr.killed || execErr.signal === 'SIGTERM') {
222
+ console.warn(`${LOG_PREFIX} Completion review timed out after ${GATE_TIMEOUT_MS / 1000}s`);
223
+ }
224
+ else {
225
+ console.warn(`${LOG_PREFIX} Completion review failed: ${execErr.message ?? 'unknown error'}`);
226
+ }
227
+ return null;
228
+ }
229
+ finally {
230
+ if (governor)
231
+ governor.releaseSlot('factory');
232
+ }
233
+ if (!rawOutput || rawOutput.trim().length === 0) {
234
+ console.warn(`${LOG_PREFIX} Completion review returned empty output`);
235
+ return null;
236
+ }
237
+ // Extract and validate JSON
238
+ let jsonStr;
239
+ try {
240
+ jsonStr = extractWorkPlanJson(rawOutput);
241
+ }
242
+ catch (err) {
243
+ console.warn(`${LOG_PREFIX} Failed to extract JSON: ${err instanceof Error ? err.message : String(err)}`);
244
+ return null;
245
+ }
246
+ let parsedJson;
247
+ try {
248
+ parsedJson = JSON.parse(jsonStr);
249
+ }
250
+ catch (err) {
251
+ console.warn(`${LOG_PREFIX} Output is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
252
+ return null;
253
+ }
254
+ // Normalize: AI sometimes returns a bare array instead of an object.
255
+ if (Array.isArray(parsedJson)) {
256
+ if (parsedJson.length === 1 && typeof parsedJson[0] === 'object' && parsedJson[0] !== null && !Array.isArray(parsedJson[0])) {
257
+ parsedJson = parsedJson[0];
258
+ }
259
+ }
260
+ const validation = CompletionGateResultSchema.safeParse(parsedJson);
261
+ if (!validation.success) {
262
+ const issues = validation.error.issues
263
+ .map((i) => `${i.path.join('.')}: ${i.message}`)
264
+ .join('; ');
265
+ console.warn(`${LOG_PREFIX} Validation failed: ${issues}`);
266
+ return null;
267
+ }
268
+ const result = validation.data;
269
+ console.log(`${LOG_PREFIX} Completion review: ${result.passed ? 'PASSED' : 'FAILED'} ` +
270
+ `(confidence: ${result.confidence}, gaps: ${result.gaps.length})`);
271
+ return result;
272
+ }
273
+ // ============================================================================
274
+ // Remediation work unit generation
275
+ // ============================================================================
276
+ /**
277
+ * Convert critical completion gate gaps into remediation work units.
278
+ *
279
+ * Only critical-severity gaps produce new work units. Important gaps are
280
+ * logged but not auto-remediated. If generating remediation units would
281
+ * exceed the blueprint's maxWorkUnits limit, no units are created and
282
+ * the function returns an empty array (caller should escalate).
283
+ *
284
+ * @param state The factory instance state
285
+ * @param gateResult The completion gate result with gaps
286
+ * @returns Array of created work units (empty if none needed or limit exceeded)
287
+ */
288
+ export async function generateRemediationWorkUnits(state, gateResult) {
289
+ const criticalGaps = gateResult.gaps.filter((g) => g.severity === 'critical');
290
+ if (criticalGaps.length === 0) {
291
+ // No critical gaps -- all gaps are 'important' (informational)
292
+ if (gateResult.gaps.length > 0) {
293
+ console.log(`${LOG_PREFIX} ${gateResult.gaps.length} important gap(s) noted but not auto-remediated`);
294
+ }
295
+ return [];
296
+ }
297
+ // Check maxWorkUnits limit
298
+ if (state.blueprint.maxWorkUnits !== null) {
299
+ const existingUnits = await getInstanceWorkUnits(state.instanceId);
300
+ if (existingUnits.length + criticalGaps.length > state.blueprint.maxWorkUnits) {
301
+ console.warn(`${LOG_PREFIX} Cannot create ${criticalGaps.length} remediation units: ` +
302
+ `would exceed maxWorkUnits (${existingUnits.length} existing + ` +
303
+ `${criticalGaps.length} new > ${state.blueprint.maxWorkUnits} limit)`);
304
+ return [];
305
+ }
306
+ }
307
+ // Build remediation work unit definitions
308
+ const existingUnits = await getInstanceWorkUnits(state.instanceId);
309
+ const maxSortOrder = existingUnits.reduce((max, wu) => Math.max(max, wu.sortOrder), -1);
310
+ const units = criticalGaps.map((gap, i) => ({
311
+ id: randomUUID(),
312
+ title: `[Remediation] ${gap.area}`,
313
+ description: [
314
+ '## Completion Gate Remediation',
315
+ '',
316
+ 'The completion gate identified this gap after all initial work units were completed.',
317
+ '',
318
+ `### Gap: ${gap.area}`,
319
+ gap.description,
320
+ '',
321
+ '### Suggested Fix',
322
+ gap.suggestedFix,
323
+ '',
324
+ '### Context',
325
+ 'This work unit was auto-generated by the completion gate. The original specification',
326
+ 'and all prior work units have been completed. Focus specifically on addressing this gap.',
327
+ ].join('\n'),
328
+ sortOrder: maxSortOrder + 1 + i,
329
+ blockedBy: [],
330
+ cycleNumber: state.completionGateIterations + 1,
331
+ }));
332
+ const created = await createWorkUnits(state.instanceId, units);
333
+ console.log(`${LOG_PREFIX} Created ${created.length} remediation work unit(s) from completion gate gaps`);
334
+ return created;
335
+ }
336
+ //# sourceMappingURL=completion-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-gate.js","sourceRoot":"","sources":["../src/completion-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAS1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,uEAAuE;AACvE,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,yDAAyD;AACzD,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,kCAAkC;AAClC,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAEvC,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAChC,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAClC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACjC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,UAAkB;IAElB,mBAAmB;IACnB,MAAM,UAAU,GAAG,MAAM,CACvB,CAAC,MAAM,EAAE,UAAU,UAAU,EAAE,EAAE,QAAQ,CAAC,EAC1C,YAAY,CACb,CAAC;IAEF,gBAAgB;IAChB,MAAM,UAAU,GAAG,MAAM,CACvB,CAAC,MAAM,EAAE,UAAU,UAAU,EAAE,CAAC,EAChC,YAAY,CACb,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,uDAAuD,CAAC;IACjE,CAAC;IAED,IAAI,QAAQ,GAAG,oBAAoB,IAAI,qBAAqB,IAAI,EAAE,CAAC;IAEnE,IAAI,QAAQ,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACrC,QAAQ;YACN,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;gBACjC,0BAA0B,cAAc,sDAAsD,CAAC;IACnG,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,aAAqB,EACrB,SAA2B,EAC3B,SAA4B,EAC5B,QAAgB,EAChB,UAAgC,EAChC,WAAoB;IAEpB,MAAM,KAAK,GAAa;QACtB,8DAA8D;QAC9D,kFAAkF;QAClF,8CAA8C;QAC9C,EAAE;QACF,kBAAkB;QAClB,aAAa;KACd,CAAC;IAEF,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACrE,CAAC;IAED,kDAAkD;IAClD,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACxD,IAAI,GAAG,EAAE,CAAC;QACR,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,mCAAmC;IACnC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAC/E,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;YAClG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBAC9B,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,cAAc,mBAAmB,EAAE,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC,CAAC;gBACzG,CAAC;YACH,CAAC;QACH,CAAC;QACD,8CAA8C;QAC9C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;QACpF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;YAC1C,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,cAAc,mBAAmB,EAAE,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC,CAAC;YACzG,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;QACnE,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,cAAc,mBAAmB,EAAE,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAE5C,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC9B,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,IAAI,CACR,EAAE,EACF,2CAA2C,EAC3C,EAAE,EACF,8EAA8E,EAC9E,kFAAkF,EAClF,8EAA8E,EAC9E,mFAAmF,CACpF,CAAC;IAEF,KAAK,CAAC,IAAI,CACR,EAAE,EACF,iBAAiB,EACjB,EAAE,EACF,sFAAsF,EACtF,uFAAuF,EACvF,uEAAuE,EACvE,EAAE,EACF,yBAAyB,EACzB,iEAAiE,EACjE,sCAAsC,EACtC,EAAE,EACF,uFAAuF,EACvF,qFAAqF,EACrF,EAAE,EACF,qBAAqB,EACrB,2GAA2G,EAC3G,gDAAgD,EAChD,EAAE,EACF,kBAAkB,EAClB,iEAAiE,EACjE,KAAK,EACL,GAAG,EACH,yBAAyB,EACzB,4CAA4C,EAC5C,iEAAiE,EACjE,aAAa,EACb,OAAO,EACP,sDAAsD,EACtD,qFAAqF,EACrF,6CAA6C,EAC7C,uCAAuC,EACvC,OAAO,EACP,MAAM,EACN,yDAAyD,EACzD,GAAG,EACH,KAAK,EACL,EAAE,EACF,QAAQ,EACR,oGAAoG,EACpG,iGAAiG,EACjG,sEAAsE,EACtE,6CAA6C,CAC9C,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA2B,EAC3B,MAAqB,EACrB,SAA4B,EAC5B,QAAkC;IAElC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,6CAA6C,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wFAAwF;IACxF,IAAI,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,YAAY,QAAQ,CAAC,MAAM,qCAAqC,CAAC,CAAC;YAC3F,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACxE,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAE1D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CACT,GAAG,UAAU,IAAI,WAAW,CAAC,MAAM,8CAA8C,CAClF,CAAC;gBACF,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,UAAU,EAAE,MAAM;oBAClB,OAAO,EAAE,GAAG,WAAW,CAAC,MAAM,4CAA4C;oBAC1E,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC5B,IAAI,EAAE,CAAC,CAAC,SAAS;wBACjB,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;wBACjC,QAAQ,EAAE,UAAmB;wBAC7B,YAAY,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;4BACvC,CAAC,CAAC,wBAAwB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4BAC3E,CAAC,CAAC,4BAA4B;qBACjC,CAAC,CAAC;oBACH,WAAW,EAAE,EAAE;iBAChB,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,0BAA0B,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,iCAAiC,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAE5E,oDAAoD;IACpD,IAAI,UAA2C,CAAC;IAChD,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IACrE,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,8BAA8B,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAChF,UAAU,GAAG,MAAM,8BAA8B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,wFAAwF;IACxF,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,2BAA2B,CACxC,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,EACf,SAAS,EACT,QAAQ,EACR,UAAU,EACV,WAAW,CACZ,CAAC;IAEF,oBAAoB;IACpB,IAAI,SAAiB,CAAC;IACtB,IAAI,QAAQ;QAAE,MAAM,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAErC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,gDAAgD,CAAC,CAAC;QAE3E,SAAS,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE;YACxD,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,eAAe;YACxB,GAAG,EAAE,KAAK,CAAC,YAAY;YACvB,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAIf,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,sCAAsC,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,GAAG,UAAU,8BAA8B,OAAO,CAAC,OAAO,IAAI,eAAe,EAAE,CAChF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ;YAAE,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,0CAA0C,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4BAA4B;IAC5B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,GAAG,UAAU,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC5F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,GAAG,UAAU,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC9F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qEAAqE;IACrE,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5H,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,0BAA0B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;IAC/B,OAAO,CAAC,GAAG,CACT,GAAG,UAAU,uBAAuB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG;QAC1E,gBAAgB,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAClE,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAA2B,EAC3B,UAAgC;IAEhC,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IAE9E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,+DAA+D;QAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CACT,GAAG,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,iDAAiD,CACzF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,2BAA2B;IAC3B,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnE,IAAI,aAAa,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YAC9E,OAAO,CAAC,IAAI,CACV,GAAG,UAAU,kBAAkB,YAAY,CAAC,MAAM,sBAAsB;gBACxE,8BAA8B,aAAa,CAAC,MAAM,cAAc;gBAChE,GAAG,YAAY,CAAC,MAAM,UAAU,KAAK,CAAC,SAAS,CAAC,YAAY,SAAS,CACtE,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,EACxC,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,EAAE,EAAE,UAAU,EAAE;QAChB,KAAK,EAAE,iBAAiB,GAAG,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE;YACX,gCAAgC;YAChC,EAAE;YACF,sFAAsF;YACtF,EAAE;YACF,YAAY,GAAG,CAAC,IAAI,EAAE;YACtB,GAAG,CAAC,WAAW;YACf,EAAE;YACF,mBAAmB;YACnB,GAAG,CAAC,YAAY;YAChB,EAAE;YACF,aAAa;YACb,sFAAsF;YACtF,0FAA0F;SAC3F,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,SAAS,EAAE,YAAY,GAAG,CAAC,GAAG,CAAC;QAC/B,SAAS,EAAE,EAAc;QACzB,WAAW,EAAE,KAAK,CAAC,wBAAwB,GAAG,CAAC;KAChD,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CACT,GAAG,UAAU,YAAY,OAAO,CAAC,MAAM,qDAAqD,CAC7F,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Factory instance completion report generation.
3
+ *
4
+ * After the final completion gate passes, this module generates a structured
5
+ * keep/stop/change retrospective. The AI produces the retrospective analysis;
6
+ * execution metrics are computed from instance state and injected separately.
7
+ *
8
+ * Pattern: same one-shot Claude Code --print invocation used by planning,
9
+ * strategy design, and completion gate modules.
10
+ */
11
+ import type { ResourceGovernor } from '@telora/daemon-core';
12
+ import type { ExecutionMetrics, FactoryCompletionReport, FactoryConfig, FactoryCycleEvaluation, FactoryGateResult, FactoryInstanceState, FactoryWorkUnit } from './types.js';
13
+ import type { PersistedStrategy } from './strategy-design.js';
14
+ /**
15
+ * Build the prompt for the completion report AI.
16
+ *
17
+ * Includes full factory run context: original spec, cycle evaluations,
18
+ * gate results, work unit outcomes, and strategy outcomes.
19
+ */
20
+ export declare function buildCompletionReportPrompt(specification: string, cycleEvaluations: FactoryCycleEvaluation[], workUnits: FactoryWorkUnit[], gateResults: FactoryGateResult[], strategies?: PersistedStrategy[]): string;
21
+ /**
22
+ * Compute execution metrics from instance state and fetched data.
23
+ * These are factual numbers, not AI-generated.
24
+ */
25
+ export declare function computeExecutionMetrics(state: FactoryInstanceState, workUnits: FactoryWorkUnit[], gateResults: FactoryGateResult[], cycleEvaluations: FactoryCycleEvaluation[]): ExecutionMetrics;
26
+ /**
27
+ * Generate a structured completion report for a factory instance.
28
+ *
29
+ * Spawns Claude Code in --print mode to produce the retrospective,
30
+ * then merges in computed execution metrics.
31
+ *
32
+ * Returns null on failure -- report generation should never block
33
+ * instance completion.
34
+ */
35
+ export declare function generateCompletionReport(state: FactoryInstanceState, config: FactoryConfig, governor?: ResourceGovernor | null): Promise<FactoryCompletionReport | null>;
36
+ //# sourceMappingURL=completion-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-report.d.ts","sourceRoot":"","sources":["../src/completion-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAK5D,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAwD9D;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,sBAAsB,EAAE,EAC1C,SAAS,EAAE,eAAe,EAAE,EAC5B,WAAW,EAAE,iBAAiB,EAAE,EAChC,UAAU,CAAC,EAAE,iBAAiB,EAAE,GAC/B,MAAM,CAkJR;AAMD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,EAAE,eAAe,EAAE,EAC5B,WAAW,EAAE,iBAAiB,EAAE,EAChC,gBAAgB,EAAE,sBAAsB,EAAE,GACzC,gBAAgB,CAqBlB;AAMD;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAsIzC"}