@vibe-agent-toolkit/agent-skills 0.1.40 → 0.1.41-rc.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/skill-test/eval-executor.d.ts +50 -0
- package/dist/skill-test/eval-executor.d.ts.map +1 -0
- package/dist/skill-test/eval-executor.js +85 -0
- package/dist/skill-test/eval-executor.js.map +1 -0
- package/dist/skill-test/eval-fragment.d.ts +278 -0
- package/dist/skill-test/eval-fragment.d.ts.map +1 -0
- package/dist/skill-test/eval-fragment.js +128 -0
- package/dist/skill-test/eval-fragment.js.map +1 -0
- package/dist/skill-test/eval-grader.d.ts +54 -0
- package/dist/skill-test/eval-grader.d.ts.map +1 -0
- package/dist/skill-test/eval-grader.js +184 -0
- package/dist/skill-test/eval-grader.js.map +1 -0
- package/dist/skill-test/eval-inputs.d.ts +355 -0
- package/dist/skill-test/eval-inputs.d.ts.map +1 -1
- package/dist/skill-test/eval-inputs.js +36 -8
- package/dist/skill-test/eval-inputs.js.map +1 -1
- package/dist/skill-test/eval-lint.d.ts +51 -0
- package/dist/skill-test/eval-lint.d.ts.map +1 -0
- package/dist/skill-test/eval-lint.js +157 -0
- package/dist/skill-test/eval-lint.js.map +1 -0
- package/dist/skill-test/evals-template.d.ts.map +1 -1
- package/dist/skill-test/evals-template.js +7 -0
- package/dist/skill-test/evals-template.js.map +1 -1
- package/dist/skill-test/executor-prompt.d.ts +41 -0
- package/dist/skill-test/executor-prompt.d.ts.map +1 -0
- package/dist/skill-test/executor-prompt.js +63 -0
- package/dist/skill-test/executor-prompt.js.map +1 -0
- package/dist/skill-test/exit-codes.d.ts +8 -5
- package/dist/skill-test/exit-codes.d.ts.map +1 -1
- package/dist/skill-test/exit-codes.js +12 -7
- package/dist/skill-test/exit-codes.js.map +1 -1
- package/dist/skill-test/fragment-merge.d.ts +46 -0
- package/dist/skill-test/fragment-merge.d.ts.map +1 -0
- package/dist/skill-test/fragment-merge.js +77 -0
- package/dist/skill-test/fragment-merge.js.map +1 -0
- package/dist/skill-test/friction-schema.d.ts +10 -10
- package/dist/skill-test/friction-schema.d.ts.map +1 -1
- package/dist/skill-test/friction-schema.js +6 -1
- package/dist/skill-test/friction-schema.js.map +1 -1
- package/dist/skill-test/grader-model.d.ts +6 -0
- package/dist/skill-test/grader-model.d.ts.map +1 -0
- package/dist/skill-test/grader-model.js +6 -0
- package/dist/skill-test/grader-model.js.map +1 -0
- package/dist/skill-test/grader-prompt.d.ts +74 -0
- package/dist/skill-test/grader-prompt.d.ts.map +1 -0
- package/dist/skill-test/grader-prompt.js +173 -0
- package/dist/skill-test/grader-prompt.js.map +1 -0
- package/dist/skill-test/grading-adapter.d.ts +5 -11
- package/dist/skill-test/grading-adapter.d.ts.map +1 -1
- package/dist/skill-test/grading-adapter.js +9 -22
- package/dist/skill-test/grading-adapter.js.map +1 -1
- package/dist/skill-test/grading-schema.d.ts +18 -15
- package/dist/skill-test/grading-schema.d.ts.map +1 -1
- package/dist/skill-test/grading-schema.js +6 -5
- package/dist/skill-test/grading-schema.js.map +1 -1
- package/dist/skill-test/index.d.ts +13 -3
- package/dist/skill-test/index.d.ts.map +1 -1
- package/dist/skill-test/index.js +13 -3
- package/dist/skill-test/index.js.map +1 -1
- package/dist/skill-test/pipeline.d.ts +29 -0
- package/dist/skill-test/pipeline.d.ts.map +1 -0
- package/dist/skill-test/pipeline.js +77 -0
- package/dist/skill-test/pipeline.js.map +1 -0
- package/dist/skill-test/prompt-invariants.d.ts +27 -0
- package/dist/skill-test/prompt-invariants.d.ts.map +1 -0
- package/dist/skill-test/prompt-invariants.js +38 -0
- package/dist/skill-test/prompt-invariants.js.map +1 -0
- package/dist/skill-test/run-harness.d.ts +187 -55
- package/dist/skill-test/run-harness.d.ts.map +1 -1
- package/dist/skill-test/run-harness.js +539 -189
- package/dist/skill-test/run-harness.js.map +1 -1
- package/dist/skill-test/tier-plan.d.ts +89 -0
- package/dist/skill-test/tier-plan.d.ts.map +1 -0
- package/dist/skill-test/tier-plan.js +96 -0
- package/dist/skill-test/tier-plan.js.map +1 -0
- package/dist/skill-test/tool-eval-schema.d.ts +412 -0
- package/dist/skill-test/tool-eval-schema.d.ts.map +1 -0
- package/dist/skill-test/tool-eval-schema.js +83 -0
- package/dist/skill-test/tool-eval-schema.js.map +1 -0
- package/dist/validators/packaging-validator.d.ts +8 -1
- package/dist/validators/packaging-validator.d.ts.map +1 -1
- package/dist/validators/packaging-validator.js.map +1 -1
- package/package.json +5 -5
- package/schemas/friction-report.json +2 -1
- package/dist/skill-test/experimenter-prompt.d.ts +0 -42
- package/dist/skill-test/experimenter-prompt.d.ts.map +0 -1
- package/dist/skill-test/experimenter-prompt.js +0 -104
- package/dist/skill-test/experimenter-prompt.js.map +0 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { existsSync, readFileSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { mkdirSyncReal, parseStreamJsonTranscript, safePath, spawnHeadlessClaude } from '@vibe-agent-toolkit/utils';
|
|
3
|
+
import { EvalFragmentError, parseEvalFragment } from './eval-fragment.js';
|
|
4
|
+
import { InternalHarnessError } from './exit-codes.js';
|
|
5
|
+
import { assertGraderPromptInvariants, buildGraderPrompt } from './grader-prompt.js';
|
|
6
|
+
import { GradingNonceError } from './grading-adapter.js';
|
|
7
|
+
import { computeToolPassed } from './tool-eval-schema.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run ONE eval's grader: a blind `claude -p` spawn (grader model, NO
|
|
10
|
+
* skill/plugin loaded) that reads the executor's captured transcript via its
|
|
11
|
+
* prompt and writes a nonce'd fragment JSON to `graderOutDir` (issue #145
|
|
12
|
+
* Task 8). `graderOutDir` is vat-only and separate from the skill sandbox the
|
|
13
|
+
* executor ran in (Task 7) — the grader's `sandboxDir` --add-dir is
|
|
14
|
+
* `graderOutDir` itself, and `pluginDirs: []` means no skill code ever runs
|
|
15
|
+
* inside the grader's process, so skill code cannot forge or tamper with the
|
|
16
|
+
* fragment this run trusts.
|
|
17
|
+
*
|
|
18
|
+
* The grader is vat infrastructure, not the thing under test: unlike the
|
|
19
|
+
* executor (see eval-executor.ts), there is NO clean-failure path here. A
|
|
20
|
+
* spawn rejection, watchdog kill (`timedOut`/`stalled`), non-zero exit, or a
|
|
21
|
+
* missing fragment file all mean the grader failed to do its ONE job and are
|
|
22
|
+
* thrown as {@link InternalHarnessError} (exit 1) — never laundered into a
|
|
23
|
+
* passing (or even a valid failing) verdict.
|
|
24
|
+
*
|
|
25
|
+
* Once the fragment file exists, shape/JSON problems throw
|
|
26
|
+
* {@link EvalFragmentError} (via {@link parseEvalFragment}) and a nonce that
|
|
27
|
+
* doesn't match this run's expected nonce throws {@link GradingNonceError} —
|
|
28
|
+
* both distinct from harness breakage because the grader DID run and produce
|
|
29
|
+
* *something*, just not something we can trust.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Adapt the grader's stdout `onProgress` sink into the `onWarn` callback
|
|
33
|
+
* {@link parseEvalFragment} expects (used only when it drops malformed friction
|
|
34
|
+
* items). Extracted so the ternary does not add a branch to `runGraderForEval`'s
|
|
35
|
+
* cognitive complexity budget.
|
|
36
|
+
*/
|
|
37
|
+
function fragmentWarnRouter(onProgress) {
|
|
38
|
+
if (onProgress === undefined)
|
|
39
|
+
return undefined;
|
|
40
|
+
return (message) => onProgress(`[skill-test] ${message}\n`);
|
|
41
|
+
}
|
|
42
|
+
export async function runGraderForEval(input) {
|
|
43
|
+
mkdirSyncReal(input.graderOutDir, { recursive: true });
|
|
44
|
+
// evalId is validated `[A-Za-z0-9_-]+` upstream (eval-inputs.ts) so a plain
|
|
45
|
+
// join is safe, but `joinUnderRoot` is used defensively — it costs nothing
|
|
46
|
+
// and closes off any future path where an unvalidated id reaches here.
|
|
47
|
+
const fragmentOut = safePath.joinUnderRoot(input.graderOutDir, `${input.evalId}.json`);
|
|
48
|
+
const prompt = buildGraderPrompt({
|
|
49
|
+
evalId: input.evalId,
|
|
50
|
+
transcript: input.transcript,
|
|
51
|
+
expectations: input.expectations,
|
|
52
|
+
...(input.expectedOutput === undefined ? {} : { expectedOutput: input.expectedOutput }),
|
|
53
|
+
rubricPath: input.rubricPath,
|
|
54
|
+
fragmentOut,
|
|
55
|
+
nonce: input.nonce,
|
|
56
|
+
...(input.toolExpectations === undefined ? {} : { toolExpectations: input.toolExpectations }),
|
|
57
|
+
...(input.declaredExecutables === undefined ? {} : { declaredExecutables: input.declaredExecutables }),
|
|
58
|
+
});
|
|
59
|
+
// Defense-in-depth (parity with eval-executor.ts's build→assert→use pattern):
|
|
60
|
+
// re-verify the built grader prompt still carries its required invariants
|
|
61
|
+
// (STOP, fragment path, browser/iteration forbids, nonce directive) before
|
|
62
|
+
// spawning, so a regressed buildGraderPrompt is caught here, not by a grader
|
|
63
|
+
// that silently misbehaves.
|
|
64
|
+
assertGraderPromptInvariants(prompt, input.transcript);
|
|
65
|
+
const spawn = input.spawn ?? spawnHeadlessClaude;
|
|
66
|
+
// Accumulate the grader's stream-json stdout so we can read its terminal
|
|
67
|
+
// `total_cost_usd` for run-wide spend aggregation (adopter follow-up). Held in
|
|
68
|
+
// memory only, like the executor's transcript — never written to disk.
|
|
69
|
+
let graderTranscript = '';
|
|
70
|
+
const onStdout = (chunk) => {
|
|
71
|
+
graderTranscript += chunk;
|
|
72
|
+
input.onProgress?.(chunk);
|
|
73
|
+
};
|
|
74
|
+
let spawnResult;
|
|
75
|
+
try {
|
|
76
|
+
spawnResult = await spawn({
|
|
77
|
+
prompt,
|
|
78
|
+
// No skill/plugin ever loads inside the grader's process — this is the
|
|
79
|
+
// forgery-proofing half of the contract (the other half is that
|
|
80
|
+
// graderOutDir is not the skill sandbox).
|
|
81
|
+
pluginDirs: [],
|
|
82
|
+
sandboxDir: input.graderOutDir,
|
|
83
|
+
cwd: input.graderOutDir,
|
|
84
|
+
env: input.env,
|
|
85
|
+
timeoutMs: input.timeoutMs,
|
|
86
|
+
onStdout,
|
|
87
|
+
maxTurns: input.maxTurns,
|
|
88
|
+
maxBudgetUsd: input.maxBudgetUsd,
|
|
89
|
+
model: input.graderModel,
|
|
90
|
+
...(input.stallMs === undefined ? {} : { stallMs: input.stallMs }),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
throw new InternalHarnessError(`Grader spawn failed for eval "${input.evalId}": ${err instanceof Error ? err.message : String(err)}`);
|
|
95
|
+
}
|
|
96
|
+
// The grader is vat infrastructure: any of these mean it failed to do its
|
|
97
|
+
// ONE job, so all of them are harness breakage — there is no clean-failure
|
|
98
|
+
// path here (contrast eval-executor.ts's cleanFailure).
|
|
99
|
+
if (spawnResult.stalled) {
|
|
100
|
+
throw new InternalHarnessError(`Grader stalled for eval "${input.evalId}" (no output for ${input.stallMs ?? 0}ms).`);
|
|
101
|
+
}
|
|
102
|
+
if (spawnResult.timedOut) {
|
|
103
|
+
throw new InternalHarnessError(`Grader timed out for eval "${input.evalId}" (limit ${input.timeoutMs}ms).`);
|
|
104
|
+
}
|
|
105
|
+
if (spawnResult.status !== 0) {
|
|
106
|
+
throw new InternalHarnessError(`Grader exited non-zero (status ${spawnResult.status}) for eval "${input.evalId}".`);
|
|
107
|
+
}
|
|
108
|
+
// Report the grader session's cost for run-wide spend aggregation. Parsed from
|
|
109
|
+
// the in-memory transcript (not the fragment) so it reflects real API spend even
|
|
110
|
+
// under subscription auth; `undefined` when the transcript carried no result.
|
|
111
|
+
input.costSink?.(parseStreamJsonTranscript(graderTranscript).result?.totalCostUsd);
|
|
112
|
+
const raw = readAndConsumeFragmentFile(fragmentOut, input.evalId, spawnResult.status);
|
|
113
|
+
const fragment = parseEvalFragment(raw, fragmentWarnRouter(input.onProgress));
|
|
114
|
+
// Integrity gate: a missing/wrong nonce means this fragment was not produced
|
|
115
|
+
// by the grader we prompted for THIS run — most likely forged or left behind
|
|
116
|
+
// by untrusted skill code — so the verdict cannot be trusted, hard error.
|
|
117
|
+
if (fragment.runNonce !== input.nonce) {
|
|
118
|
+
throw new GradingNonceError(`eval "${input.evalId}" fragment \`runNonce\` does not match this run`);
|
|
119
|
+
}
|
|
120
|
+
assertToolVerdictConsistent(input.evalId, input.toolExpectations, fragment.tool);
|
|
121
|
+
return fragment;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Read the grader's fragment JSON into memory and unlink it immediately —
|
|
125
|
+
* consume-on-read. Split out of {@link runGraderForEval} to keep its cognitive
|
|
126
|
+
* complexity within budget. Throws {@link InternalHarnessError} if the grader
|
|
127
|
+
* wrote no fragment, {@link EvalFragmentError} if it is not valid JSON.
|
|
128
|
+
*
|
|
129
|
+
* The unlink is the security-relevant half: the grader dir is same-uid (see
|
|
130
|
+
* `resolveGraderOutDir`), so a fragment left on disk lets skill code that
|
|
131
|
+
* survived the process-group kill read the echoed nonce at leisure and forge
|
|
132
|
+
* LATER fragments. Consuming it on read leaves no persisted copy — exposure
|
|
133
|
+
* shrinks to each fragment's own read window (no cross-eval harvest). The read
|
|
134
|
+
* here is the ONLY read of the file; all downstream logic runs off the returned
|
|
135
|
+
* value. Best-effort: a failed unlink is not a run failure (end-of-run cleanup
|
|
136
|
+
* removes the whole dir), and true isolation from same-uid code is issue #149.
|
|
137
|
+
*/
|
|
138
|
+
function readAndConsumeFragmentFile(fragmentOut, evalId, status) {
|
|
139
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- fragmentOut is our own derived path (joinUnderRoot-guarded)
|
|
140
|
+
if (!existsSync(fragmentOut)) {
|
|
141
|
+
throw new InternalHarnessError(`Grader exited (status ${status}) without writing a fragment at ${fragmentOut} for eval "${evalId}".`);
|
|
142
|
+
}
|
|
143
|
+
let raw;
|
|
144
|
+
try {
|
|
145
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- fragmentOut is our own derived path (joinUnderRoot-guarded)
|
|
146
|
+
raw = JSON.parse(readFileSync(fragmentOut, 'utf-8'));
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
throw new EvalFragmentError(`grader fragment for eval "${evalId}" at ${fragmentOut} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- fragmentOut is our own derived path (joinUnderRoot-guarded)
|
|
153
|
+
unlinkSync(fragmentOut);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Swallow: cleanup removes the grader dir regardless.
|
|
157
|
+
}
|
|
158
|
+
return raw;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Fail-open guards on the grader's tool verdict, split out of
|
|
162
|
+
* {@link runGraderForEval} to keep its cognitive complexity within budget:
|
|
163
|
+
*
|
|
164
|
+
* - Fix #1: the eval DECLARED tool expectations, so the grader was asked to
|
|
165
|
+
* judge them and emit a `tool` verdict — a fragment WITHOUT one means the
|
|
166
|
+
* grader silently skipped half its job. That is grader breakage (exit 1),
|
|
167
|
+
* never a laundered pass: an absent tool block must not merge as "there were
|
|
168
|
+
* no tool expectations to check".
|
|
169
|
+
* - Fix #3: the grader self-reports `tool.passed`, but we never trust it —
|
|
170
|
+
* recompute from the sub-checks via {@link computeToolPassed}. A `passed`
|
|
171
|
+
* that disagrees with its own sub-checks is grader malfunction (a false green
|
|
172
|
+
* or a false red), surfaced loudly rather than merged. Mirrors
|
|
173
|
+
* `reconcileGrading`'s summary/expectations reconciliation (grading-adapter.ts).
|
|
174
|
+
*/
|
|
175
|
+
function assertToolVerdictConsistent(evalId, toolExpectations, tool) {
|
|
176
|
+
if (toolExpectations !== undefined && tool === undefined) {
|
|
177
|
+
throw new InternalHarnessError(`Grader for eval "${evalId}" was asked to judge declared tool expectations but returned no \`tool\` verdict in its fragment.`);
|
|
178
|
+
}
|
|
179
|
+
if (tool !== undefined && computeToolPassed(tool) !== tool.passed) {
|
|
180
|
+
throw new InternalHarnessError(`Grader for eval "${evalId}" emitted a tool verdict whose \`passed\` (${tool.passed}) ` +
|
|
181
|
+
`disagrees with its own sub-checks (recomputed ${computeToolPassed(tool)}).`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=eval-grader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-grader.js","sourceRoot":"","sources":["../../src/skill-test/eval-grader.ts"],"names":[],"mappings":"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"}
|