Skip to content
Architecture decisionsView source on GitHub ↗

0009: Retain npm orchestration after the Vite+ evaluation

  • Status: Proposed
  • Date: 2026-10-23
  • Roadmap: 368

Context

Forge evaluated vite-plus 1.4.0 and its Vite Task runner against npm at revision 595a5e00d7e2fea04b26b54c7fb6bb7b6396f4e9. Maintenance reduction was the primary criterion; a faster command alone was insufficient. The scope authorized a bounded experiment, not production adoption. The evaluation ends with a recommendation within the shared two focused working day limit; that limit was not exhausted.

Decision

Retain the existing npm scripts, workspace boundaries, specialized tools, and provider-native CI selection. Do not adopt Vite+ or add another task runner on this evidence. This proposed record awaits maintainer review through the PR; it does not supersede ADR 0003 or ADR 0007, and introduces no rollout.

Vite Task successfully scheduled explicit prerequisites and parallel work, cached selected commands, and restored declared outputs. Public npm commands remained usable, and measured package/site artifacts matched. Those capabilities are useful, but the trial retained the existing tools and configuration. No material ongoing responsibility was demonstrated to disappear.

ResponsibilityCurrent npm baselineCandidate preserving tested behavior
Package commands and prepack safetyFour package manifestsRetained
Formatting, lint, types, tests and buildsExisting specialized tools/configsRetained; bundled replacement equivalence not established
Website/template isolationTwo separate consumer installs and lockfilesRetained; explicit invocation still needed
Native identity, reproducibility and noticesExisting pinned helper and toolchainRetained; generic task caching cannot replace validation
Independent project CI selectionNative provider rulesRetained; no demonstrated Git change selector
Local task graphSerial aggregate scriptsExplicit task definitions introduced for scheduling
Cross-command cached resultsNo generic task cacheCache input/output/environment ownership introduced
Runtime and CI cache trustExisting runtime lanes and artifact handoffsAdditional cache partition, writer, transfer and cleanup policy needed

The representative uncached package graph took 1.701 seconds against a 1.975-second serial npm observation; a repeat took 1.693 seconds. Cache-enabled typecheck repeats fell from 0.918 to 0.141 seconds. These are exploratory observations, not statistically controlled repository/CI speedups. They do not establish reduced maintenance. CI already parallelizes independent root quality jobs and shares selected artifacts.

Evidence and limits

  • Baseline and command map: four packages, independent install roots, existing prerequisites, outputs, repeated work and timings.
  • Representative package: all 15 packed files equal, installed consumer runtime/declarations pass, real build failure blocks pack.
  • Remaining boundaries: package outputs equal, isolated website/template validation and all 143/394 built files equal; 57 native package source tests and packaging pass using verified baseline hosted WASM assets.
  • Selection and cache evidence: explicit ownership, invalidation, output restoration, failed-task reruns, runtime switch and shared producer.

Fresh pinned Rust compilation could not be completed locally: the existing toolchain was unavailable and the isolated installation exhausted available disk. Reusing a verified baseline native artifact does not prove candidate compilation or native cache invalidation. A packed browser attempt failed at macOS Chromium process permissions. Candidate cross-engine execution, hosted provider behavior/cache trust, dependency version-change experiments, and full bundled-tool replacement remain unverified. Equivalent behavior and safeguards therefore have not been demonstrated in full. These limitations strengthen the decision to retain the baseline; they are not claims that those capabilities are impossible with Vite+.

Consequences and reconsideration

No production migration, shared repository settings, generated consumer tooling, package-manager change, release-tool choice, publication, or template lockfile policy change is authorized by this decision. Prototype configurations and installations remain disposable experimental state, not a new supported interface. No migration, CI rollout, cleanup, or rollback tickets are needed because adoption is not recommended. The existing scripts remain the contributor and CI contract.

Reconsider only against a concrete maintenance problem with measurable responsibilities removed, rather than command renaming or another orchestration layer. A future limited trial would need a runner with sufficient native build storage, pinned native/toolchain invalidation and reproducibility proof, provider/cache trust measurements, cross-engine checks, and a replacement plan that removes existing responsibilities. Budget roughly one additional focused working day plus hosted native build time for those missing proofs, excluding a broader bundled-tool migration. This is an estimate, not a request to extend or permission to resume the experiment. No extension is needed to recommend retaining npm now. Nx, Turborepo, remote caching, and release/template evaluations remain outside this decision.