Skip to content

Regression scenarios

A regression scenario is one standing check: a named thing the platform can run on its own, again and again, after the work that needed it is finished. Most of them are registered for you when a branch merges, and nightly checks is the page that explains when. This one is the lookup table for what a scenario holds.

Scenarios live on the Regression Testing page, on its Scenarios tab.

FieldWhat it holds
scenarioIdThe identifier, unique in the workspace. A scenario registered by a merge is task: or huddle: followed by the id it came from, which is what makes a second merge update it instead of adding a copy
nameWhat the list shows. A registered per-task check is named <task key> acceptance, so SUM-15 acceptance
descriptionFree text, for a scenario somebody wrote by hand
kindnightly or smoke. Only nightly scenarios run in the nightly sweep, and only a nightly result raises a fix task
enabledSwitching it off leaves the record in place and takes it out of the sweep
configEverything about how the scenario runs, as JSON. The only part the editor lets you change
sourceTaskIdThe task this scenario replays. Written by the platform on the merge, and preserved when you edit the configuration
huddleIdThe huddle whose merge registered it, when there was one
createdAt, updatedAtTimestamps

sourceTaskId and huddleId are lineage rather than settings: they are what links a night’s failure back to the work that shipped it, and what a fix task is filed under. The editor keeps them out of the JSON you edit so a hand save cannot clear them.

config.exec picks the mode. A configuration that does not name one is command, so a scenario written before the other two modes existed keeps the behavior it had.

execWhat it runsWhere it runsWhere it comes from
commandOne command, with assertions applied to the output it printedThe control plane, with no copy of any repositoryWritten by hand
runA full agent run against a repository, with optional judges reading the resultA runnerWritten by hand, and registered by a merge for a huddle whose final check needs a live agent
checkoutA fresh copy of a branch, the setup commands, then the acceptance checks and negative cases the task shipped with. No agent, no commit, no pushA runnerRegistered by a merge, one per merged task

Every mode has to be claimed by the nightly sweep and by the dispatcher before it can run at all, so a mode cannot be added and then quietly go nowhere.

{
"exec": "checkout",
"checkout": {
"repoRef": "https://github.com/alpenglow/summitline-app.git",
"branch": "main"
},
"prepare": [["pnpm", "install"]],
"checks": [
{
"criterionId": "AC1",
"argv": ["pnpm", "test", "elevation"],
"expect": { "exit": 0 }
},
{
"id": "NC1",
"gate": "scripts/check-elevation.mjs",
"plant": [["node", "scripts/plant-flat-profile.mjs"]],
"expect": { "exit": "nonzero" }
}
],
"acceptanceCriteria": ["The elevation profile renders at full height on Safari"],
"toolchain": {
"language": "node",
"packageManager": "pnpm",
"prepare": [["pnpm", "install"]],
"verify": [["pnpm", "test"], ["pnpm", "lint"]],
"testFileGlobs": ["**/*.test.ts"]
}
}
KeyWhat it is
checkout.repoRefThe repository to clone
checkout.branchThe branch to clone, which is the branch the work merged into. A checkout scenario pins a branch rather than following the default one, so it cannot drift when the default moves
prepareThe setup commands, one argv array each. These are what runs before any check
checksThe acceptance checks and the negative cases, in one array. An entry with criterionId is an acceptance check and has to exit 0; an entry with id is a negative case, which plants its violation and then requires the gate to reject it
acceptanceCriteriaThe criteria the checks are paired with, copied from the task. AC1 means the first of them, so a criterion and its check cannot drift apart
toolchainHow the repository is built and tested, copied from the task. Its verify commands are not run by a nightly check: they are your repository’s own gates and they belong to the run and to your CI

Every value in a registered scenario is copied from the merged task. Nothing here is written by an agent at registration time, and nothing is inferred.

Saving a checkout scenario is refused, with the missing piece named, when any of the following is true. The rule is applied when you save rather than at two in the morning, so a scenario that would fail to start is never stored.

  • checkout.repoRef or checkout.branch is missing.
  • checks is empty.
  • acceptanceCriteria is empty or absent.
  • The acceptance checks do not cover the criteria: there has to be exactly one AC check per criterion, numbered from the first.
  • toolchain.verify is empty.

A command scenario may not name a repository

Section titled “A command scenario may not name a repository”

A command scenario runs on the control plane, and it has no copy of any repository to run in. So a command configuration that names one is refused when you save it, rather than accepted and then ignored.

The rule is on the field name and not on the text: repoRef, checkout and run are refused anywhere in the configuration, at any nesting depth, whatever their value. A command whose assertion text happens to quote a git URL is fine, because what the rule is about is a repository named as a setting and then silently dropped.