fix(update): stop retired installers and finish on fresh launch

Old updaters keep running after the checkout changes. Returning None
from their removed uv helpers enables a pip fallback against the new tree.
Keep the historical imports as inert shims and stop dependency entrypoints
with a relaunch message instead. Do not call PM or write recovery markers
from that mixed-version process.

Self-managed source launches use PM's successful input stamp to decide
when dependencies need a sync. Restart on the managed interpreter before
activating the selected generation. Preserve launcher forms and options,
and do not sync while a live updater owns the installation.

Targeted runtime batch: 225 passed, 8 platform skips. Real PM worker tests
build and publish disposable dependency generations, retain prior state on
failure, and exercise fresh-process relaunch before dependency activation.
The final launch guard test also passes. Full suite and native Windows
execution were not run locally.
This commit is contained in:
ethernet
2026-09-11 19:45:30 -04:00
parent 528a9414df
commit 529050eab7
28 changed files with 1116 additions and 30 deletions

View File

@@ -26,6 +26,18 @@ Each file has a separate role:
A lockfile entry does not prove that a package is installed. `hermes pm doctor`
compares the installed state with the lock and checks the realized bytes.
Startup uses a cheaper check. It does not query upstream versions on every launch.
For self-managed source installs, the pre-import launcher compares PM's recorded
successful dependency stamp with the current inputs. Missing or stale completion
state triggers a sync, then the same command restarts on the managed Python before
loading application dependencies. Failed syncs keep the previous selection and
retry on the next launch; no pending-update marker is required. Developer checkouts
and packaged installations retain their existing owner.
Historical updaters can still be executing old Python code after swapping in this
source tree. Their retired helper names are inert compatibility shims; dependency
entry shims stop the old updater cleanly and ask for a relaunch instead of invoking
PM or falling back to pip. Completion belongs to the new launcher, not that mixed
old-code/new-files process.
## Source installs and packaged builds