Glossary

One entry per term, alphabetically. Each links to the page that covers it in depth — read this page for the precise meaning, then follow the link for the worked example.

Ambiguity

The failure mode when Lattice cannot pick a single driver for an auto workspace: two tools of the same role both have evidence, or a workspace shows only a bare generic marker (a lone package.json, pom.xml, …) with no tool-unique signal. Lattice never guesses in this case — it halts before any task runs and prints a copy-pasteable engines fix (AmbiguityError, crates/lattice-workspace/src/lib.rs:354-386). See Driver detection.

Cache hit

The outcome when a task’s cache key matches a stored entry and that entry passes the integrity check: its metadata parses, its tarball opens, and the tarball’s sha256 matches the digest recorded when it was written. Only then does Lattice restore the stored outputs instead of running the command. See Caching.

Cache key

The sha256 hash that identifies a task’s result: a domain-separated, length-prefixed digest over the task name, its resolved command, every file matched by inputs (minus ignore, contents included), any tool-unique lockfile evidence present in the workspace, the resolved value of every env variable the task names, the toolchain identity, and the running Lattice version (compute_key, crates/lattice-cache/src/lib.rs:353-408). Change any one input and the key changes. See Cache internals.

Cache miss

Anything that isn’t a cache hit: no stored entry for the key, missing metadata, a tarball that won’t open, or a tarball whose digest doesn’t match the recorded one. A miss only ever costs a re-run — it never hands back the wrong output. See Caching.

Drift

The gap between the latticeVersion pinned in the nearest lattice.json and the binary actually running. When a managed binary under .lattice/bin drifts from the pin, Lattice installs the pinned version and hands the invocation to it before anything runs; the interactive-only version-drift nag is the advisory version of the same check for a binary Lattice didn’t install (crates/lattice/src/drift.rs). See Upgrading.

Driver

The tool that turns a workspace’s named task into a real shell command — pnpm, cargo, go, gradle, and around 30 others Lattice recognizes by fingerprint (DRIVERS, crates/lattice-workspace/src/lib.rs:70-288). Not to be confused with an engine: a driver runs tasks, an engine is a versioned tool a workspace needs on its PATH or provisioned. The same name can be both — cargo is a driver (it invokes cargo build) and also appears in WELL_KNOWN_ENGINES (its version can be constrained) — but the two concepts are resolved independently. See Driver detection.

Engine

A versioned tool named under enginesnode, rust, go, or anything else with a version constraint that matters, string-form for a well-known name or object-form (version, versionCmd, installCmd, bin) for anything else (EngineSpec, crates/lattice-config/src/lib.rs:33-83). An engine’s shape — not its name — selects host mode, validate-only, or provisioning. Not to be confused with a driver: an engine is what Lattice makes sure is the right version; a driver is what Lattice invokes to run a task. See Engines and provisioning.

Filter

The -f/--filter <PATTERN> flag on lattice run, which keeps only workspaces whose name contains PATTERN (a substring match, not a glob) before the task graph is built. Filtering removes a non-matching workspace from the graph entirely — it never pulls in that workspace’s dependencies, and it is never an error, even when nothing matches (crates/lattice/src/commands/run.rs:39,107-111). See Selecting what runs.

Host mode

The engine mode when a constraint has neither a version nor an installCmd: Lattice trusts whatever the driver or task finds on PATH and checks nothing (EngineMode::HostPath, crates/lattice-workspace/src/toolchain.rs:19-20; selected by classify, crates/lattice-workspace/src/toolchain.rs:85-100). See Engines and provisioning.

Inputs

The inputs field on a task: glob patterns for the files whose contents enter the cache key. A task with no inputs has no files in its key at all, so an unchanged command with an unchanged environment always hits, even after its source changes (crates/lattice-config/src/lib.rs:113). See Caching.

Lockfile evidence

A lockfile or wrapper file only one tool produces — pnpm-lock.yaml, bun.lockb, Cargo.lock, poetry.lock, turbo.json, and similar. It is the lowest rung of the driver evidence ladder (rung 3, below a declaration and a native file) and, independently, one of the inputs hashed into every task’s cache key so a dependency bump invalidates the cache even when you forgot to list the lockfile in inputs (LOCKFILES, crates/lattice-cache/src/lib.rs:19-30). See Driver detection and Caching.

Outputs

The outputs field on a task: glob patterns for the files a successful run captures into the cached artifact, and what a later cache hit restores. A file the command produces but outputs doesn’t match is simply never saved. Only a successful run is ever stored — a failed task is never cached, matching outputs or not. See Caching.

Output digest

The sha256 hex of a cached artifact’s tarball bytes, recorded in its .meta.json as output_digest when the entry is written (crates/lattice-cache/src/lib.rs:46). A lookup recomputes this digest from the tarball on disk and only reports a hit if the two match — this is what turns a corrupted or partially-written artifact into a miss instead of a false hit. See Cache internals.

Persistent task

A task declared with persistent: true — a dev server, watcher, or anything not meant to exit. It is never cached regardless of cache, it must be a leaf in the task graph (nothing may depend on it, since it never completes), and pulling one into a run’s closure forces raw/CI output so its streaming output stays visible instead of being collapsed behind a live TUI (crates/lattice-config/src/lib.rs:121-124, crates/dagger/src/lib.rs:193-208). See Persistent tasks.

Pin

A version fixed against drift, in two distinct places. latticeVersion in the root lattice.json pins which Lattice binary a repo runs, and a running invocation switches to it automatically (see Drift). Separately, each provisioned engine writes its own pins.json — the exact version installed and the hash of the installCmd that produced it — into its toolchain directory, so a later run reuses that install instead of repeating it (ToolchainPins, crates/lattice-workspace/src/toolchain.rs:111-118). See Upgrading and Engines and provisioning.

Provisioning

The engine mode when a constraint has an installCmd: Lattice runs that command itself into a content-addressed directory under .lattice/toolchains/<engine>/<version>-<installHash>/, version-checks the result, writes a pin, and prepends the resulting bin directory to the task’s PATH (EngineMode::Provisioned, crates/lattice-workspace/src/toolchain.rs:242-398). Reusing an existing pin means installation happens once per distinct installCmd content, not once per run. See Engines and provisioning.

Role

The kind of job a driver does: Runtime, BuildTool, PackageManager, or TaskRunner, ranked in that order (crates/lattice-workspace/src/lib.rs:29-47). Drivers with different roles compose into one stack for a workspace — a Node runtime plus a pnpm package manager is not a conflict, and the higher-ranked role drives named tasks. Drivers competing for the same role are an ambiguity unless a declaration names one. A pure Runtime can never drive tasks on its own. See Driver detection.

Root config

The single lattice.json at the repository root — the one file that declares every workspace, the root engines, the tasks map, and repo-wide settings (LatticeConfig, crates/lattice-config/src/lib.rs:261-273). find_root walks up from the current directory looking for it, so any subdirectory can run lattice commands. A workspace may add its own scripts and engines, but the task graph, cache settings, and workspace list live only in the root config. See Configuration.

Schedule

The runner-facing shape of the task graph, built from it but independent of the graph library: for each task, which other tasks must finish first (prerequisites), which tasks move closer to ready once it finishes (dependents), and how many prerequisites are still outstanding (indegree) (Schedule, crates/dagger/src/lib.rs:230-278). The runner drives execution from the schedule alone; it never touches the graph directly. See Task graph.

Stacked run

Naming more than one task in a single lattice run invocation, e.g. lattice run lint test build. The tasks are merged into one combined task graph rather than run as separate graphs, so a dependency two of them share executes once and independent work still parallelizes. --sequentially opts out: it runs each named task’s graph to completion before starting the next (build_execution_graph_multi, crates/dagger/src/lib.rs:94-214). See Selecting what runs.

Task

A named unit of work under tasks in lattice.jsonbuild, test, lint, or anything else — resolved to a concrete shell command per workspace by that workspace’s driver or its own scripts override (PipelineTask, crates/lattice-config/src/lib.rs:110-118). A task’s dependsOn names other tasks (see workspace dependsOn for the field of the same name that means something different). See Task graph.

Task graph

The expansion of one or more root tasks across every resolved workspace into a directed graph of concrete task instances, built from each task’s dependsOn (^task for a cross-workspace edge, a bare task for a same-workspace edge) and each workspace’s own dependsOn (build_execution_graph_multi, crates/dagger/src/lib.rs:94-214). Lattice runs it in dependency order, in parallel where the graph allows. See Task graph.

Toolchain

The set of engines Lattice has resolved for a run: for each, whether it came from host mode, validate-only, or provisioning, combined into a PATH prefix and a single identity string that feeds every affected task’s cache key (ResolvedToolchains, crates/lattice-workspace/src/toolchain.rs:102-108). Resolution happens once per distinct merged engine map and is reused across workspaces that share one. See Engines and provisioning.

Validate-only

The engine mode when a constraint has a version but no installCmd: Lattice runs a version command against whatever is already on PATH and fails before any task starts if the result doesn’t satisfy the constraint. Nothing is installed either way (EngineMode::ValidateOnly, crates/lattice-workspace/src/toolchain.rs:21-23). See Engines and provisioning.

Workspace

A single project directory — the unit of task running and caching. Declared explicitly by name and a literal path (never a glob) under the root lattice.json’s workspaces list (WorkspaceConfig, crates/lattice-config/src/lib.rs:89-105). A workspace’s own dependsOn names other workspaces by name and only takes effect where a task’s dependsOn uses a ^-prefixed token — on its own it declares nothing about scheduling (see task dependsOn for the field of the same name that means something different). auto: false opts a workspace out of driver detection entirely: you declare its scripts and engines yourself and nothing is inferred. See Workspaces.