vx info
vx info prints one screen of facts about the workspace and this
machine, for bug reports and sanity checks. The task count and the
sandbox row’s declared count come from the same load a run uses: the
lock, plugin stages included. vx info evaluates no config; with no
lock, or one a run would refuse, both counts are zero and
projects lock says no — a broken config is vx lock’s to report.
vx info [--format pretty|json] [--cache-dir <path>]Example
Section titled “Example”$ vx info
─ vx info ──────────────────────────────────────────────────── vx 0.0.0 bun 1.4.2 git 2.53.0 git status cache core.fsmonitor, core.untrackedCache off workspace root /work/repo projects 12 (34 tasks) plugins 2 — @vzn/vx-reapi (executor, cache); @vzn/vx-otel (telemetry) workers 2 — cgroup CPU quota 2 of 8 cores memory 13 GB usable — cgroup limit; the machine has 16 GB cache dir /work/repo/.vx/cache (8.2 MB, this workspace's run history) cache store /home/me/.vx/3f2a9c1e7b4d5a60/cache (1.3 GB, shared by this repo's checkouts) cache versions keys vx-cache-v48 · index schema v49 cache entries 42 (1.3 GB) orphans 3 artifacts (12 MB) the index does not know — `vx cache clean` reaps them task runs (24h) 7 (5 cache hits) flaky tasks 1 — web#test (3 of 11 runs failed on unchanged inputs) sandbox available (9 tasks declare exec.sandbox) projects lock yesOptions
Section titled “Options”| Option | Meaning |
|---|---|
--format pretty|json |
json prints the same facts as one typed object, below |
--cache-dir <path> |
read the cache a run with the same flag uses |
Understanding the output
Section titled “Understanding the output”gitshows(not found)when the binary is missing.git status cache: vx runs ONEgit statusper run to find dirty and untracked files, and on a large tree that walk is the warm run’s critical path. git’score.fsmonitor(a daemon that watches the worktree) andcore.untrackedCachemake it near-free after the first run; both are off by default, sovx infosays when they are.sandboxis the runtime probe’s verdict for THIS host — one sandboxedtrue, memoized — and how many loaded tasks declareexec.sandbox. A declared sandbox whose runtime cannot start fails the task at run time rather than downgrading, sounavailable — <why>; 3 tasks declare exec.sandbox and will failsays it first: root inside a container (the runtime’s seccomp helper cannot create its nested user namespace; run as a non-root user or setsandbox.weakerWhenNested: true), a missing bubblewrap, socat or ripgrep, a nested seatbelt on macOS. On Linux an available sandbox that cannot report the reads it denies (nostraceon PATH, one whose--versionfails, or one that may not attach) adds, untraced — <why>, so the reads it denies go unreported: the sandbox still enforces, but a task that tolerates a denied read passes and caches with no word of it. The--format jsonfact issandbox.untraced, the reason ornull.pluginsnames every plugin.vx/workspace.*declares and the seams each fills, in pipeline order (config,discover,project,graph,key,fingerprint,schedule,admit,executor,cache,telemetry,output,setup,commands), ornone. It reads the declarations: a plugin that declines a task at run time still lists its seam here.workersis the count a run defaults to and where it comes from:.vx/workspace.ts’srun.concurrencywhen set, else the cores this process may use — the CPU count, capped by the cgroup CPU quota a container runs under (8 — the CPU count,2 — cgroup CPU quota 2 of 8 cores).memoryis what a memory-packing policy budgets (@vzn/vx-history): the machine’s total, capped by the cgroup limit — inside a container the raw numbers are the host’s, and the doctor is where to see which one a run reads.flaky tasksis the standing list a run’s flaky notes add to: every task whose history (30 days, what the cache keeps) holds a cache key that failed after it had passed, most failures first, with the outcomes over those keys. A cache hit counts as a pass (it replayed one), and a pass that took a retry counts too, its failed attempts counted as failures. A task with no cache block keys on its config alone, so its key says nothing about its inputs: it is never listed. A pass or a failure behind a failed dependency, in a run that continues past failures, is not its key’s and counts on no key.nonewhen no key did.task runs (24h)counts task runs, executed and replayed alike, so the hits are a share of it: threevx runof two tasks are six. An invocation is whatvx lastcalls a run;vx last --listcounts those.cache dirholds the index and this workspace’s run history; its size is on disk.cache storeis where the entries and their artifacts live: the store shared by this repo’s checkouts (docs/caching.md), with its size on disk, ornone: the cache dir holds the entrieswhen the workspace names its cache dir. Before a first run it is the store a run would open. A barevx cache cleanfrees both sizes.cache entriescounts the entries and their size. Paths under the home directory print as~/…; the JSON keeps them absolute.cache policyis the policy avx runtakes when no flag names one, and where it comes from (VX_CACHE_POLICY,.vx/workspace’scache.policy, or the default, every layer on, remote writes off off CI);cache scopeisVX_CACHE_SCOPE’s, or none: a run then takes a plugin’s (github()), else the branch’s from git.cache versionsare the two constants a bug report needs and the reset notice names: the key prefix (CACHE_VERSION; a bump orphans every entry) and the index schema (SCHEMA_VERSION; a mismatch drops every table on the next open, which the run then says once).orphansappears only when the cache directory holds artifacts or save temps the index has no row for, older than an hour (what aSCHEMA_VERSIONreset leaves behind; a fresh one is a save in flight). A task that asks for one’s key again indexes it and hits; the rest onlyvx cache cleanreclaims, so the doctor says so.
--format json prints the same facts as one typed object, for a
script or a bug-report template: vx, vxPath (the file that ran),
handedOffFrom (the vx that handed the call to the project’s own, else
null), bun, bunSupported (false
below Bun 1.4.4), git (null when not
found), gitStatusCache ({ fsmonitor, untrackedCache }, null when
git could not answer), workspaceRoot, projects, tasks,
plugins ([{ name, seams }]), workers ({ count, source, cores, cpuQuota }, the source one of workspace / cgroup / cores,
cpuQuota in cores or null), memory ({ usableBytes, totalBytes, cgroupLimitBytes }, the limit null when none binds), cacheDir, cacheDirBytes
(on disk: the index and run history), cacheStore (null when the cache
dir holds the entries), cacheStoreBytes (on disk, null with no store), cacheVersion,
schemaVersion, cacheEntries, cacheBytes, settings (every
setting by path, { value, source }, source one of env /
workspace / default, value null for the default),
orphans ({ artifacts, bytes }, always present), runs24h, hits24h (task
runs, as the row), restored24h (of those hits, the ones that restored
outputs; the rest found them up to date), flakyTasks ([{ taskId, project, task, keys, passes, failures }],
empty when none), lockfile, sandbox ({ available, reason, declared, untraced }, declared the count of tasks with exec.sandbox,
untraced the reason denied reads go unreported or null). The
pretty rows render this object;
there is no second source.
Exit codes
Section titled “Exit codes”| Code | When |
|---|---|
0 |
the facts printed, with no lock included |
1 |
no workspace here or above, or a parse error |