The first upgrade still loses the state the rail exists to save
PR #3929 gives the core a stop that drains, saves, joins, and reports what reached
disk. It protects every upgrade except the one that installs it.
The outgoing core predates the rail by definition. It has no system/shutdown
verb, so stop/reboot fall back to the kill tree, and its modules' volatile
state is discarded exactly once — on the rollout. #3929 names that honestly
(GracefulStop::LegacyCore, non-zero exit, "the one-time cost of installing the
shutdown rail") but naming it is not saving it.
Raised by Astra during review of #3929, who put it plainly: this cannot be
labelled durable, and it should be addressed in reboot before deploying — not
with a per-machine script, and not with an inferred max-sequence merge.
What is actually missing
Explicit ADOPTION of legacy checkpoints, with provenance. Specifically:
- the original files are PRESERVED, not overwritten or merged in place
- distinct lifetimes stay distinct — a checkpoint written by the old saver is not
silently blended with one the new rail produced
- adoption is a decision with a receipt, not an inference. No "highest sequence
number wins": that is a guess dressed as a merge, and it is the shape that makes
a wrong value look authoritative.
The existing pre-rail saver is the thing being adopted FROM: a detached 15s
HOME→cwd fallback with no acknowledgement and no current-cycle ownership. Its
output is not obviously trustworthy, which is exactly why adoption must be
explicit rather than automatic.
Why this is not a follow-up nicety
The volatile tier is what a persona restores as her own recent thought on boot,
and load_volatile treats it as authoritative — it only refuses when it fails to
parse. A stale or half-adopted checkpoint PARSES FINE. So the failure mode here is
not a crash; it is a citizen waking with the wrong recent memory presented as her
own, which is the same class as
the eviction pool's "clean repo, nothing to preserve": an intact,
plausible, wrong value that nothing refuses.
Acceptance
continuum reboot from a pre-rail core to a rail-carrying core either adopts the
outgoing checkpoints with recorded provenance, or refuses and says what it could
not establish. The receipt distinguishes "adopted N checkpoints from the legacy
saver" from "no legacy state found" from "legacy state found and NOT adopted
because X" — and a restore is demonstrated, not asserted.
Not started
Nothing is written. Flagging rather than half-building it: it is a data-migration
decision about citizens' memory, it wants its own review, and #3929 is a shutdown
rail — the wrong PR to bolt it onto at the end of a long session.
The first upgrade still loses the state the rail exists to save
PR #3929 gives the core a stop that drains, saves, joins, and reports what reached
disk. It protects every upgrade except the one that installs it.
The outgoing core predates the rail by definition. It has no
system/shutdownverb, so
stop/rebootfall back to the kill tree, and its modules' volatilestate is discarded exactly once — on the rollout. #3929 names that honestly
(
GracefulStop::LegacyCore, non-zero exit, "the one-time cost of installing theshutdown rail") but naming it is not saving it.
Raised by Astra during review of #3929, who put it plainly: this cannot be
labelled durable, and it should be addressed in
rebootbefore deploying — notwith a per-machine script, and not with an inferred max-sequence merge.
What is actually missing
Explicit ADOPTION of legacy checkpoints, with provenance. Specifically:
silently blended with one the new rail produced
number wins": that is a guess dressed as a merge, and it is the shape that makes
a wrong value look authoritative.
The existing pre-rail saver is the thing being adopted FROM: a detached 15s
HOME→cwd fallback with no acknowledgement and no current-cycle ownership. Itsoutput is not obviously trustworthy, which is exactly why adoption must be
explicit rather than automatic.
Why this is not a follow-up nicety
The volatile tier is what a persona restores as her own recent thought on boot,
and
load_volatiletreats it as authoritative — it only refuses when it fails toparse. A stale or half-adopted checkpoint PARSES FINE. So the failure mode here is
not a crash; it is a citizen waking with the wrong recent memory presented as her
own, which is the same class as
the eviction pool's "clean repo, nothing to preserve": an intact,
plausible, wrong value that nothing refuses.
Acceptance
continuum rebootfrom a pre-rail core to a rail-carrying core either adopts theoutgoing checkpoints with recorded provenance, or refuses and says what it could
not establish. The receipt distinguishes "adopted N checkpoints from the legacy
saver" from "no legacy state found" from "legacy state found and NOT adopted
because X" — and a restore is demonstrated, not asserted.
Not started
Nothing is written. Flagging rather than half-building it: it is a data-migration
decision about citizens' memory, it wants its own review, and #3929 is a shutdown
rail — the wrong PR to bolt it onto at the end of a long session.