cassette layout changes after first boot never reach spirekeeper (one-shot hello gate) #94

Closed
opened 2026-09-20 15:15:27 +00:00 by padreug · 0 comments
Owner

The bitspire-cassettes-state hello is gated by the boolean meta.bootstrapPublishedAt. It fires once on first boot and then only after a dispense or an applied operator config (#65). Any change to the layout itself — reseeding the cassettes table, adding a bay with atm-tui, direct SQL — is never published, so spirekeeper's cassette_configs keeps the old bay set and every publish from the dashboard fails position-set validation (or worse, pushes stale values back down, see below).

Hit this on 2026-09-20 on the sintra after a DB wipe + reseed: the first boot published the hello, a Publish from the dashboard form (still loaded with the old rows) landed 7 min later and overwrote the fresh seed. Working around it needs

DELETE FROM cassettes; UPDATE meta SET value='' WHERE key='bootstrapPublishedAt'

and a restart.

Proposed:

  • drop the boolean gate. Publish the state on every boot (replaceable event, latest wins, encrypted — cheap), or store a fingerprint of the position set in meta and republish when it differs.
  • provision-atm.sh: accept a CASSETTES input so the layout is part of provisioning.
  • factory-reset-atm.sh: carry VITE_LAMASSU_CASSETTES through the .env rewrite like model + fiat, otherwise a non-preset machine reverts to the preset bay count.

Related: #56 (design), #65 (live republish), aiolabs/spirekeeper#43 (reconciliation side).

The bitspire-cassettes-state hello is gated by the boolean meta.bootstrapPublishedAt. It fires once on first boot and then only after a dispense or an applied operator config (#65). Any change to the layout itself — reseeding the cassettes table, adding a bay with atm-tui, direct SQL — is never published, so spirekeeper's cassette_configs keeps the old bay set and every publish from the dashboard fails position-set validation (or worse, pushes stale values back down, see below). Hit this on 2026-09-20 on the sintra after a DB wipe + reseed: the first boot published the hello, a Publish from the dashboard form (still loaded with the old rows) landed 7 min later and overwrote the fresh seed. Working around it needs ``` DELETE FROM cassettes; UPDATE meta SET value='' WHERE key='bootstrapPublishedAt' ``` and a restart. Proposed: - drop the boolean gate. Publish the state on every boot (replaceable event, latest wins, encrypted — cheap), or store a fingerprint of the position set in meta and republish when it differs. - provision-atm.sh: accept a CASSETTES input so the layout is part of provisioning. - factory-reset-atm.sh: carry VITE_LAMASSU_CASSETTES through the .env rewrite like model + fiat, otherwise a non-preset machine reverts to the preset bay count. Related: #56 (design), #65 (live republish), aiolabs/spirekeeper#43 (reconciliation side).
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aiolabs/bitspire#94
No description provided.