@vibe-agent-toolkit/cli 0.1.40-rc.2 → 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/bin.js CHANGED
@@ -17,6 +17,7 @@ import { createRagCommand, showRagVerboseHelp } from './commands/rag/index.js';
17
17
  import { createResourcesCommand, showResourcesVerboseHelp } from './commands/resources/index.js';
18
18
  import { createSkillCommand } from './commands/skill/index.js';
19
19
  import { createSkillsCommand } from './commands/skills/index.js';
20
+ import { createValidateTopLevelCommand } from './commands/validate.js';
20
21
  import { createVerifyTopLevelCommand } from './commands/verify.js';
21
22
  import { loadVerboseHelp } from './utils/help-loader.js';
22
23
  import { createLogger } from './utils/logger.js';
@@ -120,6 +121,7 @@ program.addCommand(createSkillCommand());
120
121
  program.addCommand(createClaudeCommand());
121
122
  // Add top-level orchestration commands
122
123
  program.addCommand(createBuildTopLevelCommand());
124
+ program.addCommand(createValidateTopLevelCommand());
123
125
  program.addCommand(createVerifyTopLevelCommand());
124
126
  // Add standalone commands
125
127
  doctorCommand(program);
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -97,7 +97,7 @@ export function createSkillTestConfigureCommand() {
97
97
  .description('Upsert the test block for a skill in vibe-agent-toolkit.config.yaml')
98
98
  .argument('<skill>', 'Skill name (key under skills.config)')
99
99
  .option('--auth <mode>', 'Auth mechanism: inherit | subscription | api-key | auto')
100
- .option('--max-turns <n>', 'Cap on experimenter turns (positive integer)')
100
+ .option('--max-turns <n>', 'Per-spawn cap on executor/grader turns (positive integer)')
101
101
  .option('--max-budget-usd <n>', 'Hard USD budget cap (positive number)')
102
102
  .option('--timeout <s>', 'Wall-clock timeout in seconds (positive integer)')
103
103
  .option('--stall <s>', 'Stall-watchdog seconds (positive integer)')
@@ -1 +1 @@
1
- {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../../src/commands/skill/test/configure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAElE,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAezD,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,IAAY;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oCAAoC,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CACjB,OAAkC;IAElC,MAAM,KAAK,GAA2C,EAAE,CAAC;IAEzD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAiB,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACvC,KAAK,CAAC,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9B,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,SAAiB,EACjB,OAAkC;IAElC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,oFAAoF;gBAClF,kDAAkD,CACrD,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAE/D,sHAAsH;QACtH,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAEjE,mDAAmD;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAY,CAAC;QAClD,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,gDAAgD,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAC3E,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,sHAAsH;YACtH,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzC,OAAO;SACJ,WAAW,CAAC,qEAAqE,CAAC;SAClF,QAAQ,CAAC,SAAS,EAAE,sCAAsC,CAAC;SAC3D,MAAM,CAAC,eAAe,EAAE,yDAAyD,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,8CAA8C,CAAC;SACzE,MAAM,CAAC,sBAAsB,EAAE,uCAAuC,CAAC;SACvE,MAAM,CAAC,eAAe,EAAE,kDAAkD,CAAC;SAC3E,MAAM,CAAC,aAAa,EAAE,2CAA2C,CAAC;SAClE,MAAM,CAAC,cAAc,EAAE,qCAAqC,CAAC;SAC7D,MAAM,CAAC,YAAY,EAAE,sCAAsC,CAAC;SAC5D,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,SAAS,EAAE,8DAA8D,CAAC;SACjF,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACzC,MAAM,CAAC,gBAAgB,CAAC;SACxB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;CAYL,CACI,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../../src/commands/skill/test/configure.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * print the §12 security warning, call runSkillTestHarness, map result/error to exit code.
6
6
  * All domain logic lives in run-harness.ts (agent-skills package).
7
7
  */
8
- import { runSkillTestHarness } from '@vibe-agent-toolkit/agent-skills';
8
+ import { runSkillTestHarness, type SkillPackagingConfig } from '@vibe-agent-toolkit/agent-skills';
9
9
  import { Command } from 'commander';
10
10
  export interface SkillTestRunOptions {
11
11
  with?: string[];
@@ -21,20 +21,35 @@ export interface SkillTestRunOptions {
21
21
  allowUnverifiedSkillSource?: boolean;
22
22
  iUnderstandThisRunsSkillCode?: boolean;
23
23
  model?: string;
24
+ /** Model for the fixed grader/judge (GLOBAL, independent of `model` — the model UNDER TEST). */
25
+ graderModel?: string;
24
26
  maxTurns?: string;
25
27
  maxBudgetUsd?: string;
26
28
  timeout?: string;
27
29
  stall?: string;
30
+ /** Max evals graded in parallel (GLOBAL — the executor→grader pipeline width). */
31
+ concurrency?: string;
28
32
  debug?: boolean;
29
33
  env?: string[];
30
34
  passEnv?: string[];
31
35
  /** Skip building a declared subject and stage its existing dist instead. */
32
36
  noBuild?: boolean;
33
- /** Exit non-zero (EvalFailure) when any eval fails, instead of the default Ok. */
34
- failOnEvalFailure?: boolean;
37
+ /** Opt out of the fail-closed default: exit Ok (0) even when an eval fails. */
38
+ allowEvalFailure?: boolean;
35
39
  }
36
40
  type HarnessOpts = Parameters<typeof runSkillTestHarness>[0];
37
41
  type SkillSourceSpec = NonNullable<HarnessOpts['withSources']>[string];
42
+ /** The declared-executable recognition aid the harness forwards to the WITH-arm grader. */
43
+ type DeclaredExecutable = NonNullable<HarnessOpts['declaredExecutables']>[number];
44
+ /**
45
+ * Map a resolved skill's packaging-config `executables` (SkillExecutableEntry[]) to
46
+ * the grader's recognition-aid shape (issue #145 Phase T): each entry's stable NAME
47
+ * is its `path` basename with the extension stripped (`scripts/dxa.py` → `dxa`),
48
+ * carried alongside its `howInvoked` + `kind`. Returns undefined for absent/empty
49
+ * input so the harness omits the aid entirely (the grader still matches tools by the
50
+ * commands in the transcript). Pure + unit-testable.
51
+ */
52
+ export declare function deriveDeclaredExecutableNames(executables: SkillPackagingConfig['executables']): DeclaredExecutable[] | undefined;
38
53
  /**
39
54
  * Resolve one cost/runtime knob with flag > config > default precedence AND a
40
55
  * built-in safety cap, enforcing an asymmetry between the two sources:
@@ -69,6 +84,19 @@ export interface ResolvedSubject {
69
84
  * or when the subject is a plain source.
70
85
  */
71
86
  dryRunStagedExistingDist?: boolean;
87
+ /**
88
+ * True when a PATH target mapped back to a declared skill (its `test:` config is
89
+ * honored and its scaffold dir points at the authored source). Gates the
90
+ * config-bypass warning: only a path with NO declared linkage is config-blind.
91
+ */
92
+ linkedToDeclaredSkill?: boolean;
93
+ /**
94
+ * Declared executables (name + kind + howInvoked) derived from the subject's
95
+ * packaging config, forwarded to the WITH-arm grader as a tool recognition aid
96
+ * (issue #145 Phase T). Populated ONLY for a `buildable` subject (which carries
97
+ * `packagingConfig`); a plain path/source subject leaves it undefined.
98
+ */
99
+ declaredExecutables?: DeclaredExecutable[];
72
100
  }
73
101
  /**
74
102
  * Project-aware subject resolution for `vat skill test run`. Resolves the subject
@@ -82,6 +110,18 @@ export declare function resolveSubjectForTest(ref: string, cwd: string, flags: {
82
110
  acknowledged: boolean;
83
111
  build?: string;
84
112
  }): Promise<ResolvedSubject>;
113
+ /**
114
+ * True when the resolved subject is a CONFIG-BLIND path target: a `{ path }` source
115
+ * staged AS-IS (not built) that does NOT map back to a declared skill, so the project's
116
+ * `test:` config cannot be applied to it. A path that DOES map to a declared skill
117
+ * (`linkedToDeclaredSkill`) honors config and is NOT blind. A config-declared NAME
118
+ * target (`wouldBuild`) is never blind. Gates the #7 warning. Pure + exported for tests.
119
+ */
120
+ export declare function isPathSourceTarget(subject: {
121
+ wouldBuild: boolean;
122
+ subjectSource: SkillSourceSpec;
123
+ linkedToDeclaredSkill?: boolean;
124
+ }): boolean;
85
125
  /**
86
126
  * The unit-testable action for `vat skill test run`. Exported so tests can
87
127
  * call it directly without parsing CLI args. Calls process.exit on completion.
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/commands/skill/test/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAOL,mBAAmB,EAKpB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CpC,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAwDD,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,KAAK,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AA+GvE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAWpB;AA4GD,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,aAAa,EAAE,eAAe,CAAC;IAC/B,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2GAA2G;IAC3G,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAClF,OAAO,CAAC,eAAe,CAAC,CA0B1B;AAgHD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA2Df;AAMD,wBAAgB,yBAAyB,IAAI,OAAO,CAwFnD"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/commands/skill/test/run.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,13 @@
6
6
  * All domain logic lives in run-harness.ts (agent-skills package).
7
7
  */
8
8
  import { existsSync } from 'node:fs';
9
- import { basename, dirname } from 'node:path';
9
+ import { basename, dirname, extname } from 'node:path';
10
10
  import { BootstrapNeededError, isAcknowledged, mapErrorToExitCode, packageSkill, packagingConfigToPackageOptions, runPreStageBuild, runSkillTestHarness, SecurityAckError, SKILL_TEST_BUILTIN_CAPS, SkillBuildError, SkillTestExitCode, } from '@vibe-agent-toolkit/agent-skills';
11
11
  import { findProjectRoot, safePath, toForwardSlash } from '@vibe-agent-toolkit/utils';
12
12
  import { Command } from 'commander';
13
13
  import { parseSourceSpec } from '../../../skill-resolution/classify.js';
14
- import { resolveSkillReference } from '../../../skill-resolution/index.js';
15
- import { loadConfig } from '../../../utils/config-loader.js';
14
+ import { findDeclaredSkillForPath, resolveSkillReference, } from '../../../skill-resolution/index.js';
15
+ import { ConfigLoadError, loadConfig } from '../../../utils/config-loader.js';
16
16
  import { runClaudePluginBuild } from '../../claude/plugin/build.js';
17
17
  import { assertValidAuth, assertValidRequireAuth } from './auth-flags.js';
18
18
  /** Extract the trailing path segment (cross-platform) from a path-like string. */
@@ -25,8 +25,8 @@ function lastPathSegment(p) {
25
25
  const SECURITY_WARNING = `
26
26
  WARNING: 'vat skill test run' EXECUTES the skill's code on your machine.
27
27
 
28
- It spawns a headless Claude session with --permission-mode bypassPermissions,
29
- so the staged skill files and experimenter prompt run with YOUR user account's
28
+ It spawns headless Claude sessions with --permission-mode bypassPermissions,
29
+ so the staged skill files run with YOUR user account's
30
30
  full privileges: they can read and write your files (including credentials under
31
31
  ~/.claude, SSH keys, cloud configs), run shell commands, and make network
32
32
  requests. The auth credential used to bill the run is reachable by that code.
@@ -75,8 +75,29 @@ function coerceKnobs(options) {
75
75
  const stall = coercePositiveInt(options.stall, '--stall');
76
76
  if (stall !== undefined)
77
77
  result.stall = stall;
78
+ const concurrency = coercePositiveInt(options.concurrency, '--concurrency');
79
+ if (concurrency !== undefined)
80
+ result.concurrency = concurrency;
78
81
  return result;
79
82
  }
83
+ /**
84
+ * Map a resolved skill's packaging-config `executables` (SkillExecutableEntry[]) to
85
+ * the grader's recognition-aid shape (issue #145 Phase T): each entry's stable NAME
86
+ * is its `path` basename with the extension stripped (`scripts/dxa.py` → `dxa`),
87
+ * carried alongside its `howInvoked` + `kind`. Returns undefined for absent/empty
88
+ * input so the harness omits the aid entirely (the grader still matches tools by the
89
+ * commands in the transcript). Pure + unit-testable.
90
+ */
91
+ export function deriveDeclaredExecutableNames(executables) {
92
+ if (executables === undefined || executables.length === 0)
93
+ return undefined;
94
+ return executables.map((e) => {
95
+ const base = basename(toForwardSlash(e.path));
96
+ const ext = extname(base);
97
+ const name = ext === '' ? base : base.slice(0, -ext.length);
98
+ return { name, howInvoked: e.howInvoked, kind: e.kind };
99
+ });
100
+ }
80
101
  /**
81
102
  * Parse a single `name=src` pair into a [name, SkillSourceSpec] tuple. The
82
103
  * source half uses a `kind:value` prefix:
@@ -133,25 +154,34 @@ function descriptorsToRecord(list) {
133
154
  // Precedence resolution: flag > config > default
134
155
  // ---------------------------------------------------------------------------
135
156
  /**
136
- * Load the persisted `skills.config.<skill>.test` block for the subject skill.
137
- * The subject is the first positional skill name (a path or skill key). We key
138
- * the config by its basename so `./dist/skills/my-skill/` matches `my-skill`.
139
- * Missing config / missing file → undefined (defaults apply).
157
+ * Load the persisted `skills.config.<skill>.test` block for the subject skill,
158
+ * PROJECT-AWARE (mirrors the resolver — not a parallel cwd+basename resolver).
159
+ *
160
+ * A PATH target (`./dist/skills/my-skill/`) is mapped back to its declared skill
161
+ * via {@link findDeclaredSkillForPath} (walks up from the path, config-first) and
162
+ * keyed by the DECLARED name against the GOVERNING config — so a path target honors
163
+ * the same model/evals/timeout as its name, regardless of cwd. A NAME target (or a
164
+ * path that maps to no declared skill) falls back to the cwd-anchored governing
165
+ * config keyed by basename. Missing config / missing file → undefined (defaults apply).
166
+ *
167
+ * A broken config throws {@link ConfigLoadError}; we let it propagate to the preflight
168
+ * guard in runSkillTestRun, which surfaces it as a clean exit-2 error rather than
169
+ * silently applying defaults against a config the author clearly intended.
140
170
  */
141
- function loadTestConfig(skills) {
142
- const projectRoot = findProjectRoot(process.cwd());
171
+ async function loadTestConfig(skills, cwd) {
172
+ const subject = skills[0] ?? '';
173
+ // Path target → resolve the declared skill it materializes, and read its test
174
+ // block from that skill's own governing config root (cwd-independent).
175
+ const link = await findDeclaredSkillForPath(subject, cwd);
176
+ if (link !== undefined) {
177
+ return loadConfig(link.configRoot)?.skills?.config?.[link.name]?.test;
178
+ }
179
+ const projectRoot = findProjectRoot(cwd);
143
180
  if (projectRoot === null)
144
181
  return undefined;
145
- // loadConfig returns undefined when no config exists and throws only when a
146
- // config file is present but broken. We deliberately let that throw propagate:
147
- // it is caught by the preflight guard in runSkillTestRun and surfaced as a
148
- // clean exit-2 error, rather than silently applying defaults (and potentially
149
- // staging the wrong subject) against a config the author clearly intended.
150
- const config = loadConfig(projectRoot);
151
- const perSkill = config?.skills?.config;
182
+ const perSkill = loadConfig(projectRoot)?.skills?.config;
152
183
  if (perSkill === undefined)
153
184
  return undefined;
154
- const subject = skills[0] ?? '';
155
185
  const base = lastPathSegment(subject) || subject;
156
186
  return perSkill[subject]?.test ?? perSkill[base]?.test;
157
187
  }
@@ -159,6 +189,24 @@ function loadTestConfig(skills) {
159
189
  function resolveRepoRoot() {
160
190
  return findProjectRoot(process.cwd()) ?? process.cwd();
161
191
  }
192
+ /**
193
+ * Load the persisted TOP-LEVEL `test:` config node (`graderModel`, `concurrency`)
194
+ * from the GOVERNING project config. Deliberately distinct from
195
+ * {@link loadTestConfig}, which reads the PER-SKILL `skills.config.<skill>.test`
196
+ * block: graderModel/concurrency are global judge/pipeline settings that apply
197
+ * across every skill's test run, not something a single skill's config should
198
+ * override (issue #145).
199
+ *
200
+ * Undefined when there's no project root or no `test:` node. A broken config
201
+ * throws {@link ConfigLoadError}, propagated the same way as loadTestConfig's
202
+ * errors (surfaced by the caller's preflight guard as a clean exit-2).
203
+ */
204
+ function loadGlobalTestConfig(cwd) {
205
+ const projectRoot = findProjectRoot(cwd);
206
+ if (projectRoot === null)
207
+ return undefined;
208
+ return loadConfig(projectRoot)?.test;
209
+ }
162
210
  /** Copy flag-only passthrough options (no config counterpart) onto opts. */
163
211
  function applyFlagOnlyOptions(opts, options) {
164
212
  if (options.refresh !== undefined)
@@ -175,8 +223,8 @@ function applyFlagOnlyOptions(opts, options) {
175
223
  opts.allowUnverifiedSkillSource = options.allowUnverifiedSkillSource;
176
224
  if (options.iUnderstandThisRunsSkillCode !== undefined)
177
225
  opts.acknowledgedRunsSkillCode = options.iUnderstandThisRunsSkillCode;
178
- if (options.failOnEvalFailure !== undefined)
179
- opts.failOnEvalFailure = options.failOnEvalFailure;
226
+ if (options.allowEvalFailure !== undefined)
227
+ opts.tolerateEvalFailure = options.allowEvalFailure;
180
228
  }
181
229
  /** Apply flag>config merges for scalar knobs (auth, model, baseline, eval/prompt). */
182
230
  function applyScalarMerges(opts, options, config) {
@@ -194,8 +242,6 @@ function applyScalarMerges(opts, options, config) {
194
242
  opts.model = model;
195
243
  if (config?.evals !== undefined)
196
244
  opts.evalsSubpath = config.evals;
197
- if (config?.experimenterPrompt !== undefined)
198
- opts.promptOverride = config.experimenterPrompt;
199
245
  }
200
246
  /**
201
247
  * Resolve one cost/runtime knob with flag > config > default precedence AND a
@@ -291,12 +337,27 @@ function applyDepMerges(opts, options, config) {
291
337
  if (withOptional !== undefined)
292
338
  opts.withOptional = withOptional;
293
339
  }
340
+ /**
341
+ * Apply flag>config merges for the GLOBAL grader/concurrency knobs — the
342
+ * top-level `test:` config node (see {@link loadGlobalTestConfig}), NOT the
343
+ * per-skill `skills.config.<skill>.test` block. Precedence: flag > top-level
344
+ * config > default(undefined) — left undefined here so the domain applies
345
+ * DEFAULT_GRADER_MODEL / DEFAULT_CONCURRENCY.
346
+ */
347
+ function applyGraderMerges(opts, options, knobs, globalTest) {
348
+ const graderModel = options.graderModel ?? globalTest?.graderModel;
349
+ if (graderModel !== undefined)
350
+ opts.graderModel = graderModel;
351
+ const concurrency = knobs.concurrency ?? globalTest?.concurrency;
352
+ if (concurrency !== undefined)
353
+ opts.concurrency = concurrency;
354
+ }
294
355
  /**
295
356
  * Resolve CLI flags → RunHarnessOptions, applying flag > config > default
296
357
  * precedence. CLI flags win; config (`skills.config.<skill>.test`) fills gaps;
297
358
  * built-in defaults (inside the domain) are the final fallback.
298
359
  */
299
- function buildHarnessOpts(skills, options, knobs, config) {
360
+ function buildHarnessOpts(skills, options, knobs, config, globalTest) {
300
361
  const repoRoot = resolveRepoRoot();
301
362
  const opts = { skills, repoRoot };
302
363
  applyFlagOnlyOptions(opts, options);
@@ -304,8 +365,25 @@ function buildHarnessOpts(skills, options, knobs, config) {
304
365
  applyKnobMerges(opts, knobs, config);
305
366
  applyDepMerges(opts, options, config);
306
367
  applyEnvMerges(opts, options, config);
368
+ applyGraderMerges(opts, options, knobs, globalTest);
307
369
  return opts;
308
370
  }
371
+ /**
372
+ * Scaffold-dir fields for a `source` subject. A path that maps back to a declared
373
+ * skill anchors at the AUTHORED source (dirname of its SKILL.md) so `config.evals`
374
+ * resolves + overlays from there — the built dist it points at does not carry the
375
+ * eval suite. An UNLINKED path anchors at the resolved path itself (legacy behavior;
376
+ * the path IS the skill dir). A nameless source (npm/url/vendored) has no scaffold dir.
377
+ */
378
+ function sourceScaffoldFields(source, declaredSkill, cwd) {
379
+ if (declaredSkill !== undefined) {
380
+ return { subjectScaffoldDir: dirname(declaredSkill.sourcePath), linkedToDeclaredSkill: true };
381
+ }
382
+ if ('path' in source) {
383
+ return { subjectScaffoldDir: safePath.resolve(cwd, source.path) };
384
+ }
385
+ return {};
386
+ }
309
387
  /**
310
388
  * Project-aware subject resolution for `vat skill test run`. Resolves the subject
311
389
  * reference; for a declared skill, builds it (real entry points) and returns the
@@ -320,19 +398,20 @@ export async function resolveSubjectForTest(ref, cwd, flags) {
320
398
  subjectSource: resolved.source,
321
399
  rebuilt: false,
322
400
  wouldBuild: false,
323
- // A path subject points at the skill DIR itself (not its SKILL.md), so the
324
- // authored scaffold dir is the resolved path — not its parent. Mirrors the
325
- // legacy positional-path behavior in resolveScaffoldEvalsPath.
326
- ...('path' in resolved.source
327
- ? { subjectScaffoldDir: safePath.resolve(cwd, resolved.source.path) }
328
- : {}),
401
+ ...sourceScaffoldFields(resolved.source, resolved.declaredSkill, cwd),
329
402
  };
330
403
  case 'name-miss':
331
404
  throw new SkillBuildError(`no skill named '${resolved.name}' in ${resolved.configRoot}; known skills: ${resolved.knownSkills.join(', ') || '(none)'}. (For a directory, use './${resolved.name}'.)`);
332
405
  case 'not-found':
333
406
  throw new SkillBuildError(`no path '${resolved.ref}' and no governing config to resolve a name; pass a path or run inside a VAT project.`);
334
- case 'buildable':
335
- return resolveBuildableSubject(resolved, flags);
407
+ case 'buildable': {
408
+ // A buildable ref carries `packagingConfig` — the ONE cleanly-reachable place
409
+ // the subject's declared executables live — so attach the grader recognition
410
+ // aid here (a plain source has no packaging config and leaves it undefined).
411
+ const subject = await resolveBuildableSubject(resolved, flags);
412
+ const declaredExecutables = deriveDeclaredExecutableNames(resolved.packagingConfig.executables);
413
+ return declaredExecutables === undefined ? subject : { ...subject, declaredExecutables };
414
+ }
336
415
  }
337
416
  }
338
417
  /**
@@ -403,6 +482,30 @@ async function resolveBuildableSubject(ref, flags) {
403
482
  }
404
483
  return { subjectSource: { path: ref.expectedDistDir }, subjectScaffoldDir: scaffoldDir, rebuilt: true, wouldBuild: true };
405
484
  }
485
+ /**
486
+ * True when the resolved subject is a CONFIG-BLIND path target: a `{ path }` source
487
+ * staged AS-IS (not built) that does NOT map back to a declared skill, so the project's
488
+ * `test:` config cannot be applied to it. A path that DOES map to a declared skill
489
+ * (`linkedToDeclaredSkill`) honors config and is NOT blind. A config-declared NAME
490
+ * target (`wouldBuild`) is never blind. Gates the #7 warning. Pure + exported for tests.
491
+ */
492
+ export function isPathSourceTarget(subject) {
493
+ return !subject.wouldBuild && 'path' in subject.subjectSource && subject.linkedToDeclaredSkill !== true;
494
+ }
495
+ /**
496
+ * Warn (stderr) when the subject is a CONFIG-BLIND path target: its `test:` config
497
+ * (model / evals / timeout) cannot be resolved because the path maps to no declared
498
+ * skill. A path pointing at a declared skill's built dist DOES honor config (mapped
499
+ * back by {@link findDeclaredSkillForPath}) and is silent — only a truly unmapped
500
+ * path is warned, pointing the user at the NAME form.
501
+ */
502
+ function warnIfPathTargetBypassesConfig(subject) {
503
+ if (!isPathSourceTarget(subject))
504
+ return;
505
+ process.stderr.write('Note: this path maps to no declared skill, so the project\'s test: config ' +
506
+ '(model/evals/timeout) is not applied. Pass the skill NAME (or point at the skill\'s ' +
507
+ 'built dist directory) to honor it.\n');
508
+ }
406
509
  // ---------------------------------------------------------------------------
407
510
  // Testable action
408
511
  // ---------------------------------------------------------------------------
@@ -412,17 +515,40 @@ async function resolveBuildableSubject(ref, flags) {
412
515
  * with a clean message + preflight code (2) instead of surfacing as an unhandled
413
516
  * promise rejection (raw stack trace, exit 1).
414
517
  */
415
- function preflightKnobsAndConfig(skills, options) {
518
+ async function preflightKnobsAndConfig(skills, options, cwd) {
416
519
  try {
417
520
  assertValidAuth(options.auth);
418
521
  assertValidRequireAuth(options.requireAuth);
419
- return { knobs: coerceKnobs(options), config: loadTestConfig(skills) };
522
+ return {
523
+ knobs: coerceKnobs(options),
524
+ config: await loadTestConfig(skills, cwd),
525
+ globalTest: loadGlobalTestConfig(cwd),
526
+ };
420
527
  }
421
528
  catch (err) {
422
529
  process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
423
530
  process.exit(SkillTestExitCode.Preflight);
424
531
  }
425
532
  }
533
+ /**
534
+ * Copy the resolved-subject fields onto the harness options. Optional fields are
535
+ * only assigned when present (exactOptionalPropertyTypes). Extracted so
536
+ * {@link runSkillTestRun} stays within its cognitive-complexity budget.
537
+ */
538
+ function applyResolvedSubject(harnessOpts, subject) {
539
+ harnessOpts.subjectSource = subject.subjectSource;
540
+ harnessOpts.rebuilt = subject.rebuilt;
541
+ harnessOpts.wouldBuild = subject.wouldBuild;
542
+ if (subject.subjectScaffoldDir !== undefined) {
543
+ harnessOpts.subjectScaffoldDir = subject.subjectScaffoldDir;
544
+ }
545
+ if (subject.dryRunStagedExistingDist !== undefined) {
546
+ harnessOpts.dryRunStagedExistingDist = subject.dryRunStagedExistingDist;
547
+ }
548
+ if (subject.declaredExecutables !== undefined) {
549
+ harnessOpts.declaredExecutables = subject.declaredExecutables;
550
+ }
551
+ }
426
552
  /**
427
553
  * The unit-testable action for `vat skill test run`. Exported so tests can
428
554
  * call it directly without parsing CLI args. Calls process.exit on completion.
@@ -434,7 +560,7 @@ function preflightKnobsAndConfig(skills, options) {
434
560
  */
435
561
  export async function runSkillTestRun(skills, options) {
436
562
  printSecurityWarning();
437
- const { knobs, config } = preflightKnobsAndConfig(skills, options);
563
+ const { knobs, config, globalTest } = await preflightKnobsAndConfig(skills, options, process.cwd());
438
564
  // Commander stores the `--no-build` negatable flag under `build` (=== false when set);
439
565
  // honor an explicit programmatic `noBuild` too.
440
566
  const noBuild = options.noBuild === true || options.build === false;
@@ -454,21 +580,16 @@ export async function runSkillTestRun(skills, options) {
454
580
  });
455
581
  }
456
582
  catch (err) {
457
- const exitCode = mapErrorToExitCode(err);
583
+ // A broken governing config surfacing during subject resolution is a preflight
584
+ // problem the user must fix (exit 2), not an internal harness failure (exit 1).
585
+ const exitCode = err instanceof ConfigLoadError ? SkillTestExitCode.Preflight : mapErrorToExitCode(err);
458
586
  process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
459
587
  process.exit(exitCode);
460
588
  return;
461
589
  }
462
- const harnessOpts = buildHarnessOpts(skills, options, knobs, config);
463
- harnessOpts.subjectSource = subject.subjectSource;
464
- harnessOpts.rebuilt = subject.rebuilt;
465
- harnessOpts.wouldBuild = subject.wouldBuild;
466
- if (subject.subjectScaffoldDir !== undefined) {
467
- harnessOpts.subjectScaffoldDir = subject.subjectScaffoldDir;
468
- }
469
- if (subject.dryRunStagedExistingDist !== undefined) {
470
- harnessOpts.dryRunStagedExistingDist = subject.dryRunStagedExistingDist;
471
- }
590
+ warnIfPathTargetBypassesConfig(subject);
591
+ const harnessOpts = buildHarnessOpts(skills, options, knobs, config, globalTest);
592
+ applyResolvedSubject(harnessOpts, subject);
472
593
  try {
473
594
  const result = await runSkillTestHarness(harnessOpts);
474
595
  process.stderr.write(`Harness: ${result.harnessPath}\n`);
@@ -500,8 +621,8 @@ export function createSkillTestRunCommand() {
500
621
  .argument('<skill...>', 'Skill name(s) to test (primary subject set)')
501
622
  .option('--with <pair...>', 'Inject a declared-dependency skill as name=<src>, where <src> is workspace:<pkg> | npm:<spec> | url:<u> | path:<dir> | vendored (e.g. mydep=npm:@scope/s@1.2.3)')
502
623
  .option('--with-optional <pair...>', 'Inject an optional skill as name=<src> (same syntax as --with)')
503
- .option('--env <pair...>', 'Inject an env var into the experimenter spawn as KEY=VALUE (repeatable). Values support ${fixturesDir}, ${stagedSkillDir}, ${harnessRoot}, ${resultsDir}. CLI overrides config for the same key.')
504
- .option('--pass-env <key...>', 'Forward a host env var by NAME to the experimenter spawn if present (repeatable). Protected names (PATH, auth, model) are ignored.')
624
+ .option('--env <pair...>', 'Inject an env var into the executor spawn as KEY=VALUE (repeatable). Values support ${fixturesDir}, ${stagedSkillDir}, ${harnessRoot}, ${resultsDir}. CLI overrides config for the same key.')
625
+ .option('--pass-env <key...>', 'Forward a host env var by NAME to the executor spawn if present (repeatable). Protected names (PATH, auth, model) are ignored.')
505
626
  .option('--refresh', 'Force a full re-stage (ignore existing staged content)')
506
627
  .option('--no-build', 'Skip building a declared skill; stage its existing dist instead (errors if absent)')
507
628
  .option('--workdir <dir>', 'Override the harness working directory')
@@ -511,14 +632,16 @@ export function createSkillTestRunCommand() {
511
632
  .option('--auth <mode>', 'Auth mechanism: inherit | subscription | api-key | auto')
512
633
  .option('--require-auth <mech>', 'Require a specific auth mechanism: subscription | api-key')
513
634
  .option('--baseline', 'Enable A/B baseline run (with/without skill)')
514
- .option('--fail-on-eval-failure', 'Exit non-zero when any eval fails (default: the run exits 0 if the harness completed and produced grading.json; eval pass/fail is in the summary).')
635
+ .option('--allow-eval-failure', 'Opt out of the fail-closed default: exit 0 even when an eval fails (for interactive use). By DEFAULT a failing eval exits 4, distinct from the harness-broke codes (1/2/3) so CI can gate on it.')
515
636
  .option('--allow-unverified-skill-source', 'Skip the vendored manifest integrity check')
516
637
  .option('--i-understand-this-runs-skill-code', 'Acknowledge this command executes skill code (required)')
517
- .option('--model <id>', "Model ID passed VERBATIM to `claude --model <id>` (VAT does no mapping/validation; e.g. opus, sonnet, claude-opus-4-8). Omit to use claude's own default model.")
518
- .option('--max-turns <n>', 'Cap on experimenter turns (positive integer)')
638
+ .option('--model <id>', "Model ID passed VERBATIM to `claude --model <id>` for the model UNDER TEST (the executor). VAT does no mapping/validation (e.g. opus, sonnet, claude-opus-4-8). Omit to use claude's own default model. Independent of --grader-model.")
639
+ .option('--grader-model <id>', 'Model for the fixed grader/judge, passed VERBATIM to `claude --model` (default claude-sonnet-5). GLOBAL (top-level `test:` config), independent of --model (the model UNDER TEST).')
640
+ .option('--max-turns <n>', 'Per-spawn cap on executor/grader turns (positive integer)')
519
641
  .option('--max-budget-usd <n>', 'Hard USD budget cap (positive number)')
520
642
  .option('--timeout <s>', 'Wall-clock timeout in seconds (positive integer)')
521
643
  .option('--stall <s>', 'Stall-watchdog in seconds (positive integer)')
644
+ .option('--concurrency <n>', 'Max evals graded in parallel (positive integer; default 4)')
522
645
  .option('--debug', 'Enable debug logging')
523
646
  .action(runSkillTestRun)
524
647
  .addHelpText('after', `
@@ -526,9 +649,10 @@ Description:
526
649
  Stages the named skill(s) into a fresh temp harness (context isolation: a
527
650
  scrubbed env allowlist and no user/project settings -- NOT an OS security
528
651
  sandbox), runs preflight checks (claude binary, auth, eval inputs, budget),
529
- then spawns a headless Claude session with a non-interactive experimenter
530
- prompt. The experimenter grades each eval against the skill's expectations
531
- and writes grading.json.
652
+ then runs a vat-owned executor->grader pipeline: per eval, a blind executor
653
+ Claude session performs the task and a separate grader session judges its
654
+ transcript against the skill's expectations. VAT merges the grader results and
655
+ writes grading.json.
532
656
 
533
657
  IMPORTANT: This command EXECUTES the skill's code with your user account's
534
658
  full privileges (filesystem, network, shell) and a reachable auth credential.
@@ -536,23 +660,40 @@ Description:
536
660
  to acknowledge this and proceed.
537
661
 
538
662
  Model:
539
- --model <id> is passed straight through to the experimenter spawn as
540
- \`claude --model <id>\` (verbatim -- VAT does not map or validate it). With no
541
- --model, no flag is passed and claude picks its own default. The selected
542
- model is echoed to stderr ("Model: <id>") on every run, and the --dry-run
543
- output shows the model flag that would be passed (not the full argv — budget,
544
- turns, and permission flags are added at spawn time).
663
+ --model <id> selects the model UNDER TEST (the executor spawn): passed
664
+ straight through as \`claude --model <id>\` (verbatim -- VAT does not map or
665
+ validate it). With no --model, no flag is passed and claude picks its own
666
+ default. The selected model is echoed to stderr ("Model: <id>") on every run,
667
+ and the --dry-run output shows the model flag that would be passed (not the
668
+ full argv — budget, turns, and permission flags are added at spawn time).
669
+
670
+ --grader-model <id> is INDEPENDENT of --model: it selects the fixed judge
671
+ that grades every eval's transcript (default claude-sonnet-5), so grading
672
+ stays comparable across runs even as the model under test changes. This is a
673
+ GLOBAL setting (top-level \`test:\` config node), not per-skill. Precedence:
674
+ --grader-model flag > top-level config \`test.graderModel\` > built-in default.
675
+ --concurrency follows the same GLOBAL precedence for the executor->grader
676
+ pipeline width (default 4).
545
677
 
546
678
  Exit Codes:
547
- 0 - Harness ran to completion and produced a valid grading.json (check summary/grading.json for pass/fail counts)
548
- 1 - Internal error (grading.json absent/invalid, summary/expectations skew, experimenter crash, stall/timeout)
679
+ 0 - Harness ran to completion and every eval passed (or --allow-eval-failure suppressed a failing verdict)
680
+ 1 - Internal error (grader fragment absent/invalid, summary/expectations skew, executor/grader crash, stall/timeout)
549
681
  2 - Preflight failed (missing binary, auth error, eval inputs absent, unsafe workdir, ack missing, skill build failed, or --no-build with no existing dist)
550
682
  3 - Bootstrap needed: evals.json was absent, so VAT wrote a starter template next to the skill source. Fill it in and re-run.
551
- 4 - An eval FAILED and --fail-on-eval-failure was passed (the harness completed; expectations did not all pass). Without the flag this is exit 0.
683
+ 4 - An eval FAILED (the harness completed and produced a valid grading.json; expectations did not all pass). This is the fail-closed DEFAULT -- suppress with --allow-eval-failure.
684
+
685
+ The taxonomy is designed so a CI consumer can tolerate eval failures while
686
+ failing closed on every other (harness-broke) outcome:
687
+
688
+ vat skill test run my-skill --i-understand-this-runs-skill-code
689
+ case $? in
690
+ 0) ;; # all evals passed
691
+ 4) ;; # evals failed but the harness is healthy -- tolerate/warn
692
+ *) exit 1 ;; # 1/2/3/unknown -- harness broke, fail the build
693
+ esac
552
694
 
553
- Note: by DEFAULT, eval pass/fail is NOT reflected in the exit code -- read the
554
- printed summary ("PASS N/N" or "FAIL N/N") or grading.json. Pass
555
- --fail-on-eval-failure to make a failing eval exit 4 (e.g. to gate CI).
695
+ Which specific evals failed lives in grading.json, never in the exit code.
696
+ For interactive iteration, --allow-eval-failure downgrades 4 to 0.
556
697
 
557
698
  Example:
558
699
  $ vat skill test run my-skill --i-understand-this-runs-skill-code