Repository navigation
v0.3.9 — deploy() creates the wrapper install stamp + syncs dev deps
Pairs with v0.3.8. After v0.3.8 the ./spectator wrapper takes a fast path skipping require_uv when .venv/ looks healthy, but on a freshly deploy'd target two things kept that fast path from triggering:
deploy.pyranuv sync(runtime only) over SSH; the wrapper'sdeps_ready()probe checks forpytest + ruffand refused.- The wrapper's install-stamp file (
.venv/.spectator-installed) was never created on the target; the wrapper's mtime check refused the fast path even whendeps_readywould have passed.
Net effect: ./spectator <verb> on a deploy'd Spark exploded with "uv is required" on every invocation over a non-interactive SSH session (where ~/.local/bin typically isn't on PATH), even though the venv was fully populated.
Fix: deploy.deploy() now uses uv sync --extra dev and touch .venv/.spectator-installed after the sync. Adds ~30 MB of dev-deps to the target (pytest + ruff + transitives), negligible vs the multi-GB VSS docker images.
50/50 tests pass (was 49, +1: test_deploy_remote_uv_sync_includes_dev_and_writes_install_stamp introspects deploy.deploy source to pin both new lines).