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,46 @@
1
+ import type { RunMetrics, ValidationReport } from "../core/types.js";
2
+ export interface EvalVariant {
3
+ name: string;
4
+ command?: string;
5
+ env?: Record<string, string>;
6
+ }
7
+ export interface EvalCase {
8
+ version: 1;
9
+ id: string;
10
+ taskId: string;
11
+ baseRef: string;
12
+ fixtureDir?: string;
13
+ setupCommands?: string[];
14
+ runCommand?: string;
15
+ variants?: EvalVariant[];
16
+ expectations?: {
17
+ status?: "PASS" | "FAIL";
18
+ maxRepairs?: number;
19
+ maxHumanInterventions?: number;
20
+ maxCostUsd?: number;
21
+ requiredChecks?: string[];
22
+ };
23
+ weights?: {
24
+ status?: number;
25
+ firstPass?: number;
26
+ repairs?: number;
27
+ interventions?: number;
28
+ efficiency?: number;
29
+ };
30
+ }
31
+ export interface EvalResult {
32
+ version: 1;
33
+ caseId: string;
34
+ variant: string;
35
+ taskId: string;
36
+ baseRef: string;
37
+ status: "PASS" | "FAIL";
38
+ commandExitCode: number;
39
+ metrics?: RunMetrics;
40
+ report?: ValidationReport;
41
+ score: number;
42
+ scoreBreakdown: Record<string, number>;
43
+ startedAt: string;
44
+ finishedAt: string;
45
+ resultFile?: string;
46
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/evals/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ import { z } from "zod";
2
+ import { type TriageEvidence } from "../core/triage.js";
3
+ import type { HarnessProjectConfig, TaskContract } from "../core/types.js";
4
+ export interface GithubIssueSnapshot {
5
+ version: 1;
6
+ provider: "github";
7
+ repository: string;
8
+ number: number;
9
+ url: string;
10
+ title: string;
11
+ body: string;
12
+ state: string;
13
+ labels: string[];
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ fetchedAt: string;
17
+ contentSha256: string;
18
+ }
19
+ export interface IssueInspection {
20
+ snapshot: GithubIssueSnapshot;
21
+ evidence: TriageEvidence;
22
+ preliminaryMode: "quick" | "spec";
23
+ reasons: string[];
24
+ acceptance: string[];
25
+ }
26
+ export interface IssuePreparationResult {
27
+ taskId: string;
28
+ mode: "quick" | "spec";
29
+ contract: TaskContract;
30
+ snapshot: GithubIssueSnapshot;
31
+ normalizedBy: "planner" | "deterministic";
32
+ traceability?: string;
33
+ }
34
+ declare const issuePlanSchema: z.ZodObject<{
35
+ classification: z.ZodEnum<{
36
+ ready: "ready";
37
+ requires_product_decision: "requires_product_decision";
38
+ spec_contradiction: "spec_contradiction";
39
+ }>;
40
+ rationale: z.ZodString;
41
+ problem: z.ZodString;
42
+ desiredOutcome: z.ZodString;
43
+ requirements: z.ZodArray<z.ZodObject<{
44
+ text: z.ZodString;
45
+ source: z.ZodDefault<z.ZodEnum<{
46
+ explicit: "explicit";
47
+ "repository-derived": "repository-derived";
48
+ }>>;
49
+ validators: z.ZodOptional<z.ZodArray<z.ZodString>>;
50
+ }, z.core.$strip>>;
51
+ acceptance: z.ZodArray<z.ZodObject<{
52
+ title: z.ZodString;
53
+ requirementIndexes: z.ZodArray<z.ZodNumber>;
54
+ given: z.ZodString;
55
+ when: z.ZodString;
56
+ then: z.ZodString;
57
+ }, z.core.$strip>>;
58
+ scope: z.ZodObject<{
59
+ allowed: z.ZodDefault<z.ZodArray<z.ZodString>>;
60
+ forbidden: z.ZodDefault<z.ZodArray<z.ZodString>>;
61
+ domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
62
+ }, z.core.$strip>;
63
+ risk: z.ZodEnum<{
64
+ high: "high";
65
+ medium: "medium";
66
+ low: "low";
67
+ }>;
68
+ flags: z.ZodDefault<z.ZodArray<z.ZodEnum<{
69
+ security: "security";
70
+ architecture: "architecture";
71
+ authentication: "authentication";
72
+ authorization: "authorization";
73
+ schema: "schema";
74
+ migration: "migration";
75
+ "public-api": "public-api";
76
+ "breaking-change": "breaking-change";
77
+ "new-dependency": "new-dependency";
78
+ "cross-module": "cross-module";
79
+ ambiguous: "ambiguous";
80
+ }>>>;
81
+ constraints: z.ZodObject<{
82
+ breakingApiChanges: z.ZodBoolean;
83
+ newDependencies: z.ZodBoolean;
84
+ schemaChanges: z.ZodBoolean;
85
+ }, z.core.$strip>;
86
+ design: z.ZodObject<{
87
+ currentState: z.ZodString;
88
+ proposedDesign: z.ZodString;
89
+ risks: z.ZodDefault<z.ZodArray<z.ZodString>>;
90
+ }, z.core.$strip>;
91
+ tasks: z.ZodArray<z.ZodObject<{
92
+ title: z.ZodString;
93
+ requirementIndexes: z.ZodArray<z.ZodNumber>;
94
+ scope: z.ZodDefault<z.ZodArray<z.ZodString>>;
95
+ }, z.core.$strip>>;
96
+ nonGoals: z.ZodDefault<z.ZodArray<z.ZodString>>;
97
+ unresolved: z.ZodDefault<z.ZodArray<z.ZodString>>;
98
+ }, z.core.$strip>;
99
+ export type IssueIntakePlan = z.infer<typeof issuePlanSchema>;
100
+ export declare function inspectGithubIssue(root: string, config: HarnessProjectConfig, issueNumber: number): Promise<IssueInspection>;
101
+ export declare function prepareGithubIssueTask(root: string, config: HarnessProjectConfig, issueNumber: number, options?: {
102
+ refresh?: boolean;
103
+ force?: boolean;
104
+ usePlanner?: boolean;
105
+ }): Promise<IssuePreparationResult>;
106
+ export declare function verifyGithubIssueDrift(root: string, config: HarnessProjectConfig, contract: TaskContract): Promise<{
107
+ ok: boolean;
108
+ message: string;
109
+ remote?: GithubIssueSnapshot;
110
+ }>;
111
+ export declare function taskIdForIssue(issueNumber: number): string;
112
+ export declare function issueContentSha256(title: string, body: string): string;
113
+ export declare function normalizeIssueDeterministically(snapshot: GithubIssueSnapshot): IssueIntakePlan;
114
+ export {};
@@ -0,0 +1,213 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import YAML from "yaml";
5
+ import { z } from "zod";
6
+ import { loadResolvedAgentTopology } from "../agents/config.js";
7
+ import { executionSelectionForAgent } from "../agents/routing.js";
8
+ import { extractMarkedJson } from "../agents/structuredOutput.js";
9
+ import { loadTaskContract } from "../core/config.js";
10
+ import { getCurrentBranch } from "../core/git.js";
11
+ import { createQuickContract, validateQuickTaskContract } from "../core/quick.js";
12
+ import { formatTraceabilityMatrix, validateSddChange } from "../core/sdd.js";
13
+ import { sealTask, verifyTaskSeal } from "../core/seal.js";
14
+ import { triageChange } from "../core/triage.js";
15
+ import { githubRequest, inferGithubRepository, loadDeliveryRecord, resolveGithubTokenOptional, seedDeliveryRecordFromIssue } from "../delivery/handoff.js";
16
+ import { executeAgentPrompt } from "../workers/agentPrompt.js";
17
+ const flagSchema = z.enum(["architecture", "security", "authentication", "authorization", "schema", "migration", "public-api", "breaking-change", "new-dependency", "cross-module", "ambiguous"]);
18
+ const issuePlanSchema = z.object({
19
+ classification: z.enum(["ready", "requires_product_decision", "spec_contradiction"]), rationale: z.string().min(1), problem: z.string().min(1), desiredOutcome: z.string().min(1),
20
+ requirements: z.array(z.object({ text: z.string().min(1), source: z.enum(["explicit", "repository-derived"]).default("explicit"), validators: z.array(z.string().min(1)).optional() })).min(1),
21
+ acceptance: z.array(z.object({ title: z.string().min(1), requirementIndexes: z.array(z.number().int().positive()).min(1), given: z.string().min(1), when: z.string().min(1), then: z.string().min(1) })).min(1),
22
+ scope: z.object({ allowed: z.array(z.string().min(1)).default([]), forbidden: z.array(z.string().min(1)).default([]), domains: z.array(z.string().min(1)).default([]) }), risk: z.enum(["low", "medium", "high"]), flags: z.array(flagSchema).default([]),
23
+ constraints: z.object({ breakingApiChanges: z.boolean(), newDependencies: z.boolean(), schemaChanges: z.boolean() }), design: z.object({ currentState: z.string().min(1), proposedDesign: z.string().min(1), risks: z.array(z.string()).default([]) }),
24
+ tasks: z.array(z.object({ title: z.string().min(1), requirementIndexes: z.array(z.number().int().positive()).min(1), scope: z.array(z.string()).default([]) })).min(1), nonGoals: z.array(z.string()).default([]), unresolved: z.array(z.string()).default([])
25
+ });
26
+ export async function inspectGithubIssue(root, config, issueNumber) {
27
+ if (config.workflow?.issueIntake?.enabled === false)
28
+ throw new Error("GitHub issue intake is disabled by workflow.issueIntake.enabled=false.");
29
+ const snapshot = await fetchGithubIssueSnapshot(root, config, issueNumber);
30
+ if (config.workflow?.issueIntake?.requireOpen !== false && snapshot.state !== "open")
31
+ throw new Error(`ISSUE_NOT_OPEN: GitHub issue #${issueNumber} is ${snapshot.state}.`);
32
+ const acceptance = extractAcceptance(snapshot.body);
33
+ const evidence = deriveTriageEvidence(snapshot);
34
+ const decision = triageChange(config, evidence);
35
+ return { snapshot, evidence, preliminaryMode: decision.mode, reasons: decision.reasons, acceptance };
36
+ }
37
+ export async function prepareGithubIssueTask(root, config, issueNumber, options = {}) {
38
+ const inspection = await inspectGithubIssue(root, config, issueNumber);
39
+ const snapshot = inspection.snapshot;
40
+ const taskId = taskIdForIssue(issueNumber);
41
+ const existing = await tryLoadTask(root, config, taskId);
42
+ if (existing?.issue?.provider === "github") {
43
+ if (existing.issue.repository !== snapshot.repository || existing.issue.number !== issueNumber)
44
+ throw new Error(`ISSUE_SOURCE_MISMATCH: ${taskId} is already bound to a different issue.`);
45
+ if (existing.issue.contentSha256 !== snapshot.contentSha256 && !options.refresh)
46
+ throw new Error(`ISSUE_DRIFT: GitHub issue #${issueNumber} changed after it was frozen. Re-run with --refresh after reviewing the issue change.`);
47
+ if (existing.issue.contentSha256 === snapshot.contentSha256 && !options.refresh) {
48
+ const seal = await verifyTaskSeal(root, existing, config.validation?.requireSeal ?? true);
49
+ if ((config.validation?.requireSeal ?? true) && seal.status !== "PASS")
50
+ throw new Error(`LOCAL_CONTRACT_DRIFT: ${seal.message}`);
51
+ await seedDeliveryRecordFromIssue(root, config, existing, { repository: snapshot.repository, issueNumber: snapshot.number, issueUrl: snapshot.url });
52
+ return { taskId, mode: existing.mode ?? "spec", contract: existing, snapshot, normalizedBy: "deterministic" };
53
+ }
54
+ if (options.refresh) {
55
+ const delivery = await loadDeliveryRecord(root, config, taskId);
56
+ if (delivery?.paseo?.workspaceId && !options.force)
57
+ throw new Error("ISSUE_REFRESH_BLOCKED: an implementation workspace already exists. Review/close that workspace or use --force explicitly.");
58
+ }
59
+ }
60
+ const plannerNeeded = inspection.preliminaryMode === "spec" || inspection.acceptance.length === 0;
61
+ const normalized = plannerNeeded && options.usePlanner !== false ? await normalizeIssueWithPlanner(root, config, snapshot).catch(() => ({ plan: normalizeIssueDeterministically(snapshot), normalizedBy: "deterministic" })) : { plan: normalizeIssueDeterministically(snapshot), normalizedBy: "deterministic" };
62
+ const plan = normalized.plan;
63
+ if (plan.classification === "spec_contradiction")
64
+ throw new Error(`SPEC_CONTRADICTION: ${[plan.rationale, ...plan.unresolved].filter(Boolean).join("; ")}`);
65
+ if (plan.classification === "requires_product_decision")
66
+ throw new Error(`REQUIRES_PRODUCT_DECISION: ${[plan.rationale, ...plan.unresolved].filter(Boolean).join("; ")}`);
67
+ const finalDecision = triageChange(config, { request: `${snapshot.title}\n${snapshot.body}`, files: plan.scope.allowed, domains: plan.scope.domains, risk: plan.risk, flags: plan.flags });
68
+ const snapshotPath = issueSnapshotPath(config, taskId);
69
+ await writeSnapshot(root, snapshotPath, snapshot);
70
+ const originatingBranch = await getCurrentBranch(root) ?? config.validation?.baseRef ?? "main";
71
+ let contract;
72
+ let traceability;
73
+ if (finalDecision.quickEligible && plan.acceptance.length > 0) {
74
+ const quick = await createQuickContract(root, config, taskId, { title: snapshot.title, request: `${snapshot.title}\n\n${snapshot.body}`.trim(), scope: plan.scope.allowed, acceptance: plan.acceptance.map((item) => `${item.title}: ${item.then}`), domains: plan.scope.domains, risk: "low", flags: [] });
75
+ contract = { ...quick.contract, source: { ...(quick.contract.source ?? {}), issue: snapshotPath }, issue: issueMetadata(snapshot, snapshotPath), git: { ...quick.contract.git, baseRef: originatingBranch, originatingBranch }, scope: { ...quick.contract.scope, forbidden: plan.scope.forbidden } };
76
+ await writeContract(root, config, contract);
77
+ const quickValidation = validateQuickTaskContract(config, contract);
78
+ if (!quickValidation.ok)
79
+ throw new Error(`Issue-derived QuickContract failed validation: ${quickValidation.issues.join("; ")}`);
80
+ }
81
+ else {
82
+ contract = await writeIssueDerivedSdd(root, config, snapshot, snapshotPath, plan, originatingBranch);
83
+ const validation = await validateSddChange(root, taskId, config);
84
+ if (!validation.ok)
85
+ throw new Error(`Issue-derived SDD failed validation: ${[...validation.missing, ...validation.issues].join("; ")}`);
86
+ traceability = formatTraceabilityMatrix(validation.requirements);
87
+ }
88
+ await sealTask(root, config, contract);
89
+ await seedDeliveryRecordFromIssue(root, config, contract, { repository: snapshot.repository, issueNumber: snapshot.number, issueUrl: snapshot.url });
90
+ return { taskId, mode: contract.mode ?? "spec", contract, snapshot, normalizedBy: normalized.normalizedBy, traceability };
91
+ }
92
+ export async function verifyGithubIssueDrift(root, config, contract) {
93
+ if (!contract.issue || contract.issue.provider !== "github" || config.workflow?.issueIntake?.verifyDriftOnRun === false)
94
+ return { ok: true, message: "No GitHub issue drift check required." };
95
+ let remote;
96
+ try {
97
+ remote = await fetchGithubIssueSnapshot(root, config, contract.issue.number, contract.issue.repository);
98
+ }
99
+ catch (error) {
100
+ throw new Error(`BLOCKED_EXTERNAL: cannot verify GitHub issue #${contract.issue.number} before execution: ${String(error)}`);
101
+ }
102
+ if (remote.contentSha256 !== contract.issue.contentSha256)
103
+ return { ok: false, message: `ISSUE_DRIFT: GitHub issue #${contract.issue.number} title/body changed after freeze (${contract.issue.contentSha256.slice(0, 12)} -> ${remote.contentSha256.slice(0, 12)}).`, remote };
104
+ return { ok: true, message: `GitHub issue #${contract.issue.number} still matches the frozen intake snapshot.`, remote };
105
+ }
106
+ export function taskIdForIssue(issueNumber) { if (!Number.isInteger(issueNumber) || issueNumber <= 0)
107
+ throw new Error("Issue number must be a positive integer."); return `GH-${issueNumber}`; }
108
+ export function issueContentSha256(title, body) { return crypto.createHash("sha256").update(JSON.stringify({ title: title.trim(), body: body.replace(/\r\n/g, "\n").trim() })).digest("hex"); }
109
+ export function normalizeIssueDeterministically(snapshot) {
110
+ const acceptance = extractAcceptance(snapshot.body);
111
+ const bullets = extractUsefulBullets(snapshot.body);
112
+ const requirementTexts = unique((acceptance.length ? acceptance : bullets).filter(Boolean)).slice(0, 20);
113
+ const fallbackRequirement = snapshot.body.trim() ? `${snapshot.title}: ${firstMeaningfulParagraph(snapshot.body)}` : snapshot.title;
114
+ const requirements = (requirementTexts.length ? requirementTexts : [fallbackRequirement]).map((text) => ({ text, source: "explicit", validators: ["gherkin"] }));
115
+ const paths = extractFilePaths(snapshot.body);
116
+ const domains = inferDomains(snapshot.labels, snapshot.body);
117
+ const request = `${snapshot.title}\n${snapshot.body}`;
118
+ const preliminary = triageChange({ version: 1, project: { name: "issue-normalizer" } }, { request, files: paths, domains, risk: inferRisk(snapshot.labels), flags: [] });
119
+ const risk = preliminary.quickEligible ? "low" : inferRisk(snapshot.labels) === "low" ? "medium" : inferRisk(snapshot.labels);
120
+ const scenarios = requirements.map((item, index) => ({ title: `Satisfy requirement ${index + 1}`, requirementIndexes: [index + 1], given: `the repository is evaluated against frozen GitHub issue #${snapshot.number}`, when: "the issue implementation is completed", then: item.text }));
121
+ const constraints = inferConstraints(request);
122
+ return { classification: snapshot.body.trim() || snapshot.title.trim() ? "ready" : "requires_product_decision", rationale: "Requirements were normalized from the explicit issue text; repository-specific planning may refine implementation details without changing the frozen issue intent.", problem: firstMeaningfulParagraph(snapshot.body) || snapshot.title, desiredOutcome: snapshot.title, requirements, acceptance: scenarios, scope: { allowed: paths.length ? paths : ["**"], forbidden: [], domains }, risk, flags: inferFlags(request), constraints, design: { currentState: "Use the existing repository architecture and nearby implementation patterns as the baseline.", proposedDesign: "Implement the frozen issue requirements with the smallest architecture-consistent change; routed planning may choose concrete files and tests.", risks: [] }, tasks: requirements.map((_, index) => ({ title: `Implement requirement ${index + 1}`, requirementIndexes: [index + 1], scope: paths })), nonGoals: [], unresolved: [] };
123
+ }
124
+ async function normalizeIssueWithPlanner(root, config, snapshot) {
125
+ if (!config.agents)
126
+ throw new Error("No agent topology configured for issue normalization.");
127
+ const topology = await loadResolvedAgentTopology(root, config, config.agents.activeProfile);
128
+ const plannerName = config.workflow?.issueIntake?.plannerAgent ?? Object.values(topology.agents).find((agent) => agent.role === "planner" && !agent.disabled)?.name ?? "planner";
129
+ if (!topology.agents[plannerName])
130
+ throw new Error(`Issue intake planner '${plannerName}' is not available.`);
131
+ const selection = executionSelectionForAgent(topology, plannerName);
132
+ const provisional = { version: 1, task: { id: taskIdForIssue(snapshot.number), title: snapshot.title }, git: { baseRef: config.validation?.baseRef ?? "main" }, scope: { allowed: ["**"], forbidden: [], frozen: [] }, routing: { intent: "plan", domains: [], risk: "medium" }, constraints: { breakingApiChanges: false, newDependencies: false, schemaChanges: false } };
133
+ const prompt = `Normalize GitHub issue #${snapshot.number} from ${snapshot.repository} into an engineering intake plan. You are read-only. Inspect the repository to resolve implementation details and existing conventions, but never invent a product decision that cannot be derived from the issue/repository. Classify as requires_product_decision or spec_contradiction only when genuinely unavoidable.\n\nFrozen issue snapshot:\n${JSON.stringify(snapshot, null, 2)}\n\nReturn exactly this JSON shape on one final line beginning AEH_RESULT_JSON=:\n${issuePlanContractDescription()}`;
134
+ const session = await executeAgentPrompt(root, config, provisional, selection, prompt);
135
+ if (session.exitCode !== 0)
136
+ throw new Error(`Issue planner exited with ${session.exitCode}: ${session.stderr || session.stdout}`);
137
+ return { plan: issuePlanSchema.parse(extractMarkedJson(session.stdout, session.stderr)), normalizedBy: "planner" };
138
+ }
139
+ async function fetchGithubIssueSnapshot(root, config, issueNumber, repositoryOverride) {
140
+ const github = config.delivery?.github;
141
+ const repository = repositoryOverride ?? github?.repository ?? await inferGithubRepository(root);
142
+ const apiBase = (github?.apiBaseUrl ?? "https://api.github.com").replace(/\/$/, "");
143
+ const token = resolveGithubTokenOptional(github?.tokenEnv);
144
+ const issue = await githubRequest(apiBase, token, `/repos/${repository}/issues/${issueNumber}`);
145
+ if (issue.pull_request)
146
+ throw new Error(`GitHub #${issueNumber} is a pull request, not an issue.`);
147
+ const body = issue.body ?? "";
148
+ return { version: 1, provider: "github", repository, number: issue.number, url: issue.html_url, title: issue.title, body, state: issue.state, labels: (issue.labels ?? []).map((label) => typeof label === "string" ? label : label.name ?? "").filter(Boolean), createdAt: issue.created_at, updatedAt: issue.updated_at, fetchedAt: new Date().toISOString(), contentSha256: issueContentSha256(issue.title, body) };
149
+ }
150
+ async function writeIssueDerivedSdd(root, config, snapshot, snapshotPath, plan, originatingBranch) {
151
+ const taskId = taskIdForIssue(snapshot.number);
152
+ const specsDir = config.sdd?.specsDir ?? "specs";
153
+ const dir = path.join(root, specsDir, "changes", taskId);
154
+ await fs.mkdir(dir, { recursive: true });
155
+ const requirementIds = plan.requirements.map((_, index) => `${taskId}-R${index + 1}`);
156
+ const requirementLines = plan.requirements.map((item, index) => `- ${requirementIds[index]} — ${item.text} _(${item.source})_`).join("\n");
157
+ const proposal = `# ${taskId}: ${snapshot.title}\n\n## Source\n\nGitHub issue #${snapshot.number}: ${snapshot.url}\nFrozen content SHA-256: \`${snapshot.contentSha256}\`\n\n## Problem\n\n${plan.problem}\n\n## Desired outcome\n\n${plan.desiredOutcome}\n\n## Requirements\n\n${requirementLines}\n\n## Scope\n\n${plan.scope.allowed.map((item) => `- \`${item}\``).join("\n") || "- Repository-defined scope"}\n\n## Non-goals\n\n${plan.nonGoals.map((item) => `- ${item}`).join("\n") || "- No additional behavior beyond the frozen issue requirements."}\n`;
158
+ const spec = `# Specification: ${snapshot.title}\n\n## Frozen source\n\nGitHub issue #${snapshot.number}; content SHA-256 \`${snapshot.contentSha256}\`.\n\n## Requirements\n\n${plan.requirements.map((item, index) => `### ${requirementIds[index]}\n\n${item.text}\n\nSource classification: **${item.source}**.`).join("\n\n")}\n\n## Invariants\n\n- The frozen issue snapshot and this sealed SDD define the run intent.\n- Repository architecture/security invariants remain in force unless the issue explicitly authorizes a change.\n`;
159
+ const design = `# Design: ${snapshot.title}\n\n## Current state\n\n${plan.design.currentState}\n\n## Proposed design\n\n${plan.design.proposedDesign}\n\n## Requirement mapping\n\n${requirementIds.map((id) => `- ${id} — implement using routed specialists within the declared scope.`).join("\n")}\n\n## Data/API impact\n\n- breakingApiChanges: ${plan.constraints.breakingApiChanges}\n- newDependencies: ${plan.constraints.newDependencies}\n- schemaChanges: ${plan.constraints.schemaChanges}\n\n## Risks and trade-offs\n\n${plan.design.risks.map((item) => `- ${item}`).join("\n") || "- No additional issue-specific risks were identified during intake."}\n`;
160
+ const tasks = { version: 1, task: taskId, items: plan.tasks.map((item, index) => ({ id: index + 1, title: item.title, status: "pending", requirements: item.requirementIndexes.map((value) => requirementIds[value - 1]).filter(Boolean), scope: item.scope })) };
161
+ const acceptance = `@${taskId}\nFeature: ${gherkinText(snapshot.title)}\n\n${plan.acceptance.map((item, index) => { const tags = item.requirementIndexes.map((value) => requirementIds[value - 1]).filter(Boolean).map((id) => `@${id}`).join(" "); return ` ${tags}\n Scenario: ${gherkinText(item.title || `Acceptance ${index + 1}`)}\n Given ${gherkinText(item.given)}\n When ${gherkinText(item.when)}\n Then ${gherkinText(item.then)}`; }).join("\n\n")}\n`;
162
+ const files = { "proposal.md": proposal, "spec.md": spec, "design.md": design, "tasks.yaml": YAML.stringify(tasks), "acceptance.feature": acceptance };
163
+ for (const [name, content] of Object.entries(files))
164
+ await fs.writeFile(path.join(dir, name), content);
165
+ const rel = (name) => path.relative(root, path.join(dir, name)).replaceAll("\\", "/");
166
+ const contract = { version: 1, mode: "spec", task: { id: taskId, title: snapshot.title }, source: { proposal: rel("proposal.md"), spec: rel("spec.md"), design: rel("design.md"), tasks: rel("tasks.yaml"), acceptance: rel("acceptance.feature"), issue: snapshotPath }, issue: issueMetadata(snapshot, snapshotPath), git: { baseRef: originatingBranch, originatingBranch }, scope: { allowed: plan.scope.allowed.length ? plan.scope.allowed : ["**"], forbidden: plan.scope.forbidden, frozen: [] }, routing: { intent: "implement", domains: plan.scope.domains, risk: plan.risk }, requirements: plan.requirements.map((item, index) => ({ id: requirementIds[index], description: item.text, validators: item.validators?.length ? item.validators : ["gherkin"] })), constraints: plan.constraints, repair: { maxAttempts: config.orchestration?.worker?.maxRepairAttempts ?? 2 } };
167
+ await writeContract(root, config, contract);
168
+ return contract;
169
+ }
170
+ function issueMetadata(snapshot, snapshotPath) { return { provider: "github", repository: snapshot.repository, number: snapshot.number, url: snapshot.url, state: snapshot.state, fetchedAt: snapshot.fetchedAt, updatedAt: snapshot.updatedAt, contentSha256: snapshot.contentSha256, snapshotPath }; }
171
+ async function writeContract(root, config, contract) { const dir = path.resolve(root, config.sdd?.contractsDir ?? ".harness/contracts"); await fs.mkdir(dir, { recursive: true }); await fs.writeFile(path.join(dir, `${contract.task.id}.yaml`), YAML.stringify(contract)); }
172
+ async function writeSnapshot(root, relative, snapshot) { const file = path.resolve(root, relative); await fs.mkdir(path.dirname(file), { recursive: true }); await fs.writeFile(file, `${JSON.stringify(snapshot, null, 2)}\n`); }
173
+ function issueSnapshotPath(config, taskId) { return path.posix.join((config.workflow?.issueIntake?.snapshotDir ?? ".harness/issues").replaceAll("\\", "/"), `${taskId}.json`); }
174
+ async function tryLoadTask(root, config, taskId) { try {
175
+ return await loadTaskContract(root, taskId, config);
176
+ }
177
+ catch {
178
+ return undefined;
179
+ } }
180
+ function deriveTriageEvidence(snapshot) { const request = `${snapshot.title}\n${snapshot.body}`; return { request, files: extractFilePaths(snapshot.body), domains: inferDomains(snapshot.labels, snapshot.body), risk: inferRisk(snapshot.labels), flags: inferFlags(request) }; }
181
+ function inferRisk(labels) { const lower = labels.map((item) => item.toLowerCase()); if (lower.some((item) => /risk[:/-]?high|high[- ]risk|severity[:/-]?high/.test(item)))
182
+ return "high"; if (lower.some((item) => /risk[:/-]?medium|medium[- ]risk|severity[:/-]?medium/.test(item)))
183
+ return "medium"; return "low"; }
184
+ function inferDomains(labels, body) { const known = ["backend", "frontend", "web", "mobile", "data", "database", "api", "security", "auth", "architecture", "ops", "devops", "docs", "test", "e2e"]; const haystack = `${labels.join(" ")} ${body}`.toLowerCase(); return known.filter((domain) => new RegExp(`\\b${domain.replace("-", "[- ]")}\\b`, "i").test(haystack)); }
185
+ function inferFlags(request) { const flags = []; const tests = [["architecture", /\barchitecture|architectural|cross[- ]module|large refactor\b/i], ["security", /\bsecurity|tenant isolation\b/i], ["authentication", /\bauthentication|login|sign[- ]in\b/i], ["authorization", /\bauthorization|permission|role|rbac\b/i], ["schema", /\bschema|table|column\b/i], ["migration", /\bmigration\b/i], ["public-api", /\bpublic api|api contract\b/i], ["breaking-change", /\bbreaking change|backward compat\b/i], ["new-dependency", /\bnew dependency|add dependency|package upgrade\b/i], ["cross-module", /\bcross[- ]module\b/i], ["ambiguous", /\bto be decided|tbd|unclear\b/i]]; for (const [flag, pattern] of tests)
186
+ if (pattern.test(request))
187
+ flags.push(flag); return flags; }
188
+ function inferConstraints(request) { return { breakingApiChanges: /\bbreaking change|break public api|incompatible api\b/i.test(request), newDependencies: /\badd (a )?(new )?dependenc|new dependency|install package\b/i.test(request), schemaChanges: /\bmigration|schema change|add (a )?(table|column)|alter table\b/i.test(request) }; }
189
+ function extractAcceptance(body) { const sections = extractSections(body); const preferred = Object.entries(sections).filter(([heading]) => /accept|definition of done|expected|requirements?|success criteria/i.test(heading)).flatMap(([, lines]) => extractBullets(lines.join("\n"))); return unique(preferred).slice(0, 20); }
190
+ function extractUsefulBullets(body) { return unique(extractBullets(body)).filter((item) => item.length >= 5).slice(0, 20); }
191
+ function extractBullets(text) { return text.split(/\r?\n/).map((line) => line.match(/^\s*[-*+]\s+(?:\[[ xX]\]\s*)?(.+?)\s*$/)?.[1]?.trim()).filter((value) => Boolean(value)); }
192
+ function extractSections(body) { const sections = { "": [] }; let current = ""; for (const line of body.split(/\r?\n/)) {
193
+ const heading = line.match(/^#{1,6}\s+(.+?)\s*$/);
194
+ if (heading) {
195
+ current = heading[1].toLowerCase();
196
+ sections[current] ??= [];
197
+ }
198
+ else
199
+ sections[current].push(line);
200
+ } return sections; }
201
+ function extractFilePaths(body) { const values = new Set(); for (const match of body.matchAll(/`([^`]+)`/g)) {
202
+ const value = match[1].trim();
203
+ if (looksLikePath(value))
204
+ values.add(value);
205
+ } for (const match of body.matchAll(/(?:^|\s)((?:[A-Za-z0-9_.-]+\/)+[A-Za-z0-9_.@*-]+(?:\.[A-Za-z0-9*]+)?)/gm))
206
+ if (looksLikePath(match[1]))
207
+ values.add(match[1]); return [...values].slice(0, 20); }
208
+ function looksLikePath(value) { return !value.includes(" ") && !value.startsWith("http") && (value.includes("/") || /\.[A-Za-z0-9]{1,8}$/.test(value)); }
209
+ function firstMeaningfulParagraph(body) { return body.split(/\n\s*\n/).map((item) => item.replace(/^#+\s*/gm, "").trim()).find((item) => item && !/^[-*+]\s/.test(item))?.slice(0, 1000) ?? ""; }
210
+ function unique(values) { return [...new Set(values.map((value) => value.trim()).filter(Boolean))]; }
211
+ function gherkinText(value) { return value.replace(/\s+/g, " ").replace(/^\s*(Given|When|Then|And)\s+/i, "").trim().replace(/:/g, " - "); }
212
+ function issuePlanContractDescription() { return JSON.stringify({ classification: "ready | requires_product_decision | spec_contradiction", rationale: "string", problem: "string", desiredOutcome: "string", requirements: [{ text: "observable requirement", source: "explicit | repository-derived", validators: ["gherkin"] }], acceptance: [{ title: "scenario", requirementIndexes: [1], given: "precondition", when: "action", then: "observable result" }], scope: { allowed: ["repo/paths/or/globs"], forbidden: [], domains: ["backend"] }, risk: "low | medium | high", flags: ["architecture | security | authentication | authorization | schema | migration | public-api | breaking-change | new-dependency | cross-module | ambiguous"], constraints: { breakingApiChanges: false, newDependencies: false, schemaChanges: false }, design: { currentState: "repository evidence", proposedDesign: "bounded approach", risks: [] }, tasks: [{ title: "task", requirementIndexes: [1], scope: ["paths"] }], nonGoals: [], unresolved: [] }, null, 2); }
213
+ //# sourceMappingURL=intake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake.js","sourceRoot":"","sources":["../../src/issues/intake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { HarnessProjectConfig } from "../core/types.js";
2
+ export interface MemoryBenchmarkCase {
3
+ version: 1;
4
+ id: string;
5
+ query: string;
6
+ expectedTerms: string[];
7
+ forbiddenTerms: string[];
8
+ }
9
+ export interface MemoryBenchmarkCaseResult {
10
+ caseId: string;
11
+ success: boolean;
12
+ latencyMs: number;
13
+ recall: number;
14
+ contamination: number;
15
+ score: number;
16
+ output: string;
17
+ }
18
+ export interface MemoryBenchmarkProviderResult {
19
+ provider: string;
20
+ score: number;
21
+ averageRecall: number;
22
+ averageContamination: number;
23
+ averageLatencyMs: number;
24
+ cases: MemoryBenchmarkCaseResult[];
25
+ }
26
+ export interface MemoryBenchmarkReport {
27
+ version: 1;
28
+ createdAt: string;
29
+ project: string;
30
+ providers: MemoryBenchmarkProviderResult[];
31
+ }
32
+ export declare function runMemoryBenchmark(root: string, config: HarnessProjectConfig): Promise<MemoryBenchmarkReport>;
33
+ export declare function scoreMemoryOutput(item: MemoryBenchmarkCase, success: boolean, latencyMs: number, output: string): MemoryBenchmarkCaseResult;
@@ -0,0 +1,69 @@
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
+ const caseSchema = z.object({
7
+ version: z.literal(1),
8
+ id: z.string().min(1),
9
+ query: z.string().min(1),
10
+ expectedTerms: z.array(z.string()).default([]),
11
+ forbiddenTerms: z.array(z.string()).default([])
12
+ });
13
+ export async function runMemoryBenchmark(root, config) {
14
+ const providers = config.memory?.benchmark?.providers ?? [];
15
+ if (!providers.length)
16
+ throw new Error("No memory benchmark providers are configured in memory.benchmark.providers.");
17
+ const cases = await loadCases(root, config);
18
+ if (!cases.length)
19
+ throw new Error("No memory benchmark cases found.");
20
+ const results = [];
21
+ for (const provider of providers) {
22
+ const caseResults = [];
23
+ for (const item of cases) {
24
+ const command = provider.command.replaceAll("{query}", shellQuote(item.query)).replaceAll("{caseId}", item.id);
25
+ const execution = await runProcess(command, { cwd: root, timeoutMs: (provider.timeoutSeconds ?? 60) * 1000 });
26
+ const output = `${execution.stdout}\n${execution.stderr}`.trim();
27
+ caseResults.push(scoreMemoryOutput(item, execution.exitCode === 0, execution.durationMs, output));
28
+ }
29
+ const divisor = Math.max(1, caseResults.length);
30
+ results.push({
31
+ provider: provider.name,
32
+ score: round(caseResults.reduce((sum, item) => sum + item.score, 0) / divisor),
33
+ averageRecall: round(caseResults.reduce((sum, item) => sum + item.recall, 0) / divisor),
34
+ averageContamination: round(caseResults.reduce((sum, item) => sum + item.contamination, 0) / divisor),
35
+ averageLatencyMs: round(caseResults.reduce((sum, item) => sum + item.latencyMs, 0) / divisor),
36
+ cases: caseResults
37
+ });
38
+ }
39
+ results.sort((a, b) => b.score - a.score || a.averageLatencyMs - b.averageLatencyMs);
40
+ const report = { version: 1, createdAt: new Date().toISOString(), project: config.project.name, providers: results };
41
+ const dir = path.resolve(root, config.memory?.benchmark?.resultsDir ?? ".harness/memory-benchmarks");
42
+ await fs.mkdir(dir, { recursive: true });
43
+ await fs.writeFile(path.join(dir, `${Date.now()}.json`), `${JSON.stringify(report, null, 2)}\n`);
44
+ return report;
45
+ }
46
+ export function scoreMemoryOutput(item, success, latencyMs, output) {
47
+ const normalized = output.toLocaleLowerCase();
48
+ const expected = item.expectedTerms.map((term) => term.toLocaleLowerCase());
49
+ const forbidden = item.forbiddenTerms.map((term) => term.toLocaleLowerCase());
50
+ const recall = expected.length ? expected.filter((term) => normalized.includes(term)).length / expected.length : (success ? 1 : 0);
51
+ const contamination = forbidden.length ? forbidden.filter((term) => normalized.includes(term)).length / forbidden.length : 0;
52
+ const latencyPenalty = Math.min(10, latencyMs / 1000);
53
+ const score = success ? Math.max(0, recall * 100 - contamination * 40 - latencyPenalty) : 0;
54
+ return { caseId: item.id, success, latencyMs, recall: round(recall), contamination: round(contamination), score: round(score), output: trim(output) };
55
+ }
56
+ async function loadCases(root, config) {
57
+ const dir = path.resolve(root, config.memory?.benchmark?.casesDir ?? "memory-benchmarks");
58
+ const names = await fs.readdir(dir).catch(() => []);
59
+ const cases = [];
60
+ for (const name of names.filter((value) => /\.ya?ml$/i.test(value)).sort()) {
61
+ const raw = YAML.parse(await fs.readFile(path.join(dir, name), "utf8"));
62
+ cases.push(caseSchema.parse(raw));
63
+ }
64
+ return cases;
65
+ }
66
+ function shellQuote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
67
+ function trim(value) { return value.length <= 8_000 ? value : `${value.slice(0, 8_000)}\n...[truncated]`; }
68
+ function round(value) { return Math.round(value * 1000) / 1000; }
69
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/memory/benchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { HarnessProjectConfig, RunMetrics, UsageMetrics } from "../core/types.js";
2
+ export declare function countHumanInterventions(root: string, config: HarnessProjectConfig, taskId: string, since: string): Promise<number>;
3
+ export declare function buildRunMetrics(input: {
4
+ firstPassSuccess: boolean;
5
+ repairCount: number;
6
+ humanInterventions: number;
7
+ durationMs: number;
8
+ usage?: UsageMetrics;
9
+ }): RunMetrics;
@@ -0,0 +1,34 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function countHumanInterventions(root, config, taskId, since) {
4
+ const relative = config.telemetry?.localEventsFile ?? ".harness/telemetry/events.ndjson";
5
+ try {
6
+ const raw = await fs.readFile(path.resolve(root, relative), "utf8");
7
+ return raw.split(/\r?\n/).filter(Boolean).reduce((count, line) => {
8
+ try {
9
+ const event = JSON.parse(line);
10
+ if (event.name !== "harness.human.intervention")
11
+ return count;
12
+ if (event.at && event.at < since)
13
+ return count;
14
+ return event.attributes?.taskId === taskId ? count + 1 : count;
15
+ }
16
+ catch {
17
+ return count;
18
+ }
19
+ }, 0);
20
+ }
21
+ catch {
22
+ return 0;
23
+ }
24
+ }
25
+ export function buildRunMetrics(input) {
26
+ return {
27
+ firstPassSuccess: input.firstPassSuccess,
28
+ repairCount: input.repairCount,
29
+ humanInterventions: input.humanInterventions,
30
+ durationMs: input.durationMs,
31
+ usage: input.usage ?? {}
32
+ };
33
+ }
34
+ //# sourceMappingURL=runMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runMetrics.js","sourceRoot":"","sources":["../../src/metrics/runMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY,EAAE,MAA4B,EAAE,MAAc,EAAE,KAAa;IACrH,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,EAAE,eAAe,IAAI,kCAAkC,CAAC;IACzF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/D,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyE,CAAC;gBACvG,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B;oBAAE,OAAO,KAAK,CAAC;gBAC9D,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,KAAK;oBAAE,OAAO,KAAK,CAAC;gBAC/C,OAAO,KAAK,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;QAC3B,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAM/B;IACC,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;KACzB,CAAC;AACJ,CAAC"}