field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

commit 5d807163441ee6d3bee4687ae3fc47ccf59b7f5a
parent 1c21d1bd4bc1b9a0ac683ab4124577dea251f885
Author: triesap <tyson@radroots.org>
Date:   Sun,  9 Aug 2026 18:37:24 +0000

merge: reconcile actionable media draft state

- Preserve service hardening and mobile runtime histories.
- Derive aggregate media state from persisted prerequisites.
- Keep verified and failed drafts editable until queueing.
- Retain real-I/O regression coverage and orphan evidence.

Diffstat:
Mcore/crates/tera_core/src/runtime/product_surface/outbox.rs | 26+++++---------------------
1 file changed, 5 insertions(+), 21 deletions(-)

diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox.rs b/core/crates/tera_core/src/runtime/product_surface/outbox.rs @@ -884,15 +884,7 @@ impl RadrootsRuntime { media.failure_code = None; } media.validate()?; - let next_stage = match stage { - Phase1MediaStage::Pending | Phase1MediaStage::Preparing => { - AuthoredDraftStage::MediaPreparing - } - Phase1MediaStage::Uploading - | Phase1MediaStage::Verified - | Phase1MediaStage::Failed - | Phase1MediaStage::Orphaned => AuthoredDraftStage::MediaUploading, - }; + let next_stage = draft_stage_for_media(&payload.media); let next = head .successor(payload.encode()?, next_stage, None, updated_at_unix_ms) .map_err(|_| Phase1DraftError::RevisionConflict)?; @@ -946,13 +938,9 @@ impl RadrootsRuntime { media.verified_at_unix_ms = Some(receipt.verified_at_unix_ms()); media.orphan = None; media.validate()?; + let next_stage = draft_stage_for_media(&payload.media); let next = head - .successor( - payload.encode()?, - AuthoredDraftStage::MediaUploading, - None, - updated_at_unix_ms, - ) + .successor(payload.encode()?, next_stage, None, updated_at_unix_ms) .map_err(|_| Phase1DraftError::RevisionConflict)?; let receipt = storage .append_authored_draft(next, Some(expected)) @@ -1016,13 +1004,9 @@ impl RadrootsRuntime { recorded_at_unix_ms: updated_at_unix_ms, }); media.validate()?; + let next_stage = draft_stage_for_media(&payload.media); let next = head - .successor( - payload.encode()?, - AuthoredDraftStage::MediaUploading, - None, - updated_at_unix_ms, - ) + .successor(payload.encode()?, next_stage, None, updated_at_unix_ms) .map_err(|_| Phase1DraftError::RevisionConflict)?; let receipt = storage .append_authored_draft(next, Some(expected))