@vibe-agent-toolkit/agent-skills 0.1.40 → 0.1.41-rc.2

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 (88) hide show
  1. package/dist/skill-test/eval-executor.d.ts +50 -0
  2. package/dist/skill-test/eval-executor.d.ts.map +1 -0
  3. package/dist/skill-test/eval-executor.js +85 -0
  4. package/dist/skill-test/eval-executor.js.map +1 -0
  5. package/dist/skill-test/eval-fragment.d.ts +278 -0
  6. package/dist/skill-test/eval-fragment.d.ts.map +1 -0
  7. package/dist/skill-test/eval-fragment.js +128 -0
  8. package/dist/skill-test/eval-fragment.js.map +1 -0
  9. package/dist/skill-test/eval-grader.d.ts +54 -0
  10. package/dist/skill-test/eval-grader.d.ts.map +1 -0
  11. package/dist/skill-test/eval-grader.js +184 -0
  12. package/dist/skill-test/eval-grader.js.map +1 -0
  13. package/dist/skill-test/eval-inputs.d.ts +355 -0
  14. package/dist/skill-test/eval-inputs.d.ts.map +1 -1
  15. package/dist/skill-test/eval-inputs.js +36 -8
  16. package/dist/skill-test/eval-inputs.js.map +1 -1
  17. package/dist/skill-test/eval-lint.d.ts +51 -0
  18. package/dist/skill-test/eval-lint.d.ts.map +1 -0
  19. package/dist/skill-test/eval-lint.js +157 -0
  20. package/dist/skill-test/eval-lint.js.map +1 -0
  21. package/dist/skill-test/evals-template.d.ts.map +1 -1
  22. package/dist/skill-test/evals-template.js +7 -0
  23. package/dist/skill-test/evals-template.js.map +1 -1
  24. package/dist/skill-test/executor-prompt.d.ts +41 -0
  25. package/dist/skill-test/executor-prompt.d.ts.map +1 -0
  26. package/dist/skill-test/executor-prompt.js +63 -0
  27. package/dist/skill-test/executor-prompt.js.map +1 -0
  28. package/dist/skill-test/exit-codes.d.ts +8 -5
  29. package/dist/skill-test/exit-codes.d.ts.map +1 -1
  30. package/dist/skill-test/exit-codes.js +12 -7
  31. package/dist/skill-test/exit-codes.js.map +1 -1
  32. package/dist/skill-test/fragment-merge.d.ts +46 -0
  33. package/dist/skill-test/fragment-merge.d.ts.map +1 -0
  34. package/dist/skill-test/fragment-merge.js +77 -0
  35. package/dist/skill-test/fragment-merge.js.map +1 -0
  36. package/dist/skill-test/friction-schema.d.ts +10 -10
  37. package/dist/skill-test/friction-schema.d.ts.map +1 -1
  38. package/dist/skill-test/friction-schema.js +6 -1
  39. package/dist/skill-test/friction-schema.js.map +1 -1
  40. package/dist/skill-test/grader-model.d.ts +6 -0
  41. package/dist/skill-test/grader-model.d.ts.map +1 -0
  42. package/dist/skill-test/grader-model.js +6 -0
  43. package/dist/skill-test/grader-model.js.map +1 -0
  44. package/dist/skill-test/grader-prompt.d.ts +74 -0
  45. package/dist/skill-test/grader-prompt.d.ts.map +1 -0
  46. package/dist/skill-test/grader-prompt.js +173 -0
  47. package/dist/skill-test/grader-prompt.js.map +1 -0
  48. package/dist/skill-test/grading-adapter.d.ts +5 -11
  49. package/dist/skill-test/grading-adapter.d.ts.map +1 -1
  50. package/dist/skill-test/grading-adapter.js +9 -22
  51. package/dist/skill-test/grading-adapter.js.map +1 -1
  52. package/dist/skill-test/grading-schema.d.ts +18 -15
  53. package/dist/skill-test/grading-schema.d.ts.map +1 -1
  54. package/dist/skill-test/grading-schema.js +6 -5
  55. package/dist/skill-test/grading-schema.js.map +1 -1
  56. package/dist/skill-test/index.d.ts +13 -3
  57. package/dist/skill-test/index.d.ts.map +1 -1
  58. package/dist/skill-test/index.js +13 -3
  59. package/dist/skill-test/index.js.map +1 -1
  60. package/dist/skill-test/pipeline.d.ts +29 -0
  61. package/dist/skill-test/pipeline.d.ts.map +1 -0
  62. package/dist/skill-test/pipeline.js +77 -0
  63. package/dist/skill-test/pipeline.js.map +1 -0
  64. package/dist/skill-test/prompt-invariants.d.ts +27 -0
  65. package/dist/skill-test/prompt-invariants.d.ts.map +1 -0
  66. package/dist/skill-test/prompt-invariants.js +38 -0
  67. package/dist/skill-test/prompt-invariants.js.map +1 -0
  68. package/dist/skill-test/run-harness.d.ts +187 -55
  69. package/dist/skill-test/run-harness.d.ts.map +1 -1
  70. package/dist/skill-test/run-harness.js +539 -189
  71. package/dist/skill-test/run-harness.js.map +1 -1
  72. package/dist/skill-test/tier-plan.d.ts +89 -0
  73. package/dist/skill-test/tier-plan.d.ts.map +1 -0
  74. package/dist/skill-test/tier-plan.js +96 -0
  75. package/dist/skill-test/tier-plan.js.map +1 -0
  76. package/dist/skill-test/tool-eval-schema.d.ts +412 -0
  77. package/dist/skill-test/tool-eval-schema.d.ts.map +1 -0
  78. package/dist/skill-test/tool-eval-schema.js +83 -0
  79. package/dist/skill-test/tool-eval-schema.js.map +1 -0
  80. package/dist/validators/packaging-validator.d.ts +8 -1
  81. package/dist/validators/packaging-validator.d.ts.map +1 -1
  82. package/dist/validators/packaging-validator.js.map +1 -1
  83. package/package.json +5 -5
  84. package/schemas/friction-report.json +2 -1
  85. package/dist/skill-test/experimenter-prompt.d.ts +0 -42
  86. package/dist/skill-test/experimenter-prompt.d.ts.map +0 -1
  87. package/dist/skill-test/experimenter-prompt.js +0 -104
  88. 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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"}