A Non-Atomic Cross-Agent Property Write Leaves Partial State on Error

Claim

In the eOS-Harness MVA running against DGD 1.7.9 plus the eOSContinuum/eOS-kernellib feature/cohesive-lift branch, when the same two-room writer is run through a non-atomic batch and throws after the first write, the first room's append survives while the second room is never written. cross_write_then_fail(room_a, room_b, content) appends a message to room_a and then error()s; run through MERRY->batch(this_object(), "cross_write_then_fail", args, ([ ])) -- a plain batch with no atomic opt -- the first append commits before the throw and is not rolled back, while the second append is never reached. The room pair is left in partial state: room_a holds the message, room_b is empty. This is the failure mode the atomic batch removes by making the two writes one all-or-nothing unit; without the envelope, the error-handling and compensating writes that restore consistency are left to the application.

Grounds

This is an Empirical Observation. The grounds are a captured three-boot smoke run 2026-05-31 against the live MVA demonstration instance with examples/chat-app/ overlaid at the isolated runtime staging tree's src/usr/Chat/.

Setup (verifiable from repo state):

Load-bearing source (the failing writer and phase 9d's negative half in examples/chat-app/sys/test.c):

/* appends to the first room, then throws before the second */
void cross_write_then_fail(object room_a, object room_b, string content)
{
    mapping msg;
    msg = ([ "content": content, "timestamp": time() ]);
    room_a->set_property("chat-room.message-log", room_a->query_messages() + ({ msg }));
    error("ATOMIC-ROLLBACK deliberate failure");
}

/* phase 9d negative: NON-atomic batch -- no "atomic" opt, no rollback */
MERRY_DAEMON->batch(this_object(), "cross_write_then_fail",
                    ({ room_pa, room_pb, "partial" }), ([ ]));
/* throws; asserts room_pa holds 1 (survived), room_pb holds 0 (never written) */

The non-atomic path runs the function via _run_callable rather than _atomic_run_callable, so the first set_property commits and the propagated error does not unwind it.

Smoke transcript (the load-bearing portion of the result log after boot 1):

ChatApp:test: ATOMIC-ROLLBACK OK
ChatApp:test: PARTIAL-STATE OK

PARTIAL-STATE OK writes only when the non-atomic batch threw, the first room (room_pa) holds exactly one message, and the second room (room_pb) holds zero. The assertion is inside catch{}; a non-throwing batch, a missing first write, or an unexpected second write each logs a distinct FAIL. Fresh rooms (PartialA, PartialB) make the partial write unambiguous.

What the evidence establishes:

What the evidence does not establish:

What Would Revise It

Sources

Relations