No runs inside runs
A vx run inside a task of the same workspace is refused, with the reason.

A task that calls vx run hides its work from the graph: it escapes the schedule, the concurrency limit and the cache key, and a loop back to itself forks without end.
vx marks every task it starts and refuses the nested run, pointing you at dependsOn.
// what it prints
$ vx run @demo/api#nested
vx: task @demo/api#nested runs `vx run` inside its own workspace … Declare what it needs with dependsOn instead.More in Config

One command per task
A task is a shell command with edges and a cache block; nothing boots in between.

Rules that catch slow configs
Checks for configs that would make runs slow or wrong, on by default, each one optional.

A config that hangs, named
A config whose evaluation runs away fails after a deadline, naming the file.

Config with autocomplete
defineProject gives you completion and errors while you type.

Presets are just functions
Share task setups across projects with a TypeScript function, no new concept.

Config errors that point
A bad config fails at load with the file, the line and the key, no stack trace.