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,250 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getOriginRemote } from "../core/git.js";
4
+ import { loadTaskContract } from "../core/config.js";
5
+ import { validateQuickTaskContract } from "../core/quick.js";
6
+ import { validateSddChange } from "../core/sdd.js";
7
+ import { verifyTaskSeal } from "../core/seal.js";
8
+ import { runProcess } from "../utils/process.js";
9
+ export async function handoffTask(root, config, taskId) {
10
+ const contract = await loadTaskContract(root, taskId, config);
11
+ if (contract.mode === "quick") {
12
+ const validation = validateQuickTaskContract(config, contract);
13
+ if (!validation.ok)
14
+ throw new Error(`Cannot hand off ${taskId}: QuickContract validation failed: ${validation.issues.join("; ")}`);
15
+ }
16
+ else {
17
+ const validation = await validateSddChange(root, taskId, config);
18
+ if (!validation.ok)
19
+ throw new Error(`Cannot hand off ${taskId}: SDD validation failed: ${[...validation.missing, ...validation.issues].join("; ")}`);
20
+ }
21
+ await assertHandoffReady(root, contract);
22
+ if (config.validation?.requireSeal !== false) {
23
+ const seal = await verifyTaskSeal(root, contract, true);
24
+ if (seal.status !== "PASS")
25
+ throw new Error(`Cannot hand off ${taskId}: ${seal.message}`);
26
+ }
27
+ const originatingBranch = contract.git?.originatingBranch ?? contract.git?.baseRef ?? config.validation?.baseRef ?? "main";
28
+ let record = await loadDeliveryRecord(root, config, taskId) ?? { version: 1, taskId, status: "initialized", createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), originatingBranch };
29
+ const github = config.delivery?.github;
30
+ if (github?.enabled) {
31
+ const token = resolveGithubToken(github.tokenEnv);
32
+ const repository = record.github?.repository ?? github.repository ?? await inferGithubRepository(root);
33
+ const apiBase = (github.apiBaseUrl ?? "https://api.github.com").replace(/\/$/, "");
34
+ record.github = { repository, ...(record.github ?? {}) };
35
+ await saveDeliveryRecord(root, config, record);
36
+ if (!record.github.issueNumber) {
37
+ const body = await renderIssueBody(root, contract, originatingBranch);
38
+ const assignees = [];
39
+ if (github.assignTokenOwner !== false)
40
+ assignees.push((await githubRequest(apiBase, token, "/user")).login);
41
+ const issue = await githubRequest(apiBase, token, `/repos/${repository}/issues`, { method: "POST", body: JSON.stringify({ title: `${contract.task.id}: ${contract.task.title}`, body, labels: github.labels ?? [], assignees }) });
42
+ record.github.issueNumber = issue.number;
43
+ record.github.issueUrl = issue.html_url;
44
+ record.status = "issue-created";
45
+ record.updatedAt = new Date().toISOString();
46
+ await saveDeliveryRecord(root, config, record);
47
+ }
48
+ if (!record.github.branch) {
49
+ const branch = renderPattern(github.branchPattern ?? "feature/gh-{issue}-{slug}", contract, record.github.issueNumber);
50
+ const existing = await githubRequestMaybe(apiBase, token, `/repos/${repository}/git/ref/heads/${encodeRef(branch)}`);
51
+ if (existing) {
52
+ record.github.branch = branch;
53
+ record.github.branchSha = existing.object.sha;
54
+ }
55
+ else {
56
+ const baseRef = await githubRequest(apiBase, token, `/repos/${repository}/git/ref/heads/${encodeRef(originatingBranch)}`);
57
+ await githubRequest(apiBase, token, `/repos/${repository}/git/refs`, { method: "POST", body: JSON.stringify({ ref: `refs/heads/${branch}`, sha: baseRef.object.sha }) });
58
+ record.github.branch = branch;
59
+ record.github.branchSha = baseRef.object.sha;
60
+ }
61
+ record.status = "branch-created";
62
+ record.updatedAt = new Date().toISOString();
63
+ await saveDeliveryRecord(root, config, record);
64
+ }
65
+ }
66
+ const paseo = config.delivery?.paseo;
67
+ if (paseo?.enabled && paseo.createWorkspace !== false) {
68
+ if (record.paseo?.worktreePath && !(await exists(record.paseo.worktreePath)))
69
+ record.paseo = undefined;
70
+ if (!record.paseo?.workspaceId) {
71
+ const issue = record.github?.issueNumber;
72
+ const slug = renderPattern(paseo.worktreeSlugPattern ?? "gh-{issue}-{slug}", contract, issue);
73
+ const remoteBranch = record.github?.branch;
74
+ const localIssueBranch = issue ? renderPattern(github?.branchPattern ?? "feature/gh-{issue}-{slug}", contract, issue) : renderPattern("aeh-{task}-{slug}", contract, issue);
75
+ const workspace = remoteBranch ? await createCheckoutWorkspace(root, remoteBranch, slug, taskId) : await createBranchOffWorkspace(root, originatingBranch, localIssueBranch, slug, taskId);
76
+ if (!workspace.worktreePath)
77
+ throw new Error("Paseo workspace did not expose a worktree path; task context cannot be materialized safely.");
78
+ await materializeTaskContext(root, workspace.worktreePath, config, contract);
79
+ record.paseo = workspace;
80
+ record.status = "workspace-created";
81
+ record.updatedAt = new Date().toISOString();
82
+ await saveDeliveryRecord(root, config, record);
83
+ }
84
+ else if (record.paseo.worktreePath)
85
+ await materializeTaskContext(root, record.paseo.worktreePath, config, contract);
86
+ }
87
+ record.status = "ready";
88
+ record.updatedAt = new Date().toISOString();
89
+ await saveDeliveryRecord(root, config, record);
90
+ return record;
91
+ }
92
+ export async function handoffSdd(root, config, taskId) { return handoffTask(root, config, taskId); }
93
+ export async function seedDeliveryRecordFromIssue(root, config, contract, issue) {
94
+ const originatingBranch = contract.git?.originatingBranch ?? contract.git?.baseRef ?? config.validation?.baseRef ?? "main";
95
+ const existing = await loadDeliveryRecord(root, config, contract.task.id);
96
+ if (existing?.github?.issueNumber && existing.github.issueNumber !== issue.issueNumber)
97
+ throw new Error(`Delivery record ${contract.task.id} is already bound to GitHub issue #${existing.github.issueNumber}.`);
98
+ if (existing?.github?.repository && existing.github.repository !== issue.repository)
99
+ throw new Error(`Delivery record ${contract.task.id} is already bound to ${existing.github.repository}.`);
100
+ const now = new Date().toISOString();
101
+ const record = existing ?? { version: 1, taskId: contract.task.id, status: "initialized", createdAt: now, updatedAt: now, originatingBranch };
102
+ record.github = { repository: issue.repository, issueNumber: issue.issueNumber, issueUrl: issue.issueUrl, ...(record.github ?? {}) };
103
+ if (record.status === "initialized")
104
+ record.status = "issue-created";
105
+ record.updatedAt = now;
106
+ await saveDeliveryRecord(root, config, record);
107
+ return record;
108
+ }
109
+ export async function assertHandoffReady(root, contract) {
110
+ const placeholders = [];
111
+ for (const kind of ["proposal", "spec", "design", "tasks", "acceptance"]) {
112
+ const relative = contract.source?.[kind];
113
+ if (!relative)
114
+ continue;
115
+ const content = await fs.readFile(path.resolve(root, relative), "utf8");
116
+ if (/\bTODO\b|TODO observable|TODO business rule/i.test(content))
117
+ placeholders.push(kind);
118
+ }
119
+ for (const requirement of contract.requirements ?? [])
120
+ if (/\bTODO\b/i.test(requirement.description ?? ""))
121
+ placeholders.push(`requirement:${requirement.id}`);
122
+ if (placeholders.length)
123
+ throw new Error(`Cannot hand off ${contract.task.id}: unresolved template placeholders remain in ${[...new Set(placeholders)].join(", ")}.`);
124
+ }
125
+ export async function materializeTaskContext(controlRoot, workspaceRoot, config, contract) {
126
+ if (path.resolve(controlRoot) === path.resolve(workspaceRoot))
127
+ return;
128
+ const relativeFiles = [...Object.values(contract.source ?? {}).filter((value) => Boolean(value)), path.join(config.sdd?.contractsDir ?? ".harness/contracts", `${contract.task.id}.yaml`), path.join(".harness", "seals", `${contract.task.id}.json`)];
129
+ for (const relative of [...new Set(relativeFiles)]) {
130
+ if (path.isAbsolute(relative) || relative.startsWith(".."))
131
+ throw new Error(`Task context path must be repository-relative for worktree handoff: ${relative}`);
132
+ const source = path.resolve(controlRoot, relative);
133
+ const destination = path.resolve(workspaceRoot, relative);
134
+ try {
135
+ await fs.access(source);
136
+ }
137
+ catch {
138
+ throw new Error(`Task context artifact is missing before worktree handoff: ${relative}`);
139
+ }
140
+ await fs.mkdir(path.dirname(destination), { recursive: true });
141
+ await fs.copyFile(source, destination);
142
+ }
143
+ }
144
+ export async function loadDeliveryRecord(root, config, taskId) {
145
+ for (const candidate of await deliveryControlRoots(root)) {
146
+ try {
147
+ return JSON.parse(await fs.readFile(deliveryFile(candidate, config, taskId), "utf8"));
148
+ }
149
+ catch { /* try next root */ }
150
+ }
151
+ return undefined;
152
+ }
153
+ export async function deliveryWorkspaceId(root, config, taskId) { if (config.delivery?.paseo?.enabled !== true || config.delivery.paseo.autoUseWorkspace === false)
154
+ return undefined; return (await loadDeliveryRecord(root, config, taskId))?.paseo?.workspaceId; }
155
+ export async function deliveryWorkspacePath(root, config, taskId) { if (config.delivery?.paseo?.enabled !== true || config.delivery.paseo.autoUseWorkspace === false)
156
+ return undefined; const value = (await loadDeliveryRecord(root, config, taskId))?.paseo?.worktreePath; return value && await exists(value) ? value : undefined; }
157
+ export function parseGithubRepository(remote) { const ssh = remote.match(/^[^@]+@[^:]+:([^/]+\/[^/]+?)(?:\.git)?$/); if (ssh)
158
+ return ssh[1]; try {
159
+ const url = new URL(remote);
160
+ const value = url.pathname.replace(/^\//, "").replace(/\.git$/, "");
161
+ return /^[^/]+\/[^/]+$/.test(value) ? value : undefined;
162
+ }
163
+ catch {
164
+ return undefined;
165
+ } }
166
+ export function renderPattern(pattern, contract, issue) { const slug = slugify(contract.task.title); return pattern.replaceAll("{issue}", issue ? String(issue) : "no-issue").replaceAll("{task}", slugify(contract.task.id)).replaceAll("{slug}", slug); }
167
+ export async function renderIssueBody(root, contract, originatingBranch) { const spec = contract.source?.spec ? await fs.readFile(path.resolve(root, contract.source.spec), "utf8") : ""; const acceptance = contract.source?.acceptance ? await fs.readFile(path.resolve(root, contract.source.acceptance), "utf8") : ""; const requirements = (contract.requirements ?? []).map((item) => `- ${item.id}: ${item.description ?? "see specification"}`).join("\n"); return `**Source: Agentic Engineering Harness SDD**\n\n**Task:** ${contract.task.id}\n\n## Implementation Start Rule\nImplementation is authorized from this issue-linked branch only after the validated SDD handoff completes. The local sealed TaskContract and SDD artifacts remain normative; this issue is a delivery mirror.\n\n## Originating Branch\n${originatingBranch}\n\n## Requirements\n${requirements || "See specification."}\n\n## Specification\n${spec.trim()}\n\n## Acceptance\n\`\`\`gherkin\n${acceptance.trim()}\n\`\`\`\n\n## Harness Sources\n${Object.entries(contract.source ?? {}).map(([name, value]) => `- ${name}: \`${value}\``).join("\n")}\n`; }
168
+ export async function inferGithubRepository(root) { const remote = await getOriginRemote(root); const repository = remote ? parseGithubRepository(remote) : undefined; if (!repository)
169
+ throw new Error("Cannot infer GitHub repository from origin; set delivery.github.repository as owner/repo."); return repository; }
170
+ export function resolveGithubTokenOptional(preferred) { for (const name of [preferred, "GH_TOKEN", "GITHUB_TOKEN", "GITHUB_PAT"].filter((value) => Boolean(value))) {
171
+ const token = process.env[name];
172
+ if (token)
173
+ return token;
174
+ } return undefined; }
175
+ export function resolveGithubToken(preferred) { const token = resolveGithubTokenOptional(preferred); if (token)
176
+ return token; throw new Error(`GitHub delivery is enabled but no token is available. Set ${preferred ?? "GH_TOKEN"} (or GITHUB_TOKEN/GITHUB_PAT).`); }
177
+ export async function githubRequest(base, token, endpoint, init = {}) {
178
+ const headers = new Headers(init.headers);
179
+ headers.set("Accept", "application/vnd.github+json");
180
+ headers.set("X-GitHub-Api-Version", "2022-11-28");
181
+ headers.set("Content-Type", "application/json");
182
+ if (token)
183
+ headers.set("Authorization", `Bearer ${token}`);
184
+ const response = await fetch(`${base}${endpoint}`, { ...init, headers });
185
+ const text = await response.text();
186
+ if (!response.ok)
187
+ throw new Error(`GitHub API ${init.method ?? "GET"} ${endpoint} failed (${response.status}): ${text.slice(0, 1000)}`);
188
+ return text ? JSON.parse(text) : undefined;
189
+ }
190
+ async function githubRequestMaybe(base, token, endpoint) { try {
191
+ return await githubRequest(base, token, endpoint);
192
+ }
193
+ catch (error) {
194
+ if (/failed \(404\)/.test(String(error)))
195
+ return undefined;
196
+ throw error;
197
+ } }
198
+ async function createCheckoutWorkspace(root, branch, slug, title) { const local = await runProcess(`git show-ref --verify --quiet refs/heads/${quoteRef(branch)}`, { cwd: root }); if (local.exitCode !== 0) {
199
+ const fetchResult = await runProcess(`git fetch origin ${quote(`refs/heads/${branch}:refs/heads/${branch}`)}`, { cwd: root, timeoutMs: 120_000 });
200
+ if (fetchResult.exitCode !== 0)
201
+ throw new Error(`Failed to fetch issue branch ${branch}: ${fetchResult.stderr || fetchResult.stdout}`);
202
+ } return runPaseoWorkspace(root, `--mode checkout-branch --branch ${quote(branch)}`, slug, title, branch); }
203
+ async function createBranchOffWorkspace(root, base, branch, slug, title) { return runPaseoWorkspace(root, `--mode branch-off --new-branch ${quote(branch)} --base ${quote(base)}`, slug, title, branch); }
204
+ async function runPaseoWorkspace(root, mode, slug, title, branch) {
205
+ const create = await runProcess(`paseo workspace create --isolation worktree --path ${quote(root)} ${mode} --worktree-slug ${quote(slug)} --title ${quote(title)} --json`, { cwd: root, timeoutMs: 180_000 });
206
+ if (create.exitCode !== 0)
207
+ throw new Error(`Paseo workspace creation failed: ${create.stderr || create.stdout}`);
208
+ const direct = parseWorkspace(create.stdout, branch);
209
+ if (direct.workspaceId && direct.worktreePath)
210
+ return direct;
211
+ const list = await runProcess("paseo workspace ls --json", { cwd: root, timeoutMs: 60_000 });
212
+ if (list.exitCode === 0) {
213
+ const found = parseWorkspace(list.stdout, branch);
214
+ if (found.workspaceId && found.worktreePath)
215
+ return found;
216
+ }
217
+ throw new Error(`Paseo created the workspace but its ID/path could not be resolved. Output: ${create.stdout}`);
218
+ }
219
+ function parseWorkspace(raw, branch) { try {
220
+ const value = JSON.parse(raw);
221
+ const candidates = flattenObjects(value);
222
+ const found = candidates.find((item) => [item.branch, item.branchName, item.gitBranch].some((candidate) => candidate === branch)) ?? candidates.find((item) => typeof item.id === "string" || typeof item.workspaceId === "string");
223
+ return found ? { workspaceId: stringValue(found.workspaceId) ?? stringValue(found.id), worktreePath: stringValue(found.worktreePath) ?? stringValue(found.path) ?? stringValue(found.root) } : {};
224
+ }
225
+ catch {
226
+ return {};
227
+ } }
228
+ function flattenObjects(value) { if (Array.isArray(value))
229
+ return value.flatMap(flattenObjects); if (!value || typeof value !== "object")
230
+ return []; const record = value; return [record, ...Object.values(record).flatMap(flattenObjects)]; }
231
+ function stringValue(value) { return typeof value === "string" && value ? value : undefined; }
232
+ async function saveDeliveryRecord(root, config, record) { const file = deliveryFile(root, config, record.taskId); await fs.mkdir(path.dirname(file), { recursive: true }); await fs.writeFile(file, `${JSON.stringify(record, null, 2)}\n`); }
233
+ async function deliveryControlRoots(root) { const roots = [path.resolve(root)]; const common = await runProcess("git rev-parse --path-format=absolute --git-common-dir", { cwd: root, timeoutMs: 10_000 }); if (common.exitCode === 0) {
234
+ const gitDir = common.stdout.trim();
235
+ if (path.basename(gitDir) === ".git")
236
+ roots.push(path.dirname(gitDir));
237
+ } return [...new Set(roots)]; }
238
+ function deliveryFile(root, config, taskId) { return path.join(root, config.delivery?.stateDir ?? ".harness/delivery", `${taskId}.json`); }
239
+ function encodeRef(value) { return value.split("/").map(encodeURIComponent).join("/"); }
240
+ function slugify(value) { return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60) || "change"; }
241
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
242
+ function quoteRef(value) { return value.replace(/[^A-Za-z0-9._\/-]/g, ""); }
243
+ async function exists(file) { try {
244
+ await fs.access(file);
245
+ return true;
246
+ }
247
+ catch {
248
+ return false;
249
+ } }
250
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/delivery/handoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/entry.js ADDED
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { initializeProject } from "./core/init.js";
5
+ import { loadProjectConfig } from "./core/config.js";
6
+ import { compileAgentTopology } from "./agents/compiler.js";
7
+ import { compileToolchain, setupToolchain } from "./toolchain/setup.js";
8
+ import { loadToolchainConfig } from "./toolchain/config.js";
9
+ import { resolveToolchain } from "./toolchain/resolve.js";
10
+ const args = process.argv.slice(2);
11
+ if (args.length === 1 && ["--version", "-V"].includes(args[0])) {
12
+ console.log("0.4.16");
13
+ process.exit(0);
14
+ }
15
+ if (args[0] === "setup") {
16
+ await runSetup(args.slice(1));
17
+ process.exit(process.exitCode ?? 0);
18
+ }
19
+ if (args[0] === "toolchain") {
20
+ await runToolchain(args.slice(1));
21
+ process.exit(process.exitCode ?? 0);
22
+ }
23
+ if (args[0] === "init" && args.includes("--setup")) {
24
+ await runInitSetup(args.slice(1));
25
+ process.exit(process.exitCode ?? 0);
26
+ }
27
+ await import("./cli.js");
28
+ async function runSetup(argv) {
29
+ const parsed = parse(argv);
30
+ const root = path.resolve(parsed.directory);
31
+ const config = await loadProjectConfig(root);
32
+ const result = await setupToolchain(root, config, { profile: parsed.value("profile"), dryRun: parsed.flag("dry-run"), updateLock: parsed.flag("update-lock"), skipProjectDependencies: parsed.flag("skip-project-deps"), preferContainers: parsed.flag("prefer-containers") });
33
+ console.log(`${result.dryRun ? "DRY-RUN" : "READY"} toolchain profile=${result.profile}`);
34
+ console.log(`miseConfig=${result.generatedConfig}`);
35
+ console.log(`lock=${result.lockFile}`);
36
+ console.log(`state=${result.stateFile}`);
37
+ if (result.installed.length)
38
+ console.log(`tools=${result.installed.join(", ")}`);
39
+ if (result.containers.length)
40
+ console.log(`containers=${result.containers.join(", ")}`);
41
+ if (result.projectDependencyCommands.length)
42
+ console.log(`projectDeps=${result.projectDependencyCommands.join(" && ")}`);
43
+ if (result.systemMissing.length) {
44
+ console.error(`missingSystem=${result.systemMissing.join(", ")}`);
45
+ process.exitCode = 1;
46
+ }
47
+ }
48
+ async function runToolchain(argv) {
49
+ const sub = argv[0] ?? "show";
50
+ const parsed = parse(argv.slice(1));
51
+ const root = path.resolve(parsed.directory);
52
+ const config = await loadProjectConfig(root);
53
+ if (sub === "compile") {
54
+ console.log(`Compiled toolchain: ${await compileToolchain(root, config, { profile: parsed.value("profile"), updateLock: parsed.flag("update-lock") })}`);
55
+ return;
56
+ }
57
+ if (sub === "show") {
58
+ const tc = await loadToolchainConfig(root, config);
59
+ console.log(JSON.stringify(await resolveToolchain(root, config, tc, { profile: parsed.value("profile") }), null, 2));
60
+ return;
61
+ }
62
+ if (sub === "setup") {
63
+ await runSetup(argv.slice(1));
64
+ return;
65
+ }
66
+ throw new Error(`Unknown toolchain command '${sub}'. Use compile, show or setup.`);
67
+ }
68
+ async function runInitSetup(argv) {
69
+ const without = argv.filter((value) => value !== "--setup");
70
+ const parsed = parse(without);
71
+ const root = path.resolve(parsed.directory);
72
+ const created = await initializeProject(root);
73
+ const config = await loadProjectConfig(root);
74
+ if (config.agents) {
75
+ const compiled = await compileAgentTopology(root, config);
76
+ if (!compiled.ok)
77
+ throw new Error(compiled.issues.join("; "));
78
+ }
79
+ await compileToolchain(root, config);
80
+ const setup = await setupToolchain(root, config, { profile: parsed.value("profile"), preferContainers: parsed.flag("prefer-containers") });
81
+ console.log(created.length ? `Created: ${created.join(", ")}` : "Harness already initialized.");
82
+ console.log(`Toolchain ready: profile=${setup.profile}`);
83
+ }
84
+ function parse(argv) {
85
+ const valueFlags = new Set(["profile"]);
86
+ const booleanFlags = new Set(["dry-run", "update-lock", "skip-project-deps", "prefer-containers"]);
87
+ const flags = new Map();
88
+ const positional = [];
89
+ for (let i = 0; i < argv.length; i++) {
90
+ const value = argv[i];
91
+ if (!value.startsWith("--")) {
92
+ positional.push(value);
93
+ continue;
94
+ }
95
+ const name = value.slice(2);
96
+ if (valueFlags.has(name)) {
97
+ const next = argv[++i];
98
+ if (!next || next.startsWith("--"))
99
+ throw new Error(`--${name} requires a value.`);
100
+ flags.set(name, next);
101
+ continue;
102
+ }
103
+ if (!booleanFlags.has(name))
104
+ throw new Error(`Unknown toolchain option --${name}.`);
105
+ flags.set(name, true);
106
+ }
107
+ if (positional.length > 1)
108
+ throw new Error(`Expected at most one project directory, received: ${positional.join(", ")}`);
109
+ const directory = positional[0] ?? ".";
110
+ return { directory, flag: (name) => flags.get(name) === true, value: (name) => typeof flags.get(name) === "string" ? flags.get(name) : undefined };
111
+ }
112
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HarnessProjectConfig } from "../core/types.js";
2
+ import type { EvalResult } from "./types.js";
3
+ export declare function runEvalCase(root: string, config: HarnessProjectConfig, caseId: string, variantName?: string): Promise<EvalResult>;
4
+ export declare function compareEvalCase(root: string, config: HarnessProjectConfig, caseId: string): Promise<EvalResult[]>;
@@ -0,0 +1,112 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import YAML from "yaml";
4
+ import { z } from "zod";
5
+ import { runProcess } from "../utils/process.js";
6
+ import { rankEvalResults, scoreEvalResult } from "./scoring.js";
7
+ const variantSchema = z.object({ name: z.string().min(1), command: z.string().optional(), env: z.record(z.string(), z.string()).optional() });
8
+ const evalSchema = z.object({
9
+ version: z.literal(1),
10
+ id: z.string().min(1),
11
+ taskId: z.string().min(1),
12
+ baseRef: z.string().min(1),
13
+ fixtureDir: z.string().optional(),
14
+ setupCommands: z.array(z.string()).optional(),
15
+ runCommand: z.string().optional(),
16
+ variants: z.array(variantSchema).optional(),
17
+ expectations: z.object({
18
+ status: z.enum(["PASS", "FAIL"]).optional(),
19
+ maxRepairs: z.number().int().nonnegative().optional(),
20
+ maxHumanInterventions: z.number().int().nonnegative().optional(),
21
+ maxCostUsd: z.number().nonnegative().optional(),
22
+ requiredChecks: z.array(z.string()).optional()
23
+ }).optional(),
24
+ weights: z.object({ status: z.number().nonnegative().optional(), firstPass: z.number().nonnegative().optional(), repairs: z.number().nonnegative().optional(), interventions: z.number().nonnegative().optional(), efficiency: z.number().nonnegative().optional() }).optional()
25
+ });
26
+ export async function runEvalCase(root, config, caseId, variantName) {
27
+ const evalCase = await loadEvalCase(root, config, caseId);
28
+ const variant = selectVariant(evalCase, variantName);
29
+ const startedAt = new Date().toISOString();
30
+ const workspace = path.resolve(root, config.evals?.workspacesDir ?? ".harness/evals/workspaces", `${safe(caseId)}-${Date.now()}`);
31
+ await fs.mkdir(path.dirname(workspace), { recursive: true });
32
+ const add = await runProcess(`git worktree add --detach ${quote(workspace)} ${quote(evalCase.baseRef)}`, { cwd: root, timeoutMs: 120_000 });
33
+ if (add.exitCode !== 0)
34
+ throw new Error(`Unable to create eval worktree: ${add.stderr || add.stdout}`);
35
+ try {
36
+ if (evalCase.fixtureDir) {
37
+ const fixture = path.resolve(root, evalCase.fixtureDir);
38
+ await fs.cp(fixture, workspace, { recursive: true, force: true });
39
+ }
40
+ for (const setup of evalCase.setupCommands ?? []) {
41
+ const result = await runProcess(template(setup, evalCase, workspace), { cwd: workspace, timeoutMs: 600_000, env: variant.env });
42
+ if (result.exitCode !== 0)
43
+ throw new Error(`Eval setup failed: ${result.stderr || result.stdout}`);
44
+ }
45
+ const command = template(variant.command ?? evalCase.runCommand ?? `aeh run ${quote(evalCase.taskId)}`, evalCase, workspace);
46
+ const execution = await runProcess(command, { cwd: workspace, timeoutMs: 3_600_000, env: variant.env });
47
+ const run = await readJson(path.join(workspace, ".harness", "runs", `${evalCase.taskId}.json`));
48
+ const report = await readJson(path.join(workspace, ".harness", "reports", `${evalCase.taskId}.json`));
49
+ const status = (run?.status ?? report?.status ?? (execution.exitCode === 0 ? "PASS" : "FAIL"));
50
+ const base = {
51
+ version: 1,
52
+ caseId: evalCase.id,
53
+ variant: variant.name,
54
+ taskId: evalCase.taskId,
55
+ baseRef: evalCase.baseRef,
56
+ status,
57
+ commandExitCode: execution.exitCode,
58
+ metrics: run?.metrics,
59
+ report,
60
+ startedAt,
61
+ finishedAt: new Date().toISOString()
62
+ };
63
+ const scored = scoreEvalResult(evalCase, base);
64
+ const output = { ...base, ...scored };
65
+ const resultsDir = path.resolve(root, config.evals?.resultsDir ?? ".harness/evals/results", safe(caseId));
66
+ await fs.mkdir(resultsDir, { recursive: true });
67
+ const file = path.join(resultsDir, `${Date.now()}-${safe(variant.name)}.json`);
68
+ output.resultFile = path.relative(root, file).replaceAll("\\", "/");
69
+ await fs.writeFile(file, `${JSON.stringify(output, null, 2)}\n`);
70
+ return output;
71
+ }
72
+ finally {
73
+ await runProcess(`git worktree remove --force ${quote(workspace)}`, { cwd: root, timeoutMs: 120_000 });
74
+ }
75
+ }
76
+ export async function compareEvalCase(root, config, caseId) {
77
+ const dir = path.resolve(root, config.evals?.resultsDir ?? ".harness/evals/results", safe(caseId));
78
+ const files = await fs.readdir(dir).catch(() => []);
79
+ const results = [];
80
+ for (const file of files.filter((name) => name.endsWith(".json"))) {
81
+ const value = await readJson(path.join(dir, file));
82
+ if (value?.caseId === caseId)
83
+ results.push(value);
84
+ }
85
+ return rankEvalResults(results);
86
+ }
87
+ async function loadEvalCase(root, config, caseId) {
88
+ const file = path.resolve(root, config.evals?.corpusDir ?? "evals/corpus", caseId, "eval.yaml");
89
+ return evalSchema.parse(YAML.parse(await fs.readFile(file, "utf8")));
90
+ }
91
+ function selectVariant(evalCase, name) {
92
+ if (!evalCase.variants?.length)
93
+ return { name: name ?? "default" };
94
+ const selected = name ? evalCase.variants.find((variant) => variant.name === name) : evalCase.variants[0];
95
+ if (!selected)
96
+ throw new Error(`Unknown eval variant '${name}'.`);
97
+ return selected;
98
+ }
99
+ function template(command, evalCase, workspace) {
100
+ return command.replaceAll("{taskId}", evalCase.taskId).replaceAll("{workspace}", workspace);
101
+ }
102
+ async function readJson(file) {
103
+ try {
104
+ return JSON.parse(await fs.readFile(file, "utf8"));
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ }
110
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
111
+ function safe(value) { return value.replace(/[^A-Za-z0-9._-]/g, "-"); }
112
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/evals/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { EvalCase, EvalResult } from "./types.js";
2
+ export declare function scoreEvalResult(evalCase: EvalCase, input: Omit<EvalResult, "score" | "scoreBreakdown">): Pick<EvalResult, "score" | "scoreBreakdown">;
3
+ export declare function rankEvalResults(results: EvalResult[]): EvalResult[];
@@ -0,0 +1,41 @@
1
+ export function scoreEvalResult(evalCase, input) {
2
+ const weights = {
3
+ status: evalCase.weights?.status ?? 60,
4
+ firstPass: evalCase.weights?.firstPass ?? 15,
5
+ repairs: evalCase.weights?.repairs ?? 10,
6
+ interventions: evalCase.weights?.interventions ?? 10,
7
+ efficiency: evalCase.weights?.efficiency ?? 5
8
+ };
9
+ const expectedStatus = evalCase.expectations?.status ?? "PASS";
10
+ const breakdown = {};
11
+ breakdown.status = input.status === expectedStatus ? weights.status : 0;
12
+ breakdown.firstPass = input.metrics?.firstPassSuccess ? weights.firstPass : 0;
13
+ const repairs = input.metrics?.repairCount ?? Number.POSITIVE_INFINITY;
14
+ const repairBudget = evalCase.expectations?.maxRepairs ?? 2;
15
+ breakdown.repairs = Number.isFinite(repairs) && repairs <= repairBudget
16
+ ? weights.repairs * Math.max(0, 1 - repairs / (repairBudget + 1))
17
+ : 0;
18
+ const interventions = input.metrics?.humanInterventions ?? Number.POSITIVE_INFINITY;
19
+ const interventionBudget = evalCase.expectations?.maxHumanInterventions ?? 0;
20
+ breakdown.interventions = Number.isFinite(interventions) && interventions <= interventionBudget ? weights.interventions : 0;
21
+ const maxCost = evalCase.expectations?.maxCostUsd;
22
+ const cost = input.metrics?.usage.costUsd;
23
+ breakdown.efficiency = maxCost === undefined
24
+ ? weights.efficiency
25
+ : cost !== undefined && cost <= maxCost
26
+ ? weights.efficiency * Math.max(0, 1 - cost / Math.max(maxCost, 0.000001) * 0.5)
27
+ : 0;
28
+ if (evalCase.expectations?.requiredChecks?.length && input.report) {
29
+ const checks = new Map(input.report.checks.map((check) => [check.id, check.status]));
30
+ const missing = evalCase.expectations.requiredChecks.filter((id) => checks.get(id) !== "PASS");
31
+ if (missing.length)
32
+ breakdown.status = 0;
33
+ }
34
+ const score = round(Object.values(breakdown).reduce((sum, value) => sum + value, 0));
35
+ return { score, scoreBreakdown: Object.fromEntries(Object.entries(breakdown).map(([key, value]) => [key, round(value)])) };
36
+ }
37
+ export function rankEvalResults(results) {
38
+ return [...results].sort((a, b) => b.score - a.score || (a.metrics?.usage.costUsd ?? Infinity) - (b.metrics?.usage.costUsd ?? Infinity));
39
+ }
40
+ function round(value) { return Math.round(value * 1000) / 1000; }
41
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/evals/scoring.ts"],"names":[],"mappings":"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"}