- conforms_to::[[Observation Form Contract]]
- has_epistemic_status::[[Empirical Observation]]
- in_practice_domain::[[eOS Continuum]]
- authored_by::[[Christopher Allen]]
- has_lifecycle::[[Seed Stage]]↗
- has_curation::[[Working Draft]]↗
Chat Room State Held Only In Memory Does Not Survive a Cold Boot Without a Snapshot
Claim
In the eOS-Harness MVA running against DGD 1.7.9 plus the eOS-kernellib chat-app persistence branch, a chat session held in in-memory property-bearing objects -- not written to an on-disk structured store -- does not survive a cold boot taken without loading the snapshot. The dispatch shape is: boot 1 establishes a session on a fresh room (two members, three messages, a cross-clone mention-tracker reference), records the session shape to an on-disk marker file, and dumps a snapshot; boot 2 restarts against the snapshot and confirms the session survived (the paired positive Observation); boot 3 starts DGD cold without the snapshot argument. On boot 3 the test driver's setup_and_run finds the on-disk marker present (a file, which survives any boot) but the saved-as-global persist_room nil (a cold boot resets all object globals to nil). That combination -- on-disk record present, in-image session absent -- is the signature of a session that was persisted but whose snapshot was not loaded; the driver writes COLDBOOT-LOST OK. The Observation fixes the boundary of orthogonal persistence: the runtime image survives a restore, but in-memory-only state does not survive a from-scratch boot, and durability beyond the image is the job of an on-disk store, not of in-memory properties.
Grounds
This is an Empirical Observation. The grounds are the third boot of the captured 2026-05-29 smoke run against the live MVA demonstration instance with examples/chat-app/ deployed into the isolated runtime staging tree. Boots 1 and 2 (the paired positive Observation) establish and verify snapshot survival; boot 3 exercises the cold-boot-without-snapshot loss.
Setup (verifiable from repo state):
- Driver: DGD 1.7.9 built from eOSContinuum/dgd (binary symlinked into the runtime staging tree).
- Kernel layer: eOSContinuum/eOS-kernellib's chat-app persistence-phases branch at HEAD
e2c2126(built atop kernel-layer baselineecb4e58). - Application layer:
examples/chat-app/(this commit's deliverable), deployed into the runtime staging tree'susr/Chatpath. - Runtime config: the instance config at the eOS-Harness repo root, isolated runtime staging tree layout per the runtime-provisioning script.
Load-bearing source (the cold-boot detection branch in examples/chat-app/sys/test.c):
static void setup_and_run()
{
catch(make_dir("/usr/Chat/data"));
/* Negative-case path. Reached only on a cold boot (no snapshot
* loaded) that follows a boot which wrote the marker in an earlier
* phase: the on-disk marker is present, but the in-image chat
* session it recorded is gone (persist_room is a fresh nil
* global). */
if (marker_present() && !persist_room) {
coldboot_loss_verify();
return;
}
catch(remove_file(RESULT_FILE));
run_tests();
}
private void coldboot_loss_verify()
{
string marker;
marker = nil;
catch { marker = read_file(MARKER_FILE); }
if (!marker) {
log_line("ChatApp:test: FAIL: COLDBOOT-LOST marker unreadable");
return;
}
if (persist_room) {
log_line("ChatApp:test: FAIL: COLDBOOT-LOST room unexpectedly present");
return;
}
log_line("ChatApp:test: COLDBOOT-LOST OK");
}
The marker file (/usr/Chat/data/persist-marker.log) is written by an earlier phase just before the dump; it records the session shape (messages=3 members=2). It is an ordinary on-disk file, not in-image state, so it survives any boot independent of the snapshot. persist_room is a non-static object global; on a cold boot (no snapshot loaded) it is nil. The conjunction of marker-present and persist_room-nil is the detectable signature of "a session was persisted but the snapshot was not loaded."
Boot sequence:
# Boot 3 (cold, NO snapshot argument).
$ dgd <instance config> &
** DGD 1.7.9
** Initializing...
** Initialization complete.
Boot 3 emits ** Initialization complete. (a fresh initialization), NOT ** State restored. -- it is a cold boot, not a restore. The Chat domain's initd recompiled and re-ran from scratch; the test driver's create() fired its deferred call_out, and setup_and_run took the cold-boot-loss branch.
Smoke transcript (the full result log after all three boots):
ChatApp:test: starting
ChatApp:test: CAP-REJECT OK
ChatApp:test: CAP-ACCEPT OK
ChatApp:test: PERSIST-SETUP OK
ChatApp:test: PERSIST-VERIFY OK
ChatApp:test: COLDBOOT-LOST OK
COLDBOOT-LOST OK writes to the sentinel file only when, on boot 3:
marker_present()is true (the on-disk record written by the earlier phase survived the cold boot).read_file(MARKER_FILE)returns the marker content (it is readable -- proof the session existed and its shape was recorded).persist_roomisnil(the in-image room saved as a global did NOT survive the cold boot).
The third assertion is the load-bearing one: a non-nil persist_room here would be a contradiction (it would mean the snapshot was loaded, in which case this branch would not have been taken). The driver does NOT wipe the result file on this path, so the boot-1 and boot-2 sentinels remain and the transcript reads as a single coherent record across all three boots.
What the evidence establishes:
- In-memory-only state (the chat room's property-backed message log, membership, and accounts) does not survive a from-scratch cold boot; the runtime image is what the snapshot preserves, and without the snapshot there is no image to restore.
- The boundary of orthogonal persistence is the snapshot, not the disk. The positive Observation shows the whole in-image session surviving a restore -- properties and plain LPC globals alike, with no "globals vs Vault" difference at that granularity (the merry-app walkthrough makes the same point, listing "LPC global variables" among the guarantees its persistence cycle exercises). This negative Observation shows what falls outside that boundary: a cold boot without the snapshot.
- On-disk files and in-image object state have different durability. The marker file (a
write_fileto disk) survived the cold boot; the in-image room did not. This is exactly the distinction between an on-disk structured store (which would survive a from-scratch boot) and in-memory runtime state (which rides the snapshot).
What the evidence does not establish:
- That a Vault/Schema-registered room would survive the cold boot. The Observation demonstrates the in-memory room is lost; it does not run the contrastive on-disk implementation. The claim that a Schema-registered, Marshal-to-disk room WOULD survive a from-scratch boot is the
examples/vault-app/demonstration's subject, cited here as the boundary's other side but not re-run in this smoke. - That the loss is total rather than partial. The marker survived because it is an on-disk file the application explicitly wrote. The Observation does not enumerate which other on-disk artifacts (logs, sentinel files) survive vs which in-image structures are lost; it asserts the specific in-image session is gone, evidenced by
persist_roombeing nil. - Crash vs clean-boot distinction. Boot 3 is a deliberate cold boot (operator omits the snapshot argument), not a crash. The Observation does not address whether a crash mid-session followed by a cold boot differs from this clean cold boot.
What Would Revise It
- A Vault-backed counter-implementation surviving the cold boot. A probe that Schema-registers the room, marshals its state to disk via the Vault path, then cold-boots without the snapshot and observes the room state recovered from disk would complete the contrast this Observation only points at -- demonstrating that on-disk durability survives exactly the boot that loses in-memory-only state.
- A cold boot that still finds residual in-image state. If a future change to DGD or the kernel layer caused some in-image state to survive a cold boot without a snapshot (e.g., a write-through swap that is read at cold boot), the
persist_room-nil assertion would fail and the Observation's "in-memory state is wholly lost on cold boot" claim would need revision. - A marker-survival failure. If the marker file did NOT survive the cold boot (e.g., the data directory were on a tmpfs cleared at boot), the detection branch would not fire and the negative sentinel would not be produced; the Observation presumes on-disk files persist across boots, which a different storage layout could violate.
- A DGD or eOS-kernellib upgrade that changes cold-boot semantics. The current evidence rests on DGD 1.7.9 plus the cited eOS-kernellib HEAD. A runtime release that changes how a cold boot treats prior swap/snapshot files, or that adds a default warm-start path, would invalidate the cold-boot-loss claim; the pinning is part of the grounds.
Sources
examples/chat-app/sys/test.c(eOS-kernellib) --setup_and_run's cold-boot detection branch andcoldboot_loss_verifyare the load-bearing code. The branch fires only on a cold boot following the phase that wrote the marker.examples/chat-app/obj/room.c(eOS-kernellib) -- the Room clonable; property-storage backed via/lib/util/propertiesand NOT Schema-registered, so its state is in-memory-only (rides the snapshot, not the disk). This is why the room is lost on a cold boot.examples/merry-app/sys/test.c(eOS-kernellib) -- the prior persistence demonstration whose walkthrough lists "LPC global variables" among the orthogonal-persistence guarantees; cited for the "no globals-vs-Vault difference at snapshot granularity" point that fixes this Observation's boundary correctly.examples/vault-app/(eOS-kernellib) -- the on-disk Schema/Marshal durability demonstration; the other side of the boundary this Observation marks (durability beyond the image snapshot).docs/chat-applications.md(eOS-kernellib) -- the walkthrough; the "Persistence" section's "Negative case" subsection narrates this cold-boot-loss path.examples/chat-app/README.md(eOS-kernellib) -- the three-boot verify recipe; boot 3 is the cold-boot-without-snapshot step.- The result and marker logs written into the runtime staging tree's
usr/Chat/data/path -- carryCOLDBOOT-LOST OKand the on-disk marker (messages=3 members=2) whose survival across the cold boot is the contrast against the lost in-image session.
Relations
-
conforms_to::[[Observation Form Contract]]
- Carries
has_epistemic_status::[[Empirical Observation]], names the measurement (the third boot of a three-boot smoke, with the marker-present plus room-nil conjunction as the detection), states the limits (does not run the Vault-backed contrast; presumes on-disk files persist; clean cold boot not crash), and lists concrete revision conditions.
- Carries
-
informs_downstream::[[Runtime State Is Persistent by Default, Not by Application Discipline]]
- The persistence Conviction's stance is that the runtime image is the persistence layer. This negative Observation marks the boundary of that stance: the image survives a restore, but in-memory-only state does not survive a from-scratch boot. The Conviction's "What It Asks" distinguishes runtime-state-graph persistence from external-store patterns; this Observation makes the distinction concrete by showing where in-memory state ends and on-disk durability (the Vault path) must begin.
-
grounded_in::[[Conviction Form Contract]]
- The boundary the Observation fixes is a property of the persistence primitive's stance, not of application code. The application wrote no recovery routine; the loss on cold boot is the platform's behavior when the snapshot is not loaded, and the Conviction's stance is what makes that behavior the expected one rather than a bug.
-
contrasts_with::[[Chat Room State Survives Statedump and Restore]]
- The positive-case peer Observation. The two together mark the boundary of orthogonal persistence: snapshot-and-restore preserves the entire in-image session (the positive), but a cold boot WITHOUT the snapshot finds an empty world (this Observation). Reading the positive case alone risks the misreading "in-memory state is durable, full stop"; this negative case fixes the boundary at "durable across restore, not across a from-scratch boot -- on-disk Vault is what survives that".