@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.
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +80 -0
- package/dist/bin.js.map +1 -0
- package/dist/bundle.d.ts +93 -0
- package/dist/bundle.js +216 -0
- package/dist/bundle.js.map +1 -0
- package/dist/capabilities.d.ts +2 -0
- package/dist/capabilities.js +38 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/common.d.ts +8 -0
- package/dist/common.js +22 -0
- package/dist/common.js.map +1 -0
- package/dist/corpus-digest.d.ts +3 -0
- package/dist/corpus-digest.js +19 -0
- package/dist/corpus-digest.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/json-schema.d.ts +3 -0
- package/dist/json-schema.js +70 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/output-path.d.ts +1 -0
- package/dist/output-path.js +34 -0
- package/dist/output-path.js.map +1 -0
- package/dist/plan.d.ts +79 -0
- package/dist/plan.js +285 -0
- package/dist/plan.js.map +1 -0
- package/dist/process-tree.d.ts +25 -0
- package/dist/process-tree.js +385 -0
- package/dist/process-tree.js.map +1 -0
- package/dist/process.d.ts +14 -0
- package/dist/process.js +301 -0
- package/dist/process.js.map +1 -0
- package/dist/run.d.ts +2 -0
- package/dist/run.js +592 -0
- package/dist/run.js.map +1 -0
- package/dist/runtime-skill.d.ts +18 -0
- package/dist/runtime-skill.js +135 -0
- package/dist/runtime-skill.js.map +1 -0
- package/dist/schemas/aw-skill-eval-execution-plan.schema.json +220 -0
- package/dist/schemas/digests.json +5 -0
- package/dist/schemas/eval-run-bundle.schema.json +408 -0
- package/dist/schemas/eval-runtime-capabilities.schema.json +85 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +27 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +34 -0
package/dist/bin.d.ts
ADDED
package/dist/bin.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
import { computeSkillDigest, getRuntimeCapabilities, getSchema, runExecutionPlan, validateExecutionPlan, validateRunBundle, } from './index.js';
|
|
5
|
+
import { isSchemaName } from './schemas.js';
|
|
6
|
+
const help = `Usage: aw-skill-eval <command>
|
|
7
|
+
|
|
8
|
+
Commands:
|
|
9
|
+
capabilities --json
|
|
10
|
+
schema print <aw-skill-eval-execution-plan|eval-run-bundle>
|
|
11
|
+
plan validate <plan.json>
|
|
12
|
+
run <plan.json>
|
|
13
|
+
bundle validate <bundle.json>
|
|
14
|
+
digest skill <skill-dir>
|
|
15
|
+
`;
|
|
16
|
+
function requirePath(value, usage) {
|
|
17
|
+
if (!value)
|
|
18
|
+
throw new Error(usage);
|
|
19
|
+
return path.resolve(value);
|
|
20
|
+
}
|
|
21
|
+
async function main(argv) {
|
|
22
|
+
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
23
|
+
process.stdout.write(help);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const [command, action, value, ...extra] = argv;
|
|
27
|
+
if (extra.length > 0)
|
|
28
|
+
throw new Error('Too many arguments. Use --help for usage.');
|
|
29
|
+
if (command === 'capabilities') {
|
|
30
|
+
if (action !== '--json' || value !== undefined)
|
|
31
|
+
throw new Error('Usage: aw-skill-eval capabilities --json');
|
|
32
|
+
process.stdout.write(`${JSON.stringify(getRuntimeCapabilities(), null, 2)}\n`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (command === 'schema') {
|
|
36
|
+
if (action !== 'print' || !value || !isSchemaName(value) || value === 'eval-runtime-capabilities')
|
|
37
|
+
throw new Error('Usage: aw-skill-eval schema print <aw-skill-eval-execution-plan|eval-run-bundle>');
|
|
38
|
+
process.stdout.write(`${JSON.stringify(await getSchema(value), null, 2)}\n`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (command === 'plan') {
|
|
42
|
+
if (action !== 'validate')
|
|
43
|
+
throw new Error('Usage: aw-skill-eval plan validate <plan.json>');
|
|
44
|
+
const result = await validateExecutionPlan(requirePath(value, 'Usage: aw-skill-eval plan validate <plan.json>'));
|
|
45
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
46
|
+
if (!result.valid)
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (command === 'run') {
|
|
51
|
+
if (value !== undefined)
|
|
52
|
+
throw new Error('Usage: aw-skill-eval run <plan.json>');
|
|
53
|
+
const result = await runExecutionPlan(requirePath(action, 'Usage: aw-skill-eval run <plan.json>'));
|
|
54
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
55
|
+
if (!result.requirementsMet)
|
|
56
|
+
process.exitCode = 1;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (command === 'bundle') {
|
|
60
|
+
if (action !== 'validate')
|
|
61
|
+
throw new Error('Usage: aw-skill-eval bundle validate <bundle.json>');
|
|
62
|
+
const result = await validateRunBundle(requirePath(value, 'Usage: aw-skill-eval bundle validate <bundle.json>'));
|
|
63
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
64
|
+
if (!result.valid)
|
|
65
|
+
process.exitCode = 1;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (command === 'digest') {
|
|
69
|
+
if (action !== 'skill')
|
|
70
|
+
throw new Error('Usage: aw-skill-eval digest skill <skill-dir>');
|
|
71
|
+
process.stdout.write(`${await computeSkillDigest(requirePath(value, 'Usage: aw-skill-eval digest skill <skill-dir>'))}\n`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`Unknown command: ${command}. Use --help for usage.`);
|
|
75
|
+
}
|
|
76
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
77
|
+
process.stderr.write(`[ERROR] ${error.message}\n`);
|
|
78
|
+
process.exitCode = 1;
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/bundle.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Digest, ValidationResult } from './types.js';
|
|
2
|
+
export interface EvalArtifact {
|
|
3
|
+
role: 'trace' | 'report' | 'output' | 'grading' | 'other';
|
|
4
|
+
path: string;
|
|
5
|
+
digest: Digest;
|
|
6
|
+
}
|
|
7
|
+
export interface EvalGrading {
|
|
8
|
+
grader: {
|
|
9
|
+
id: string;
|
|
10
|
+
version: string;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
result: Record<string, unknown>;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface EvalRun {
|
|
17
|
+
caseId: string;
|
|
18
|
+
configuration: string;
|
|
19
|
+
comparisonId: string | null;
|
|
20
|
+
skillMode: 'with-skill' | 'without-skill' | 'previous-version';
|
|
21
|
+
skillDigest: Digest | null;
|
|
22
|
+
runIndex: number;
|
|
23
|
+
status: 'completed' | 'process-failed' | 'timeout' | 'error';
|
|
24
|
+
exitCode: number | null;
|
|
25
|
+
durationMs: number;
|
|
26
|
+
stdoutPath: string;
|
|
27
|
+
stdoutDigest: Digest;
|
|
28
|
+
stderrPath: string;
|
|
29
|
+
stderrDigest: Digest;
|
|
30
|
+
usage: Record<string, unknown> | null;
|
|
31
|
+
grading: EvalGrading | null;
|
|
32
|
+
artifacts: EvalArtifact[];
|
|
33
|
+
}
|
|
34
|
+
export interface ComparisonAggregate {
|
|
35
|
+
comparisonId: string;
|
|
36
|
+
caseId: string;
|
|
37
|
+
runIndex: number;
|
|
38
|
+
paired: boolean;
|
|
39
|
+
comparable: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface EvalRunBundle {
|
|
42
|
+
schemaVersion: 3;
|
|
43
|
+
runner: {
|
|
44
|
+
id: string;
|
|
45
|
+
version: string;
|
|
46
|
+
};
|
|
47
|
+
independentContext: boolean;
|
|
48
|
+
provider: {
|
|
49
|
+
id: string;
|
|
50
|
+
version: string;
|
|
51
|
+
};
|
|
52
|
+
planDigest: Digest;
|
|
53
|
+
targetSkillDigest: Digest;
|
|
54
|
+
caseCorpusDigest: Digest;
|
|
55
|
+
comparisonPlanned: boolean;
|
|
56
|
+
evidenceLevel: 'executed' | 'comparative';
|
|
57
|
+
evidenceRequirement?: {
|
|
58
|
+
minimumEvidenceLevel: 'executed' | 'comparative';
|
|
59
|
+
plannedComparisons: number;
|
|
60
|
+
comparableComparisons: number;
|
|
61
|
+
satisfied: boolean;
|
|
62
|
+
};
|
|
63
|
+
processManagement?: {
|
|
64
|
+
mode: 'managed' | 'verified-observed' | 'observed';
|
|
65
|
+
descendantCleanupGuaranteed: boolean;
|
|
66
|
+
limitation?: string;
|
|
67
|
+
};
|
|
68
|
+
runs: EvalRun[];
|
|
69
|
+
aggregate: {
|
|
70
|
+
cases: number;
|
|
71
|
+
configurations: number;
|
|
72
|
+
runs: number;
|
|
73
|
+
completed: number;
|
|
74
|
+
processFailed: number;
|
|
75
|
+
timedOut: number;
|
|
76
|
+
comparisons: ComparisonAggregate[];
|
|
77
|
+
};
|
|
78
|
+
limitations: string[];
|
|
79
|
+
}
|
|
80
|
+
export interface BundleCalculated {
|
|
81
|
+
bundleDigest: Digest;
|
|
82
|
+
cases?: number;
|
|
83
|
+
configurations?: number;
|
|
84
|
+
runs?: number;
|
|
85
|
+
completed?: number;
|
|
86
|
+
processFailed?: number;
|
|
87
|
+
timedOut?: number;
|
|
88
|
+
comparisons?: ComparisonAggregate[];
|
|
89
|
+
}
|
|
90
|
+
export declare function comparisonAggregate(runs: EvalRun[], gradingBoundRuns?: Set<string>): ComparisonAggregate[];
|
|
91
|
+
export declare function validateRunBundle(bundlePath: string, options?: {
|
|
92
|
+
evidenceRoot?: string;
|
|
93
|
+
}): Promise<ValidationResult<BundleCalculated>>;
|
package/dist/bundle.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { lstat, readFile, realpath } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isPathInside, sha256, stable } from './common.js';
|
|
4
|
+
import { validateJsonSchema } from './json-schema.js';
|
|
5
|
+
import { getSchema } from './schemas.js';
|
|
6
|
+
function identity(values) {
|
|
7
|
+
return JSON.stringify(values);
|
|
8
|
+
}
|
|
9
|
+
function graderIdentity(run) {
|
|
10
|
+
return run.grading ? identity([run.grading.grader.id, run.grading.grader.version]) : null;
|
|
11
|
+
}
|
|
12
|
+
function runIdentity(run) {
|
|
13
|
+
return identity([run.caseId, run.configuration, run.runIndex]);
|
|
14
|
+
}
|
|
15
|
+
export function comparisonAggregate(runs, gradingBoundRuns = new Set(runs
|
|
16
|
+
.filter((run) => run.grading !== null && run.artifacts.filter((entry) => entry.role === 'grading').length === 1)
|
|
17
|
+
.map(runIdentity))) {
|
|
18
|
+
const groups = new Map();
|
|
19
|
+
for (const run of runs) {
|
|
20
|
+
if (run.comparisonId === null)
|
|
21
|
+
continue;
|
|
22
|
+
const key = identity([run.comparisonId, run.caseId, run.runIndex]);
|
|
23
|
+
const group = groups.get(key) ?? {
|
|
24
|
+
comparisonId: run.comparisonId,
|
|
25
|
+
caseId: run.caseId,
|
|
26
|
+
runIndex: run.runIndex,
|
|
27
|
+
runs: [],
|
|
28
|
+
};
|
|
29
|
+
group.runs.push(run);
|
|
30
|
+
groups.set(key, group);
|
|
31
|
+
}
|
|
32
|
+
return [...groups.values()].map((group) => {
|
|
33
|
+
const withSkill = group.runs.filter((run) => run.skillMode === 'with-skill' && run.status === 'completed');
|
|
34
|
+
const baselines = group.runs.filter((run) => run.skillMode !== 'with-skill' && run.status === 'completed');
|
|
35
|
+
const paired = withSkill.length > 0 && baselines.length > 0;
|
|
36
|
+
const comparable = paired && withSkill.some((current) => {
|
|
37
|
+
if (!gradingBoundRuns.has(runIdentity(current)))
|
|
38
|
+
return false;
|
|
39
|
+
const currentGrader = graderIdentity(current);
|
|
40
|
+
return currentGrader !== null && baselines.some((baseline) => gradingBoundRuns.has(runIdentity(baseline)) && graderIdentity(baseline) === currentGrader);
|
|
41
|
+
});
|
|
42
|
+
return { comparisonId: group.comparisonId, caseId: group.caseId, runIndex: group.runIndex, paired, comparable };
|
|
43
|
+
}).sort((left, right) => identity([left.comparisonId, left.caseId, left.runIndex])
|
|
44
|
+
.localeCompare(identity([right.comparisonId, right.caseId, right.runIndex])));
|
|
45
|
+
}
|
|
46
|
+
function isCanonicalEvidencePath(value) {
|
|
47
|
+
if (!value || value.includes('\\') || path.posix.isAbsolute(value) || path.win32.isAbsolute(value))
|
|
48
|
+
return false;
|
|
49
|
+
return value.split('/').every((segment) => segment && segment !== '.' && segment !== '..');
|
|
50
|
+
}
|
|
51
|
+
async function evidenceErrors(root, value, digest, label) {
|
|
52
|
+
if (!isCanonicalEvidencePath(value))
|
|
53
|
+
return [`${label} must be a canonical POSIX relative file path`];
|
|
54
|
+
const candidate = path.resolve(root, value);
|
|
55
|
+
if (!isPathInside(root, candidate))
|
|
56
|
+
return [`${label} leaves the evidence root`];
|
|
57
|
+
try {
|
|
58
|
+
const info = await lstat(candidate);
|
|
59
|
+
if (info.isSymbolicLink())
|
|
60
|
+
return [`${label} must not be a symlink`];
|
|
61
|
+
if (!info.isFile())
|
|
62
|
+
return [`${label} must be a regular file`];
|
|
63
|
+
const actual = await realpath(candidate);
|
|
64
|
+
if (!isPathInside(root, actual))
|
|
65
|
+
return [`${label} leaves the evidence root`];
|
|
66
|
+
return sha256(await readFile(actual)) === digest ? [] : [`${label} digest does not match file content`];
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return [`${label} does not resolve to a regular evidence file`];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function gradingBindingErrors(root, run, index) {
|
|
73
|
+
const artifacts = run.artifacts.filter((entry) => entry.role === 'grading');
|
|
74
|
+
if (run.grading === null) {
|
|
75
|
+
return artifacts.length === 0
|
|
76
|
+
? { errors: [], bound: false }
|
|
77
|
+
: { errors: [`runs[${index}] must not have a grading artifact when grading is null`], bound: false };
|
|
78
|
+
}
|
|
79
|
+
if (artifacts.length !== 1)
|
|
80
|
+
return { errors: [`runs[${index}] grading requires exactly one grading artifact`], bound: false };
|
|
81
|
+
const artifact = artifacts[0];
|
|
82
|
+
if (!isCanonicalEvidencePath(artifact.path))
|
|
83
|
+
return { errors: [], bound: false };
|
|
84
|
+
try {
|
|
85
|
+
const candidate = path.resolve(root, artifact.path);
|
|
86
|
+
if (!isPathInside(root, candidate))
|
|
87
|
+
return { errors: [], bound: false };
|
|
88
|
+
const info = await lstat(candidate);
|
|
89
|
+
if (info.isSymbolicLink() || !info.isFile())
|
|
90
|
+
return { errors: [], bound: false };
|
|
91
|
+
const actual = await realpath(candidate);
|
|
92
|
+
if (!isPathInside(root, actual))
|
|
93
|
+
return { errors: [], bound: false };
|
|
94
|
+
const bytes = await readFile(actual);
|
|
95
|
+
if (sha256(bytes) !== artifact.digest)
|
|
96
|
+
return { errors: [], bound: false };
|
|
97
|
+
const parsed = JSON.parse(bytes.toString('utf8'));
|
|
98
|
+
if (stable(parsed) !== stable(run.grading)) {
|
|
99
|
+
return { errors: [`runs[${index}] grading artifact does not match run.grading`], bound: false };
|
|
100
|
+
}
|
|
101
|
+
return { errors: [], bound: true };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof SyntaxError) {
|
|
105
|
+
return { errors: [`runs[${index}] grading artifact must contain JSON`], bound: false };
|
|
106
|
+
}
|
|
107
|
+
return { errors: [], bound: false };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export async function validateRunBundle(bundlePath, options = {}) {
|
|
111
|
+
let bundle;
|
|
112
|
+
const errors = [];
|
|
113
|
+
let raw;
|
|
114
|
+
try {
|
|
115
|
+
raw = await readFile(bundlePath);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return { valid: false, errors: [`bundle is unavailable or invalid: ${error.message}`], calculated: null };
|
|
119
|
+
}
|
|
120
|
+
const digestCalculated = { bundleDigest: sha256(raw) };
|
|
121
|
+
try {
|
|
122
|
+
const value = JSON.parse(raw.toString('utf8'));
|
|
123
|
+
errors.push(...validateJsonSchema(await getSchema('eval-run-bundle'), value));
|
|
124
|
+
if (errors.length > 0)
|
|
125
|
+
return { valid: false, errors, calculated: digestCalculated };
|
|
126
|
+
bundle = value;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
return { valid: false, errors: [`bundle is unavailable or invalid: ${error.message}`], calculated: digestCalculated };
|
|
130
|
+
}
|
|
131
|
+
const root = await realpath(options.evidenceRoot ?? path.dirname(path.resolve(bundlePath)));
|
|
132
|
+
const runIdentities = new Set();
|
|
133
|
+
const gradingBoundRuns = new Set();
|
|
134
|
+
for (let index = 0; index < bundle.runs.length; index += 1) {
|
|
135
|
+
const run = bundle.runs[index];
|
|
136
|
+
const key = identity([run.caseId, run.configuration, run.runIndex]);
|
|
137
|
+
if (runIdentities.has(key))
|
|
138
|
+
errors.push(`duplicate run identity ${key}`);
|
|
139
|
+
runIdentities.add(key);
|
|
140
|
+
if (run.skillMode === 'with-skill' && run.skillDigest !== bundle.targetSkillDigest)
|
|
141
|
+
errors.push(`with-skill run ${key} must use targetSkillDigest`);
|
|
142
|
+
if (run.skillMode === 'without-skill' && run.skillDigest !== null)
|
|
143
|
+
errors.push(`without-skill run ${key} must use skillDigest=null`);
|
|
144
|
+
if (run.skillMode === 'previous-version' && run.skillDigest === null)
|
|
145
|
+
errors.push(`previous-version run ${key} must use a Skill digest`);
|
|
146
|
+
errors.push(...await evidenceErrors(root, run.stdoutPath, run.stdoutDigest, `runs[${index}].stdoutPath`), ...await evidenceErrors(root, run.stderrPath, run.stderrDigest, `runs[${index}].stderrPath`));
|
|
147
|
+
for (let artifactIndex = 0; artifactIndex < run.artifacts.length; artifactIndex += 1) {
|
|
148
|
+
const artifact = run.artifacts[artifactIndex];
|
|
149
|
+
errors.push(...await evidenceErrors(root, artifact.path, artifact.digest, `runs[${index}].artifacts[${artifactIndex}].path`));
|
|
150
|
+
}
|
|
151
|
+
const gradingBinding = await gradingBindingErrors(root, run, index);
|
|
152
|
+
errors.push(...gradingBinding.errors);
|
|
153
|
+
if (gradingBinding.bound)
|
|
154
|
+
gradingBoundRuns.add(runIdentity(run));
|
|
155
|
+
}
|
|
156
|
+
const comparisons = comparisonAggregate(bundle.runs, gradingBoundRuns);
|
|
157
|
+
const calculated = {
|
|
158
|
+
bundleDigest: digestCalculated.bundleDigest,
|
|
159
|
+
cases: new Set(bundle.runs.map((run) => run.caseId)).size,
|
|
160
|
+
configurations: new Set(bundle.runs.map((run) => run.configuration)).size,
|
|
161
|
+
runs: bundle.runs.length,
|
|
162
|
+
completed: bundle.runs.filter((run) => run.status === 'completed').length,
|
|
163
|
+
processFailed: bundle.runs.filter((run) => run.status === 'process-failed' || run.status === 'error').length,
|
|
164
|
+
timedOut: bundle.runs.filter((run) => run.status === 'timeout').length,
|
|
165
|
+
comparisons,
|
|
166
|
+
};
|
|
167
|
+
for (const name of ['cases', 'configurations', 'runs', 'completed', 'processFailed', 'timedOut'])
|
|
168
|
+
if (bundle.aggregate[name] !== calculated[name])
|
|
169
|
+
errors.push(`aggregate.${name} does not match runs`);
|
|
170
|
+
const actualComparisons = [...bundle.aggregate.comparisons].sort((left, right) => identity([left.comparisonId, left.caseId, left.runIndex]).localeCompare(identity([right.comparisonId, right.caseId, right.runIndex])));
|
|
171
|
+
if (JSON.stringify(actualComparisons) !== JSON.stringify(comparisons))
|
|
172
|
+
errors.push('aggregate.comparisons does not match runs');
|
|
173
|
+
const comparisonPlanned = comparisons.length > 0;
|
|
174
|
+
if (bundle.comparisonPlanned !== comparisonPlanned)
|
|
175
|
+
errors.push('comparisonPlanned does not match run comparison identities');
|
|
176
|
+
const evidenceLevel = comparisons.some((entry) => entry.comparable) ? 'comparative' : 'executed';
|
|
177
|
+
if (bundle.evidenceLevel !== evidenceLevel)
|
|
178
|
+
errors.push(`evidenceLevel must be ${evidenceLevel} for the supplied runs`);
|
|
179
|
+
if (bundle.evidenceRequirement) {
|
|
180
|
+
const comparableComparisons = comparisons.filter((entry) => entry.comparable).length;
|
|
181
|
+
if (bundle.evidenceRequirement.comparableComparisons !== comparableComparisons)
|
|
182
|
+
errors.push('evidenceRequirement.comparableComparisons does not match aggregate comparisons');
|
|
183
|
+
if (bundle.evidenceRequirement.plannedComparisons < comparisons.length)
|
|
184
|
+
errors.push('evidenceRequirement.plannedComparisons is smaller than aggregate comparisons');
|
|
185
|
+
const comparisonCoverageSatisfied = bundle.evidenceRequirement.minimumEvidenceLevel === 'executed' || (bundle.evidenceRequirement.plannedComparisons > 0 &&
|
|
186
|
+
comparableComparisons === bundle.evidenceRequirement.plannedComparisons);
|
|
187
|
+
if (bundle.evidenceRequirement.satisfied && !comparisonCoverageSatisfied)
|
|
188
|
+
errors.push('evidenceRequirement.satisfied cannot be true without required comparison coverage');
|
|
189
|
+
}
|
|
190
|
+
if (bundle.processManagement?.mode === 'managed' &&
|
|
191
|
+
bundle.processManagement.descendantCleanupGuaranteed !== true)
|
|
192
|
+
errors.push('managed processManagement must guarantee descendant cleanup');
|
|
193
|
+
if (bundle.processManagement &&
|
|
194
|
+
bundle.processManagement.mode !== 'managed' &&
|
|
195
|
+
bundle.processManagement.descendantCleanupGuaranteed !== false)
|
|
196
|
+
errors.push('observed processManagement must not guarantee descendant cleanup');
|
|
197
|
+
if (bundle.processManagement &&
|
|
198
|
+
bundle.processManagement.mode !== 'managed' &&
|
|
199
|
+
!bundle.processManagement.limitation)
|
|
200
|
+
errors.push('observed processManagement requires a limitation');
|
|
201
|
+
if (bundle.processManagement?.limitation &&
|
|
202
|
+
!bundle.limitations.includes(bundle.processManagement.limitation))
|
|
203
|
+
errors.push('processManagement limitation must be preserved in limitations');
|
|
204
|
+
if (bundle.evidenceLevel === 'comparative' &&
|
|
205
|
+
bundle.evidenceRequirement?.satisfied !== false &&
|
|
206
|
+
bundle.processManagement?.mode === 'observed')
|
|
207
|
+
errors.push('accepted comparative evidence requires managed or verified-observed process management');
|
|
208
|
+
if (bundle.evidenceLevel === 'comparative' &&
|
|
209
|
+
bundle.evidenceRequirement?.satisfied === true &&
|
|
210
|
+
bundle.processManagement === undefined)
|
|
211
|
+
errors.push('accepted comparative evidence requires processManagement evidence');
|
|
212
|
+
if (comparisons.some((entry) => !entry.comparable) && bundle.limitations.length === 0)
|
|
213
|
+
errors.push('non-comparable planned comparisons require a limitation');
|
|
214
|
+
return { valid: errors.length === 0, errors, calculated };
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
export function getRuntimeCapabilities(platform = process.platform) {
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const packageJson = require('../package.json');
|
|
6
|
+
const processObservationAvailable = platform === 'darwin' || platform === 'linux' || platform === 'win32';
|
|
7
|
+
return {
|
|
8
|
+
schemaVersion: 1,
|
|
9
|
+
provider: 'aw-skill-eval-process',
|
|
10
|
+
providerVersion: packageJson.version,
|
|
11
|
+
capabilities: {
|
|
12
|
+
triggerDiscovery: false,
|
|
13
|
+
skillPathExecution: processObservationAvailable,
|
|
14
|
+
previousVersionBaseline: processObservationAvailable,
|
|
15
|
+
withoutSkillBaseline: processObservationAvailable,
|
|
16
|
+
cleanContext: false,
|
|
17
|
+
parallelRuns: false,
|
|
18
|
+
toolTrace: false,
|
|
19
|
+
tokenUsage: true,
|
|
20
|
+
duration: true,
|
|
21
|
+
sandbox: false,
|
|
22
|
+
materialization: true,
|
|
23
|
+
},
|
|
24
|
+
limitations: [
|
|
25
|
+
'The process provider does not prove a clean model context.',
|
|
26
|
+
'The process provider does not supply a tool trace or sandbox.',
|
|
27
|
+
...(processObservationAvailable
|
|
28
|
+
? [
|
|
29
|
+
`Standalone ${platform} execution uses process observation and before/after Skill digests; it does not guarantee descendant cleanup.`,
|
|
30
|
+
...(platform === 'darwin' || platform === 'linux'
|
|
31
|
+
? ['Comparative evidence requires Full Access verified process observation or confirmed external containment.']
|
|
32
|
+
: ['Comparative evidence is disabled without confirmed external containment.']),
|
|
33
|
+
]
|
|
34
|
+
: [`Standalone ${platform} execution is disabled because process observation is unavailable.`]),
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,OAAO,MAAM,cAAc,CAAA;AAGlC,MAAM,UAAU,sBAAsB,CAAC,WAA4B,OAAO,CAAC,QAAQ;IACjF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAA;IACrE,MAAM,2BAA2B,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO,CAAA;IACzG,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,uBAAuB;QACjC,eAAe,EAAE,WAAW,CAAC,OAAO;QACpC,YAAY,EAAE;YACZ,gBAAgB,EAAE,KAAK;YACvB,kBAAkB,EAAE,2BAA2B;YAC/C,uBAAuB,EAAE,2BAA2B;YACpD,oBAAoB,EAAE,2BAA2B;YACjD,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,KAAK;YACd,eAAe,EAAE,IAAI;SACtB;QACD,WAAW,EAAE;YACX,4DAA4D;YAC5D,+DAA+D;YAC/D,GAAG,CAAC,2BAA2B;gBAC7B,CAAC,CAAC;oBACE,cAAc,QAAQ,+GAA+G;oBACrI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO;wBAC/C,CAAC,CAAC,CAAC,2GAA2G,CAAC;wBAC/G,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC;iBAClF;gBACH,CAAC,CAAC,CAAC,cAAc,QAAQ,oEAAoE,CAAC,CAAC;SAClG;KACF,CAAA;AACH,CAAC"}
|
package/dist/common.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { canonicalJson } from './corpus-digest.js';
|
|
2
|
+
import type { Digest } from './types.js';
|
|
3
|
+
export declare function sha256(data: string | NodeJS.ArrayBufferView): Digest;
|
|
4
|
+
export declare function isPathInside(root: string, candidate: string): boolean;
|
|
5
|
+
export declare function pathsOverlap(left: string, right: string): boolean;
|
|
6
|
+
export declare function safeSegment(value: string): boolean;
|
|
7
|
+
export declare const stable: typeof canonicalJson;
|
|
8
|
+
export declare function toPosixRelative(root: string, candidate: string): string;
|
package/dist/common.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { canonicalJson } from './corpus-digest.js';
|
|
4
|
+
export function sha256(data) {
|
|
5
|
+
return `sha256:${createHash('sha256').update(data).digest('hex')}`;
|
|
6
|
+
}
|
|
7
|
+
export function isPathInside(root, candidate) {
|
|
8
|
+
const relative = path.relative(root, candidate);
|
|
9
|
+
return (relative === '' ||
|
|
10
|
+
(!path.isAbsolute(relative) && relative !== '..' && !relative.startsWith(`..${path.sep}`)));
|
|
11
|
+
}
|
|
12
|
+
export function pathsOverlap(left, right) {
|
|
13
|
+
return isPathInside(left, right) || isPathInside(right, left);
|
|
14
|
+
}
|
|
15
|
+
export function safeSegment(value) {
|
|
16
|
+
return /^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(value);
|
|
17
|
+
}
|
|
18
|
+
export const stable = canonicalJson;
|
|
19
|
+
export function toPosixRelative(root, candidate) {
|
|
20
|
+
return path.relative(root, candidate).split(path.sep).join('/');
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,MAAM,UAAU,MAAM,CAAC,IAAqC;IAC1D,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC/C,OAAO,CACL,QAAQ,KAAK,EAAE;QACf,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAC3F,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa;IACtD,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAA;AAEnC,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB;IAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
export function canonicalJson(value) {
|
|
4
|
+
if (Array.isArray(value))
|
|
5
|
+
return `[${value.map(canonicalJson).join(',')}]`;
|
|
6
|
+
if (value && typeof value === 'object') {
|
|
7
|
+
return `{${Object.keys(value)
|
|
8
|
+
.sort()
|
|
9
|
+
.map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)
|
|
10
|
+
.join(',')}}`;
|
|
11
|
+
}
|
|
12
|
+
return JSON.stringify(value);
|
|
13
|
+
}
|
|
14
|
+
export async function computeCaseCorpusDigest(casePaths) {
|
|
15
|
+
const documents = await Promise.all(casePaths.map(async (filePath) => canonicalJson(JSON.parse(await readFile(filePath, 'utf8')))));
|
|
16
|
+
documents.sort();
|
|
17
|
+
return `sha256:${createHash('sha256').update(documents.join('\n')).digest('hex')}`;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=corpus-digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus-digest.js","sourceRoot":"","sources":["../src/corpus-digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAG3C,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IAC1E,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aAC1B,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,aAAa,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aAChG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAAmB;IAC/D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAC/F,CAAA;IACD,SAAS,CAAC,IAAI,EAAE,CAAA;IAChB,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACpF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { validateExecutionPlan } from './plan.js';
|
|
2
|
+
export { canonicalJson, computeCaseCorpusDigest } from './corpus-digest.js';
|
|
3
|
+
export { getRuntimeCapabilities } from './capabilities.js';
|
|
4
|
+
export { runExecutionPlan } from './run.js';
|
|
5
|
+
export { validateRunBundle } from './bundle.js';
|
|
6
|
+
export { computeSkillDigest, createRuntimeSkillSnapshot } from './runtime-skill.js';
|
|
7
|
+
export type { RuntimeSkillDigestOptions } from './runtime-skill.js';
|
|
8
|
+
export { assertProviderProcessSupported, ProviderProcessCleanupError, runProviderProcess, } from './process.js';
|
|
9
|
+
export type { ProviderProcessDependencies } from './process.js';
|
|
10
|
+
export { assertProcessTreeInspectionAvailable, observeProcessTree, terminateProcessTree, } from './process-tree.js';
|
|
11
|
+
export { getSchema, getSchemaDigest, validateRuntimeCapabilities } from './schemas.js';
|
|
12
|
+
export { validateJsonSchema } from './json-schema.js';
|
|
13
|
+
export type { AwSkillEvalExecutionPlan, EvalCase, EvalConfiguration, PlanCalculated, } from './plan.js';
|
|
14
|
+
export type { BundleCalculated, ComparisonAggregate, EvalArtifact, EvalGrading, EvalRun, EvalRunBundle, } from './bundle.js';
|
|
15
|
+
export type { Digest, ExternalContainmentConfirmation, ProcessLifecycleHooks, ProcessRequest, ProcessResult, ProcessTreeCleanupConfirmation, ProcessTerminationReason, ProviderProcessHandle, RunExecutionPlanOptions, RunExecutionResult, RuntimeCapabilities, RuntimeSkillSnapshot, SchemaName, ValidationResult, } from './types.js';
|
|
16
|
+
export type { ProcessTreeDependencies, ProcessTreeObservation, ProcessTreeTerminationOptions, } from './process-tree.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { validateExecutionPlan } from './plan.js';
|
|
2
|
+
export { canonicalJson, computeCaseCorpusDigest } from './corpus-digest.js';
|
|
3
|
+
export { getRuntimeCapabilities } from './capabilities.js';
|
|
4
|
+
export { runExecutionPlan } from './run.js';
|
|
5
|
+
export { validateRunBundle } from './bundle.js';
|
|
6
|
+
export { computeSkillDigest, createRuntimeSkillSnapshot } from './runtime-skill.js';
|
|
7
|
+
export { assertProviderProcessSupported, ProviderProcessCleanupError, runProviderProcess, } from './process.js';
|
|
8
|
+
export { assertProcessTreeInspectionAvailable, observeProcessTree, terminateProcessTree, } from './process-tree.js';
|
|
9
|
+
export { getSchema, getSchemaDigest, validateRuntimeCapabilities } from './schemas.js';
|
|
10
|
+
export { validateJsonSchema } from './json-schema.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAA;AAEnF,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,oCAAoC,EACpC,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA"}
|