@openagentsy/hooks 0.0.0-stage → 0.2.0

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 (307) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +32 -2
  3. package/dist/accountability.d.ts +29 -0
  4. package/dist/accountability.d.ts.map +1 -0
  5. package/dist/accountability.js +21 -0
  6. package/dist/accountability.js.map +1 -0
  7. package/dist/accountability.test.d.ts +2 -0
  8. package/dist/accountability.test.d.ts.map +1 -0
  9. package/dist/accountability.test.js +42 -0
  10. package/dist/accountability.test.js.map +1 -0
  11. package/dist/approvals.d.ts +110 -0
  12. package/dist/approvals.d.ts.map +1 -0
  13. package/dist/approvals.js +464 -0
  14. package/dist/approvals.js.map +1 -0
  15. package/dist/approvals.test.d.ts +2 -0
  16. package/dist/approvals.test.d.ts.map +1 -0
  17. package/dist/approvals.test.js +307 -0
  18. package/dist/approvals.test.js.map +1 -0
  19. package/dist/base-tool.d.ts +26 -0
  20. package/dist/base-tool.d.ts.map +1 -0
  21. package/dist/base-tool.js +37 -0
  22. package/dist/base-tool.js.map +1 -0
  23. package/dist/base-tool.test.d.ts +2 -0
  24. package/dist/base-tool.test.d.ts.map +1 -0
  25. package/dist/base-tool.test.js +34 -0
  26. package/dist/base-tool.test.js.map +1 -0
  27. package/dist/eval/index.d.ts +3 -0
  28. package/dist/eval/index.d.ts.map +1 -0
  29. package/dist/eval/index.js +3 -0
  30. package/dist/eval/index.js.map +1 -0
  31. package/dist/eval/runner.d.ts +179 -0
  32. package/dist/eval/runner.d.ts.map +1 -0
  33. package/dist/eval/runner.js +616 -0
  34. package/dist/eval/runner.js.map +1 -0
  35. package/dist/eval/runner.test.d.ts +2 -0
  36. package/dist/eval/runner.test.d.ts.map +1 -0
  37. package/dist/eval/runner.test.js +431 -0
  38. package/dist/eval/runner.test.js.map +1 -0
  39. package/dist/eval/types.d.ts +173 -0
  40. package/dist/eval/types.d.ts.map +1 -0
  41. package/dist/eval/types.js +104 -0
  42. package/dist/eval/types.js.map +1 -0
  43. package/dist/event.d.ts +59 -0
  44. package/dist/event.d.ts.map +1 -0
  45. package/dist/event.js +178 -0
  46. package/dist/event.js.map +1 -0
  47. package/dist/event.test.d.ts +2 -0
  48. package/dist/event.test.d.ts.map +1 -0
  49. package/dist/event.test.js +49 -0
  50. package/dist/event.test.js.map +1 -0
  51. package/dist/index.d.ts +30 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +29 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/lessons/capture.d.ts +66 -0
  56. package/dist/lessons/capture.d.ts.map +1 -0
  57. package/dist/lessons/capture.js +166 -0
  58. package/dist/lessons/capture.js.map +1 -0
  59. package/dist/lessons/capture.test.d.ts +2 -0
  60. package/dist/lessons/capture.test.d.ts.map +1 -0
  61. package/dist/lessons/capture.test.js +200 -0
  62. package/dist/lessons/capture.test.js.map +1 -0
  63. package/dist/lessons/decide.d.ts +90 -0
  64. package/dist/lessons/decide.d.ts.map +1 -0
  65. package/dist/lessons/decide.js +334 -0
  66. package/dist/lessons/decide.js.map +1 -0
  67. package/dist/lessons/decide.test.d.ts +2 -0
  68. package/dist/lessons/decide.test.d.ts.map +1 -0
  69. package/dist/lessons/decide.test.js +527 -0
  70. package/dist/lessons/decide.test.js.map +1 -0
  71. package/dist/lessons/id.d.ts +5 -0
  72. package/dist/lessons/id.d.ts.map +1 -0
  73. package/dist/lessons/id.js +20 -0
  74. package/dist/lessons/id.js.map +1 -0
  75. package/dist/lessons/index.d.ts +5 -0
  76. package/dist/lessons/index.d.ts.map +1 -0
  77. package/dist/lessons/index.js +5 -0
  78. package/dist/lessons/index.js.map +1 -0
  79. package/dist/lessons/model.d.ts +163 -0
  80. package/dist/lessons/model.d.ts.map +1 -0
  81. package/dist/lessons/model.js +181 -0
  82. package/dist/lessons/model.js.map +1 -0
  83. package/dist/lessons/model.test.d.ts +2 -0
  84. package/dist/lessons/model.test.d.ts.map +1 -0
  85. package/dist/lessons/model.test.js +178 -0
  86. package/dist/lessons/model.test.js.map +1 -0
  87. package/dist/lessons/permissions.test.d.ts +2 -0
  88. package/dist/lessons/permissions.test.d.ts.map +1 -0
  89. package/dist/lessons/permissions.test.js +88 -0
  90. package/dist/lessons/permissions.test.js.map +1 -0
  91. package/dist/lessons/store.d.ts +74 -0
  92. package/dist/lessons/store.d.ts.map +1 -0
  93. package/dist/lessons/store.js +231 -0
  94. package/dist/lessons/store.js.map +1 -0
  95. package/dist/output-checks.d.ts +64 -0
  96. package/dist/output-checks.d.ts.map +1 -0
  97. package/dist/output-checks.js +248 -0
  98. package/dist/output-checks.js.map +1 -0
  99. package/dist/output-checks.test.d.ts +2 -0
  100. package/dist/output-checks.test.d.ts.map +1 -0
  101. package/dist/output-checks.test.js +58 -0
  102. package/dist/output-checks.test.js.map +1 -0
  103. package/dist/paths.d.ts +37 -0
  104. package/dist/paths.d.ts.map +1 -0
  105. package/dist/paths.js +70 -0
  106. package/dist/paths.js.map +1 -0
  107. package/dist/paths.test.d.ts +2 -0
  108. package/dist/paths.test.d.ts.map +1 -0
  109. package/dist/paths.test.js +36 -0
  110. package/dist/paths.test.js.map +1 -0
  111. package/dist/policies/agi-framing.d.ts +12 -0
  112. package/dist/policies/agi-framing.d.ts.map +1 -0
  113. package/dist/policies/agi-framing.js +33 -0
  114. package/dist/policies/agi-framing.js.map +1 -0
  115. package/dist/policies/anti-anthropomorphism.d.ts +13 -0
  116. package/dist/policies/anti-anthropomorphism.d.ts.map +1 -0
  117. package/dist/policies/anti-anthropomorphism.js +34 -0
  118. package/dist/policies/anti-anthropomorphism.js.map +1 -0
  119. package/dist/policies/anti-dependence.d.ts +12 -0
  120. package/dist/policies/anti-dependence.d.ts.map +1 -0
  121. package/dist/policies/anti-dependence.js +33 -0
  122. package/dist/policies/anti-dependence.js.map +1 -0
  123. package/dist/policies/anti-sycophancy.d.ts +13 -0
  124. package/dist/policies/anti-sycophancy.d.ts.map +1 -0
  125. package/dist/policies/anti-sycophancy.js +34 -0
  126. package/dist/policies/anti-sycophancy.js.map +1 -0
  127. package/dist/policies/dark-pattern.d.ts +14 -0
  128. package/dist/policies/dark-pattern.d.ts.map +1 -0
  129. package/dist/policies/dark-pattern.js +44 -0
  130. package/dist/policies/dark-pattern.js.map +1 -0
  131. package/dist/policies/destructive-needs-approval.d.ts +14 -0
  132. package/dist/policies/destructive-needs-approval.d.ts.map +1 -0
  133. package/dist/policies/destructive-needs-approval.js +31 -0
  134. package/dist/policies/destructive-needs-approval.js.map +1 -0
  135. package/dist/policies/discovery.d.ts +12 -0
  136. package/dist/policies/discovery.d.ts.map +1 -0
  137. package/dist/policies/discovery.js +130 -0
  138. package/dist/policies/discovery.js.map +1 -0
  139. package/dist/policies/high-risk.d.ts +25 -0
  140. package/dist/policies/high-risk.d.ts.map +1 -0
  141. package/dist/policies/high-risk.js +105 -0
  142. package/dist/policies/high-risk.js.map +1 -0
  143. package/dist/policies/human-only-decisions.d.ts +14 -0
  144. package/dist/policies/human-only-decisions.d.ts.map +1 -0
  145. package/dist/policies/human-only-decisions.js +33 -0
  146. package/dist/policies/human-only-decisions.js.map +1 -0
  147. package/dist/policies/index.d.ts +29 -0
  148. package/dist/policies/index.d.ts.map +1 -0
  149. package/dist/policies/index.js +82 -0
  150. package/dist/policies/index.js.map +1 -0
  151. package/dist/policies/no-skip-git-hooks.d.ts +14 -0
  152. package/dist/policies/no-skip-git-hooks.d.ts.map +1 -0
  153. package/dist/policies/no-skip-git-hooks.js +31 -0
  154. package/dist/policies/no-skip-git-hooks.js.map +1 -0
  155. package/dist/policies/package-manager.d.ts +12 -0
  156. package/dist/policies/package-manager.d.ts.map +1 -0
  157. package/dist/policies/package-manager.js +29 -0
  158. package/dist/policies/package-manager.js.map +1 -0
  159. package/dist/policies/patterns.d.ts +17 -0
  160. package/dist/policies/patterns.d.ts.map +1 -0
  161. package/dist/policies/patterns.js +30 -0
  162. package/dist/policies/patterns.js.map +1 -0
  163. package/dist/policies/policies.test.d.ts +2 -0
  164. package/dist/policies/policies.test.d.ts.map +1 -0
  165. package/dist/policies/policies.test.js +210 -0
  166. package/dist/policies/policies.test.js.map +1 -0
  167. package/dist/policies/privacy-transparency.d.ts +14 -0
  168. package/dist/policies/privacy-transparency.d.ts.map +1 -0
  169. package/dist/policies/privacy-transparency.js +50 -0
  170. package/dist/policies/privacy-transparency.js.map +1 -0
  171. package/dist/policies/professional-displacement.d.ts +15 -0
  172. package/dist/policies/professional-displacement.d.ts.map +1 -0
  173. package/dist/policies/professional-displacement.js +45 -0
  174. package/dist/policies/professional-displacement.js.map +1 -0
  175. package/dist/policies/protect-policy.d.ts +14 -0
  176. package/dist/policies/protect-policy.d.ts.map +1 -0
  177. package/dist/policies/protect-policy.js +35 -0
  178. package/dist/policies/protect-policy.js.map +1 -0
  179. package/dist/policies/scope-enforcement.d.ts +14 -0
  180. package/dist/policies/scope-enforcement.d.ts.map +1 -0
  181. package/dist/policies/scope-enforcement.js +34 -0
  182. package/dist/policies/scope-enforcement.js.map +1 -0
  183. package/dist/policies/secret-scan-writes.d.ts +13 -0
  184. package/dist/policies/secret-scan-writes.d.ts.map +1 -0
  185. package/dist/policies/secret-scan-writes.js +38 -0
  186. package/dist/policies/secret-scan-writes.js.map +1 -0
  187. package/dist/policies/selection.d.ts +20 -0
  188. package/dist/policies/selection.d.ts.map +1 -0
  189. package/dist/policies/selection.js +93 -0
  190. package/dist/policies/selection.js.map +1 -0
  191. package/dist/policies/structural-bias.d.ts +14 -0
  192. package/dist/policies/structural-bias.d.ts.map +1 -0
  193. package/dist/policies/structural-bias.js +41 -0
  194. package/dist/policies/structural-bias.js.map +1 -0
  195. package/dist/policies/third-party-impact.d.ts +13 -0
  196. package/dist/policies/third-party-impact.d.ts.map +1 -0
  197. package/dist/policies/third-party-impact.js +38 -0
  198. package/dist/policies/third-party-impact.js.map +1 -0
  199. package/dist/policies/tool-call.d.ts +38 -0
  200. package/dist/policies/tool-call.d.ts.map +1 -0
  201. package/dist/policies/tool-call.js +53 -0
  202. package/dist/policies/tool-call.js.map +1 -0
  203. package/dist/policies/truthfulness-uncertainty.d.ts +13 -0
  204. package/dist/policies/truthfulness-uncertainty.d.ts.map +1 -0
  205. package/dist/policies/truthfulness-uncertainty.js +45 -0
  206. package/dist/policies/truthfulness-uncertainty.js.map +1 -0
  207. package/dist/policies/workspace-writes-only.d.ts +25 -0
  208. package/dist/policies/workspace-writes-only.d.ts.map +1 -0
  209. package/dist/policies/workspace-writes-only.js +54 -0
  210. package/dist/policies/workspace-writes-only.js.map +1 -0
  211. package/dist/policy-engine.d.ts +69 -0
  212. package/dist/policy-engine.d.ts.map +1 -0
  213. package/dist/policy-engine.js +145 -0
  214. package/dist/policy-engine.js.map +1 -0
  215. package/dist/policy-registry.d.ts +62 -0
  216. package/dist/policy-registry.d.ts.map +1 -0
  217. package/dist/policy-registry.js +63 -0
  218. package/dist/policy-registry.js.map +1 -0
  219. package/dist/policy-registry.test.d.ts +2 -0
  220. package/dist/policy-registry.test.d.ts.map +1 -0
  221. package/dist/policy-registry.test.js +79 -0
  222. package/dist/policy-registry.test.js.map +1 -0
  223. package/dist/policy-release.d.ts +44 -0
  224. package/dist/policy-release.d.ts.map +1 -0
  225. package/dist/policy-release.js +65 -0
  226. package/dist/policy-release.js.map +1 -0
  227. package/dist/policy.d.ts +141 -0
  228. package/dist/policy.d.ts.map +1 -0
  229. package/dist/policy.js +22 -0
  230. package/dist/policy.js.map +1 -0
  231. package/dist/quality/audit.d.ts +56 -0
  232. package/dist/quality/audit.d.ts.map +1 -0
  233. package/dist/quality/audit.js +52 -0
  234. package/dist/quality/audit.js.map +1 -0
  235. package/dist/quality/findings.d.ts +34 -0
  236. package/dist/quality/findings.d.ts.map +1 -0
  237. package/dist/quality/findings.js +121 -0
  238. package/dist/quality/findings.js.map +1 -0
  239. package/dist/quality/findings.test.d.ts +2 -0
  240. package/dist/quality/findings.test.d.ts.map +1 -0
  241. package/dist/quality/findings.test.js +79 -0
  242. package/dist/quality/findings.test.js.map +1 -0
  243. package/dist/quality/index.d.ts +20 -0
  244. package/dist/quality/index.d.ts.map +1 -0
  245. package/dist/quality/index.js +20 -0
  246. package/dist/quality/index.js.map +1 -0
  247. package/dist/quality/rule.d.ts +43 -0
  248. package/dist/quality/rule.d.ts.map +1 -0
  249. package/dist/quality/rule.js +162 -0
  250. package/dist/quality/rule.js.map +1 -0
  251. package/dist/quality/rule.test.d.ts +2 -0
  252. package/dist/quality/rule.test.d.ts.map +1 -0
  253. package/dist/quality/rule.test.js +187 -0
  254. package/dist/quality/rule.test.js.map +1 -0
  255. package/dist/quality/tools.d.ts +30 -0
  256. package/dist/quality/tools.d.ts.map +1 -0
  257. package/dist/quality/tools.js +33 -0
  258. package/dist/quality/tools.js.map +1 -0
  259. package/dist/quality/tools.test.d.ts +2 -0
  260. package/dist/quality/tools.test.d.ts.map +1 -0
  261. package/dist/quality/tools.test.js +41 -0
  262. package/dist/quality/tools.test.js.map +1 -0
  263. package/dist/quality/waive.d.ts +37 -0
  264. package/dist/quality/waive.d.ts.map +1 -0
  265. package/dist/quality/waive.js +39 -0
  266. package/dist/quality/waive.js.map +1 -0
  267. package/dist/quality/waivers.d.ts +63 -0
  268. package/dist/quality/waivers.d.ts.map +1 -0
  269. package/dist/quality/waivers.js +132 -0
  270. package/dist/quality/waivers.js.map +1 -0
  271. package/dist/quality/waivers.test.d.ts +2 -0
  272. package/dist/quality/waivers.test.d.ts.map +1 -0
  273. package/dist/quality/waivers.test.js +138 -0
  274. package/dist/quality/waivers.test.js.map +1 -0
  275. package/dist/registry.d.ts +86 -0
  276. package/dist/registry.d.ts.map +1 -0
  277. package/dist/registry.js +92 -0
  278. package/dist/registry.js.map +1 -0
  279. package/dist/registry.test.d.ts +2 -0
  280. package/dist/registry.test.d.ts.map +1 -0
  281. package/dist/registry.test.js +117 -0
  282. package/dist/registry.test.js.map +1 -0
  283. package/dist/rules.d.ts +107 -0
  284. package/dist/rules.d.ts.map +1 -0
  285. package/dist/rules.js +632 -0
  286. package/dist/rules.js.map +1 -0
  287. package/dist/rules.test.d.ts +2 -0
  288. package/dist/rules.test.d.ts.map +1 -0
  289. package/dist/rules.test.js +488 -0
  290. package/dist/rules.test.js.map +1 -0
  291. package/dist/secrets.d.ts +17 -0
  292. package/dist/secrets.d.ts.map +1 -0
  293. package/dist/secrets.js +17 -0
  294. package/dist/secrets.js.map +1 -0
  295. package/dist/secrets.test.d.ts +2 -0
  296. package/dist/secrets.test.d.ts.map +1 -0
  297. package/dist/secrets.test.js +20 -0
  298. package/dist/secrets.test.js.map +1 -0
  299. package/dist/shell-env.d.ts +23 -0
  300. package/dist/shell-env.d.ts.map +1 -0
  301. package/dist/shell-env.js +34 -0
  302. package/dist/shell-env.js.map +1 -0
  303. package/dist/shell-env.test.d.ts +2 -0
  304. package/dist/shell-env.test.d.ts.map +1 -0
  305. package/dist/shell-env.test.js +45 -0
  306. package/dist/shell-env.test.js.map +1 -0
  307. package/package.json +49 -4
@@ -0,0 +1,431 @@
1
+ import { chmod, mkdir, mkdtemp, readdir, readFile, rm, stat, symlink, writeFile, } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { assertArgv, evalResultPath, gitCommand, reproduceBaseline, runCommand, runEvalArtifact, withTemporaryWorktree, } from './runner.js';
6
+ /** The moment every result in this file carries, so the path is known. */
7
+ const PINNED = new Date('2026-10-27T12:00:00.000Z');
8
+ /** The lesson every artifact here belongs to. */
9
+ const LESSON = 'oa-lesson-test0001';
10
+ async function workspace() {
11
+ const root = await mkdtemp(join(tmpdir(), 'openagentsy-eval-'));
12
+ return { root, remove: () => rm(root, { recursive: true, force: true }) };
13
+ }
14
+ /** An artifact file with the scenarios it is given. */
15
+ async function artifactFile(root, scenarios) {
16
+ const path = join(root, 'artifact.json');
17
+ await writeFile(path, JSON.stringify({ schema_version: '1', lesson_id: LESSON, name: 'the proof', scenarios }, null, 2), 'utf8');
18
+ return path;
19
+ }
20
+ /** A script the scenarios run, so no shell is involved. */
21
+ async function script(root, name, body) {
22
+ const path = join(root, name);
23
+ await writeFile(path, body, 'utf8');
24
+ return path;
25
+ }
26
+ /** Whether a path is there. */
27
+ async function exists(path) {
28
+ try {
29
+ await stat(path);
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * A throwaway repository, with the change in the commit on top.
38
+ *
39
+ * The change lives in the second commit, so the worktree can be made from it
40
+ * and the baseline can be run on the tree without it. Every git command goes
41
+ * through the runner's own builder, because the runner's environment cannot
42
+ * reach a signing agent and a throwaway commit must not need one.
43
+ */
44
+ async function throwawayRepo(root) {
45
+ await runCommand(gitCommand(['init', '-q']), root, 30_000);
46
+ await writeFile(join(root, 'answer.txt'), 'wrong\n', 'utf8');
47
+ await runCommand(gitCommand(['add', '.']), root, 30_000);
48
+ await commitIn(root, 'init');
49
+ await writeFile(join(root, 'answer.txt'), 'right\n', 'utf8');
50
+ await runCommand(gitCommand(['add', '.']), root, 30_000);
51
+ await commitIn(root, 'the change');
52
+ const ref = (await runCommand(gitCommand(['rev-parse', 'HEAD']), root, 30_000)).stdout.trim();
53
+ const owner = (await runCommand(gitCommand(['rev-parse', 'HEAD~1']), root, 30_000)).stdout.trim();
54
+ await runCommand(gitCommand(['checkout', owner]), root, 30_000);
55
+ return { ref, owner };
56
+ }
57
+ /** A commit in the throwaway repository, with an identity of its own. */
58
+ async function commitIn(root, message) {
59
+ const outcome = await runCommand(gitCommand([
60
+ '-c',
61
+ 'user.email=builder@example.com',
62
+ '-c',
63
+ 'user.name=Builder',
64
+ 'commit',
65
+ '-q',
66
+ '-m',
67
+ message,
68
+ ]), root, 30_000);
69
+ if (outcome.exitCode !== 0) {
70
+ throw new Error(`the throwaway commit failed: ${outcome.stderr.trim()}`);
71
+ }
72
+ }
73
+ /** The artifact with the baseline and the candidate scenario. */
74
+ async function baselineArtifact(root) {
75
+ return artifactFile(root, [
76
+ {
77
+ id: 'baseline',
78
+ phase: 'baseline',
79
+ cwd: '.',
80
+ command: ['cat', 'answer.txt'],
81
+ expect: { stdout_includes: ['right'] },
82
+ },
83
+ {
84
+ id: 'candidate',
85
+ phase: 'candidate',
86
+ cwd: '.',
87
+ command: ['cat', 'answer.txt'],
88
+ expect: { stdout_includes: ['right'] },
89
+ },
90
+ ]);
91
+ }
92
+ /**
93
+ * A home directory whose git config signs every commit.
94
+ *
95
+ * The machine may sign with an agent the runner's environment cannot reach,
96
+ * and the signer here fails the way a locked agent fails. The marker says
97
+ * the signer was reached at all.
98
+ */
99
+ async function signingHome() {
100
+ const root = await mkdtemp(join(tmpdir(), 'openagentsy-signing-home-'));
101
+ const marker = join(root, 'the-signer-was-called');
102
+ const signer = join(root, 'signer');
103
+ await writeFile(signer, ['#!/bin/sh', `printf 'called\\n' > "${marker}"`, 'exit 1', ''].join('\n'), 'utf8');
104
+ await chmod(signer, 0o755);
105
+ await writeFile(join(root, '.gitconfig'), [
106
+ '[commit]',
107
+ '\tgpgsign = true',
108
+ '[gpg]',
109
+ '\tformat = ssh',
110
+ '[gpg "ssh"]',
111
+ `\tprogram = ${signer}`,
112
+ '[user]',
113
+ '\tsigningkey = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFIXTUREKEYFORTHEEVALRUNNERONLY0000000',
114
+ '',
115
+ ].join('\n'), 'utf8');
116
+ return { home: root, marker, remove: () => rm(root, { recursive: true, force: true }) };
117
+ }
118
+ describe('the command', () => {
119
+ it('rejects a shell string', () => {
120
+ expect(() => assertArgv('cat answer.txt')).toThrow(/argv/);
121
+ });
122
+ it('rejects a shell line wrapped in an array', () => {
123
+ expect(() => assertArgv(['cat answer.txt; rm -rf /'])).toThrow(/shell string/);
124
+ });
125
+ it('rejects an empty command', () => {
126
+ expect(() => assertArgv([])).toThrow(/argv/);
127
+ });
128
+ it('rejects an argument with a newline', () => {
129
+ expect(() => assertArgv(['cat', 'a\nb'])).toThrow(/newline/);
130
+ });
131
+ it('takes an argv', () => {
132
+ expect(() => assertArgv(['cat', 'answer.txt'])).not.toThrow();
133
+ });
134
+ });
135
+ describe('the runner', () => {
136
+ it('rejects an artifact whose command is a shell string', async () => {
137
+ const { root, remove } = await workspace();
138
+ try {
139
+ const path = await artifactFile(root, [
140
+ { id: 's', phase: 'candidate', cwd: '.', command: 'cat answer.txt', expect: {} },
141
+ ]);
142
+ await expect(runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED })).rejects.toThrow(/does not match the schema/);
143
+ }
144
+ finally {
145
+ await remove();
146
+ }
147
+ });
148
+ it('rejects a working directory outside the workspace', async () => {
149
+ const { root, remove } = await workspace();
150
+ try {
151
+ const path = await artifactFile(root, [
152
+ { id: 's', phase: 'candidate', cwd: '../../etc', command: ['cat', 'x'], expect: {} },
153
+ ]);
154
+ await expect(runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED })).rejects.toThrow(/outside the workspace/);
155
+ }
156
+ finally {
157
+ await remove();
158
+ }
159
+ });
160
+ it('rejects a timeout over the maximum', async () => {
161
+ const { root, remove } = await workspace();
162
+ try {
163
+ const path = await artifactFile(root, [
164
+ {
165
+ id: 's',
166
+ phase: 'candidate',
167
+ cwd: '.',
168
+ command: ['cat', 'x'],
169
+ timeout_ms: 400_000,
170
+ expect: {},
171
+ },
172
+ ]);
173
+ await expect(runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED })).rejects.toThrow(/does not match the schema/);
174
+ }
175
+ finally {
176
+ await remove();
177
+ }
178
+ });
179
+ it('rejects a symlinked result path', async () => {
180
+ const { root, remove } = await workspace();
181
+ try {
182
+ const path = await artifactFile(root, [
183
+ { id: 's', phase: 'candidate', cwd: '.', command: ['cat', 'x'], expect: {} },
184
+ ]);
185
+ const target = evalResultPath(root, LESSON, PINNED);
186
+ await mkdir(dirname(target), { recursive: true });
187
+ await symlink(join(root, 'somewhere-else.json'), target);
188
+ await expect(runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED })).rejects.toThrow(/symlink/);
189
+ }
190
+ finally {
191
+ await remove();
192
+ }
193
+ });
194
+ it('never writes stdout or stderr into the result', async () => {
195
+ const { root, remove } = await workspace();
196
+ try {
197
+ const marker = 'THE-MARKER-9431';
198
+ const printer = await script(root, 'print.js', `console.log(${JSON.stringify(marker)});console.error(${JSON.stringify(marker)});\n`);
199
+ const path = await artifactFile(root, [
200
+ {
201
+ id: 's',
202
+ phase: 'candidate',
203
+ cwd: '.',
204
+ command: [process.execPath, printer],
205
+ expect: { stdout_includes: [marker], stderr_includes: [marker] },
206
+ },
207
+ ]);
208
+ const result = await runEvalArtifact({
209
+ artifactPath: path,
210
+ workspace: root,
211
+ now: () => PINNED,
212
+ });
213
+ expect(result.passed).toBe(true);
214
+ expect(JSON.stringify(result)).not.toContain(marker);
215
+ const written = await readFile(evalResultPath(root, LESSON, PINNED), 'utf8');
216
+ expect(written).not.toContain(marker);
217
+ }
218
+ finally {
219
+ await remove();
220
+ }
221
+ });
222
+ it('strips a fake GITHUB_TOKEN from the child environment', async () => {
223
+ const { root, remove } = await workspace();
224
+ const before = process.env.GITHUB_TOKEN;
225
+ process.env.GITHUB_TOKEN = ['gh', 'p_', 'a'.repeat(36)].join('');
226
+ try {
227
+ const path = await artifactFile(root, [
228
+ {
229
+ id: 's',
230
+ phase: 'candidate',
231
+ cwd: '.',
232
+ command: ['printenv', 'GITHUB_TOKEN'],
233
+ expect: { exit_code: 1 },
234
+ },
235
+ ]);
236
+ const result = await runEvalArtifact({
237
+ artifactPath: path,
238
+ workspace: root,
239
+ now: () => PINNED,
240
+ });
241
+ expect(result.passed).toBe(true);
242
+ expect(result.scenarios[0]?.exit_code).toBe(1);
243
+ }
244
+ finally {
245
+ if (before === undefined)
246
+ delete process.env.GITHUB_TOKEN;
247
+ else
248
+ process.env.GITHUB_TOKEN = before;
249
+ await remove();
250
+ }
251
+ });
252
+ it('writes the result with mode 0600', async () => {
253
+ const { root, remove } = await workspace();
254
+ try {
255
+ const path = await artifactFile(root, [
256
+ { id: 's', phase: 'candidate', cwd: '.', command: ['cat', 'x'], expect: {} },
257
+ ]);
258
+ await runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED });
259
+ const info = await stat(evalResultPath(root, LESSON, PINNED));
260
+ expect(info.mode & 0o777).toBe(0o600);
261
+ }
262
+ finally {
263
+ await remove();
264
+ }
265
+ });
266
+ it('kills the process at the timeout', async () => {
267
+ const { root, remove } = await workspace();
268
+ try {
269
+ const sleeper = await script(root, 'sleep.js', 'setTimeout(() => {}, 60000);\n');
270
+ const path = await artifactFile(root, [
271
+ {
272
+ id: 's',
273
+ phase: 'candidate',
274
+ cwd: '.',
275
+ command: [process.execPath, sleeper],
276
+ timeout_ms: 300,
277
+ expect: {},
278
+ },
279
+ ]);
280
+ const result = await runEvalArtifact({
281
+ artifactPath: path,
282
+ workspace: root,
283
+ now: () => PINNED,
284
+ });
285
+ expect(result.scenarios[0]?.timed_out).toBe(true);
286
+ expect(result.scenarios[0]?.exit_code).toBeNull();
287
+ }
288
+ finally {
289
+ await remove();
290
+ }
291
+ });
292
+ });
293
+ describe('the baseline in a temporary worktree', () => {
294
+ it('fails on the current owner and passes with the change', async () => {
295
+ const { root, remove } = await workspace();
296
+ try {
297
+ const { ref } = await throwawayRepo(root);
298
+ const path = await baselineArtifact(root);
299
+ const outcome = await reproduceBaseline({
300
+ artifactPath: path,
301
+ workspace: root,
302
+ repo: root,
303
+ changeRef: ref,
304
+ now: () => PINNED,
305
+ });
306
+ expect(outcome.baseline_failed).toBe(true);
307
+ expect(outcome.with_change_passed).toBe(true);
308
+ expect(outcome.passed).toBe(true);
309
+ const before = outcome.before?.scenarios.find((scenario) => scenario.phase === 'baseline');
310
+ expect(before?.passed).toBe(false);
311
+ const after = outcome.after?.scenarios.find((scenario) => scenario.phase === 'candidate');
312
+ expect(after?.passed).toBe(true);
313
+ }
314
+ finally {
315
+ await remove();
316
+ }
317
+ });
318
+ });
319
+ describe('the signing of a throwaway commit', () => {
320
+ it('turns the signing off on the git commands it spawns', () => {
321
+ expect(gitCommand(['worktree', 'add', '--detach', 'worktree', 'HEAD'])).toEqual([
322
+ 'git',
323
+ '-c',
324
+ 'commit.gpgsign=false',
325
+ 'worktree',
326
+ 'add',
327
+ '--detach',
328
+ 'worktree',
329
+ 'HEAD',
330
+ ]);
331
+ });
332
+ it('completes the run on a machine whose signing agent is locked', async () => {
333
+ const { root, remove } = await workspace();
334
+ const signing = await signingHome();
335
+ const before = process.env.HOME;
336
+ process.env.HOME = signing.home;
337
+ try {
338
+ const { ref } = await throwawayRepo(root);
339
+ const path = await baselineArtifact(root);
340
+ const outcome = await reproduceBaseline({
341
+ artifactPath: path,
342
+ workspace: root,
343
+ repo: root,
344
+ changeRef: ref,
345
+ now: () => PINNED,
346
+ });
347
+ expect(outcome.passed).toBe(true);
348
+ // The signer was never reached: a throwaway commit is not signed.
349
+ expect(await exists(signing.marker)).toBe(false);
350
+ }
351
+ finally {
352
+ if (before === undefined)
353
+ delete process.env.HOME;
354
+ else
355
+ process.env.HOME = before;
356
+ await signing.remove();
357
+ await remove();
358
+ }
359
+ });
360
+ });
361
+ describe('the boundaries of a run', () => {
362
+ it('refuses a lesson id that is really a path', async () => {
363
+ const { root, remove } = await workspace();
364
+ try {
365
+ const path = await artifactFile(root, [
366
+ { id: 's', phase: 'candidate', cwd: '.', command: ['cat', 'x'], expect: {} },
367
+ ]);
368
+ const raw = JSON.parse(await readFile(path, 'utf8'));
369
+ raw.lesson_id = '../../../../../../../../tmp/oa-escaped-result';
370
+ await writeFile(path, JSON.stringify(raw), 'utf8');
371
+ await expect(runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED })).rejects.toThrow(/is not a lesson id/);
372
+ }
373
+ finally {
374
+ await remove();
375
+ }
376
+ });
377
+ it('refuses a working directory that leaves the workspace through a symlink', async () => {
378
+ const { root, remove } = await workspace();
379
+ const outside = await mkdtemp(join(tmpdir(), 'openagentsy-outside-'));
380
+ try {
381
+ await symlink(outside, join(root, 'link'));
382
+ const path = await artifactFile(root, [
383
+ {
384
+ id: 's',
385
+ phase: 'candidate',
386
+ cwd: 'link',
387
+ command: ['pwd'],
388
+ expect: { stdout_includes: [outside] },
389
+ },
390
+ ]);
391
+ await expect(runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED })).rejects.toThrow(/leaves the workspace through a symlink/);
392
+ }
393
+ finally {
394
+ await rm(outside, { recursive: true, force: true });
395
+ await remove();
396
+ }
397
+ });
398
+ it('refuses to write a result through a symlinked state directory', async () => {
399
+ const { root, remove } = await workspace();
400
+ const outside = await mkdtemp(join(tmpdir(), 'openagentsy-state-'));
401
+ try {
402
+ await symlink(outside, join(root, '.openagentsy'));
403
+ const path = await artifactFile(root, [
404
+ { id: 's', phase: 'candidate', cwd: '.', command: ['cat', 'x'], expect: {} },
405
+ ]);
406
+ await expect(runEvalArtifact({ artifactPath: path, workspace: root, now: () => PINNED })).rejects.toThrow(/symlink/);
407
+ expect(await readdir(outside)).toHaveLength(0);
408
+ }
409
+ finally {
410
+ await rm(outside, { recursive: true, force: true });
411
+ await remove();
412
+ }
413
+ });
414
+ it('leaves no worktree behind when the add fails', async () => {
415
+ const { root, remove } = await workspace();
416
+ try {
417
+ await runCommand(gitCommand(['init', '-q']), root, 30_000);
418
+ await expect(withTemporaryWorktree({
419
+ repo: root,
420
+ ref: 'nosuchref',
421
+ run: async () => 'never',
422
+ })).rejects.toThrow(/failed/);
423
+ const list = await runCommand(gitCommand(['worktree', 'list']), root, 30_000);
424
+ expect(list.stdout.trim().split('\n')).toHaveLength(1);
425
+ }
426
+ finally {
427
+ await remove();
428
+ }
429
+ });
430
+ });
431
+ //# sourceMappingURL=runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../src/eval/runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * The eval artifacts: the executable proof that a lesson is real.
4
+ *
5
+ * An artifact is a list of scenarios. A baseline scenario says what the
6
+ * behaviour is today, and a candidate scenario says what it should be. The
7
+ * runner executes them and writes a result that holds the verdicts and never
8
+ * the output, so a result can be kept without keeping what the run printed.
9
+ */
10
+ /** The longest a scenario may run, in milliseconds. */
11
+ export declare const MAX_TIMEOUT_MS = 300000;
12
+ /** The timeout a scenario gets when it names none. */
13
+ export declare const DEFAULT_TIMEOUT_MS = 30000;
14
+ /** The most scenarios an artifact may hold. */
15
+ export declare const MAX_SCENARIOS = 20;
16
+ /**
17
+ * What a scenario asserts about the run.
18
+ *
19
+ * Every field is optional, and a field that is absent is not asserted: a
20
+ * scenario that only names an exit code does not care what was printed.
21
+ */
22
+ export declare const EvalExpectation: z.ZodObject<{
23
+ exit_code: z.ZodOptional<z.ZodNumber>;
24
+ stdout_includes: z.ZodOptional<z.ZodArray<z.ZodString>>;
25
+ stdout_excludes: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ stderr_includes: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ stderr_excludes: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ }, z.core.$strip>;
29
+ /**
30
+ * One scenario: a command, a place to run it, and what it must show.
31
+ *
32
+ * The command is an argv, never a shell string. The schema says so by
33
+ * holding an array, and the runner says it again before it spawns, because a
34
+ * shell string is the one shape that turns a proof into an injection.
35
+ */
36
+ export declare const EvalScenario: z.ZodObject<{
37
+ id: z.ZodString;
38
+ phase: z.ZodEnum<{
39
+ baseline: "baseline";
40
+ candidate: "candidate";
41
+ }>;
42
+ cwd: z.ZodString;
43
+ command: z.ZodArray<z.ZodString>;
44
+ timeout_ms: z.ZodDefault<z.ZodNumber>;
45
+ expect: z.ZodObject<{
46
+ exit_code: z.ZodOptional<z.ZodNumber>;
47
+ stdout_includes: z.ZodOptional<z.ZodArray<z.ZodString>>;
48
+ stdout_excludes: z.ZodOptional<z.ZodArray<z.ZodString>>;
49
+ stderr_includes: z.ZodOptional<z.ZodArray<z.ZodString>>;
50
+ stderr_excludes: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ }, z.core.$strip>;
52
+ }, z.core.$strip>;
53
+ /**
54
+ * The artifact.
55
+ *
56
+ * It needs at least one candidate scenario, because an artifact that only
57
+ * shows the current behaviour proves nothing, and the scenario ids have to be
58
+ * unique, because a result names its scenarios by id.
59
+ */
60
+ export declare const EvalArtifact: z.ZodObject<{
61
+ schema_version: z.ZodLiteral<"1">;
62
+ lesson_id: z.ZodString;
63
+ name: z.ZodString;
64
+ scenarios: z.ZodArray<z.ZodObject<{
65
+ id: z.ZodString;
66
+ phase: z.ZodEnum<{
67
+ baseline: "baseline";
68
+ candidate: "candidate";
69
+ }>;
70
+ cwd: z.ZodString;
71
+ command: z.ZodArray<z.ZodString>;
72
+ timeout_ms: z.ZodDefault<z.ZodNumber>;
73
+ expect: z.ZodObject<{
74
+ exit_code: z.ZodOptional<z.ZodNumber>;
75
+ stdout_includes: z.ZodOptional<z.ZodArray<z.ZodString>>;
76
+ stdout_excludes: z.ZodOptional<z.ZodArray<z.ZodString>>;
77
+ stderr_includes: z.ZodOptional<z.ZodArray<z.ZodString>>;
78
+ stderr_excludes: z.ZodOptional<z.ZodArray<z.ZodString>>;
79
+ }, z.core.$strip>;
80
+ }, z.core.$strip>>;
81
+ }, z.core.$strip>;
82
+ export type EvalArtifact = z.infer<typeof EvalArtifact>;
83
+ export type EvalScenario = z.infer<typeof EvalScenario>;
84
+ export type EvalExpectation = z.infer<typeof EvalExpectation>;
85
+ /** The verdict of every assertion a scenario made, by assertion name. */
86
+ export type EvalAssertions = Record<string, boolean>;
87
+ /**
88
+ * What one scenario did.
89
+ *
90
+ * The argv is not here, only its hash: the result says which command ran
91
+ * without carrying the command, and the output is not here at all.
92
+ */
93
+ export interface EvalScenarioResult {
94
+ id: string;
95
+ phase: 'baseline' | 'candidate';
96
+ /** The hash of the argv. */
97
+ command_sha256: string;
98
+ /** The exit code, or null when the process was killed at the timeout. */
99
+ exit_code: number | null;
100
+ /** Whether the process was killed at the timeout. */
101
+ timed_out: boolean;
102
+ /** How long the scenario ran, in milliseconds. */
103
+ duration_ms: number;
104
+ /** The verdict of every assertion the expectation named. */
105
+ assertions: EvalAssertions;
106
+ /** Whether every assertion held. */
107
+ passed: boolean;
108
+ }
109
+ /**
110
+ * What the runner produced.
111
+ *
112
+ * The result is the proof: it says what passed, how long it took, which
113
+ * artifact it came from and which commands ran. It never says what any of
114
+ * them printed.
115
+ */
116
+ export interface EvalResult {
117
+ schema_version: '1';
118
+ lesson_id: string;
119
+ /** The hash of the artifact the run came from. */
120
+ artifact_sha256: string;
121
+ started_at: string;
122
+ finished_at: string;
123
+ /** Whether every scenario passed. */
124
+ passed: boolean;
125
+ /**
126
+ * How many times the proof ran.
127
+ *
128
+ * An artifact run is one. A proof that points at an evals/ suite needs
129
+ * three: a suite that passes once has not shown that it always passes.
130
+ */
131
+ runs: number;
132
+ scenarios: EvalScenarioResult[];
133
+ }
134
+ /**
135
+ * The shape of a result, for a result that came from somewhere else.
136
+ *
137
+ * The runner builds its own results, so the type is enough for it. A result
138
+ * that arrives from a person or from a file has to be checked, because a
139
+ * result that is not one is not a proof.
140
+ */
141
+ export declare const EvalResultShape: z.ZodObject<{
142
+ schema_version: z.ZodLiteral<"1">;
143
+ lesson_id: z.ZodString;
144
+ artifact_sha256: z.ZodString;
145
+ started_at: z.ZodString;
146
+ finished_at: z.ZodString;
147
+ passed: z.ZodBoolean;
148
+ runs: z.ZodNumber;
149
+ scenarios: z.ZodArray<z.ZodObject<{
150
+ id: z.ZodString;
151
+ phase: z.ZodEnum<{
152
+ baseline: "baseline";
153
+ candidate: "candidate";
154
+ }>;
155
+ command_sha256: z.ZodString;
156
+ exit_code: z.ZodNullable<z.ZodNumber>;
157
+ timed_out: z.ZodBoolean;
158
+ duration_ms: z.ZodNumber;
159
+ assertions: z.ZodRecord<z.ZodString, z.ZodBoolean>;
160
+ passed: z.ZodBoolean;
161
+ }, z.core.$strip>>;
162
+ }, z.core.$strip>;
163
+ /**
164
+ * The error the proof raises.
165
+ *
166
+ * It carries a hint, like every other error in this repository: the message
167
+ * says what happened, the hint says what to do next.
168
+ */
169
+ export declare class ProofError extends Error {
170
+ readonly hint: string;
171
+ constructor(message: string, hint: string);
172
+ }
173
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/eval/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AAEH,uDAAuD;AACvD,eAAO,MAAM,cAAc,SAAU,CAAC;AAEtC,sDAAsD;AACtD,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,+CAA+C;AAC/C,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;;;;iBAM1B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;iBAOvB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;iBAevB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,UAAU,GAAG,WAAW,CAAC;IAChC,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,EAAE,cAAc,CAAC;IAC3B,oCAAoC;IACpC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;iBAoB1B,CAAC;AAEH;;;;;GAKG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAK1C"}