Skip to content

The first upgrade to the shutdown rail still discards the state it exists to save — legacy checkpoints need explicit adoption with provenance #3930

Description

@joelteply

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions