@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.
- package/dist/audit.d.ts +69 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +376 -0
- package/dist/audit.js.map +1 -0
- package/dist/builder-completion.d.ts +35 -0
- package/dist/builder-completion.d.ts.map +1 -0
- package/dist/builder-completion.js +375 -0
- package/dist/builder-completion.js.map +1 -0
- package/dist/builder-spawner.d.ts +40 -0
- package/dist/builder-spawner.d.ts.map +1 -0
- package/dist/builder-spawner.js +493 -0
- package/dist/builder-spawner.js.map +1 -0
- package/dist/completion-gate.d.ts +52 -0
- package/dist/completion-gate.d.ts.map +1 -0
- package/dist/completion-gate.js +336 -0
- package/dist/completion-gate.js.map +1 -0
- package/dist/completion-report.d.ts +36 -0
- package/dist/completion-report.d.ts.map +1 -0
- package/dist/completion-report.js +348 -0
- package/dist/completion-report.js.map +1 -0
- package/dist/completion.d.ts +58 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +287 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/context-manager.d.ts +152 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +421 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/crash-detection.d.ts +70 -0
- package/dist/crash-detection.d.ts.map +1 -0
- package/dist/crash-detection.js +123 -0
- package/dist/crash-detection.js.map +1 -0
- package/dist/crash-recovery.d.ts +83 -0
- package/dist/crash-recovery.d.ts.map +1 -0
- package/dist/crash-recovery.js +522 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/crash-resolution.d.ts +34 -0
- package/dist/crash-resolution.d.ts.map +1 -0
- package/dist/crash-resolution.js +382 -0
- package/dist/crash-resolution.js.map +1 -0
- package/dist/escalation.d.ts +150 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +352 -0
- package/dist/escalation.js.map +1 -0
- package/dist/execution-target.d.ts +31 -0
- package/dist/execution-target.d.ts.map +1 -0
- package/dist/execution-target.js +71 -0
- package/dist/execution-target.js.map +1 -0
- package/dist/execution-unit-init.d.ts +28 -0
- package/dist/execution-unit-init.d.ts.map +1 -0
- package/dist/execution-unit-init.js +115 -0
- package/dist/execution-unit-init.js.map +1 -0
- package/dist/execution.d.ts +17 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +20 -0
- package/dist/execution.js.map +1 -0
- package/dist/factory-engine.d.ts +100 -0
- package/dist/factory-engine.d.ts.map +1 -0
- package/dist/factory-engine.js +243 -0
- package/dist/factory-engine.js.map +1 -0
- package/dist/gap-detection.d.ts +43 -0
- package/dist/gap-detection.d.ts.map +1 -0
- package/dist/gap-detection.js +149 -0
- package/dist/gap-detection.js.map +1 -0
- package/dist/gate-context.d.ts +23 -0
- package/dist/gate-context.d.ts.map +1 -0
- package/dist/gate-context.js +63 -0
- package/dist/gate-context.js.map +1 -0
- package/dist/gate-engine.d.ts +55 -0
- package/dist/gate-engine.d.ts.map +1 -0
- package/dist/gate-engine.js +191 -0
- package/dist/gate-engine.js.map +1 -0
- package/dist/gates/adversarial.d.ts +59 -0
- package/dist/gates/adversarial.d.ts.map +1 -0
- package/dist/gates/adversarial.js +426 -0
- package/dist/gates/adversarial.js.map +1 -0
- package/dist/gates/adversary-spawner.d.ts +35 -0
- package/dist/gates/adversary-spawner.d.ts.map +1 -0
- package/dist/gates/adversary-spawner.js +286 -0
- package/dist/gates/adversary-spawner.js.map +1 -0
- package/dist/gates/adversary-test-dir.d.ts +41 -0
- package/dist/gates/adversary-test-dir.d.ts.map +1 -0
- package/dist/gates/adversary-test-dir.js +150 -0
- package/dist/gates/adversary-test-dir.js.map +1 -0
- package/dist/gates/behavioral-parser.d.ts +32 -0
- package/dist/gates/behavioral-parser.d.ts.map +1 -0
- package/dist/gates/behavioral-parser.js +190 -0
- package/dist/gates/behavioral-parser.js.map +1 -0
- package/dist/gates/behavioral-runner.d.ts +36 -0
- package/dist/gates/behavioral-runner.d.ts.map +1 -0
- package/dist/gates/behavioral-runner.js +306 -0
- package/dist/gates/behavioral-runner.js.map +1 -0
- package/dist/gates/behavioral.d.ts +37 -0
- package/dist/gates/behavioral.d.ts.map +1 -0
- package/dist/gates/behavioral.js +485 -0
- package/dist/gates/behavioral.js.map +1 -0
- package/dist/gates/deterministic.d.ts +24 -0
- package/dist/gates/deterministic.d.ts.map +1 -0
- package/dist/gates/deterministic.js +186 -0
- package/dist/gates/deterministic.js.map +1 -0
- package/dist/git-factory.d.ts +59 -0
- package/dist/git-factory.d.ts.map +1 -0
- package/dist/git-factory.js +102 -0
- package/dist/git-factory.js.map +1 -0
- package/dist/guard-evaluation.d.ts +48 -0
- package/dist/guard-evaluation.d.ts.map +1 -0
- package/dist/guard-evaluation.js +416 -0
- package/dist/guard-evaluation.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-completion.d.ts +34 -0
- package/dist/instance-completion.d.ts.map +1 -0
- package/dist/instance-completion.js +366 -0
- package/dist/instance-completion.js.map +1 -0
- package/dist/instance-lifecycle.d.ts +15 -0
- package/dist/instance-lifecycle.d.ts.map +1 -0
- package/dist/instance-lifecycle.js +18 -0
- package/dist/instance-lifecycle.js.map +1 -0
- package/dist/instance-phase-dispatch.d.ts +75 -0
- package/dist/instance-phase-dispatch.d.ts.map +1 -0
- package/dist/instance-phase-dispatch.js +674 -0
- package/dist/instance-phase-dispatch.js.map +1 -0
- package/dist/instance-poll-loop.d.ts +43 -0
- package/dist/instance-poll-loop.d.ts.map +1 -0
- package/dist/instance-poll-loop.js +360 -0
- package/dist/instance-poll-loop.js.map +1 -0
- package/dist/instance-state-machine.d.ts +52 -0
- package/dist/instance-state-machine.d.ts.map +1 -0
- package/dist/instance-state-machine.js +235 -0
- package/dist/instance-state-machine.js.map +1 -0
- package/dist/log-manager.d.ts +28 -0
- package/dist/log-manager.d.ts.map +1 -0
- package/dist/log-manager.js +71 -0
- package/dist/log-manager.js.map +1 -0
- package/dist/pipeline-evaluator.d.ts +61 -0
- package/dist/pipeline-evaluator.d.ts.map +1 -0
- package/dist/pipeline-evaluator.js +107 -0
- package/dist/pipeline-evaluator.js.map +1 -0
- package/dist/pipeline-metrics.d.ts +52 -0
- package/dist/pipeline-metrics.d.ts.map +1 -0
- package/dist/pipeline-metrics.js +40 -0
- package/dist/pipeline-metrics.js.map +1 -0
- package/dist/pipeline-traversal.d.ts +43 -0
- package/dist/pipeline-traversal.d.ts.map +1 -0
- package/dist/pipeline-traversal.js +68 -0
- package/dist/pipeline-traversal.js.map +1 -0
- package/dist/plan-parser.d.ts +76 -0
- package/dist/plan-parser.d.ts.map +1 -0
- package/dist/plan-parser.js +223 -0
- package/dist/plan-parser.js.map +1 -0
- package/dist/planning-phase.d.ts +52 -0
- package/dist/planning-phase.d.ts.map +1 -0
- package/dist/planning-phase.js +444 -0
- package/dist/planning-phase.js.map +1 -0
- package/dist/planning-prompt.d.ts +64 -0
- package/dist/planning-prompt.d.ts.map +1 -0
- package/dist/planning-prompt.js +251 -0
- package/dist/planning-prompt.js.map +1 -0
- package/dist/planning.d.ts +16 -0
- package/dist/planning.d.ts.map +1 -0
- package/dist/planning.js +17 -0
- package/dist/planning.js.map +1 -0
- package/dist/process-runner.d.ts +41 -0
- package/dist/process-runner.d.ts.map +1 -0
- package/dist/process-runner.js +81 -0
- package/dist/process-runner.js.map +1 -0
- package/dist/product-config.d.ts +34 -0
- package/dist/product-config.d.ts.map +1 -0
- package/dist/product-config.js +43 -0
- package/dist/product-config.js.map +1 -0
- package/dist/queries/cycle-evaluations.d.ts +23 -0
- package/dist/queries/cycle-evaluations.d.ts.map +1 -0
- package/dist/queries/cycle-evaluations.js +37 -0
- package/dist/queries/cycle-evaluations.js.map +1 -0
- package/dist/queries/escalations.d.ts +30 -0
- package/dist/queries/escalations.d.ts.map +1 -0
- package/dist/queries/escalations.js +42 -0
- package/dist/queries/escalations.js.map +1 -0
- package/dist/queries/execution-units.d.ts +76 -0
- package/dist/queries/execution-units.d.ts.map +1 -0
- package/dist/queries/execution-units.js +109 -0
- package/dist/queries/execution-units.js.map +1 -0
- package/dist/queries/gate-results.d.ts +32 -0
- package/dist/queries/gate-results.d.ts.map +1 -0
- package/dist/queries/gate-results.js +44 -0
- package/dist/queries/gate-results.js.map +1 -0
- package/dist/queries/instances.d.ts +51 -0
- package/dist/queries/instances.d.ts.map +1 -0
- package/dist/queries/instances.js +77 -0
- package/dist/queries/instances.js.map +1 -0
- package/dist/queries/sessions.d.ts +50 -0
- package/dist/queries/sessions.d.ts.map +1 -0
- package/dist/queries/sessions.js +81 -0
- package/dist/queries/sessions.js.map +1 -0
- package/dist/queries/shared.d.ts +38 -0
- package/dist/queries/shared.d.ts.map +1 -0
- package/dist/queries/shared.js +119 -0
- package/dist/queries/shared.js.map +1 -0
- package/dist/queries/specs.d.ts +12 -0
- package/dist/queries/specs.d.ts.map +1 -0
- package/dist/queries/specs.js +21 -0
- package/dist/queries/specs.js.map +1 -0
- package/dist/queries/strategies.d.ts +14 -0
- package/dist/queries/strategies.d.ts.map +1 -0
- package/dist/queries/strategies.js +18 -0
- package/dist/queries/strategies.js.map +1 -0
- package/dist/queries/work-units.d.ts +42 -0
- package/dist/queries/work-units.d.ts.map +1 -0
- package/dist/queries/work-units.js +57 -0
- package/dist/queries/work-units.js.map +1 -0
- package/dist/queries/workflows.d.ts +29 -0
- package/dist/queries/workflows.d.ts.map +1 -0
- package/dist/queries/workflows.js +103 -0
- package/dist/queries/workflows.js.map +1 -0
- package/dist/remediation-units.d.ts +40 -0
- package/dist/remediation-units.d.ts.map +1 -0
- package/dist/remediation-units.js +263 -0
- package/dist/remediation-units.js.map +1 -0
- package/dist/replanning.d.ts +72 -0
- package/dist/replanning.d.ts.map +1 -0
- package/dist/replanning.js +403 -0
- package/dist/replanning.js.map +1 -0
- package/dist/resource-limits.d.ts +62 -0
- package/dist/resource-limits.d.ts.map +1 -0
- package/dist/resource-limits.js +322 -0
- package/dist/resource-limits.js.map +1 -0
- package/dist/scheduler.d.ts +98 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +203 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/session-adapter.d.ts +89 -0
- package/dist/session-adapter.d.ts.map +1 -0
- package/dist/session-adapter.js +108 -0
- package/dist/session-adapter.js.map +1 -0
- package/dist/sop-generator.d.ts +29 -0
- package/dist/sop-generator.d.ts.map +1 -0
- package/dist/sop-generator.js +235 -0
- package/dist/sop-generator.js.map +1 -0
- package/dist/spec-profiles.d.ts +41 -0
- package/dist/spec-profiles.d.ts.map +1 -0
- package/dist/spec-profiles.js +131 -0
- package/dist/spec-profiles.js.map +1 -0
- package/dist/strategy-design-graph.d.ts +23 -0
- package/dist/strategy-design-graph.d.ts.map +1 -0
- package/dist/strategy-design-graph.js +205 -0
- package/dist/strategy-design-graph.js.map +1 -0
- package/dist/strategy-design-prompt.d.ts +28 -0
- package/dist/strategy-design-prompt.d.ts.map +1 -0
- package/dist/strategy-design-prompt.js +108 -0
- package/dist/strategy-design-prompt.js.map +1 -0
- package/dist/strategy-design-schema.d.ts +767 -0
- package/dist/strategy-design-schema.d.ts.map +1 -0
- package/dist/strategy-design-schema.js +126 -0
- package/dist/strategy-design-schema.js.map +1 -0
- package/dist/strategy-design.d.ts +69 -0
- package/dist/strategy-design.d.ts.map +1 -0
- package/dist/strategy-design.js +411 -0
- package/dist/strategy-design.js.map +1 -0
- package/dist/strategy-gating.d.ts +31 -0
- package/dist/strategy-gating.d.ts.map +1 -0
- package/dist/strategy-gating.js +276 -0
- package/dist/strategy-gating.js.map +1 -0
- package/dist/team-prompt-builder.d.ts +47 -0
- package/dist/team-prompt-builder.d.ts.map +1 -0
- package/dist/team-prompt-builder.js +362 -0
- package/dist/team-prompt-builder.js.map +1 -0
- package/dist/trace-engine.d.ts +40 -0
- package/dist/trace-engine.d.ts.map +1 -0
- package/dist/trace-engine.js +344 -0
- package/dist/trace-engine.js.map +1 -0
- package/dist/types.d.ts +612 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/unit-session-lifecycle.d.ts +78 -0
- package/dist/unit-session-lifecycle.d.ts.map +1 -0
- package/dist/unit-session-lifecycle.js +141 -0
- package/dist/unit-session-lifecycle.js.map +1 -0
- package/dist/unit-session.d.ts +30 -0
- package/dist/unit-session.d.ts.map +1 -0
- package/dist/unit-session.js +370 -0
- package/dist/unit-session.js.map +1 -0
- package/dist/watchdogs.d.ts +33 -0
- package/dist/watchdogs.d.ts.map +1 -0
- package/dist/watchdogs.js +170 -0
- package/dist/watchdogs.js.map +1 -0
- package/dist/work-unit-scheduler.d.ts +34 -0
- package/dist/work-unit-scheduler.d.ts.map +1 -0
- package/dist/work-unit-scheduler.js +91 -0
- package/dist/work-unit-scheduler.js.map +1 -0
- package/dist/workflow-transition.d.ts +90 -0
- package/dist/workflow-transition.d.ts.map +1 -0
- package/dist/workflow-transition.js +340 -0
- package/dist/workflow-transition.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|