Skip to content

Candidate Ambiguous Commit State Machine

sergio velderrain edited this page Nov 9, 2026 · 1 revision

Candidate Ambiguous-Commit State Machine

The operator selected host-storage rollback as an in-scope fault. This contract does not select an authority, prove protection against authority compromise or rollback, or authorize a TPM operation or external service. Unverifiable authority continuity remains UNKNOWN. The required independence, custody, and concurrency guarantees are implementation and live-proof gates, not assumptions that the local model establishes.

A versioned request must bind the authority identity and epoch, verified VM UUID, unique transaction ID, operation and target obligation, expected generation and complete head digest, complete proposed state, any terminal receipt, and the applicable authorization or fencing context. Its exact canonical encoding, digest, and authority protocol remain to be specified. No credential, recovery material, or raw guest evidence may enter the request or its history.

State Required behavior
Not dispatched A verified pre-dispatch failure makes no authority transition and authorizes no dependent mutation. If dispatch cannot be excluded, use UNKNOWN instead.
Intent established Before sending the transition, prove that its exact identity and contents remain discoverable if host storage rolls back. Independently durable intent is one candidate; complete authority enumeration plus fencing is another. A lost or ambiguous preparation response must itself be reconciled before dispatch.
In flight or response uncertain Treat the affected obligation as blocking and do not release success or overwrite the authority with a cached earlier state. A timeout, malformed response, lost reply, or unverified TPM response is UNKNOWN.
Committed Verify the exact ID and contents against a fresh authenticated current state or sufficiently retained authenticated history. A committed result establishes history, not present readiness; re-read current state under the UUID lock and independently satisfy all phase, authorization, and VM-state gates before any dependent action.
Conflict A verified conflict proves only that the particular invocation did not change state. After any earlier ambiguous invocation, do not infer its outcome from a later conflict without independently proving the earlier transaction was closed without commit.
Unknown Retain the effective block and preserve the intent, relevant baselines, and receipt evidence. Missing local intent, missing current state, or an unverifiable authority is neither failure proof nor baseline-free genesis.

Deduplication must check the transaction ID and exact bound contents before reapplying a compare-and-commit. The ID is unique within the authority identity, epoch, and VM UUID. An exact committed retry returns the original result without advancing the state; the same ID with different contents is rejected. Retain the binding or a sufficient tombstone until old requests cannot reappear, including after host rollback. A backend that cannot prove this behavior, including a bare non-idempotent TPM increment, is not safe to retry blindly.

A missing transaction in a current read does not prove that an earlier request failed: the request may still be in flight and commit after that read. A definite no-commit conclusion requires complete authenticated history and a proven authority-side closure or equivalent fencing that prevents that request from committing later. Fencing a request or client must itself be durable and its result verified. If an intent registration, authority write, or fence has an ambiguous result, reconciliation must cover that operation too; local absence is not a substitute.

One candidate for lost local intent is an authority-enforced per-VM writer fence. An authenticated new session conditionally advances a monotonic writer generation against the verified current head; every authority transition atomically checks that generation and its owner. If an old transaction commits first, the fence conflicts and the current state and history must be re-read. If the fence commits first, the old writer's later transition is rejected. A fence whose reply is lost remains uncertain; a freshly verified state and a new conditional claim may recover only if the authority proves atomicity, unique session identities, complete history, and rollback resistance. These semantics are not equivalent to blindly repeating a TPM increment.

The fence is only an authority-side candidate. It does not stop a VM command already delivered to VirtualBox, prevent third-party snapshot operations, or provide a resource-side interlock. A separate proven quiescence or enforceable VM-control boundary remains necessary before a dependent mutation; a token that VirtualBox never validates is not such proof. Cross-host ownership, stale clients, authority recovery, and fence-counter limits remain unproven.

The authority may already have committed a valid resolution and removed an obligation before its response is lost. During uncertainty the client treats that obligation as blocking, but must not overwrite the committed state with its old local copy or claim the authority retained it. Once the exact committed transition is proven, its stored receipt may be returned only as historical. It cannot establish current readiness, and other unresolved obligations and their baselines remain in force.

An authority's independently verified current head and the necessary transaction history must survive the specified host-storage rollback. If the authority and its purported anti-rollback proof are restored together, or their epoch, freshness, custody, or complete history is unverifiable, the client remains UNKNOWN. The project-local UUID lock alone does not fence another host, an old in-flight authority operation, or a third-party VirtualBox snapshot.

Under the verified VM's lock, persist and anchor an obligation before starting a managed operation that could require reboot proof. For an unexpected reboot, compare the current boot with the retained baseline and durably record the obligation before authorizing continuation. If the process crashes before that observation is recorded, a later attempt must compare the then-current boot with the retained baseline again; inability to do so is UNKNOWN. This relies on the separate replay and boot-ID provenance gates, not on the host lock excluding third-party VM actions.

Persist a validated terminal receipt and its state transition together, then verify the durable journal and anchor before releasing a success receipt. A crash after commit but before delivery may replay the exact committed receipt as a historical result; it is not fresh current-readiness evidence. A crash before commit cannot clear the obligation. A missing, torn, unanchored, ahead-of-anchor, behind-anchor, or mismatched journal is UNKNOWN; recovery must not silently choose an older valid generation. How to make the journal and anchor transition crash-safe on each supported host remains an implementation and live-test gate.

An absent file is not proof of an empty history. Baseline-free fresh-start requires independently established, protected genesis for that VM, proving that there is no earlier accepted baseline or pending obligation in the trusted continuity domain. If that distinction cannot be established, report UNKNOWN, even after observing off/on. Initializing or adopting a VM without trustworthy prior continuity requires a separate recovery design and authorization; it must not silently erase history.

Treat snapshot or saved-state restoration as capable of replaying guest-local metadata and boot identity. A fresh attempt ID and serial boundary alone do not rule out such a replay. Oracle documents that a running snapshot can retain guest memory and resume execution at the snapshot point when restored; see Snapshot Contents. Detecting or excluding a restore, and binding any accepted evidence to the current VM state, is a feasibility gate; unresolved replay makes the affected proof UNKNOWN.

A changed volatile boot ID alone is insufficient to prove a guest-only reboot: the volatile key might have disappeared without an OS restart. An additional independently established boot observation is required, but its source, comparison rules, failure modes, and receipt representation remain a feasibility decision. Microsoft describes System-log event ID 12 from Kernel-General as an OS-start event in its reboot-history guidance. It is a candidate, not an approved or proven source: availability, provider identity, log continuity and clearing behavior, and correlation with the current boot require proof. Windows Event Log strict subscriptions can reject a missing bookmark and report missing records, but do not by themselves establish current-boot identity or exclude snapshot replay. A partially accepted query cannot establish complete evidence. Until a suitable source is specified and validated, a guest-only reboot outcome is UNKNOWN and cannot satisfy TEST-061.

The candidate observation must be independent of the volatile key, usable with the verified VM and current boot, and comparable with the retained pre-reboot baseline. Missing, stale, or inconsistent source data, and resets or interruptions without independently established cause and continuity, are UNKNOWN. Microsoft documents GetTickCount64 as elapsed milliseconds since startup, with typical 10-16 ms resolution. Its behavior across suspension, VM restore, and a delayed post-reboot sample requires proof; a new uptime greater than the baseline cannot by itself rule out a reboot. A boot time calculated from wall-clock time minus uptime can change when the wall clock changes and is not sufficient on its own.

Clone this wiki locally