# Device update missing-npm proof fixture

Run the scenario on a current main checkout, with the app selected by scenarios:prove. Each side uses a fresh scenario T3 home and a synthetic project, Chromium at 1280 by 800, and the light theme.

The fixture patch enables device support in initial settings and launches the unmodified real server directly with Node instead of through vp. This prevents vp from restoring its bundled npm or pnpm. The web client still runs through the normal dev runner and proxy. No responses or errors are mocked.

For reproduction on Linux with passwordless sudo: place portable-no-package-managers.sh in a temporary directory alongside an empty directory named hidden and a fallback-bin directory. Populate fallback-bin with resolved symlinks for every entry in ~/.local/share/vite-plus/fallback-bin except npm and pnpm. Apply scenario-fixture.patch and replace DEVICE_PROOF_WRAPPER with the absolute path to that wrapper. The wrapper hides npm and pnpm using private, read-only bind mounts, drops back to the invoking uid, and preserves the inherited environment. PATH and login-shell hydration remain intact. Adjust installation-directory patterns if the machine stores package managers elsewhere. Nothing is mounted in the host namespace.

The scenario opens Settings → Devices, updates Hub and then agent-device, captures each visible error, and checks only for npm and restart guidance. A 2.5-second pause holds each result for the video; it is not used to synchronize app state. Both tools remain uninstalled after their failed update attempts.
