@lesliechan721/agent-skill-eval 0.1.0-beta.1

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 (50) hide show
  1. package/dist/bin.d.ts +2 -0
  2. package/dist/bin.js +80 -0
  3. package/dist/bin.js.map +1 -0
  4. package/dist/bundle.d.ts +93 -0
  5. package/dist/bundle.js +216 -0
  6. package/dist/bundle.js.map +1 -0
  7. package/dist/capabilities.d.ts +2 -0
  8. package/dist/capabilities.js +38 -0
  9. package/dist/capabilities.js.map +1 -0
  10. package/dist/common.d.ts +8 -0
  11. package/dist/common.js +22 -0
  12. package/dist/common.js.map +1 -0
  13. package/dist/corpus-digest.d.ts +3 -0
  14. package/dist/corpus-digest.js +19 -0
  15. package/dist/corpus-digest.js.map +1 -0
  16. package/dist/index.d.ts +16 -0
  17. package/dist/index.js +11 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/json-schema.d.ts +3 -0
  20. package/dist/json-schema.js +70 -0
  21. package/dist/json-schema.js.map +1 -0
  22. package/dist/output-path.d.ts +1 -0
  23. package/dist/output-path.js +34 -0
  24. package/dist/output-path.js.map +1 -0
  25. package/dist/plan.d.ts +79 -0
  26. package/dist/plan.js +285 -0
  27. package/dist/plan.js.map +1 -0
  28. package/dist/process-tree.d.ts +25 -0
  29. package/dist/process-tree.js +385 -0
  30. package/dist/process-tree.js.map +1 -0
  31. package/dist/process.d.ts +14 -0
  32. package/dist/process.js +301 -0
  33. package/dist/process.js.map +1 -0
  34. package/dist/run.d.ts +2 -0
  35. package/dist/run.js +592 -0
  36. package/dist/run.js.map +1 -0
  37. package/dist/runtime-skill.d.ts +18 -0
  38. package/dist/runtime-skill.js +135 -0
  39. package/dist/runtime-skill.js.map +1 -0
  40. package/dist/schemas/aw-skill-eval-execution-plan.schema.json +220 -0
  41. package/dist/schemas/digests.json +5 -0
  42. package/dist/schemas/eval-run-bundle.schema.json +408 -0
  43. package/dist/schemas/eval-runtime-capabilities.schema.json +85 -0
  44. package/dist/schemas.d.ts +5 -0
  45. package/dist/schemas.js +27 -0
  46. package/dist/schemas.js.map +1 -0
  47. package/dist/types.d.ts +86 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +34 -0
package/dist/run.js ADDED
@@ -0,0 +1,592 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { lstat, mkdir, open, readFile, realpath, rename, rm, stat, unlink, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import process from 'node:process';
5
+ import { isPathInside, sha256, toPosixRelative } from './common.js';
6
+ import { getRuntimeCapabilities } from './capabilities.js';
7
+ import { comparisonAggregate, validateRunBundle } from './bundle.js';
8
+ import { captureAndValidateExecutionPlan, promptOf } from './plan.js';
9
+ import { hasCoreProcessReceipt, ProviderProcessCleanupError, runProviderProcess } from './process.js';
10
+ import { assertProcessTreeInspectionAvailable, observeProcessTree, terminateProcessTree, } from './process-tree.js';
11
+ import { assertSafeOutputPath } from './output-path.js';
12
+ import { computeSkillDigest, materializeCapturedRuntimeSkill, } from './runtime-skill.js';
13
+ const OBSERVED_PROCESS_LIMITATION = 'Portable process observation does not guarantee descendant cleanup; comparative evidence is disabled.';
14
+ const VERIFIED_OBSERVED_PROCESS_LIMITATION = 'Verified process observation is not OS-enforced containment and does not guarantee descendant cleanup.';
15
+ const CLEANUP_FAILURE_LIMITATION = 'Provider process cleanup could not be verified.';
16
+ const RESTRICTED_PERMISSION_PROFILES = new Set(['workspace', 'read-only']);
17
+ const FULL_ACCESS_PERMISSION_PROFILE = 'danger-full-access';
18
+ const PROVIDER_PROCESS_MARKER_ENV = 'AW_AGENT_SKILL_EVAL_PROCESS_MARKER';
19
+ function hasConfirmedExternalContainment(options) {
20
+ const containment = options.processHooks?.externalContainment;
21
+ return containment?.confirmed === true &&
22
+ containment.descendantCleanupGuaranteed === true &&
23
+ containment.readOnlySkillSnapshotGuaranteed === true &&
24
+ options.processHooks?.terminateProcessTree !== undefined;
25
+ }
26
+ function createObservedProcessHooks(processTree) {
27
+ let observation;
28
+ return {
29
+ onSpawn: ({ pid }) => {
30
+ observation = observeProcessTree(pid, undefined, processTree);
31
+ },
32
+ terminateProcessTree: async ({ pid }) => {
33
+ await terminateProcessTree(pid, (signal) => {
34
+ try {
35
+ process.kill(pid, signal);
36
+ }
37
+ catch {
38
+ // The direct child can already be closed.
39
+ }
40
+ }, processTree, {
41
+ observation,
42
+ allowInspectionUnavailable: true,
43
+ });
44
+ return { confirmed: true };
45
+ },
46
+ };
47
+ }
48
+ function normalizedPermissionProfile(sourceEnv) {
49
+ const value = sourceEnv.CODEX_PERMISSION_PROFILE?.trim();
50
+ return value ? value.replace(/^:/u, '') : null;
51
+ }
52
+ async function resolveProcessExecutionContext(plan, options) {
53
+ if (options.processHooks) {
54
+ if (!hasConfirmedExternalContainment(options)) {
55
+ throw new Error('Portable Eval execution requires explicitly confirmed external containment with descendant cleanup and read-only Skill snapshots.');
56
+ }
57
+ return { containment: 'managed', hooks: options.processHooks };
58
+ }
59
+ if ((plan.minimumEvidenceLevel ?? 'executed') === 'executed') {
60
+ return {
61
+ containment: 'observed',
62
+ hooks: createObservedProcessHooks(options.processTree),
63
+ processTree: options.processTree,
64
+ limitation: OBSERVED_PROCESS_LIMITATION,
65
+ };
66
+ }
67
+ const platform = options.platform ?? options.processTree?.platform ?? process.platform;
68
+ if (platform !== 'darwin' && platform !== 'linux') {
69
+ throw new Error(`minimumEvidenceLevel comparative requires Full Access verified process observation; ${platform} is not supported. No provider process was started.`);
70
+ }
71
+ const profile = normalizedPermissionProfile(options.sourceEnv ?? process.env);
72
+ if (profile && profile !== FULL_ACCESS_PERMISSION_PROFILE) {
73
+ const known = RESTRICTED_PERMISSION_PROFILES.has(profile) ? 'restricted' : 'unknown';
74
+ throw new Error(`minimumEvidenceLevel comparative is blocked because CODEX_PERMISSION_PROFILE=${profile} is ${known}. ` +
75
+ 'A one-off sandbox_permissions=require_escalated request is not Full Access. No provider process was started.');
76
+ }
77
+ const processTree = {
78
+ ...options.processTree,
79
+ platform,
80
+ markerEnvironmentVariable: PROVIDER_PROCESS_MARKER_ENV,
81
+ };
82
+ await assertProcessTreeInspectionAvailable(processTree);
83
+ return {
84
+ containment: 'verified-observed',
85
+ hooks: {},
86
+ processTree,
87
+ limitation: VERIFIED_OBSERVED_PROCESS_LIMITATION,
88
+ };
89
+ }
90
+ const artifactRoles = new Set(['trace', 'report', 'output', 'grading', 'other']);
91
+ class RunnerOwnedOutputError extends Error {
92
+ }
93
+ async function assertBoundInputsUnchanged(files, skills) {
94
+ for (const file of files) {
95
+ try {
96
+ const info = await lstat(file.requestedPath);
97
+ if (info.isSymbolicLink() || !info.isFile())
98
+ throw new Error('file type changed');
99
+ const actual = await realpath(file.requestedPath);
100
+ if (actual !== file.canonicalPath || sha256(await readFile(actual)) !== file.digest)
101
+ throw new Error('identity or bytes changed');
102
+ }
103
+ catch (error) {
104
+ throw new Error(`Bound Eval input changed during execution: ${file.label}: ${error.message}`, { cause: error });
105
+ }
106
+ }
107
+ for (const [configurationId, source] of skills) {
108
+ if (!source.captured)
109
+ continue;
110
+ try {
111
+ if (await computeSkillDigest(source.captured.sourceRoot) !== source.digest)
112
+ throw new Error('digest changed');
113
+ }
114
+ catch (error) {
115
+ throw new Error(`Bound Eval input changed during execution: ${configurationId} Skill: ${error.message}`, { cause: error });
116
+ }
117
+ }
118
+ }
119
+ function assertBoundInputsOutsideOutputRoot(outputRoot, files, skills) {
120
+ for (const file of files) {
121
+ if (isPathInside(outputRoot, file.canonicalPath))
122
+ throw new Error(`Bound Eval input must not be inside outputRoot: ${file.label}`);
123
+ }
124
+ for (const [configurationId, source] of skills) {
125
+ if (source.captured && isPathInside(outputRoot, source.captured.sourceRoot))
126
+ throw new Error(`Bound Eval input must not be inside outputRoot: ${configurationId} Skill`);
127
+ }
128
+ }
129
+ async function prepareOutputRoot(base, outputRoot) {
130
+ await assertSafeOutputPath(base, outputRoot);
131
+ await mkdir(outputRoot, { recursive: true });
132
+ await assertSafeOutputPath(base, outputRoot);
133
+ const oldBundle = path.join(outputRoot, 'eval-run-bundle.json');
134
+ try {
135
+ const info = await lstat(oldBundle);
136
+ if (info.isSymbolicLink() || !info.isFile())
137
+ throw new Error('existing EvalRunBundle output must be a regular file');
138
+ const actual = await realpath(oldBundle);
139
+ if (!isPathInside(outputRoot, actual))
140
+ throw new Error('existing EvalRunBundle leaves outputRoot');
141
+ await rm(oldBundle);
142
+ }
143
+ catch (error) {
144
+ if (error.code !== 'ENOENT')
145
+ throw error;
146
+ }
147
+ }
148
+ function replacePlaceholders(value, replacements) {
149
+ return value.replace(/\{(prompt|caseId|configuration|skillPath|outputDir)\}/gu, (_, key) => replacements[key]);
150
+ }
151
+ function gradingOf(value) {
152
+ if (!value || typeof value !== 'object' || Array.isArray(value))
153
+ return null;
154
+ const record = value;
155
+ const grader = record.grader;
156
+ if (!grader || typeof grader !== 'object' || Array.isArray(grader))
157
+ return null;
158
+ const identity = grader;
159
+ if (typeof identity.id !== 'string' || !identity.id || typeof identity.version !== 'string' || !identity.version)
160
+ return null;
161
+ if (!record.result || typeof record.result !== 'object' || Array.isArray(record.result))
162
+ return null;
163
+ return record;
164
+ }
165
+ async function providerArtifacts(parsed, runDirectory, outputRoot) {
166
+ if (!Array.isArray(parsed.artifacts))
167
+ return [];
168
+ const artifacts = [];
169
+ for (const entry of parsed.artifacts) {
170
+ if (!entry || typeof entry !== 'object' || typeof entry.path !== 'string')
171
+ throw new Error('provider artifact requires path');
172
+ const role = typeof entry.role === 'string' ? entry.role : 'other';
173
+ if (!artifactRoles.has(role))
174
+ throw new Error(`unsupported provider artifact role: ${role}`);
175
+ const candidate = path.resolve(runDirectory, entry.path);
176
+ if (!isPathInside(runDirectory, candidate))
177
+ throw new Error('provider artifact leaves the run directory');
178
+ if ((await lstat(candidate)).isSymbolicLink())
179
+ throw new Error('provider artifact cannot be a symlink');
180
+ const actual = await realpath(candidate);
181
+ if (!isPathInside(runDirectory, actual) || !(await stat(actual)).isFile())
182
+ throw new Error('provider artifact is not a regular run file');
183
+ artifacts.push({
184
+ role: role,
185
+ path: toPosixRelative(outputRoot, actual),
186
+ digest: sha256(await readFile(actual)),
187
+ });
188
+ }
189
+ return artifacts;
190
+ }
191
+ async function createRunnerOwnedTemp(base, outputRoot, directory, label, bytes) {
192
+ await assertSafeOutputPath(base, outputRoot);
193
+ await assertSafeOutputPath(base, directory);
194
+ const [actualOutputRoot, actualDirectory] = await Promise.all([
195
+ realpath(outputRoot),
196
+ realpath(directory),
197
+ ]);
198
+ if (!isPathInside(actualOutputRoot, actualDirectory))
199
+ throw new Error(`${label} directory leaves outputRoot`);
200
+ const temporaryPath = path.join(directory, `.${label}.${randomUUID()}.tmp`);
201
+ const handle = await open(temporaryPath, 'wx', 0o600);
202
+ try {
203
+ await handle.writeFile(bytes);
204
+ await handle.sync();
205
+ const info = await handle.stat();
206
+ if (!info.isFile() || info.nlink !== 1)
207
+ throw new Error(`${label} temporary file is not an owned regular file`);
208
+ }
209
+ catch (error) {
210
+ await handle.close().catch(() => undefined);
211
+ await unlink(temporaryPath).catch(() => undefined);
212
+ throw error;
213
+ }
214
+ await handle.close();
215
+ const actualTemporaryPath = await realpath(temporaryPath);
216
+ if (!isPathInside(actualDirectory, actualTemporaryPath)) {
217
+ await unlink(temporaryPath).catch(() => undefined);
218
+ throw new Error(`${label} temporary file leaves its runner-owned directory`);
219
+ }
220
+ return temporaryPath;
221
+ }
222
+ async function commitRunnerOwnedFile(base, outputRoot, directory, temporaryPath, finalPath, label, expectedDigest, beforeRename) {
223
+ let renamed = false;
224
+ try {
225
+ await assertSafeOutputPath(base, outputRoot);
226
+ await assertSafeOutputPath(base, directory);
227
+ const temporaryInfo = await lstat(temporaryPath);
228
+ if (!temporaryInfo.isFile() || temporaryInfo.isSymbolicLink() || temporaryInfo.nlink !== 1)
229
+ throw new Error(`${label} temporary file identity changed`);
230
+ await beforeRename?.();
231
+ try {
232
+ await lstat(finalPath);
233
+ throw new Error(`${label} path already exists`);
234
+ }
235
+ catch (error) {
236
+ if (error.code !== 'ENOENT')
237
+ throw error;
238
+ }
239
+ await rename(temporaryPath, finalPath);
240
+ renamed = true;
241
+ const finalInfo = await lstat(finalPath);
242
+ if (!finalInfo.isFile() || finalInfo.isSymbolicLink() || finalInfo.nlink !== 1)
243
+ throw new Error(`${label} is not an owned regular file after commit`);
244
+ const [actualDirectory, actualFinalPath] = await Promise.all([realpath(directory), realpath(finalPath)]);
245
+ if (!isPathInside(actualDirectory, actualFinalPath))
246
+ throw new Error(`${label} leaves its runner-owned directory`);
247
+ if (sha256(await readFile(actualFinalPath)) !== expectedDigest)
248
+ throw new Error(`${label} bytes changed during commit`);
249
+ }
250
+ catch (error) {
251
+ await unlink(temporaryPath).catch(() => undefined);
252
+ if (renamed)
253
+ await unlink(finalPath).catch(() => undefined);
254
+ throw error;
255
+ }
256
+ }
257
+ async function writeRunnerOwnedEvidence(base, outputRoot, directory, finalPath, label, bytes) {
258
+ const digest = sha256(bytes);
259
+ const temporaryPath = await createRunnerOwnedTemp(base, outputRoot, directory, label, bytes);
260
+ await commitRunnerOwnedFile(base, outputRoot, directory, temporaryPath, finalPath, label, digest);
261
+ return digest;
262
+ }
263
+ async function runOne(input) {
264
+ const { plan, base, skillSource, evalCase, configuration, runIndex, executionLimitations } = input;
265
+ const caseId = String(evalCase.id);
266
+ const outputRoot = path.resolve(base, plan.outputRoot);
267
+ const runDirectory = path.resolve(outputRoot, caseId, configuration.id, String(runIndex));
268
+ if (!isPathInside(outputRoot, runDirectory))
269
+ throw new Error('run directory leaves outputRoot');
270
+ await assertSafeOutputPath(base, outputRoot);
271
+ await assertSafeOutputPath(base, runDirectory);
272
+ await input.beforeRunDirectoryReset();
273
+ await rm(runDirectory, { recursive: true, force: true });
274
+ await mkdir(runDirectory, { recursive: true });
275
+ await assertSafeOutputPath(base, runDirectory);
276
+ let skillSnapshot = null;
277
+ if (skillSource.captured) {
278
+ const snapshot = await materializeCapturedRuntimeSkill(skillSource.captured, path.join(runDirectory, 'skill'));
279
+ if (snapshot.digest !== skillSource.digest) {
280
+ throw new Error('Runtime Skill snapshot digest does not match the bound Skill digest');
281
+ }
282
+ skillSnapshot = snapshot.root;
283
+ }
284
+ const casePath = path.join(runDirectory, 'case.json');
285
+ await writeFile(casePath, `${JSON.stringify(evalCase, null, 2)}\n`, 'utf8');
286
+ const replacements = {
287
+ prompt: promptOf(evalCase),
288
+ caseId,
289
+ configuration: configuration.id,
290
+ skillPath: skillSnapshot ?? '',
291
+ outputDir: runDirectory,
292
+ };
293
+ const argv = plan.provider.command.map((value) => replacePlaceholders(value, replacements));
294
+ const executable = argv.shift();
295
+ if (!executable)
296
+ throw new Error('provider command has no executable');
297
+ const inheritedEnvironment = plan.provider.inheritEnvironment
298
+ ? process.env
299
+ : Object.fromEntries(['PATH', 'LANG', 'LC_ALL', 'SYSTEMROOT', 'WINDIR'].flatMap((name) => process.env[name] === undefined ? [] : [[name, process.env[name]]]));
300
+ const env = {
301
+ ...inheritedEnvironment,
302
+ ...plan.provider.env,
303
+ ...configuration.env,
304
+ AGENT_EVAL_CASE_ID: caseId,
305
+ AGENT_EVAL_CONFIGURATION: configuration.id,
306
+ AGENT_EVAL_SKILL_MODE: configuration.skillMode,
307
+ AGENT_EVAL_OUTPUT_DIR: runDirectory,
308
+ AGENT_EVAL_CASE_PATH: casePath,
309
+ ...(skillSnapshot ? { AGENT_EVAL_SKILL_PATH: skillSnapshot } : {}),
310
+ };
311
+ const started = Date.now();
312
+ let result;
313
+ const snapshotDigestBefore = skillSnapshot === null ? null : await computeSkillDigest(skillSnapshot);
314
+ let cleanupFailed = false;
315
+ try {
316
+ result = await runProviderProcess({
317
+ executable,
318
+ args: argv,
319
+ cwd: plan.provider.cwd ? path.resolve(base, plan.provider.cwd) : runDirectory,
320
+ env,
321
+ timeoutMs: plan.timeoutMs,
322
+ maxBufferBytes: 20 * 1024 * 1024,
323
+ }, input.processExecution.hooks, {
324
+ containment: input.processExecution.containment,
325
+ processTree: input.processExecution.processTree,
326
+ });
327
+ }
328
+ catch (error) {
329
+ if (error instanceof ProviderProcessCleanupError && error.result) {
330
+ result = error.result;
331
+ cleanupFailed = true;
332
+ }
333
+ else
334
+ throw error;
335
+ }
336
+ if (skillSnapshot !== null && await computeSkillDigest(skillSnapshot) !== snapshotDigestBefore) {
337
+ throw new Error('Provider modified the captured Runtime Skill snapshot');
338
+ }
339
+ if (!hasCoreProcessReceipt(result)) {
340
+ throw new Error('Provider result does not contain a core-issued process receipt');
341
+ }
342
+ if (!result.descendantCleanupGuaranteed) {
343
+ executionLimitations.push(result.containmentLimitation ?? OBSERVED_PROCESS_LIMITATION);
344
+ }
345
+ let status = cleanupFailed
346
+ ? 'error'
347
+ : result.timedOut
348
+ ? 'timeout'
349
+ : result.maxBufferExceeded
350
+ ? 'process-failed'
351
+ : result.exitCode === 0
352
+ ? 'completed'
353
+ : 'process-failed';
354
+ let stderr = result.stderr;
355
+ if (result.maxBufferExceeded) {
356
+ const streams = [
357
+ ...(result.stdoutTruncated ? ['stdout'] : []),
358
+ ...(result.stderrTruncated ? ['stderr'] : []),
359
+ ].join(' and ') || 'provider output';
360
+ const diagnostic = `Provider ${streams} exceeded the capture maxBuffer and was truncated.`;
361
+ stderr += `${stderr && !stderr.endsWith('\n') ? '\n' : ''}${diagnostic}\n`;
362
+ executionLimitations.push(`Run ${caseId}/${configuration.id}/${runIndex}: ${diagnostic}`);
363
+ }
364
+ let usage = null;
365
+ let grading = null;
366
+ let artifacts = [];
367
+ try {
368
+ const parsed = JSON.parse(result.stdout.trim());
369
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
370
+ throw new Error('provider stdout must be a JSON object');
371
+ usage = parsed.usage && typeof parsed.usage === 'object' && !Array.isArray(parsed.usage) ? parsed.usage : null;
372
+ grading = result.gradingEvidenceAccepted ? gradingOf(parsed.grading) : null;
373
+ if (!result.gradingEvidenceAccepted && parsed.grading !== undefined) {
374
+ executionLimitations.push(`Run ${caseId}/${configuration.id}/${runIndex}: provider grading was not accepted because descendant cleanup is not guaranteed.`);
375
+ }
376
+ artifacts = await providerArtifacts(parsed, runDirectory, outputRoot);
377
+ if (artifacts.some((entry) => entry.role === 'grading'))
378
+ throw new Error('provider artifacts must not declare the runner-owned grading role');
379
+ if (grading) {
380
+ const gradingPath = path.join(runDirectory, 'grading.json');
381
+ const gradingBytes = Buffer.from(`${JSON.stringify(grading, null, 2)}\n`);
382
+ let gradingDigest;
383
+ try {
384
+ gradingDigest = await writeRunnerOwnedEvidence(base, outputRoot, runDirectory, gradingPath, 'grading artifact', gradingBytes);
385
+ }
386
+ catch (error) {
387
+ throw new RunnerOwnedOutputError(`Cannot commit runner-owned grading evidence: ${error.message}`);
388
+ }
389
+ artifacts.push({
390
+ role: 'grading',
391
+ path: toPosixRelative(outputRoot, gradingPath),
392
+ digest: gradingDigest,
393
+ });
394
+ }
395
+ }
396
+ catch (error) {
397
+ if (error instanceof RunnerOwnedOutputError)
398
+ throw error;
399
+ usage = null;
400
+ grading = null;
401
+ artifacts = [];
402
+ if (status === 'completed') {
403
+ status = 'error';
404
+ stderr += `${stderr ? '\n' : ''}Provider JSON/artifact error: ${error.message}`;
405
+ }
406
+ }
407
+ const stdoutPath = path.join(runDirectory, 'stdout.txt');
408
+ const stderrPath = path.join(runDirectory, 'stderr.txt');
409
+ let stdoutDigest;
410
+ let stderrDigest;
411
+ try {
412
+ stdoutDigest = await writeRunnerOwnedEvidence(base, outputRoot, runDirectory, stdoutPath, 'stdout evidence', Buffer.from(result.stdout));
413
+ stderrDigest = await writeRunnerOwnedEvidence(base, outputRoot, runDirectory, stderrPath, 'stderr evidence', Buffer.from(stderr));
414
+ }
415
+ catch (error) {
416
+ throw new RunnerOwnedOutputError(`Cannot commit runner-owned process evidence: ${error.message}`);
417
+ }
418
+ return { run: {
419
+ caseId,
420
+ configuration: configuration.id,
421
+ comparisonId: configuration.comparisonId,
422
+ skillMode: configuration.skillMode,
423
+ skillDigest: skillSource.digest,
424
+ runIndex,
425
+ status,
426
+ exitCode: result.exitCode,
427
+ durationMs: Date.now() - started,
428
+ stdoutPath: toPosixRelative(outputRoot, stdoutPath),
429
+ stdoutDigest,
430
+ stderrPath: toPosixRelative(outputRoot, stderrPath),
431
+ stderrDigest,
432
+ usage,
433
+ grading: grading,
434
+ artifacts,
435
+ }, cleanupFailed };
436
+ }
437
+ export async function runExecutionPlan(planPath, options = {}) {
438
+ const validation = await captureAndValidateExecutionPlan(planPath);
439
+ if (!validation.valid)
440
+ throw new Error(`AwSkillEvalExecutionPlan is invalid:\n${validation.errors.join('\n')}`);
441
+ if (!validation.captured)
442
+ throw new Error('AwSkillEvalExecutionPlan capture is unavailable');
443
+ const captured = validation.captured;
444
+ const { plan, base, outputRoot } = captured;
445
+ const planRaw = captured.planFile.raw;
446
+ const sources = new Map();
447
+ for (const configuration of plan.configurations) {
448
+ const skill = captured.skills.get(configuration.id);
449
+ if (skill === undefined)
450
+ throw new Error(`Missing captured Skill source for ${configuration.id}`);
451
+ sources.set(configuration.id, { captured: skill, digest: skill?.digest ?? null });
452
+ }
453
+ const boundSkills = new Map([...captured.boundSkills].map(([id, skill]) => [id, { captured: skill, digest: skill.digest }]));
454
+ const capabilities = captured.capabilities;
455
+ const runtimeCapabilities = getRuntimeCapabilities();
456
+ const boundFiles = [
457
+ captured.planFile,
458
+ ...captured.caseFiles,
459
+ captured.capabilitiesFile,
460
+ ];
461
+ assertBoundInputsOutsideOutputRoot(outputRoot, boundFiles, boundSkills);
462
+ await assertBoundInputsUnchanged(boundFiles, boundSkills);
463
+ const cases = new Map();
464
+ for (const evalCase of captured.cases)
465
+ cases.set(String(evalCase.id), evalCase);
466
+ const processExecution = await resolveProcessExecutionContext(plan, options);
467
+ try {
468
+ await prepareOutputRoot(base, outputRoot);
469
+ }
470
+ catch (error) {
471
+ throw new Error(`Cannot safely clear a prior EvalRunBundle because outputRoot is not trustworthy: ${error.message}`, { cause: error });
472
+ }
473
+ const runs = [];
474
+ const executionLimitations = [];
475
+ let executionCleanupFailed = false;
476
+ execution: for (const evalCase of cases.values()) {
477
+ for (const configuration of plan.configurations) {
478
+ const skillSource = sources.get(configuration.id);
479
+ if (!skillSource)
480
+ throw new Error(`Missing Skill source for ${configuration.id}`);
481
+ for (let runIndex = 1; runIndex <= plan.runsPerCase; runIndex += 1) {
482
+ const result = await runOne({
483
+ plan,
484
+ base,
485
+ skillSource,
486
+ evalCase,
487
+ configuration,
488
+ runIndex,
489
+ processExecution,
490
+ executionLimitations,
491
+ beforeRunDirectoryReset: async () => {
492
+ assertBoundInputsOutsideOutputRoot(outputRoot, boundFiles, boundSkills);
493
+ await assertBoundInputsUnchanged(boundFiles, boundSkills);
494
+ },
495
+ });
496
+ runs.push(result.run);
497
+ await assertBoundInputsUnchanged(boundFiles, boundSkills);
498
+ if (result.cleanupFailed) {
499
+ executionCleanupFailed = true;
500
+ executionLimitations.push(CLEANUP_FAILURE_LIMITATION);
501
+ break execution;
502
+ }
503
+ }
504
+ }
505
+ }
506
+ await assertBoundInputsUnchanged(boundFiles, boundSkills);
507
+ await assertSafeOutputPath(base, outputRoot);
508
+ const comparisons = comparisonAggregate(runs);
509
+ const evidenceLevel = comparisons.some((entry) => entry.comparable) ? 'comparative' : 'executed';
510
+ const minimumEvidenceLevel = plan.minimumEvidenceLevel ?? 'executed';
511
+ const plannedComparisons = cases.size * new Set(plan.configurations.flatMap((entry) => entry.comparisonId === null ? [] : [entry.comparisonId])).size * plan.runsPerCase;
512
+ const comparableComparisons = comparisons.filter((entry) => entry.comparable).length;
513
+ const requirementsMet = !executionCleanupFailed && (minimumEvidenceLevel === 'executed' || (plannedComparisons > 0 && comparableComparisons === plannedComparisons));
514
+ const limitations = [...capabilities.limitations];
515
+ limitations.push(...executionLimitations);
516
+ if (processExecution.limitation)
517
+ limitations.push(processExecution.limitation);
518
+ if (!capabilities.capabilities.cleanContext)
519
+ limitations.push('Provider does not prove a clean model context.');
520
+ if (!capabilities.capabilities.toolTrace)
521
+ limitations.push('Provider does not capture a tool trace.');
522
+ if (!capabilities.capabilities.tokenUsage)
523
+ limitations.push('Provider does not capture token usage.');
524
+ limitations.push('A completed provider process is not an Eval pass; grading and Skill-defect attribution remain separate.');
525
+ for (const comparison of comparisons) {
526
+ if (comparison.comparable)
527
+ continue;
528
+ const identity = `${comparison.comparisonId}/${comparison.caseId}/${comparison.runIndex}`;
529
+ limitations.push(comparison.paired
530
+ ? `Planned comparison ${identity} has no comparable grading.`
531
+ : `Planned comparison ${identity} has no completed with-skill and baseline pair.`);
532
+ }
533
+ const bundle = {
534
+ schemaVersion: 3,
535
+ runner: { id: 'aw-skill-eval', version: runtimeCapabilities.providerVersion },
536
+ independentContext: capabilities.capabilities.cleanContext === true,
537
+ provider: { id: plan.provider.id, version: capabilities.providerVersion },
538
+ planDigest: sha256(planRaw),
539
+ targetSkillDigest: plan.target.digest,
540
+ caseCorpusDigest: plan.cases.corpusDigest,
541
+ comparisonPlanned: comparisons.length > 0,
542
+ evidenceLevel,
543
+ evidenceRequirement: {
544
+ minimumEvidenceLevel,
545
+ plannedComparisons,
546
+ comparableComparisons,
547
+ satisfied: requirementsMet,
548
+ },
549
+ processManagement: {
550
+ mode: executionCleanupFailed ? 'observed' : processExecution.containment,
551
+ descendantCleanupGuaranteed: !executionCleanupFailed && processExecution.containment === 'managed',
552
+ ...(executionCleanupFailed
553
+ ? { limitation: CLEANUP_FAILURE_LIMITATION }
554
+ : processExecution.limitation
555
+ ? { limitation: processExecution.limitation }
556
+ : {}),
557
+ },
558
+ runs,
559
+ aggregate: {
560
+ cases: new Set(runs.map((entry) => entry.caseId)).size,
561
+ configurations: new Set(runs.map((entry) => entry.configuration)).size,
562
+ runs: runs.length,
563
+ completed: runs.filter((entry) => entry.status === 'completed').length,
564
+ processFailed: runs.filter((entry) => entry.status === 'process-failed' || entry.status === 'error').length,
565
+ timedOut: runs.filter((entry) => entry.status === 'timeout').length,
566
+ comparisons,
567
+ },
568
+ limitations: [...new Set(limitations)],
569
+ };
570
+ const bundlePath = path.join(outputRoot, 'eval-run-bundle.json');
571
+ const bundleBytes = Buffer.from(`${JSON.stringify(bundle, null, 2)}\n`);
572
+ const bundleDigest = sha256(bundleBytes);
573
+ const bundleTemp = await createRunnerOwnedTemp(base, outputRoot, outputRoot, 'eval-run-bundle', bundleBytes);
574
+ try {
575
+ await options.beforeBundleCommit?.();
576
+ await commitRunnerOwnedFile(base, outputRoot, outputRoot, bundleTemp, bundlePath, 'EvalRunBundle', bundleDigest, async () => {
577
+ await assertBoundInputsUnchanged(boundFiles, boundSkills);
578
+ await assertSafeOutputPath(base, outputRoot);
579
+ });
580
+ const bundleValidation = await validateRunBundle(bundlePath);
581
+ if (!bundleValidation.valid || bundleValidation.calculated?.bundleDigest !== bundleDigest) {
582
+ throw new Error(`Generated EvalRunBundle is invalid:\n${bundleValidation.errors.join('\n')}`);
583
+ }
584
+ return { valid: true, bundlePath, bundleDigest, evidenceLevel, requirementsMet };
585
+ }
586
+ catch (error) {
587
+ await unlink(bundleTemp).catch(() => undefined);
588
+ await unlink(bundlePath).catch(() => undefined);
589
+ throw error;
590
+ }
591
+ }
592
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Digest, RuntimeSkillSnapshot } from './types.js';
2
+ export interface CapturedRuntimeSkillFile {
3
+ relativePath: string;
4
+ mode: '100644' | '100755';
5
+ bytes: Buffer;
6
+ }
7
+ export interface CapturedRuntimeSkill {
8
+ sourceRoot: string;
9
+ digest: Digest;
10
+ files: CapturedRuntimeSkillFile[];
11
+ }
12
+ export interface RuntimeSkillDigestOptions {
13
+ platform?: NodeJS.Platform;
14
+ }
15
+ export declare function computeSkillDigest(skillPath: string, options?: RuntimeSkillDigestOptions): Promise<Digest>;
16
+ export declare function captureRuntimeSkill(skillPath: string, options?: RuntimeSkillDigestOptions): Promise<CapturedRuntimeSkill>;
17
+ export declare function materializeCapturedRuntimeSkill(captured: CapturedRuntimeSkill, destinationPath: string, options?: RuntimeSkillDigestOptions): Promise<RuntimeSkillSnapshot>;
18
+ export declare function createRuntimeSkillSnapshot(sourcePath: string, destinationPath: string, options?: RuntimeSkillDigestOptions): Promise<RuntimeSkillSnapshot>;