agentic-engineering-harness 0.4.16

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 (280) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +273 -0
  3. package/dist/agents/audit.d.ts +12 -0
  4. package/dist/agents/audit.js +14 -0
  5. package/dist/agents/audit.js.map +1 -0
  6. package/dist/agents/compiler.d.ts +8 -0
  7. package/dist/agents/compiler.js +103 -0
  8. package/dist/agents/compiler.js.map +1 -0
  9. package/dist/agents/config.d.ts +6 -0
  10. package/dist/agents/config.js +161 -0
  11. package/dist/agents/config.js.map +1 -0
  12. package/dist/agents/escalation.d.ts +9 -0
  13. package/dist/agents/escalation.js +75 -0
  14. package/dist/agents/escalation.js.map +1 -0
  15. package/dist/agents/exceptionDetection.d.ts +24 -0
  16. package/dist/agents/exceptionDetection.js +42 -0
  17. package/dist/agents/exceptionDetection.js.map +1 -0
  18. package/dist/agents/findings.d.ts +14 -0
  19. package/dist/agents/findings.js +40 -0
  20. package/dist/agents/findings.js.map +1 -0
  21. package/dist/agents/gitCheckpoint.d.ts +6 -0
  22. package/dist/agents/gitCheckpoint.js +61 -0
  23. package/dist/agents/gitCheckpoint.js.map +1 -0
  24. package/dist/agents/jsonc.d.ts +1 -0
  25. package/dist/agents/jsonc.js +42 -0
  26. package/dist/agents/jsonc.js.map +1 -0
  27. package/dist/agents/outputContracts.d.ts +161 -0
  28. package/dist/agents/outputContracts.js +16 -0
  29. package/dist/agents/outputContracts.js.map +1 -0
  30. package/dist/agents/parallelism.d.ts +14 -0
  31. package/dist/agents/parallelism.js +54 -0
  32. package/dist/agents/parallelism.js.map +1 -0
  33. package/dist/agents/permissions.d.ts +5 -0
  34. package/dist/agents/permissions.js +30 -0
  35. package/dist/agents/permissions.js.map +1 -0
  36. package/dist/agents/qualityConvergence.d.ts +44 -0
  37. package/dist/agents/qualityConvergence.js +77 -0
  38. package/dist/agents/qualityConvergence.js.map +1 -0
  39. package/dist/agents/recovery.d.ts +13 -0
  40. package/dist/agents/recovery.js +35 -0
  41. package/dist/agents/recovery.js.map +1 -0
  42. package/dist/agents/reviewLifecycle.d.ts +30 -0
  43. package/dist/agents/reviewLifecycle.js +233 -0
  44. package/dist/agents/reviewLifecycle.js.map +1 -0
  45. package/dist/agents/routing.d.ts +9 -0
  46. package/dist/agents/routing.js +37 -0
  47. package/dist/agents/routing.js.map +1 -0
  48. package/dist/agents/structuredOutput.d.ts +1 -0
  49. package/dist/agents/structuredOutput.js +54 -0
  50. package/dist/agents/structuredOutput.js.map +1 -0
  51. package/dist/agents/types.d.ts +207 -0
  52. package/dist/agents/types.js +2 -0
  53. package/dist/agents/types.js.map +1 -0
  54. package/dist/cli.d.ts +2 -0
  55. package/dist/cli.js +221 -0
  56. package/dist/cli.js.map +1 -0
  57. package/dist/core/config.d.ts +3 -0
  58. package/dist/core/config.js +59 -0
  59. package/dist/core/config.js.map +1 -0
  60. package/dist/core/doctor.d.ts +8 -0
  61. package/dist/core/doctor.js +59 -0
  62. package/dist/core/doctor.js.map +1 -0
  63. package/dist/core/git.d.ts +8 -0
  64. package/dist/core/git.js +47 -0
  65. package/dist/core/git.js.map +1 -0
  66. package/dist/core/init.d.ts +1 -0
  67. package/dist/core/init.js +52 -0
  68. package/dist/core/init.js.map +1 -0
  69. package/dist/core/quick.d.ts +20 -0
  70. package/dist/core/quick.js +49 -0
  71. package/dist/core/quick.js.map +1 -0
  72. package/dist/core/repair.d.ts +8 -0
  73. package/dist/core/repair.js +7 -0
  74. package/dist/core/repair.js.map +1 -0
  75. package/dist/core/run.d.ts +38 -0
  76. package/dist/core/run.js +165 -0
  77. package/dist/core/run.js.map +1 -0
  78. package/dist/core/sdd.d.ts +10 -0
  79. package/dist/core/sdd.js +88 -0
  80. package/dist/core/sdd.js.map +1 -0
  81. package/dist/core/seal.d.ts +3 -0
  82. package/dist/core/seal.js +74 -0
  83. package/dist/core/seal.js.map +1 -0
  84. package/dist/core/triage.d.ts +22 -0
  85. package/dist/core/triage.js +38 -0
  86. package/dist/core/triage.js.map +1 -0
  87. package/dist/core/types.d.ts +354 -0
  88. package/dist/core/types.js +2 -0
  89. package/dist/core/types.js.map +1 -0
  90. package/dist/core/verify.d.ts +6 -0
  91. package/dist/core/verify.js +51 -0
  92. package/dist/core/verify.js.map +1 -0
  93. package/dist/delivery/finalize.d.ts +17 -0
  94. package/dist/delivery/finalize.js +71 -0
  95. package/dist/delivery/finalize.js.map +1 -0
  96. package/dist/delivery/handoff.d.ts +39 -0
  97. package/dist/delivery/handoff.js +250 -0
  98. package/dist/delivery/handoff.js.map +1 -0
  99. package/dist/entry.d.ts +2 -0
  100. package/dist/entry.js +112 -0
  101. package/dist/entry.js.map +1 -0
  102. package/dist/evals/runner.d.ts +4 -0
  103. package/dist/evals/runner.js +112 -0
  104. package/dist/evals/runner.js.map +1 -0
  105. package/dist/evals/scoring.d.ts +3 -0
  106. package/dist/evals/scoring.js +41 -0
  107. package/dist/evals/scoring.js.map +1 -0
  108. package/dist/evals/types.d.ts +46 -0
  109. package/dist/evals/types.js +2 -0
  110. package/dist/evals/types.js.map +1 -0
  111. package/dist/issues/intake.d.ts +114 -0
  112. package/dist/issues/intake.js +213 -0
  113. package/dist/issues/intake.js.map +1 -0
  114. package/dist/memory/benchmark.d.ts +33 -0
  115. package/dist/memory/benchmark.js +69 -0
  116. package/dist/memory/benchmark.js.map +1 -0
  117. package/dist/metrics/runMetrics.d.ts +9 -0
  118. package/dist/metrics/runMetrics.js +34 -0
  119. package/dist/metrics/runMetrics.js.map +1 -0
  120. package/dist/metrics/usage.d.ts +3 -0
  121. package/dist/metrics/usage.js +53 -0
  122. package/dist/metrics/usage.js.map +1 -0
  123. package/dist/provenance/generate.d.ts +30 -0
  124. package/dist/provenance/generate.js +96 -0
  125. package/dist/provenance/generate.js.map +1 -0
  126. package/dist/providers/engram.d.ts +8 -0
  127. package/dist/providers/engram.js +14 -0
  128. package/dist/providers/engram.js.map +1 -0
  129. package/dist/providers/graphify.d.ts +9 -0
  130. package/dist/providers/graphify.js +28 -0
  131. package/dist/providers/graphify.js.map +1 -0
  132. package/dist/providers/paseo.d.ts +8 -0
  133. package/dist/providers/paseo.js +14 -0
  134. package/dist/providers/paseo.js.map +1 -0
  135. package/dist/providers/types.d.ts +41 -0
  136. package/dist/providers/types.js +2 -0
  137. package/dist/providers/types.js.map +1 -0
  138. package/dist/telemetry/events.d.ts +2 -0
  139. package/dist/telemetry/events.js +29 -0
  140. package/dist/telemetry/events.js.map +1 -0
  141. package/dist/telemetry/otlp.d.ts +3 -0
  142. package/dist/telemetry/otlp.js +57 -0
  143. package/dist/telemetry/otlp.js.map +1 -0
  144. package/dist/toolchain/config.d.ts +10 -0
  145. package/dist/toolchain/config.js +54 -0
  146. package/dist/toolchain/config.js.map +1 -0
  147. package/dist/toolchain/doctor.d.ts +8 -0
  148. package/dist/toolchain/doctor.js +56 -0
  149. package/dist/toolchain/doctor.js.map +1 -0
  150. package/dist/toolchain/mise.d.ts +10 -0
  151. package/dist/toolchain/mise.js +61 -0
  152. package/dist/toolchain/mise.js.map +1 -0
  153. package/dist/toolchain/resolve.d.ts +8 -0
  154. package/dist/toolchain/resolve.js +159 -0
  155. package/dist/toolchain/resolve.js.map +1 -0
  156. package/dist/toolchain/setup.d.ts +7 -0
  157. package/dist/toolchain/setup.js +141 -0
  158. package/dist/toolchain/setup.js.map +1 -0
  159. package/dist/toolchain/types.d.ts +95 -0
  160. package/dist/toolchain/types.js +2 -0
  161. package/dist/toolchain/types.js.map +1 -0
  162. package/dist/utils/process.d.ts +15 -0
  163. package/dist/utils/process.js +94 -0
  164. package/dist/utils/process.js.map +1 -0
  165. package/dist/validators/commands.d.ts +2 -0
  166. package/dist/validators/commands.js +28 -0
  167. package/dist/validators/commands.js.map +1 -0
  168. package/dist/validators/constraints.d.ts +6 -0
  169. package/dist/validators/constraints.js +30 -0
  170. package/dist/validators/constraints.js.map +1 -0
  171. package/dist/validators/diffScope.d.ts +2 -0
  172. package/dist/validators/diffScope.js +36 -0
  173. package/dist/validators/diffScope.js.map +1 -0
  174. package/dist/validators/evidence.d.ts +6 -0
  175. package/dist/validators/evidence.js +8 -0
  176. package/dist/validators/evidence.js.map +1 -0
  177. package/dist/validators/external.d.ts +3 -0
  178. package/dist/validators/external.js +22 -0
  179. package/dist/validators/external.js.map +1 -0
  180. package/dist/validators/gherkin.d.ts +3 -0
  181. package/dist/validators/gherkin.js +59 -0
  182. package/dist/validators/gherkin.js.map +1 -0
  183. package/dist/validators/graphify.d.ts +4 -0
  184. package/dist/validators/graphify.js +108 -0
  185. package/dist/validators/graphify.js.map +1 -0
  186. package/dist/validators/opa.d.ts +3 -0
  187. package/dist/validators/opa.js +43 -0
  188. package/dist/validators/opa.js.map +1 -0
  189. package/dist/validators/openapi.d.ts +25 -0
  190. package/dist/validators/openapi.js +98 -0
  191. package/dist/validators/openapi.js.map +1 -0
  192. package/dist/validators/registry.d.ts +2 -0
  193. package/dist/validators/registry.js +36 -0
  194. package/dist/validators/registry.js.map +1 -0
  195. package/dist/validators/toolCommand.d.ts +5 -0
  196. package/dist/validators/toolCommand.js +33 -0
  197. package/dist/validators/toolCommand.js.map +1 -0
  198. package/dist/validators/types.d.ts +13 -0
  199. package/dist/validators/types.js +2 -0
  200. package/dist/validators/types.js.map +1 -0
  201. package/dist/workers/agentPrompt.d.ts +3 -0
  202. package/dist/workers/agentPrompt.js +84 -0
  203. package/dist/workers/agentPrompt.js.map +1 -0
  204. package/dist/workers/direct.d.ts +13 -0
  205. package/dist/workers/direct.js +30 -0
  206. package/dist/workers/direct.js.map +1 -0
  207. package/dist/workers/factory.d.ts +4 -0
  208. package/dist/workers/factory.js +10 -0
  209. package/dist/workers/factory.js.map +1 -0
  210. package/dist/workers/paseo.d.ts +14 -0
  211. package/dist/workers/paseo.js +29 -0
  212. package/dist/workers/paseo.js.map +1 -0
  213. package/dist/workers/podman.d.ts +13 -0
  214. package/dist/workers/podman.js +22 -0
  215. package/dist/workers/podman.js.map +1 -0
  216. package/dist/workers/prompt.d.ts +4 -0
  217. package/dist/workers/prompt.js +4 -0
  218. package/dist/workers/prompt.js.map +1 -0
  219. package/dist/workers/types.d.ts +11 -0
  220. package/dist/workers/types.js +2 -0
  221. package/dist/workers/types.js.map +1 -0
  222. package/docs/ARCHITECTURE.md +47 -0
  223. package/docs/EVALS.md +28 -0
  224. package/docs/MEMORY.md +28 -0
  225. package/docs/OBSERVABILITY.md +18 -0
  226. package/docs/OSS_STACK.md +27 -0
  227. package/docs/PASEO.md +9 -0
  228. package/docs/PUBLISHING.md +110 -0
  229. package/docs/SDD.md +35 -0
  230. package/docs/SECURITY.md +21 -0
  231. package/docs/V0.2.md +42 -0
  232. package/docs/V0.3.md +40 -0
  233. package/docs/V0.4.11.md +30 -0
  234. package/docs/V0.4.12.md +88 -0
  235. package/docs/V0.4.13.md +203 -0
  236. package/docs/V0.4.14.md +209 -0
  237. package/docs/V0.4.15.md +365 -0
  238. package/docs/V0.4.16.md +229 -0
  239. package/docs/V0.4.md +28 -0
  240. package/docs/VALIDATION.md +23 -0
  241. package/package.json +18 -0
  242. package/policies/core/dependency-policy.rego +12 -0
  243. package/policies/core/schema-policy.rego +12 -0
  244. package/policies/core/trust-boundary.rego +17 -0
  245. package/presets/agents/default.jsonc +80 -0
  246. package/presets/docker.yaml +4 -0
  247. package/presets/dotnet.yaml +12 -0
  248. package/presets/expo.yaml +6 -0
  249. package/presets/generic.yaml +3 -0
  250. package/presets/nextjs.yaml +8 -0
  251. package/presets/node.yaml +6 -0
  252. package/presets/pnpm.yaml +6 -0
  253. package/presets/postgres.yaml +4 -0
  254. package/schemas/agent-output-planner.schema.json +1 -0
  255. package/schemas/agent-topology.schema.json +37 -0
  256. package/schemas/project.schema.json +36 -0
  257. package/schemas/quick-contract.schema.json +17 -0
  258. package/schemas/task-contract.schema.json +18 -0
  259. package/schemas/toolchain.schema.json +70 -0
  260. package/schemas/validation-report.schema.json +15 -0
  261. package/skills/acceptance-traceability/SKILL.md +13 -0
  262. package/skills/deterministic-validation/SKILL.md +15 -0
  263. package/skills/engineering-workflow/SKILL.md +108 -0
  264. package/skills/finding-dedup/SKILL.md +12 -0
  265. package/skills/github-delivery-lifecycle/SKILL.md +16 -0
  266. package/skills/implementation-worker/SKILL.md +17 -0
  267. package/skills/lead-engineer/SKILL.md +30 -0
  268. package/skills/memory-hygiene/SKILL.md +22 -0
  269. package/skills/prompt-drift-audit/SKILL.md +10 -0
  270. package/skills/recovery-classifier/SKILL.md +13 -0
  271. package/skills/routing-normalizer/SKILL.md +17 -0
  272. package/skills/sdd/SKILL.md +21 -0
  273. package/skills/simplify/SKILL.md +16 -0
  274. package/skills/verification-planning/SKILL.md +17 -0
  275. package/skills/worktree-lifecycle/SKILL.md +18 -0
  276. package/templates/AGENTS.md +37 -0
  277. package/templates/agents.source.jsonc +39 -0
  278. package/templates/otel-collector.yaml +21 -0
  279. package/templates/project.yaml +196 -0
  280. package/templates/toolchain.yaml +127 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal.js","sourceRoot":"","sources":["../../src/core/seal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { HarnessProjectConfig, TaskMode } from "./types.js";
2
+ export type TriageFlag = "architecture" | "security" | "authentication" | "authorization" | "schema" | "migration" | "public-api" | "breaking-change" | "new-dependency" | "cross-module" | "ambiguous";
3
+ export interface TriageEvidence {
4
+ request: string;
5
+ files?: string[];
6
+ domains?: string[];
7
+ risk?: "low" | "medium" | "high";
8
+ flags?: TriageFlag[];
9
+ }
10
+ export interface TriageDecision {
11
+ mode: TaskMode;
12
+ quickEligible: boolean;
13
+ reasons: string[];
14
+ evidence: Required<Pick<TriageEvidence, "request">> & {
15
+ files: string[];
16
+ domains: string[];
17
+ risk: "low" | "medium" | "high";
18
+ flags: TriageFlag[];
19
+ };
20
+ }
21
+ export declare function triageChange(config: HarnessProjectConfig, input: TriageEvidence): TriageDecision;
22
+ export declare function formatTriageDecision(decision: TriageDecision): string;
@@ -0,0 +1,38 @@
1
+ const defaultDisallowedDomains = ["security", "auth", "authentication", "authorization", "architecture", "database", "schema", "migration", "api-contract", "multi-tenancy"];
2
+ const hazardousRequestPatterns = [
3
+ [/\b(auth|authentication|authorization|permission|tenant|security)\b/i, "request touches a security/auth boundary"],
4
+ [/\b(migration|schema|database|table|column)\b/i, "request may alter persistent schema/data boundaries"],
5
+ [/\b(public\s+api|breaking\s+change|backward\s+compat)/i, "request may alter a public compatibility contract"],
6
+ [/\b(add|new|upgrade|replace)\s+(a\s+)?dependenc(y|ies)|\bpackage\s+(upgrade|change)\b/i, "request may change dependency policy"],
7
+ [/\barchitecture|architectural|cross[- ]module|large\s+refactor\b/i, "request may require an architectural decision"]
8
+ ];
9
+ export function triageChange(config, input) {
10
+ const files = [...new Set(input.files ?? [])];
11
+ const domains = [...new Set(input.domains ?? [])];
12
+ const risk = input.risk ?? "low";
13
+ const flags = [...new Set(input.flags ?? [])];
14
+ const reasons = [];
15
+ const maxFiles = config.workflow?.quick?.maxFiles ?? 5;
16
+ const disallowed = config.workflow?.quick?.disallowedDomains ?? defaultDisallowedDomains;
17
+ if (!files.length)
18
+ reasons.push("quick mode requires an explicit bounded file scope");
19
+ const nonConcrete = files.filter((file) => /[*?\[\]{}]/.test(file));
20
+ if (nonConcrete.length)
21
+ reasons.push(`quick mode requires concrete file paths, not wildcard scope: ${nonConcrete.join(", ")}`);
22
+ if (files.length > maxFiles)
23
+ reasons.push(`scope contains ${files.length} files/patterns; quick limit is ${maxFiles}`);
24
+ if (risk !== "low")
25
+ reasons.push(`risk is ${risk}; quick mode requires low risk`);
26
+ if (flags.length)
27
+ reasons.push(`explicit escalation flags: ${flags.join(", ")}`);
28
+ const blockedDomains = domains.filter((domain) => disallowed.some((pattern) => domain.toLowerCase().includes(pattern.toLowerCase()) || pattern.toLowerCase().includes(domain.toLowerCase())));
29
+ if (blockedDomains.length)
30
+ reasons.push(`domains require SDD: ${blockedDomains.join(", ")}`);
31
+ for (const [pattern, reason] of hazardousRequestPatterns)
32
+ if (pattern.test(input.request))
33
+ reasons.push(reason);
34
+ const quickEligible = reasons.length === 0;
35
+ return { mode: quickEligible ? "quick" : "spec", quickEligible, reasons: quickEligible ? ["bounded low-risk change with no SDD escalation signals"] : reasons, evidence: { request: input.request, files, domains, risk, flags } };
36
+ }
37
+ export function formatTriageDecision(decision) { return `${decision.mode.toUpperCase()} — ${decision.reasons.join("; ")}`; }
38
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/core/triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,354 @@
1
+ export type CheckStatus = "PASS" | "FAIL" | "SKIP" | "WARN";
2
+ export type TaskMode = "spec" | "quick";
3
+ export type ReviewSeverity = "critical" | "high" | "medium" | "low" | "note";
4
+ export type ValidatorAdapter = "command" | "gherkin" | "graphify" | "opengrep" | "trivy" | "playwright" | "openapi" | "pact" | "mutation" | "property" | string;
5
+ export interface ValidationCommand {
6
+ id: string;
7
+ command: string;
8
+ required?: boolean;
9
+ timeoutSeconds?: number;
10
+ workingDirectory?: string;
11
+ }
12
+ export interface ValidatorSpec {
13
+ id: string;
14
+ adapter: ValidatorAdapter;
15
+ command?: string;
16
+ required?: boolean;
17
+ timeoutSeconds?: number;
18
+ workingDirectory?: string;
19
+ options?: Record<string, unknown>;
20
+ }
21
+ export interface UsageMetrics {
22
+ inputTokens?: number;
23
+ outputTokens?: number;
24
+ totalTokens?: number;
25
+ costUsd?: number;
26
+ }
27
+ export interface RunMetrics {
28
+ firstPassSuccess: boolean;
29
+ repairCount: number;
30
+ humanInterventions: number;
31
+ durationMs: number;
32
+ usage: UsageMetrics;
33
+ }
34
+ export interface ReviewEscalationStage {
35
+ name: string;
36
+ action?: "remediate" | "diagnose" | "replan";
37
+ agent?: string;
38
+ model?: string;
39
+ }
40
+ export interface McpServerConfig {
41
+ description?: string;
42
+ type: "local" | "remote";
43
+ command?: string[];
44
+ url?: string;
45
+ environment?: Record<string, string>;
46
+ headers?: Record<string, string>;
47
+ oauth?: boolean;
48
+ enabled?: boolean;
49
+ timeoutMs?: number;
50
+ codemode?: boolean;
51
+ }
52
+ export interface HarnessProjectConfig {
53
+ version: 1;
54
+ project: {
55
+ name: string;
56
+ };
57
+ agents?: {
58
+ configPath?: string;
59
+ generatedPath?: string;
60
+ activeProfile?: string;
61
+ required?: boolean;
62
+ findingsDir?: string;
63
+ };
64
+ workflow?: {
65
+ quick?: {
66
+ maxFiles?: number;
67
+ disallowedDomains?: string[];
68
+ };
69
+ issueIntake?: {
70
+ enabled?: boolean;
71
+ snapshotDir?: string;
72
+ verifyDriftOnRun?: boolean;
73
+ requireOpen?: boolean;
74
+ plannerAgent?: string;
75
+ autoHandoff?: boolean;
76
+ };
77
+ reviews?: {
78
+ enabled?: boolean;
79
+ reviewQuick?: boolean;
80
+ leadAcceptance?: boolean;
81
+ leadAcceptanceQuick?: boolean;
82
+ /** @deprecated Accepted for old project files but ignored by the convergence engine. */
83
+ maxRemediationRounds?: number;
84
+ /** @deprecated Accepted for old project files but superseded by finalQualityGate. */
85
+ blockingSeverities?: ReviewSeverity[];
86
+ quality?: {
87
+ severityPoints?: Partial<Record<ReviewSeverity, number>>;
88
+ };
89
+ convergence?: {
90
+ minimumDebtPointImprovement?: number;
91
+ stagnationWindow?: number;
92
+ cycleDetection?: boolean;
93
+ regressionDetection?: boolean;
94
+ };
95
+ finalQualityGate?: {
96
+ maxBySeverity?: Partial<Record<ReviewSeverity, number>>;
97
+ maxDebtPoints?: number;
98
+ };
99
+ escalation?: {
100
+ stages?: ReviewEscalationStage[];
101
+ criticalStartStage?: number;
102
+ replanResumeStage?: number;
103
+ };
104
+ };
105
+ };
106
+ orchestration?: {
107
+ provider: "paseo" | "podman" | "none" | string;
108
+ required?: boolean;
109
+ worker?: {
110
+ provider?: string;
111
+ model?: string;
112
+ maxRepairAttempts?: number;
113
+ timeoutSeconds?: number;
114
+ titlePrefix?: string;
115
+ };
116
+ };
117
+ toolchain?: {
118
+ configPath?: string;
119
+ lockPath?: string;
120
+ statePath?: string;
121
+ generatedMisePath?: string;
122
+ };
123
+ mcp?: {
124
+ servers?: Record<string, McpServerConfig>;
125
+ };
126
+ delivery?: {
127
+ stateDir?: string;
128
+ github?: {
129
+ enabled?: boolean;
130
+ tokenEnv?: string;
131
+ repository?: string;
132
+ apiBaseUrl?: string;
133
+ assignTokenOwner?: boolean;
134
+ labels?: string[];
135
+ branchPattern?: string;
136
+ finalizeOnAcceptance?: boolean;
137
+ pullRequestDraft?: boolean;
138
+ };
139
+ paseo?: {
140
+ enabled?: boolean;
141
+ createWorkspace?: boolean;
142
+ autoUseWorkspace?: boolean;
143
+ worktreeSlugPattern?: string;
144
+ };
145
+ };
146
+ memory?: {
147
+ provider: "engram" | "none" | string;
148
+ required?: boolean;
149
+ benchmark?: {
150
+ casesDir?: string;
151
+ resultsDir?: string;
152
+ providers?: Array<{
153
+ name: string;
154
+ command: string;
155
+ timeoutSeconds?: number;
156
+ }>;
157
+ };
158
+ };
159
+ codeIntelligence?: {
160
+ provider: "graphify" | "none" | string;
161
+ required?: boolean;
162
+ graphPath?: string;
163
+ snapshotDir?: string;
164
+ refreshCommand?: string;
165
+ };
166
+ sdd?: {
167
+ specsDir?: string;
168
+ contractsDir?: string;
169
+ reportsDir?: string;
170
+ repairsDir?: string;
171
+ runsDir?: string;
172
+ };
173
+ validation?: {
174
+ baseRef?: string;
175
+ commands?: ValidationCommand[];
176
+ validators?: ValidatorSpec[];
177
+ frozenPaths?: string[];
178
+ requireSeal?: boolean;
179
+ opa?: {
180
+ enabled?: boolean;
181
+ policyDirs?: string[];
182
+ };
183
+ };
184
+ security?: {
185
+ sandbox?: {
186
+ provider?: "podman" | "docker" | "none" | string;
187
+ required?: boolean;
188
+ image?: string;
189
+ network?: boolean;
190
+ extraArgs?: string[];
191
+ };
192
+ tools?: string[];
193
+ };
194
+ telemetry?: {
195
+ enabled?: boolean;
196
+ required?: boolean;
197
+ localEventsFile?: string;
198
+ exporter?: "none" | "otlp-http-json" | string;
199
+ endpoint?: string;
200
+ headers?: Record<string, string>;
201
+ serviceName?: string;
202
+ };
203
+ evals?: {
204
+ corpusDir?: string;
205
+ resultsDir?: string;
206
+ workspacesDir?: string;
207
+ };
208
+ provenance?: {
209
+ outputDir?: string;
210
+ buildType?: string;
211
+ cosignKey?: string;
212
+ };
213
+ }
214
+ export interface TaskRequirement {
215
+ id: string;
216
+ description?: string;
217
+ validator?: string;
218
+ validators?: string[];
219
+ }
220
+ export interface QuickTaskMetadata {
221
+ request: string;
222
+ acceptance: string[];
223
+ triage: {
224
+ mode: TaskMode;
225
+ reasons: string[];
226
+ evaluatedAt: string;
227
+ };
228
+ }
229
+ export interface TaskIssueMetadata {
230
+ provider: "github";
231
+ repository: string;
232
+ number: number;
233
+ url: string;
234
+ state: string;
235
+ fetchedAt: string;
236
+ updatedAt: string;
237
+ contentSha256: string;
238
+ snapshotPath: string;
239
+ }
240
+ export interface TaskContract {
241
+ version: 1;
242
+ mode?: TaskMode;
243
+ task: {
244
+ id: string;
245
+ title: string;
246
+ };
247
+ quick?: QuickTaskMetadata;
248
+ source?: {
249
+ proposal?: string;
250
+ spec?: string;
251
+ design?: string;
252
+ tasks?: string;
253
+ acceptance?: string;
254
+ issue?: string;
255
+ };
256
+ issue?: TaskIssueMetadata;
257
+ git?: {
258
+ baseRef?: string;
259
+ originatingBranch?: string;
260
+ };
261
+ scope?: {
262
+ allowed?: string[];
263
+ forbidden?: string[];
264
+ frozen?: string[];
265
+ };
266
+ routing?: {
267
+ intent?: string;
268
+ domains?: string[];
269
+ risk?: "low" | "medium" | "high";
270
+ agent?: string;
271
+ reviewers?: string[];
272
+ profile?: string;
273
+ };
274
+ requirements?: TaskRequirement[];
275
+ constraints?: {
276
+ breakingApiChanges?: boolean;
277
+ newDependencies?: boolean;
278
+ schemaChanges?: boolean;
279
+ maxFilesChanged?: number;
280
+ maxLinesAdded?: number;
281
+ maxLinesDeleted?: number;
282
+ };
283
+ impact?: {
284
+ forbiddenEdges?: string[];
285
+ forbiddenNodes?: string[];
286
+ allowedCommunities?: string[];
287
+ };
288
+ repair?: {
289
+ maxAttempts?: number;
290
+ };
291
+ verification?: {
292
+ commands?: ValidationCommand[];
293
+ validators?: ValidatorSpec[];
294
+ };
295
+ }
296
+ export interface ValidationCheck {
297
+ id: string;
298
+ category: string;
299
+ status: CheckStatus;
300
+ message: string;
301
+ durationMs?: number;
302
+ details?: Record<string, unknown>;
303
+ }
304
+ export interface ValidationReport {
305
+ version: 1;
306
+ taskId: string;
307
+ status: "PASS" | "FAIL";
308
+ startedAt: string;
309
+ finishedAt: string;
310
+ checks: ValidationCheck[];
311
+ changedFiles: string[];
312
+ metadata: {
313
+ project: string;
314
+ baseRef: string;
315
+ };
316
+ }
317
+ export interface RequirementTrace {
318
+ id: string;
319
+ proposal: boolean;
320
+ spec: boolean;
321
+ design: boolean;
322
+ acceptance: boolean;
323
+ tasks: boolean;
324
+ contract: boolean;
325
+ validators: string[];
326
+ }
327
+ export interface RepairPacket {
328
+ version: 1;
329
+ taskId: string;
330
+ attempt: number;
331
+ createdAt: string;
332
+ failureType?: string;
333
+ failedAgent?: string;
334
+ recoveryAction?: string;
335
+ failures: Array<{
336
+ id: string;
337
+ category: string;
338
+ message: string;
339
+ details?: Record<string, unknown>;
340
+ }>;
341
+ }
342
+ export interface WorkerSession {
343
+ id?: string;
344
+ provider: string;
345
+ model?: string;
346
+ logicalAgent?: string;
347
+ nativeAgent?: string;
348
+ runtime?: string;
349
+ profile?: string;
350
+ exitCode: number;
351
+ stdout: string;
352
+ stderr: string;
353
+ metrics?: UsageMetrics;
354
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { HarnessProjectConfig, TaskContract, ValidationReport } from "./types.js";
2
+ export interface VerifyTaskOptions {
3
+ stateRoot?: string;
4
+ policyRoot?: string;
5
+ }
6
+ export declare function verifyTask(root: string, config: HarnessProjectConfig, contract: TaskContract, options?: VerifyTaskOptions): Promise<ValidationReport>;
@@ -0,0 +1,51 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loadTaskContract } from "./config.js";
4
+ import { getChangedFiles, getDiffStats } from "./git.js";
5
+ import { deliveryWorkspacePath } from "../delivery/handoff.js";
6
+ import { validateDiffScope } from "../validators/diffScope.js";
7
+ import { validateDiffBudget } from "../validators/constraints.js";
8
+ import { runValidationCommand } from "../validators/commands.js";
9
+ import { recordEvent } from "../telemetry/events.js";
10
+ import { runOpaPolicies } from "../validators/opa.js";
11
+ import { verifyTaskSeal } from "./seal.js";
12
+ import { runConfiguredValidators } from "../validators/registry.js";
13
+ import { collectPolicyEvidence } from "../validators/evidence.js";
14
+ export async function verifyTask(root, config, contract, options = {}) {
15
+ const executionRoot = path.resolve(root);
16
+ if (!options.stateRoot) {
17
+ const deliveryRoot = await deliveryWorkspacePath(executionRoot, config, contract.task.id);
18
+ if (deliveryRoot && path.resolve(deliveryRoot) !== executionRoot) {
19
+ const workspaceContract = await loadTaskContract(deliveryRoot, contract.task.id, config);
20
+ return verifyTask(deliveryRoot, config, workspaceContract, { stateRoot: executionRoot, policyRoot: executionRoot });
21
+ }
22
+ }
23
+ const stateRoot = path.resolve(options.stateRoot ?? executionRoot);
24
+ const policyRoot = path.resolve(options.policyRoot ?? stateRoot);
25
+ const startedAt = new Date().toISOString();
26
+ const baseRef = contract.git?.baseRef ?? config.validation?.baseRef ?? "HEAD";
27
+ await recordEvent(stateRoot, config, "harness.verify.start", { taskId: contract.task.id, baseRef, workspaceRoot: executionRoot === stateRoot ? undefined : executionRoot });
28
+ const changedFiles = await getChangedFiles(executionRoot, baseRef);
29
+ const stats = await getDiffStats(executionRoot, baseRef);
30
+ const checks = [];
31
+ checks.push(await verifyTaskSeal(executionRoot, contract, config.validation?.requireSeal ?? true));
32
+ const scopeChecks = validateDiffScope(changedFiles, contract, config.validation?.frozenPaths ?? []);
33
+ checks.push(...scopeChecks);
34
+ checks.push(...validateDiffBudget(contract, stats));
35
+ const frozenChanged = (scopeChecks.find((c) => c.id === "diff.frozen-paths")?.details?.frozenChanged ?? []);
36
+ const evidence = collectPolicyEvidence(changedFiles);
37
+ checks.push(await runOpaPolicies(executionRoot, config, contract, changedFiles, frozenChanged, evidence, policyRoot));
38
+ const commands = [...(config.validation?.commands ?? []), ...(contract.verification?.commands ?? [])];
39
+ for (const command of commands)
40
+ checks.push(await runValidationCommand(executionRoot, command));
41
+ checks.push(...await runConfiguredValidators(executionRoot, config, contract, baseRef, changedFiles));
42
+ const status = checks.some((check) => check.status === "FAIL") ? "FAIL" : "PASS";
43
+ const report = { version: 1, taskId: contract.task.id, status, startedAt, finishedAt: new Date().toISOString(), checks, changedFiles, metadata: { project: config.project.name, baseRef } };
44
+ const reportsDir = config.sdd?.reportsDir ?? ".harness/reports";
45
+ const output = path.join(stateRoot, reportsDir, `${contract.task.id}.json`);
46
+ await fs.mkdir(path.dirname(output), { recursive: true });
47
+ await fs.writeFile(output, `${JSON.stringify(report, null, 2)}\n`);
48
+ await recordEvent(stateRoot, config, "harness.verify.finish", { taskId: contract.task.id, status, checks: checks.length });
49
+ return report;
50
+ }
51
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { HarnessProjectConfig, TaskContract } from "../core/types.js";
2
+ export type DeliveryFinalizationStatus = "SKIPPED" | "NO_CHANGES" | "FINALIZED" | "BLOCKED_EXTERNAL" | "SYSTEM_FAILURE";
3
+ export interface DeliveryFinalizationResult {
4
+ status: DeliveryFinalizationStatus;
5
+ humanRequired: boolean;
6
+ committed: boolean;
7
+ commitSha?: string;
8
+ pushed: boolean;
9
+ pullRequest?: {
10
+ number: number;
11
+ url: string;
12
+ draft: boolean;
13
+ };
14
+ message: string;
15
+ }
16
+ export declare function finalizeAcceptedIssue(root: string, config: HarnessProjectConfig, contract: TaskContract): Promise<DeliveryFinalizationResult>;
17
+ export declare function deliveryFinalizationFailure(error: unknown): DeliveryFinalizationResult;
@@ -0,0 +1,71 @@
1
+ import { getCurrentBranch } from "../core/git.js";
2
+ import { githubRequest, loadDeliveryRecord, resolveGithubToken } from "./handoff.js";
3
+ import { runProcess } from "../utils/process.js";
4
+ export async function finalizeAcceptedIssue(root, config, contract) {
5
+ const github = config.delivery?.github;
6
+ if (!contract.issue || contract.issue.provider !== "github")
7
+ return skipped("Task is not issue-derived.");
8
+ if (!github?.enabled || github.finalizeOnAcceptance !== true)
9
+ return skipped("GitHub finalization is not enabled.");
10
+ const record = await loadDeliveryRecord(root, config, contract.task.id);
11
+ const branch = record?.github?.branch;
12
+ if (!branch)
13
+ throw new Error(`BLOCKED_EXTERNAL: accepted issue task ${contract.task.id} has no issue-linked delivery branch to finalize.`);
14
+ const repository = record.github?.repository ?? contract.issue.repository;
15
+ const base = contract.git?.originatingBranch ?? contract.git?.baseRef ?? config.validation?.baseRef ?? "main";
16
+ const current = await getCurrentBranch(root);
17
+ if (current && current !== branch)
18
+ throw new Error(`SYSTEM_FAILURE: refusing to finalize ${contract.task.id}; workspace branch is '${current}' but delivery branch is '${branch}'. Enable the isolated delivery workspace or run from the issue branch.`);
19
+ const status = await runProcess("git status --porcelain", { cwd: root, timeoutMs: 30_000 });
20
+ if (status.exitCode !== 0)
21
+ throw new Error(`SYSTEM_FAILURE: cannot inspect final Git state: ${status.stderr || status.stdout}`);
22
+ let committed = false;
23
+ let commitSha;
24
+ if (status.stdout.trim()) {
25
+ const add = await runProcess("git add -A", { cwd: root, timeoutMs: 60_000 });
26
+ if (add.exitCode !== 0)
27
+ throw new Error(`SYSTEM_FAILURE: git add failed during deterministic finalization: ${add.stderr || add.stdout}`);
28
+ const commit = await commitWithConfiguredOrHarnessIdentity(root, `${contract.task.id}: ${contract.task.title}`);
29
+ if (commit.exitCode !== 0)
30
+ throw new Error(`SYSTEM_FAILURE: git commit failed during deterministic finalization: ${commit.stderr || commit.stdout}`);
31
+ committed = true;
32
+ commitSha = await revParse(root, "HEAD");
33
+ }
34
+ else
35
+ commitSha = await revParse(root, "HEAD");
36
+ const ahead = await runProcess(`git rev-list --count ${quote(`${base}..HEAD`)}`, { cwd: root, timeoutMs: 30_000 });
37
+ if (ahead.exitCode !== 0)
38
+ throw new Error(`SYSTEM_FAILURE: cannot determine whether ${branch} contains deliverable commits: ${ahead.stderr || ahead.stdout}`);
39
+ if (Number(ahead.stdout.trim() || "0") === 0)
40
+ return { status: "NO_CHANGES", humanRequired: false, committed, commitSha, pushed: false, message: `No commits differ from ${base}; no pull request is required.` };
41
+ const push = await runProcess(`git push origin HEAD:${quoteRef(branch)}`, { cwd: root, timeoutMs: 180_000 });
42
+ if (push.exitCode !== 0)
43
+ throw new Error(`BLOCKED_EXTERNAL: git push failed for ${branch}: ${push.stderr || push.stdout}`);
44
+ const token = resolveGithubToken(github.tokenEnv);
45
+ const apiBase = (github.apiBaseUrl ?? "https://api.github.com").replace(/\/$/, "");
46
+ const owner = repository.split("/")[0];
47
+ const query = `/repos/${repository}/pulls?state=open&head=${encodeURIComponent(`${owner}:${branch}`)}&base=${encodeURIComponent(base)}`;
48
+ const existing = await githubRequest(apiBase, token, query);
49
+ let pr = existing[0];
50
+ if (!pr) {
51
+ pr = await githubRequest(apiBase, token, `/repos/${repository}/pulls`, {
52
+ method: "POST",
53
+ body: JSON.stringify({ title: `${contract.task.id}: ${contract.task.title}`, head: branch, base, draft: github.pullRequestDraft ?? true, body: buildPullRequestBody(contract) })
54
+ });
55
+ }
56
+ return { status: "FINALIZED", humanRequired: false, committed, commitSha, pushed: true, pullRequest: { number: pr.number, url: pr.html_url, draft: pr.draft ?? (github.pullRequestDraft ?? true) }, message: `Accepted issue task finalized on ${branch}; pull request #${pr.number}.` };
57
+ }
58
+ export function deliveryFinalizationFailure(error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ const external = /^BLOCKED_EXTERNAL:/.test(message);
61
+ return { status: external ? "BLOCKED_EXTERNAL" : "SYSTEM_FAILURE", humanRequired: external, committed: false, pushed: false, message };
62
+ }
63
+ function buildPullRequestBody(contract) { const issue = contract.issue; return `## Harness delivery\n\nTask: \`${contract.task.id}\`\nSource: ${issue.repository}#${issue.number}\nFrozen issue SHA-256: \`${issue.contentSha256}\`\n\nThe implementation passed the configured deterministic validation, quality convergence and lead-acceptance workflow before this PR was created.\n\nCloses #${issue.number}\n`; }
64
+ function skipped(message) { return { status: "SKIPPED", humanRequired: false, committed: false, pushed: false, message }; }
65
+ async function commitWithConfiguredOrHarnessIdentity(root, message) { const name = await runProcess("git config user.name", { cwd: root, timeoutMs: 10_000 }); const email = await runProcess("git config user.email", { cwd: root, timeoutMs: 10_000 }); const identity = name.exitCode === 0 && name.stdout.trim() && email.exitCode === 0 && email.stdout.trim() ? "" : `-c user.name=${quote("Agentic Engineering Harness")} -c user.email=${quote("aeh@users.noreply.github.com")}`; return runProcess(`git ${identity} commit -m ${quote(message)}`, { cwd: root, timeoutMs: 120_000 }); }
66
+ async function revParse(root, ref) { const result = await runProcess(`git rev-parse ${quote(ref)}`, { cwd: root, timeoutMs: 30_000 }); if (result.exitCode !== 0)
67
+ throw new Error(`SYSTEM_FAILURE: git rev-parse ${ref} failed: ${result.stderr || result.stdout}`); return result.stdout.trim(); }
68
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
69
+ function quoteRef(value) { if (!/^[A-Za-z0-9._\/-]+$/.test(value))
70
+ throw new Error(`Unsafe git ref: ${value}`); return value; }
71
+ //# sourceMappingURL=finalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize.js","sourceRoot":"","sources":["../../src/delivery/finalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { HarnessProjectConfig, TaskContract } from "../core/types.js";
2
+ export interface DeliveryRecord {
3
+ version: 1;
4
+ taskId: string;
5
+ status: "initialized" | "issue-created" | "branch-created" | "workspace-created" | "ready";
6
+ createdAt: string;
7
+ updatedAt: string;
8
+ originatingBranch: string;
9
+ github?: {
10
+ repository: string;
11
+ issueNumber?: number;
12
+ issueUrl?: string;
13
+ branch?: string;
14
+ branchSha?: string;
15
+ };
16
+ paseo?: {
17
+ workspaceId?: string;
18
+ worktreePath?: string;
19
+ };
20
+ }
21
+ export declare function handoffTask(root: string, config: HarnessProjectConfig, taskId: string): Promise<DeliveryRecord>;
22
+ export declare function handoffSdd(root: string, config: HarnessProjectConfig, taskId: string): Promise<DeliveryRecord>;
23
+ export declare function seedDeliveryRecordFromIssue(root: string, config: HarnessProjectConfig, contract: TaskContract, issue: {
24
+ repository: string;
25
+ issueNumber: number;
26
+ issueUrl: string;
27
+ }): Promise<DeliveryRecord>;
28
+ export declare function assertHandoffReady(root: string, contract: TaskContract): Promise<void>;
29
+ export declare function materializeTaskContext(controlRoot: string, workspaceRoot: string, config: HarnessProjectConfig, contract: TaskContract): Promise<void>;
30
+ export declare function loadDeliveryRecord(root: string, config: HarnessProjectConfig, taskId: string): Promise<DeliveryRecord | undefined>;
31
+ export declare function deliveryWorkspaceId(root: string, config: HarnessProjectConfig, taskId: string): Promise<string | undefined>;
32
+ export declare function deliveryWorkspacePath(root: string, config: HarnessProjectConfig, taskId: string): Promise<string | undefined>;
33
+ export declare function parseGithubRepository(remote: string): string | undefined;
34
+ export declare function renderPattern(pattern: string, contract: TaskContract, issue?: number): string;
35
+ export declare function renderIssueBody(root: string, contract: TaskContract, originatingBranch: string): Promise<string>;
36
+ export declare function inferGithubRepository(root: string): Promise<string>;
37
+ export declare function resolveGithubTokenOptional(preferred?: string): string | undefined;
38
+ export declare function resolveGithubToken(preferred?: string): string;
39
+ export declare function githubRequest<T = unknown>(base: string, token: string | undefined, endpoint: string, init?: RequestInit): Promise<T>;