You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,15 +6,15 @@
6
6
7
7
-[#19](https://github.com/callstackincubator/skillgym/pull/19)[`ae5aed5`](https://github.com/callstackincubator/skillgym/commit/ae5aed524592b954be6225d4d47d16e3bbcd35f4) Thanks [@V3RON](https://github.com/V3RON)! - Classify assertion failures (for example timeouts vs expectation mismatches) and show the kind in standard, JSON summary, and GitHub Actions output.
8
8
9
-
-[#20](https://github.com/callstackincubator/skillgym/pull/20)[`39393cc`](https://github.com/callstackincubator/skillgym/commit/39393cc07cb22ce713e35f9fc2dd86b56a4ffa19) Thanks [@V3RON](https://github.com/V3RON)! - Add soft assertions so a test case can record multiple failures and report them together instead of stopping at the first one.
9
+
-[#20](https://github.com/callstackincubator/skillgym/pull/20)[`39393cc`](https://github.com/callstackincubator/skillgym/commit/39393cc07cb22ce713e35f9fc2dd86b56a4ffa19) Thanks [@V3RON](https://github.com/V3RON)! - Add soft assertions so a case can record multiple failures and report them together instead of stopping at the first one.
10
10
11
11
## 0.6.0
12
12
13
13
### Minor Changes
14
14
15
15
-[#10](https://github.com/callstackincubator/skillgym/pull/10)[`adb3708`](https://github.com/callstackincubator/skillgym/commit/adb3708a8cb234b79f3acd6356c6f249736363ea) Thanks [@V3RON](https://github.com/V3RON)! - You can now mark known failures so expected problems do not block a run.
16
16
17
-
-[`ff92fea`](https://github.com/callstackincubator/skillgym/commit/ff92fea9a4c316729ecb4e21ba2b3909e9ff82f1) Thanks [@V3RON](https://github.com/V3RON)! - You can now filter benchmark runs by tag.
17
+
-[`ff92fea`](https://github.com/callstackincubator/skillgym/commit/ff92fea9a4c316729ecb4e21ba2b3909e9ff82f1) Thanks [@V3RON](https://github.com/V3RON)! - You can now filter benchmark executions by tag.
18
18
19
19
-[`ff92fea`](https://github.com/callstackincubator/skillgym/commit/ff92fea9a4c316729ecb4e21ba2b3909e9ff82f1) Thanks [@V3RON](https://github.com/V3RON)! - Asserting on commands is now easier and more reliable.
20
20
@@ -28,4 +28,4 @@
28
28
29
29
-[`ff92fea`](https://github.com/callstackincubator/skillgym/commit/ff92fea9a4c316729ecb4e21ba2b3909e9ff82f1) Thanks [@V3RON](https://github.com/V3RON)! - Benchmark suites now use available CPU capacity more efficiently.
30
30
31
-
-[`ff92fea`](https://github.com/callstackincubator/skillgym/commit/ff92fea9a4c316729ecb4e21ba2b3909e9ff82f1) Thanks [@V3RON](https://github.com/V3RON)! - The basic example now includes the latest max-steps scenario.
31
+
-[`ff92fea`](https://github.com/callstackincubator/skillgym/commit/ff92fea9a4c316729ecb4e21ba2b3909e9ff82f1) Thanks [@V3RON](https://github.com/V3RON)! - The basic example now includes the latest max-steps case.
Copy file name to clipboardExpand all lines: README.md
+23-23Lines changed: 23 additions & 23 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@
8
8
9
9
## Why it's useful
10
10
11
-
When you evaluate agent skills manually, it is hard to tell whether the agent actually selected the right skill, used it at the right time, and behaved correctly end to end. `skillgym` gives you a repeatable way to run real sessions, preserve session artifacts, verify outcomes with TypeScript assertions, and catch token regressions with snapshots.
11
+
When you evaluate agent skills manually, it is hard to tell whether the agent actually selected the right skill, used it at the right time, and behaved correctly end to end. `skillgym` gives you a repeatable way to run real sessions, preserve session artifacts, verify results with TypeScript assertions, and catch token regressions with snapshots.
12
12
13
13
## Supported runners
14
14
@@ -75,10 +75,10 @@ export default config;
75
75
Create a suite file such as `./skillgym/basic-suite.ts`:
76
76
77
77
```ts
78
-
importtype { TestSuite } from"skillgym";
78
+
importtype { Suite } from"skillgym";
79
79
import { assert } from"skillgym";
80
80
81
-
const suite:TestSuite= [
81
+
const suite:Suite= [
82
82
{
83
83
id: "always-passes",
84
84
prompt: "Say only: skillgym ready",
@@ -113,7 +113,7 @@ npx skillgym skills list
113
113
npx skillgym skills get core
114
114
```
115
115
116
-
Explain a failed run by resuming the original runner session from the exact failed leaf artifact directory:
116
+
Explain a failed execution by resuming the original runner session from the exact failed artifact directory:
- a `skillgym.config.*` file with a non-empty `runners` map
138
138
- at least one configured runner with `agent.type` and `agent.model`
139
139
- the corresponding CLI installed and working in your environment
140
-
- a suite file that exports test cases
140
+
- a suite file that exports cases
141
141
142
142
Config is discovered upward from the suite file directory. CLI flags override config values.
143
143
@@ -148,21 +148,21 @@ Use `agent.model` instead of `commandArgs` when you need to select the agent mod
148
148
149
149
A runner is one configured agent target. It tells `skillgym` which CLI to launch and which model to use for a run.
150
150
151
-
Each test case runs once per selected runner. For example, 3 cases and 2 runners produce 6 executions.
151
+
Each case runs once per selected runner. For example, 3 cases and 2 runners produce 6 executions.
152
152
153
153
## Configuration
154
154
155
155
Most important config properties:
156
156
157
-
-`run.cwd`: working directory used for shared-workspace runs
158
-
-`run.outputDir`: where artifacts, reports, and preserved workspaces are written
157
+
-`run.cwd`: working directory used for shared-workspace executions
158
+
-`run.outputDir`: suite-run artifact directory where artifacts, reports, and preserved workspaces are written
159
159
-`run.reporter`: built-in `standard` reporter or a custom reporter module path
160
160
-`run.schedule`: execution scheduling mode for case x runner pairs
161
161
-`run.maxParallel`: maximum concurrent executions for non-serial schedules, defaulting to available CPU parallelism
162
162
-`run.repeat`: require this many successful repetitions per case x runner execution
163
-
-`run.repeatFailure`: retry the current repetition up to this many additional attempts after failure
163
+
-`run.repeatFailure`: retry the current repetition up to this many additional sessions after failure
164
164
-`run.retryFailed`: compatibility alias for `run.repeatFailure`
165
-
-`run.maxSteps`: best-effort limit on streamed agent steps before skillgym terminates the run
165
+
-`run.maxSteps`: best-effort limit on streamed agent steps before skillgym terminates the execution
166
166
-`run.workspace`: default workspace mode for the suite
167
167
-`defaults.timeoutMs`: default per-case timeout
168
168
-`runners.<id>.agent.type`: which agent integration to use, currently `opencode`, `codex`, `claude-code`, or `cursor-agent`
@@ -181,15 +181,15 @@ The execution unit is one case x runner pair. `skillgym` expands the suite into
181
181
182
182
For concurrent schedules, `run.maxParallel` defaults to `os.availableParallelism()`. This limits how many SkillGym executions are active at once; it does not pin or limit CPU cores used by an individual agent process.
183
183
184
-
Concurrent schedules do not copy or isolate the workspace by themselves. Overlapping runs may still interact through the same filesystem state and live runner output unless you use isolated workspaces. OpenCode, Codex, and Claude Code runtime state are isolated per run under each artifact directory.
184
+
Concurrent schedules do not copy or isolate the workspace by themselves. Overlapping executions may still interact through the same filesystem state and live runner output unless you use isolated workspaces. OpenCode, Codex, and Claude Code runtime state are isolated per execution under each artifact directory.
185
185
186
-
`run.repeat` is useful when you want stability sampling instead of a single lucky pass. Each case x runner execution keeps running until it records the requested number of successful classified outcomes, or stops early when one repetition still fails after exhausting `run.repeatFailure` retries.
186
+
`run.repeat` is useful when you want stability sampling instead of a single lucky pass. Each case x runner execution keeps running until it records the requested number of successful classified results, or stops early when one repetition still fails after exhausting `run.repeatFailure` retries.
187
187
188
-
`run.repeatFailure` retries only the current repetition when it still counts as failed after result classification. SkillGym keeps all repetition and retry artifacts, averages visible duration and token metrics across the final outcomes of completed successful repetitions, and preserves the full nested detail in `results.json`.
188
+
`run.repeatFailure` retries only the current repetition when it still counts as failed after result classification. SkillGym keeps all repetition and retry artifacts, averages visible duration and token metrics across the final results of completed successful repetitions, and preserves the full nested detail in `results.json`.
189
189
190
-
Artifacts for repeated runs are grouped under the stable case x runner directory using `repeat-N` directories, with retry attempts nested as `attempt-N` inside the repetition that needed recovery.
190
+
Artifacts for repeated executions are grouped under the stable case x runner directory using `repeat-N` directories, with retry sessions nested as `session-N` inside the repetition that needed recovery.
191
191
192
-
`run.maxSteps` is enforced on a best-effort basis by monitoring each runner's streamed JSONL output. A step is one observed model round, not one token and not necessarily one tool call, but the exact boundary is still runner-defined, so the same prompt may consume different numbers of steps across agents. When the observed step count exceeds the configured limit, skillgym kills the agent process, fails the run with origin `max-steps`, and preserves raw stdout/stderr artifacts for debugging. No partial normalized report is produced for that failure.
192
+
`run.maxSteps` is enforced on a best-effort basis by monitoring each runner's streamed JSONL output. A step is one observed model round, not one token and not necessarily one tool call, but the exact boundary is still runner-defined, so the same prompt may consume different numbers of steps across agents. When the observed step count exceeds the configured limit, skillgym kills the agent process, fails the execution with origin `max-steps`, and preserves raw stdout/stderr artifacts for debugging. No partial session report is produced for that failure.
193
193
194
194
## Workspaces
195
195
@@ -200,7 +200,7 @@ A workspace is the directory where an execution runs.
200
200
-`shared`: run directly in one real directory
201
201
-`isolated`: create a fresh temporary workspace per case x runner execution
202
202
203
-
Use `shared` when you want the agent to work against your real project checkout. Use `isolated` when you want clean filesystem state per execution or need to prepare each run from a template.
203
+
Use `shared` when you want the agent to work against your real project checkout. Use `isolated` when you want clean filesystem state per execution or need to prepare each execution from a template.
204
204
205
205
You can configure workspaces in `skillgym.config.*` with `run.workspace`, or per suite with a named `workspace` export. Suite-level workspace config overrides config-level `run.workspace`.
206
206
@@ -217,15 +217,15 @@ export const workspace = {
217
217
};
218
218
```
219
219
220
-
In isolated mode, each execution gets its own workspace. `templateDir` copies a starter project into that workspace, and `bootstrap` runs before the agent starts. Successful isolated runs are cleaned up; failed ones are preserved under `outputDir/workspaces` for debugging.
220
+
In isolated mode, each execution gets its own workspace. `templateDir` copies a starter project into that workspace, and `bootstrap` runs before the agent starts. Successful isolated executions are cleaned up; failed ones are preserved under `outputDir/workspaces` for debugging.
221
221
222
222
See [Workspaces](docs/workspaces.md) for the full workspace reference.
223
223
224
224
## Assertions
225
225
226
226
`assert` extends Node's `node:assert/strict` helpers, so standard methods like `assert.ok`, `assert.equal`, and `assert.match` still work.
227
227
228
-
`assert.soft.*` mirrors the same sync assertion surface and collects failures until the current test case finishes, so one run can report multiple assertion mismatches together.
228
+
`assert.soft.*` mirrors the same sync assertion surface and collects failures until the current case finishes, so one execution can report multiple assertion mismatches together.
When at least one explainable assertion fails, skillgym writes `explain.json` into the failed leaf artifact directory. Running `skillgym explain <artifactDir>` resumes the original runner session, asks each persisted question, and writes `explanations.json` with the answers.
272
+
When at least one explainable assertion fails, skillgym writes `explain.json` into the failed artifact directory. Running `skillgym explain <artifactDir>` resumes the original runner session, asks each persisted question, and writes `explanations.json` with the answers.
273
273
274
-
For historical isolated-workspace runs, deferred explain currently depends on the recorded workspace still being resumable by the underlying runner.
274
+
For historical isolated-workspace executions, deferred explain currently depends on the recorded workspace still being resumable by the underlying runner.
275
275
276
276
See the [assertion reference](docs/assertions.md).
277
277
See [Deferred Explain](docs/explain.md).
278
278
279
279
## Snapshots
280
280
281
-
Snapshot checks can fail runs when token usage regresses beyond a configured tolerance.
281
+
Snapshot checks can fail executions when token usage regresses beyond a configured tolerance.
282
282
283
283
```bash
284
284
npx skillgym run ./examples/basic-suite.ts --update-snapshots
@@ -294,7 +294,7 @@ The [skill selection suite](examples/skill-selection-suite.ts) targets a real in
294
294
npx skillgym run ./examples/skill-selection-suite.ts
295
295
```
296
296
297
-
The [workspace isolation suite](examples/workspace-isolation-suite.ts) demonstrates isolated workspace setup with a template directory and bootstrap command:
297
+
The [workspace isolation suite](examples/workspace-isolation-suite.ts) demonstrates an isolated workspace with a template directory and bootstrap command:
298
298
299
299
```bash
300
300
npx skillgym run ./examples/workspace-isolation-suite.ts
@@ -311,7 +311,7 @@ npx skillgym run ./examples/failure-classification-suite.ts
311
311
The documentation site is at [incubator.callstack.com/skillgym](https://incubator.callstack.com/skillgym/). Repository docs:
When at least one explainable assertion fails, `skillgym` writes `explain.json` into the failed leaf artifact directory. You can later resume the original runner session with `skillgym explain <artifactDir>`.
133
+
When at least one explainable assertion fails, `skillgym` writes `explain.json` into the failed artifact directory. You can later resume the original runner session with `skillgym explain <artifactDir>`.
0 commit comments