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 dc235063d0933dbce74e10b497ce4ca6e3af4a81
parent 07b4112bb57f68c9aa54c3f3b5547304219f1736
Author: triesap <tyson@radroots.org>
Date:   Mon, 21 Sep 2026 15:06:18 +0000

revision: gate retraction by target replacement evidence

- Gate each child destination on its replacement evidence
- Freeze child policy and reuse its exact signed payload
- Stop both partial branches and retain restart evidence
- Qualify native artifacts and standalone consumer checks

Diffstat:
MCargo.lock | 32++++++++++++++++----------------
MCargo.toml | 24++++++++++++------------
MREADME.md | 11+++++++++++
MTeraFFI/provenance.json | 54+++++++++++++++++++++++++++---------------------------
MTeraFFI/source.lock | 6+++---
MTeraFFI/source/aarch64-apple-darwin.json | 130+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
MTeraFFI/source/aarch64-apple-ios-sim.json | 130+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
MTeraFFI/source/aarch64-apple-ios.json | 130+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mcore/crates/tera_core/src/runtime/product_surface/outbox.rs | 217+++++++++++++++++++------------------------------------------------------------
Mcore/crates/tera_core/src/runtime/product_surface/outbox/advance.rs | 26+++++++++++++++++++++++---
Acore/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs | 184+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs | 237+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs | 393+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcore/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs | 12++++++++++--
Mradroots.lib.source-lock.v1.toml | 6+++---
Mrelease/provenance.json | 12++++++------
Mrelease/sbom.cdx.json | 248++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mtest-fixtures/legacy-identifiers.v1.json | 16++++++++++++++++
19 files changed, 1521 insertions(+), 520 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1876,7 +1876,7 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "radroots_blossom" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "mediatype", "serde", @@ -1888,7 +1888,7 @@ dependencies = [ [[package]] name = "radroots_core" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "rust_decimal", "serde", @@ -1897,7 +1897,7 @@ dependencies = [ [[package]] name = "radroots_event" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "hex", "jiff-tzdb", @@ -1915,7 +1915,7 @@ dependencies = [ [[package]] name = "radroots_event_codec" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "hex", "radroots_blossom", @@ -1932,7 +1932,7 @@ dependencies = [ [[package]] name = "radroots_identity" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "k256", "serde", @@ -1942,7 +1942,7 @@ dependencies = [ [[package]] name = "radroots_nostr" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "base64", "nostr 0.44.8", @@ -1959,7 +1959,7 @@ dependencies = [ [[package]] name = "radroots_protocol" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "serde", ] @@ -1967,7 +1967,7 @@ dependencies = [ [[package]] name = "radroots_sdk" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "radroots_blossom", "radroots_core", @@ -1992,7 +1992,7 @@ dependencies = [ [[package]] name = "radroots_secrets" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "chacha20poly1305", "sha2", @@ -2003,7 +2003,7 @@ dependencies = [ [[package]] name = "radroots_signing" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "hex", "radroots_event", @@ -2017,7 +2017,7 @@ dependencies = [ [[package]] name = "radroots_storage" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "radroots_event", "radroots_event_codec", @@ -2031,7 +2031,7 @@ dependencies = [ [[package]] name = "radroots_storage_sqlite" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "fs2", "radroots_event", @@ -2048,7 +2048,7 @@ dependencies = [ [[package]] name = "radroots_sync" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "radroots_event", "radroots_event_codec", @@ -2063,7 +2063,7 @@ dependencies = [ [[package]] name = "radroots_trade" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "hex", "radroots_core", @@ -2077,7 +2077,7 @@ dependencies = [ [[package]] name = "radroots_transport" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "radroots_event", "radroots_identity", @@ -2089,7 +2089,7 @@ dependencies = [ [[package]] name = "radroots_transport_nostr" version = "0.1.0-alpha" -source = "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +source = "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" dependencies = [ "async-wsocket", "futures", diff --git a/Cargo.toml b/Cargo.toml @@ -31,18 +31,18 @@ jiff_tzdb = { package = "jiff-tzdb", version = "=0.1.8", default-features = fals futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] } hex = { version = "0.4" } nostr = { version = "0.44.7", default-features = false } -radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } -radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" } +radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } +radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "77aa55c0894c0142dbae43e272a515fd093eac36" } serde = { version = "1", default-features = false, features = ["derive", "alloc"] } serde_json = { version = "1", default-features = false, features = ["alloc"] } sha2 = { version = "0.10", default-features = false } diff --git a/README.md b/README.md @@ -279,3 +279,14 @@ retraction child. Current local card overlays also carry the exact source draft key, so revision editing can recover the retained form from either a legacy draft or a scoped submission. Missing forms and mismatched signed sources fail closed; a displayed operation ID is never treated as proof of source ownership. + +Regular revision delivery retains the replacement's exact relay policy on its +linked retraction child. Each deletion destination requires replacement evidence +from that same destination; another relay's success or aggregate completion does +not grant permission. Retries reuse the original signed child and full destination +list, withholding ineligible and already-satisfied destinations. Cancelling a +partial revision stops both pending branches and retains observed effects across +reopen. Historical revision children without an exact parent link remain held; +their signed bytes and operation identities are never rewritten or rebound to a +guessed replacement. This restriction also holds historical independent deletions +using the reserved revision reason. Other independent retractions remain separate. diff --git a/TeraFFI/provenance.json b/TeraFFI/provenance.json @@ -22,9 +22,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 77259512, + "bytes": 77372696, "path": "TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a", - "sha256": "d24e6b280050d5a4df65a259ec566138da39fc8d3f34ed36dc372cad87b97006" + "sha256": "313fe5f37d4d6d287ff16111b2d78ddff6be9bbfddc91d00c900f13dc663abc3" }, { "bytes": 88720, @@ -37,9 +37,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 77316536, + "bytes": 77464056, "path": "TeraFFI.xcframework/ios-arm64/libtera_ffi.a", - "sha256": "adf565cd04724e0cf7719089bba7d31d2f6e807d1a0e9a0507ddd775c5044035" + "sha256": "1dc05a22c3555a3cfbaf395100705603d8db72e26ed7fc56f261b6407cec8833" }, { "bytes": 55165, @@ -77,34 +77,34 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 22403792, + "bytes": 22501008, "path": "native/aarch64-apple-darwin/libtera_ffi.dylib", - "sha256": "3c30d455748ceae47acce8e1806b058f44e30c62a9b46994bb03925c4effdd1e" + "sha256": "dbecd2c611b58ddfb4be48aa557e405feb00c3a65a106acfbfc5679c89673f8f" }, { - "bytes": 77259512, + "bytes": 77372696, "path": "native/aarch64-apple-ios-sim/libtera_ffi.a", - "sha256": "d24e6b280050d5a4df65a259ec566138da39fc8d3f34ed36dc372cad87b97006" + "sha256": "313fe5f37d4d6d287ff16111b2d78ddff6be9bbfddc91d00c900f13dc663abc3" }, { - "bytes": 77316536, + "bytes": 77464056, "path": "native/aarch64-apple-ios/libtera_ffi.a", - "sha256": "adf565cd04724e0cf7719089bba7d31d2f6e807d1a0e9a0507ddd775c5044035" + "sha256": "1dc05a22c3555a3cfbaf395100705603d8db72e26ed7fc56f261b6407cec8833" }, { - "bytes": 115737, + "bytes": 116951, "path": "source/aarch64-apple-darwin.json", - "sha256": "40c6fbbdf156048ced67281a8cdcc0810fdf506722410a9e1cb6624699fc0523" + "sha256": "0299d336cbc924f45ccf0abd04d19178cc5208b8bdfa9ea1c2885db47102ec23" }, { - "bytes": 115581, + "bytes": 116795, "path": "source/aarch64-apple-ios-sim.json", - "sha256": "0b6cd5afc0a0563e9d1474b733f3ea30c822ec916b890d3f59fc19aa3b2f7e27" + "sha256": "0c4ee663f23e810769e63f78d2f71516a4eba1d355bb2ce7796db60ec2db38ea" }, { - "bytes": 115577, + "bytes": 116791, "path": "source/aarch64-apple-ios.json", - "sha256": "aec7a86cbece53007b6de9181edb8f3c7c60364abcfb07d524e68eb81caaaab2" + "sha256": "179dfc0df05681cf5fd6e75ea70524c0a17a6dd6de8218bd6b4744ede3ddc370" } ], "language": "swift", @@ -112,7 +112,7 @@ "schema": "radroots.artifact-manifest.v2", "source": { "repository": "https://github.com/radrootslabs/tera", - "tree": "3fd45b713b327106c84b09a8ea06133019f86e43" + "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958" }, "source_records": { "aarch64-apple-darwin": "source/aarch64-apple-darwin.json", @@ -139,9 +139,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 77259512, + "bytes": 77372696, "path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a", - "sha256": "d24e6b280050d5a4df65a259ec566138da39fc8d3f34ed36dc372cad87b97006" + "sha256": "313fe5f37d4d6d287ff16111b2d78ddff6be9bbfddc91d00c900f13dc663abc3" }, { "bytes": 88720, @@ -154,9 +154,9 @@ "sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c" }, { - "bytes": 77316536, + "bytes": 77464056, "path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64/libtera_ffi.a", - "sha256": "adf565cd04724e0cf7719089bba7d31d2f6e807d1a0e9a0507ddd775c5044035" + "sha256": "1dc05a22c3555a3cfbaf395100705603d8db72e26ed7fc56f261b6407cec8833" }, { "bytes": 718266, @@ -174,19 +174,19 @@ "sha256": "ac334ffc196a74bea9f23048cdab34ccb09925b60ffae9702d6bfabc1590e465" }, { - "bytes": 115737, + "bytes": 116951, "path": "TeraFFI/source/aarch64-apple-darwin.json", - "sha256": "40c6fbbdf156048ced67281a8cdcc0810fdf506722410a9e1cb6624699fc0523" + "sha256": "0299d336cbc924f45ccf0abd04d19178cc5208b8bdfa9ea1c2885db47102ec23" }, { - "bytes": 115581, + "bytes": 116795, "path": "TeraFFI/source/aarch64-apple-ios-sim.json", - "sha256": "0b6cd5afc0a0563e9d1474b733f3ea30c822ec916b890d3f59fc19aa3b2f7e27" + "sha256": "0c4ee663f23e810769e63f78d2f71516a4eba1d355bb2ce7796db60ec2db38ea" }, { - "bytes": 115577, + "bytes": 116791, "path": "TeraFFI/source/aarch64-apple-ios.json", - "sha256": "aec7a86cbece53007b6de9181edb8f3c7c60364abcfb07d524e68eb81caaaab2" + "sha256": "179dfc0df05681cf5fd6e75ea70524c0a17a6dd6de8218bd6b4744ede3ddc370" } ], "schema": "tera.installed-native-artifacts.v1" diff --git a/TeraFFI/source.lock b/TeraFFI/source.lock @@ -1,10 +1,10 @@ schema = "tera.installed-source.v1" repository = "https://github.com/radrootslabs/tera" -source_tree = "3fd45b713b327106c84b09a8ea06133019f86e43" -manifest_sha256 = "f0e228bd1272bbd4bf29d8d2a11f241734a17b83575d7fca916dbfa16e70d847" +source_tree = "3a880e433bbaa2f8e7bf09e7da296b32d2cac958" +manifest_sha256 = "d21fc3a4670d86233045861a54bb802398a8e1296607436be83dd72aeac6fafc" source_date_epoch = 1787871027 [foundation] repository = "https://github.com/radrootslabs/lib" -revision = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +revision = "77aa55c0894c0142dbae43e272a515fd093eac36" version = "0.1.0-alpha" diff --git a/TeraFFI/source/aarch64-apple-darwin.json b/TeraFFI/source/aarch64-apple-darwin.json @@ -186,36 +186,36 @@ "proc-macro2 v1.0.107|default,proc-macro (*)", "quote v1.0.47|default,proc-macro", "quote v1.0.47|default,proc-macro (*)", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std (*)", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync (*)", - "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde (*)", - "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std (*)", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync (*)", + "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde (*)", + "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)", "rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng", "rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng", "rand_chacha v0.3.1|std", @@ -385,15 +385,15 @@ "symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.", "target": "aarch64-apple-darwin" }, - "cargo_lock_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258", + "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0", "disposition": "local_staged_source_only", "foundation": { "architecture": "radroots.crates.release.v2", - "lockfile_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258", + "lockfile_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0", "repository": "https://github.com/radrootslabs/lib", - "revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "revision": "77aa55c0894c0142dbae43e272a515fd093eac36", "schema": "radroots.lib.source-lock.v1", - "source_archive_sha256": "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4", + "source_archive_sha256": "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958", "version": "0.1.0-alpha", "workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" }, @@ -502,15 +502,15 @@ "files": { "Cargo.lock": { "bytes": 94853, - "git_blob": "e57658fc836cefb23d8f3a1d9f97a8943e009161", + "git_blob": "36bdf532942dfc1928bde1fd66d7f5b104a5f698", "mode": "100644", - "sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258" + "sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0" }, "Cargo.toml": { "bytes": 4442, - "git_blob": "e81101026bb570003a937760309f0fc25f77e83e", + "git_blob": "d9dac2b6a1c3d5836d96e7f4b8315d94a832671e", "mode": "100644", - "sha256": "fda4aae3af3af1cf33ed2b489c0da507ec49efb4beac517ceab84c8c56544cc1" + "sha256": "fe744a382442f85590d6bbfa66b2dbe33634c2b82dcdb95e3b385edd6957e9e3" }, "Makefile": { "bytes": 3934, @@ -819,16 +819,16 @@ "sha256": "0dc99c1cc9cba832448368fe295a2a2b0ade4bc160d7f8f81c948b2460398794" }, "core/crates/tera_core/src/runtime/product_surface/outbox.rs": { - "bytes": 169119, - "git_blob": "2558459c65b57699bdb55f69d852de087e0d89df", + "bytes": 165122, + "git_blob": "741a296cd1f0af49a275d44baef07ea691970e0b", "mode": "100644", - "sha256": "f959da91a304fce36fdd696663982d276a922ed853e67871f647c0096671dc39" + "sha256": "465c9ec4fd2b0412c60d6e956cc87bcda761fcf2190c9fd33afd6c0a9106fe5f" }, "core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": { - "bytes": 3226, - "git_blob": "240483ba151c85a23635a94503f9317b1d6f1fec", + "bytes": 3981, + "git_blob": "d04f03090de9b0b61b11aa9b7792ac6898701391", "mode": "100644", - "sha256": "3ea5b554af27eb7d666a9cd4a2414a3c1cb59e0fa162632d1c77661fa7dfd579" + "sha256": "cb35de1bc4dc0f83a7b471af447cc2042527140b91a6ffcdac92e44d2b3d1e4d" }, "core/crates/tera_core/src/runtime/product_surface/outbox/configuration.rs": { "bytes": 5088, @@ -878,6 +878,18 @@ "mode": "100644", "sha256": "129522c664188effaacc3112f023cd3a5d044b574ab74e5e15917bae954de84f" }, + "core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs": { + "bytes": 7032, + "git_blob": "fc87aeebc4bdc2b021c8b3e1440a30eada5356d0", + "mode": "100644", + "sha256": "ac09cb352f40b44278db5bc193b77c60ef28bfe2489f9c88fba2b02d31a66973" + }, + "core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs": { + "bytes": 9051, + "git_blob": "d3b19c0a486df2baf0e9b6bedab0b97fa88adbc0", + "mode": "100644", + "sha256": "b61cb151d4fc6b5f5213c6a0736a745f56bcacd629b9cb9560b4bad9c61cf446" + }, "core/crates/tera_core/src/runtime/product_surface/outbox/revision_preparation.rs": { "bytes": 3830, "git_blob": "c07fd490205db0b537c427f9dda8d20b14e1dd25", @@ -896,11 +908,23 @@ "mode": "100644", "sha256": "f627f5c0461cdb233f58b24a25b2e9dc79c3f14c6418dec0e1ee05874a5284df" }, + "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs": { + "bytes": 5533, + "git_blob": "9684b217aa4bf7443220156a8ed7a128ecbbbf96", + "mode": "100644", + "sha256": "bbde9a37966c44c2923d52748173ea6e34a54b53977e766a239460c58136cf80" + }, + "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs": { + "bytes": 12417, + "git_blob": "6fc88e1e9916b0f9a534c1b215efbea743a2d74c", + "mode": "100644", + "sha256": "64115d7cbca899a6f4917a2fc637cf488475ed1b3049ec781d1f8a5a6e913f78" + }, "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs": { - "bytes": 10605, - "git_blob": "865abe9dc4efc1689f22780f2a8e588e943f1ec7", + "bytes": 10823, + "git_blob": "c73b288ac2a6229928e0d4e9159fed123145c597", "mode": "100644", - "sha256": "92a61fc686bc94cdfd84215d2b3108c839107c11aa9165d3e340d6b9281a45a3" + "sha256": "707a8e087f5ec9b43f71812f0ae2ff37edabe9b75d0b5031415d0f03e2cfd1a0" }, "core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs": { "bytes": 6104, @@ -2134,9 +2158,9 @@ }, "radroots.lib.source-lock.v1.toml": { "bytes": 482, - "git_blob": "64ee82bfefca72ade8c0be6b8e2c4689d0320313", + "git_blob": "37f3e153aca391daaff39885ee153540e0a5bee6", "mode": "100644", - "sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d" + "sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193" }, "rust-toolchain.toml": { "bytes": 79, @@ -2457,13 +2481,13 @@ "sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d" }, "test-fixtures/legacy-identifiers.v1.json": { - "bytes": 163937, - "git_blob": "f84e2e61c79e37841308bd9fdfc5fb65eeab15ff", + "bytes": 164555, + "git_blob": "c1c05c5f223b805486a68eb2e8769d085fddb908", "mode": "100644", - "sha256": "1280f3412487b43e977a090b14dca04cc19d3a9b1cd70249516c08cec973e351" + "sha256": "51d3624831e9ae1e1d235981fae688f1650da0b1d16e5a400ba627aa3b858868" } }, "policy": "staged_inputs", - "tree": "3fd45b713b327106c84b09a8ea06133019f86e43" + "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958" } } diff --git a/TeraFFI/source/aarch64-apple-ios-sim.json b/TeraFFI/source/aarch64-apple-ios-sim.json @@ -186,36 +186,36 @@ "proc-macro2 v1.0.107|default,proc-macro (*)", "quote v1.0.47|default,proc-macro", "quote v1.0.47|default,proc-macro (*)", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std (*)", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync (*)", - "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde (*)", - "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std (*)", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync (*)", + "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde (*)", + "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)", "rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng", "rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng", "rand_chacha v0.3.1|std", @@ -381,15 +381,15 @@ "symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.", "target": "aarch64-apple-ios-sim" }, - "cargo_lock_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258", + "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0", "disposition": "local_staged_source_only", "foundation": { "architecture": "radroots.crates.release.v2", - "lockfile_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258", + "lockfile_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0", "repository": "https://github.com/radrootslabs/lib", - "revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "revision": "77aa55c0894c0142dbae43e272a515fd093eac36", "schema": "radroots.lib.source-lock.v1", - "source_archive_sha256": "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4", + "source_archive_sha256": "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958", "version": "0.1.0-alpha", "workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" }, @@ -498,15 +498,15 @@ "files": { "Cargo.lock": { "bytes": 94853, - "git_blob": "e57658fc836cefb23d8f3a1d9f97a8943e009161", + "git_blob": "36bdf532942dfc1928bde1fd66d7f5b104a5f698", "mode": "100644", - "sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258" + "sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0" }, "Cargo.toml": { "bytes": 4442, - "git_blob": "e81101026bb570003a937760309f0fc25f77e83e", + "git_blob": "d9dac2b6a1c3d5836d96e7f4b8315d94a832671e", "mode": "100644", - "sha256": "fda4aae3af3af1cf33ed2b489c0da507ec49efb4beac517ceab84c8c56544cc1" + "sha256": "fe744a382442f85590d6bbfa66b2dbe33634c2b82dcdb95e3b385edd6957e9e3" }, "Makefile": { "bytes": 3934, @@ -815,16 +815,16 @@ "sha256": "0dc99c1cc9cba832448368fe295a2a2b0ade4bc160d7f8f81c948b2460398794" }, "core/crates/tera_core/src/runtime/product_surface/outbox.rs": { - "bytes": 169119, - "git_blob": "2558459c65b57699bdb55f69d852de087e0d89df", + "bytes": 165122, + "git_blob": "741a296cd1f0af49a275d44baef07ea691970e0b", "mode": "100644", - "sha256": "f959da91a304fce36fdd696663982d276a922ed853e67871f647c0096671dc39" + "sha256": "465c9ec4fd2b0412c60d6e956cc87bcda761fcf2190c9fd33afd6c0a9106fe5f" }, "core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": { - "bytes": 3226, - "git_blob": "240483ba151c85a23635a94503f9317b1d6f1fec", + "bytes": 3981, + "git_blob": "d04f03090de9b0b61b11aa9b7792ac6898701391", "mode": "100644", - "sha256": "3ea5b554af27eb7d666a9cd4a2414a3c1cb59e0fa162632d1c77661fa7dfd579" + "sha256": "cb35de1bc4dc0f83a7b471af447cc2042527140b91a6ffcdac92e44d2b3d1e4d" }, "core/crates/tera_core/src/runtime/product_surface/outbox/configuration.rs": { "bytes": 5088, @@ -874,6 +874,18 @@ "mode": "100644", "sha256": "129522c664188effaacc3112f023cd3a5d044b574ab74e5e15917bae954de84f" }, + "core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs": { + "bytes": 7032, + "git_blob": "fc87aeebc4bdc2b021c8b3e1440a30eada5356d0", + "mode": "100644", + "sha256": "ac09cb352f40b44278db5bc193b77c60ef28bfe2489f9c88fba2b02d31a66973" + }, + "core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs": { + "bytes": 9051, + "git_blob": "d3b19c0a486df2baf0e9b6bedab0b97fa88adbc0", + "mode": "100644", + "sha256": "b61cb151d4fc6b5f5213c6a0736a745f56bcacd629b9cb9560b4bad9c61cf446" + }, "core/crates/tera_core/src/runtime/product_surface/outbox/revision_preparation.rs": { "bytes": 3830, "git_blob": "c07fd490205db0b537c427f9dda8d20b14e1dd25", @@ -892,11 +904,23 @@ "mode": "100644", "sha256": "f627f5c0461cdb233f58b24a25b2e9dc79c3f14c6418dec0e1ee05874a5284df" }, + "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs": { + "bytes": 5533, + "git_blob": "9684b217aa4bf7443220156a8ed7a128ecbbbf96", + "mode": "100644", + "sha256": "bbde9a37966c44c2923d52748173ea6e34a54b53977e766a239460c58136cf80" + }, + "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs": { + "bytes": 12417, + "git_blob": "6fc88e1e9916b0f9a534c1b215efbea743a2d74c", + "mode": "100644", + "sha256": "64115d7cbca899a6f4917a2fc637cf488475ed1b3049ec781d1f8a5a6e913f78" + }, "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs": { - "bytes": 10605, - "git_blob": "865abe9dc4efc1689f22780f2a8e588e943f1ec7", + "bytes": 10823, + "git_blob": "c73b288ac2a6229928e0d4e9159fed123145c597", "mode": "100644", - "sha256": "92a61fc686bc94cdfd84215d2b3108c839107c11aa9165d3e340d6b9281a45a3" + "sha256": "707a8e087f5ec9b43f71812f0ae2ff37edabe9b75d0b5031415d0f03e2cfd1a0" }, "core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs": { "bytes": 6104, @@ -2130,9 +2154,9 @@ }, "radroots.lib.source-lock.v1.toml": { "bytes": 482, - "git_blob": "64ee82bfefca72ade8c0be6b8e2c4689d0320313", + "git_blob": "37f3e153aca391daaff39885ee153540e0a5bee6", "mode": "100644", - "sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d" + "sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193" }, "rust-toolchain.toml": { "bytes": 79, @@ -2453,13 +2477,13 @@ "sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d" }, "test-fixtures/legacy-identifiers.v1.json": { - "bytes": 163937, - "git_blob": "f84e2e61c79e37841308bd9fdfc5fb65eeab15ff", + "bytes": 164555, + "git_blob": "c1c05c5f223b805486a68eb2e8769d085fddb908", "mode": "100644", - "sha256": "1280f3412487b43e977a090b14dca04cc19d3a9b1cd70249516c08cec973e351" + "sha256": "51d3624831e9ae1e1d235981fae688f1650da0b1d16e5a400ba627aa3b858868" } }, "policy": "staged_inputs", - "tree": "3fd45b713b327106c84b09a8ea06133019f86e43" + "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958" } } diff --git a/TeraFFI/source/aarch64-apple-ios.json b/TeraFFI/source/aarch64-apple-ios.json @@ -186,36 +186,36 @@ "proc-macro2 v1.0.107|default,proc-macro (*)", "quote v1.0.47|default,proc-macro", "quote v1.0.47|default,proc-macro (*)", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std", - "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std", - "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,events,std (*)", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync", - "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|blossom,nostr,sqlite,sync (*)", - "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde", - "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde (*)", - "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std", - "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|json,serde,std (*)", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std", - "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|serde,std (*)", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)|", - "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d)| (*)", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std", + "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std", + "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,events,std (*)", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync", + "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|blossom,nostr,sqlite,sync (*)", + "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde", + "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde (*)", + "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std", + "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|json,serde,std (*)", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std", + "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|serde,std (*)", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)|", + "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0)| (*)", "rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng", "rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng", "rand_chacha v0.3.1|std", @@ -381,15 +381,15 @@ "symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.", "target": "aarch64-apple-ios" }, - "cargo_lock_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258", + "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0", "disposition": "local_staged_source_only", "foundation": { "architecture": "radroots.crates.release.v2", - "lockfile_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258", + "lockfile_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0", "repository": "https://github.com/radrootslabs/lib", - "revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "revision": "77aa55c0894c0142dbae43e272a515fd093eac36", "schema": "radroots.lib.source-lock.v1", - "source_archive_sha256": "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4", + "source_archive_sha256": "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958", "version": "0.1.0-alpha", "workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" }, @@ -498,15 +498,15 @@ "files": { "Cargo.lock": { "bytes": 94853, - "git_blob": "e57658fc836cefb23d8f3a1d9f97a8943e009161", + "git_blob": "36bdf532942dfc1928bde1fd66d7f5b104a5f698", "mode": "100644", - "sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258" + "sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0" }, "Cargo.toml": { "bytes": 4442, - "git_blob": "e81101026bb570003a937760309f0fc25f77e83e", + "git_blob": "d9dac2b6a1c3d5836d96e7f4b8315d94a832671e", "mode": "100644", - "sha256": "fda4aae3af3af1cf33ed2b489c0da507ec49efb4beac517ceab84c8c56544cc1" + "sha256": "fe744a382442f85590d6bbfa66b2dbe33634c2b82dcdb95e3b385edd6957e9e3" }, "Makefile": { "bytes": 3934, @@ -815,16 +815,16 @@ "sha256": "0dc99c1cc9cba832448368fe295a2a2b0ade4bc160d7f8f81c948b2460398794" }, "core/crates/tera_core/src/runtime/product_surface/outbox.rs": { - "bytes": 169119, - "git_blob": "2558459c65b57699bdb55f69d852de087e0d89df", + "bytes": 165122, + "git_blob": "741a296cd1f0af49a275d44baef07ea691970e0b", "mode": "100644", - "sha256": "f959da91a304fce36fdd696663982d276a922ed853e67871f647c0096671dc39" + "sha256": "465c9ec4fd2b0412c60d6e956cc87bcda761fcf2190c9fd33afd6c0a9106fe5f" }, "core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs": { - "bytes": 3226, - "git_blob": "240483ba151c85a23635a94503f9317b1d6f1fec", + "bytes": 3981, + "git_blob": "d04f03090de9b0b61b11aa9b7792ac6898701391", "mode": "100644", - "sha256": "3ea5b554af27eb7d666a9cd4a2414a3c1cb59e0fa162632d1c77661fa7dfd579" + "sha256": "cb35de1bc4dc0f83a7b471af447cc2042527140b91a6ffcdac92e44d2b3d1e4d" }, "core/crates/tera_core/src/runtime/product_surface/outbox/configuration.rs": { "bytes": 5088, @@ -874,6 +874,18 @@ "mode": "100644", "sha256": "129522c664188effaacc3112f023cd3a5d044b574ab74e5e15917bae954de84f" }, + "core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs": { + "bytes": 7032, + "git_blob": "fc87aeebc4bdc2b021c8b3e1440a30eada5356d0", + "mode": "100644", + "sha256": "ac09cb352f40b44278db5bc193b77c60ef28bfe2489f9c88fba2b02d31a66973" + }, + "core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs": { + "bytes": 9051, + "git_blob": "d3b19c0a486df2baf0e9b6bedab0b97fa88adbc0", + "mode": "100644", + "sha256": "b61cb151d4fc6b5f5213c6a0736a745f56bcacd629b9cb9560b4bad9c61cf446" + }, "core/crates/tera_core/src/runtime/product_surface/outbox/revision_preparation.rs": { "bytes": 3830, "git_blob": "c07fd490205db0b537c427f9dda8d20b14e1dd25", @@ -892,11 +904,23 @@ "mode": "100644", "sha256": "f627f5c0461cdb233f58b24a25b2e9dc79c3f14c6418dec0e1ee05874a5284df" }, + "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs": { + "bytes": 5533, + "git_blob": "9684b217aa4bf7443220156a8ed7a128ecbbbf96", + "mode": "100644", + "sha256": "bbde9a37966c44c2923d52748173ea6e34a54b53977e766a239460c58136cf80" + }, + "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs": { + "bytes": 12417, + "git_blob": "6fc88e1e9916b0f9a534c1b215efbea743a2d74c", + "mode": "100644", + "sha256": "64115d7cbca899a6f4917a2fc637cf488475ed1b3049ec781d1f8a5a6e913f78" + }, "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs": { - "bytes": 10605, - "git_blob": "865abe9dc4efc1689f22780f2a8e588e943f1ec7", + "bytes": 10823, + "git_blob": "c73b288ac2a6229928e0d4e9159fed123145c597", "mode": "100644", - "sha256": "92a61fc686bc94cdfd84215d2b3108c839107c11aa9165d3e340d6b9281a45a3" + "sha256": "707a8e087f5ec9b43f71812f0ae2ff37edabe9b75d0b5031415d0f03e2cfd1a0" }, "core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs": { "bytes": 6104, @@ -2130,9 +2154,9 @@ }, "radroots.lib.source-lock.v1.toml": { "bytes": 482, - "git_blob": "64ee82bfefca72ade8c0be6b8e2c4689d0320313", + "git_blob": "37f3e153aca391daaff39885ee153540e0a5bee6", "mode": "100644", - "sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d" + "sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193" }, "rust-toolchain.toml": { "bytes": 79, @@ -2453,13 +2477,13 @@ "sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d" }, "test-fixtures/legacy-identifiers.v1.json": { - "bytes": 163937, - "git_blob": "f84e2e61c79e37841308bd9fdfc5fb65eeab15ff", + "bytes": 164555, + "git_blob": "c1c05c5f223b805486a68eb2e8769d085fddb908", "mode": "100644", - "sha256": "1280f3412487b43e977a090b14dca04cc19d3a9b1cd70249516c08cec973e351" + "sha256": "51d3624831e9ae1e1d235981fae688f1650da0b1d16e5a400ba627aa3b858868" } }, "policy": "staged_inputs", - "tree": "3fd45b713b327106c84b09a8ea06133019f86e43" + "tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958" } } diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox.rs b/core/crates/tera_core/src/runtime/product_surface/outbox.rs @@ -46,6 +46,11 @@ use super::{ use crate::runtime::TeraRuntime; mod advance; +#[path = "outbox/revision_coordinator.rs"] +mod revision_coordinator; +#[path = "outbox/revision_delivery.rs"] +mod revision_delivery; +use revision_delivery::RevisionDelivery; #[path = "outbox/configuration.rs"] mod configuration; #[path = "outbox/inventory.rs"] @@ -1028,6 +1033,8 @@ struct Phase1DraftPayload { queue: Option<Phase1QueuePolicy>, #[serde(default)] revision: Option<Phase1RevisionRecord>, + #[serde(default, skip_serializing_if = "Option::is_none")] + revision_parent_draft_id: Option<[u8; 16]>, } #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] @@ -1102,6 +1109,7 @@ impl Phase1DraftPayload { media, queue: None, revision: None, + revision_parent_draft_id: None, }; value.validate()?; Ok(value) @@ -1122,6 +1130,7 @@ impl Phase1DraftPayload { media: Vec::new(), queue: None, revision: None, + revision_parent_draft_id: None, }; value.validate()?; Ok(value) @@ -1133,7 +1142,7 @@ impl Phase1DraftPayload { } match self.kind { Phase1DraftKind::Add => { - if self.target_card_id.is_some() { + if self.target_card_id.is_some() || self.revision_parent_draft_id.is_some() { return Err(Phase1DraftError::Corrupt); } if let Some(form) = &self.form { @@ -1184,6 +1193,9 @@ impl Phase1DraftPayload { return Err(Phase1DraftError::InvalidRevision); } } + if let Some(parent) = self.revision_parent_draft_id { + AuthoredDraftId::new(parent).map_err(|_| Phase1DraftError::Corrupt)?; + } let expected_media = media_urls(plan.body().tags())?; let actual_media = self .media @@ -1679,6 +1691,12 @@ impl TeraRuntime { Some(id) => match self.phase1_draft_status(id).await { Ok(status) => { validate_revision_retraction(&status, &revision.target)?; + if Phase1DraftPayload::decode(status.draft())? + .revision_parent_draft_id + .is_some_and(|parent| parent != replacement_draft_id) + { + return Err(Phase1DraftError::Corrupt); + } Some(status) } Err(Phase1DraftError::NotFound) => None, @@ -1696,167 +1714,6 @@ impl TeraRuntime { }) } - /// Advances the replacement first and creates the NIP-09 child only after - /// all configured replacement delivery targets accepted it. - pub async fn phase1_advance_revision( - &self, - replacement_draft_id: [u8; 16], - ) -> Result<Phase1RevisionStatus, Phase1DraftError> { - let _command = self.lifecycle.enter()?; - let admission = self.mutations.draft(replacement_draft_id)?; - let mut status = self.phase1_revision_status(replacement_draft_id).await?; - if matches!( - status.replacement.state(), - Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign - ) { - let now_unix_ms = phase1_operation_now_unix_ms()?; - self.phase1_queue_draft_admitted( - &admission, - replacement_draft_id, - status.replacement.draft().revision().get(), - None, - now_unix_ms, - ) - .await?; - status = self.phase1_revision_status(replacement_draft_id).await?; - } - if matches!( - status.replacement.state(), - Phase1OutboxState::Queued - | Phase1OutboxState::Retryable - | Phase1OutboxState::PartiallyDelivered - ) { - self.phase1_advance_draft_admitted( - &admission, - replacement_draft_id, - status.replacement.draft().revision().get(), - ) - .await?; - status = self.phase1_revision_status(replacement_draft_id).await?; - } - if status.replacement.state() != Phase1OutboxState::Complete - || status.policy != Phase1RevisionPolicy::ReplaceThenRetract - { - return Ok(status); - } - - let child_id = - revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?; - if status.retraction.is_none() { - self.phase1_create_revision_retraction(&status.target, child_id) - .await?; - status = self.phase1_revision_status(replacement_draft_id).await?; - } - let child = status - .retraction - .as_ref() - .ok_or(Phase1DraftError::Corrupt)?; - if matches!( - child.state(), - Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign - ) { - self.phase1_queue_add_intent(Phase1QueueIntent::new( - child_id, - child.draft().revision().get(), - )?) - .await?; - status = self.phase1_revision_status(replacement_draft_id).await?; - } - let child = status - .retraction - .as_ref() - .ok_or(Phase1DraftError::Corrupt)?; - if matches!( - child.state(), - Phase1OutboxState::Queued - | Phase1OutboxState::Retryable - | Phase1OutboxState::PartiallyDelivered - ) { - self.phase1_advance_draft(child_id, child.draft().revision().get()) - .await?; - } - self.phase1_revision_status(replacement_draft_id).await - } - - /// Cancels only still-pending work. If a kind-1 replacement is already - /// visible, a cancelled child records the deliberate partial effect and - /// prevents a later recovery from retracting the original unexpectedly. - pub async fn phase1_cancel_revision( - &self, - replacement_draft_id: [u8; 16], - ) -> Result<Phase1RevisionStatus, Phase1DraftError> { - let _command = self.lifecycle.enter()?; - let admission = self.mutations.draft(replacement_draft_id)?; - let mut status = self.phase1_revision_status(replacement_draft_id).await?; - if !matches!( - status.replacement.state(), - Phase1OutboxState::Complete - | Phase1OutboxState::Terminal - | Phase1OutboxState::Cancelled - ) { - self.phase1_cancel_draft_admitted( - &admission, - replacement_draft_id, - status.replacement.draft().revision().get(), - phase1_operation_now_unix_ms()?, - ) - .await?; - return self.phase1_revision_status(replacement_draft_id).await; - } - if status.replacement.state() == Phase1OutboxState::Complete - && status.policy == Phase1RevisionPolicy::ReplaceThenRetract - { - let child_id = - revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?; - if status.retraction.is_none() { - self.phase1_create_revision_retraction(&status.target, child_id) - .await?; - status = self.phase1_revision_status(replacement_draft_id).await?; - } - let child = status - .retraction - .as_ref() - .ok_or(Phase1DraftError::Corrupt)?; - if !matches!( - child.state(), - Phase1OutboxState::Complete - | Phase1OutboxState::Terminal - | Phase1OutboxState::Cancelled - ) { - self.phase1_cancel_add_intent(child_id, child.draft().revision().get()) - .await?; - } - } - self.phase1_revision_status(replacement_draft_id).await - } - - async fn phase1_create_revision_retraction( - &self, - target: &Phase1RevisionTarget, - draft_id: [u8; 16], - ) -> Result<Phase1DraftStatus, Phase1DraftError> { - let admission = self.mutations.draft(draft_id)?; - match self.phase1_draft_status(draft_id).await { - Ok(existing) => return Ok(existing), - Err(Phase1DraftError::NotFound) => {} - Err(error) => return Err(error), - } - let now_unix_ms = phase1_operation_now_unix_ms()?; - self.phase1_save_retraction_draft_admitted( - &admission, - draft_id, - target.command_type, - target.card_id, - &target.source_event_id, - target.source_kind, - target.source_address.as_deref(), - REVISION_RETRACTION_REASON, - now_unix_ms / 1_000, - now_unix_ms, - ) - .await - } - /// Creates or replaces the editable content of one immutable-revision draft. #[allow(clippy::too_many_arguments)] pub async fn phase1_save_draft( @@ -1942,6 +1799,9 @@ impl TeraRuntime { .ok_or(Phase1DraftError::NotFound)?; if head.revision() != expected || Phase1DraftPayload::decode(&head)?.revision.is_some() + || Phase1DraftPayload::decode(&head)? + .revision_parent()? + .is_some() || head.stage().is_terminal() || matches!( head.stage(), @@ -2003,6 +1863,7 @@ impl TeraRuntime { reason, authored_at_unix_s, persisted_at_unix_ms, + None, ) .await } @@ -2020,6 +1881,7 @@ impl TeraRuntime { reason: &str, authored_at_unix_s: u64, persisted_at_unix_ms: u64, + revision_parent_draft_id: Option<[u8; 16]>, ) -> Result<Phase1DraftStatus, Phase1DraftError> { let target_shape_valid = match command_type { AddCommandType::CreateUpdate @@ -2054,7 +1916,8 @@ impl TeraRuntime { let wire = PlanWireV1::from_plan(&plan) .to_json() .map_err(|_| Phase1DraftError::InvalidDraft)?; - let payload = Phase1DraftPayload::retraction(command_type, target_card_id, wire)?; + let mut payload = Phase1DraftPayload::retraction(command_type, target_card_id, wire)?; + payload.revision_parent_draft_id = revision_parent_draft_id; let bytes = payload.encode()?; let draft = AuthoredDraft::initial( draft_id, @@ -2306,7 +2169,14 @@ impl TeraRuntime { return Err(Phase1DraftError::RevisionConflict); } let mut payload = Phase1DraftPayload::decode(&head)?; - let policy = match policy.or_else(|| payload.queue.clone()) { + let inherited = self.revision_child_queue_policy(&head).await?; + if inherited + .as_ref() + .is_some_and(|frozen| policy.as_ref().is_some_and(|policy| policy != frozen)) + { + return Err(Phase1DraftError::InvalidQueuePolicy); + } + let policy = match inherited.or(policy).or_else(|| payload.queue.clone()) { Some(policy) => policy, None => self.active_queue_policy(queued_at_unix_ms)?, }; @@ -2419,6 +2289,13 @@ impl TeraRuntime { if head.revision() != expected || head.stage() != AuthoredDraftStage::Queued { return Err(Phase1DraftError::RevisionConflict); } + let _parent_admission = self.revision_parent_admission(&head)?; + if matches!( + self.revision_delivery_selection(&head).await?, + RevisionDelivery::Held + ) { + return self.draft_status_from(head).await; + } self.require_legacy_publication_running(sync_id_for(&head)?) .await?; self.sync()? @@ -2460,8 +2337,11 @@ impl TeraRuntime { if head.revision() != expected || head.stage() != AuthoredDraftStage::Queued { return Err(Phase1DraftError::RevisionConflict); } + let _parent_admission = self.revision_parent_admission(&head)?; let request = push_request(&head)?; - self.advance_push_request(request).await?; + // Keep the effect pipeline off the caller's nested native async frame. + // This caller retains both mutation permits across the awaited pipeline. + Box::pin(self.advance_revision_child_request(&head, request)).await?; self.draft_status_from(head).await } @@ -2901,6 +2781,11 @@ impl TeraRuntime { ready: AuthoredDraft, queued_at_unix_ms: u64, ) -> Result<Phase1DraftStatus, Phase1DraftError> { + if let Some(inherited) = self.revision_child_queue_policy(&ready).await? + && Phase1DraftPayload::decode(&ready)?.queue.as_ref() != Some(&inherited) + { + return Err(Phase1DraftError::InvalidQueuePolicy); + } let request = push_request(&ready)?; self.sync()? .prepare_push(request) @@ -3388,6 +3273,8 @@ fn phase1_random_id() -> Result<[u8; 16], Phase1DraftError> { #[cfg(test)] mod tests { mod recovery_completion_tests; + mod revision_delivery_support; + mod revision_delivery_tests; mod revision_preparation_tests; use super::*; use crate::runtime::product_surface::{ diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/advance.rs @@ -16,6 +16,24 @@ impl TeraRuntime { request: PushRequest, clock: impl Fn() -> Result<u64, Phase1DraftError> + Send + Sync, ) -> Result<(), Phase1DraftError> { + self.advance_push_request_inner(request, None, clock).await + } + + pub(in crate::runtime::product_surface) async fn advance_push_request_selected( + &self, + request: PushRequest, + selected: TargetSet, + ) -> Result<(), Phase1DraftError> { + self.advance_push_request_inner(request, Some(selected), phase1_operation_now_unix_ms) + .await + } + + async fn advance_push_request_inner( + &self, + request: PushRequest, + selected: Option<TargetSet>, + clock: impl Fn() -> Result<u64, Phase1DraftError> + Send + Sync, + ) -> Result<(), Phase1DraftError> { let operation_id = request.operation_id(); self.require_legacy_publication_running(operation_id) .await?; @@ -80,9 +98,11 @@ impl TeraRuntime { AuthoredDeliveryState::Pending | AuthoredDeliveryState::Retryable ) { - sync.deliver_push(operation_id) - .await - .map_err(|_| Phase1DraftError::Operation)?; + match selected { + Some(targets) => sync.deliver_push_selected(operation_id, targets).await, + None => sync.deliver_push(operation_id).await, + } + .map_err(|_| Phase1DraftError::Operation)?; } Ok(()) } diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/revision_coordinator.rs @@ -0,0 +1,184 @@ +//! Ordered revision coordination over durable replacement and child facts. + +use super::*; + +impl TeraRuntime { + /// Advances replacement and deletion independently per frozen target. + /// A deletion target requires its own replacement acceptance/read-back. + pub async fn phase1_advance_revision( + &self, + replacement_draft_id: [u8; 16], + ) -> Result<Phase1RevisionStatus, Phase1DraftError> { + let _command = self.lifecycle.enter()?; + let admission = self.mutations.draft(replacement_draft_id)?; + let mut status = self.phase1_revision_status(replacement_draft_id).await?; + if status.replacement.draft().stage() == AuthoredDraftStage::Cancelled + || status + .replacement + .push() + .is_some_and(|push| push.delivery_plan().stop_requested_at_unix_ms().is_some()) + { + return Ok(status); + } + if matches!( + status.replacement.state(), + Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign + ) { + let now_unix_ms = phase1_operation_now_unix_ms()?; + self.phase1_queue_draft_admitted( + &admission, + replacement_draft_id, + status.replacement.draft().revision().get(), + None, + now_unix_ms, + ) + .await?; + status = self.phase1_revision_status(replacement_draft_id).await?; + } + if matches!( + status.replacement.state(), + Phase1OutboxState::Queued + | Phase1OutboxState::Retryable + | Phase1OutboxState::PartiallyDelivered + ) { + self.phase1_advance_draft_admitted( + &admission, + replacement_draft_id, + status.replacement.draft().revision().get(), + ) + .await?; + status = self.phase1_revision_status(replacement_draft_id).await?; + } + if status.policy != Phase1RevisionPolicy::ReplaceThenRetract + || !self + .revision_has_replacement_evidence(&status.replacement) + .await? + { + return Ok(status); + } + + let child_id = + revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?; + if status.retraction.is_none() { + self.phase1_create_revision_retraction(&status.target, child_id, replacement_draft_id) + .await?; + status = self.phase1_revision_status(replacement_draft_id).await?; + } + let child = status + .retraction + .as_ref() + .ok_or(Phase1DraftError::Corrupt)?; + if matches!( + child.state(), + Phase1OutboxState::Draft | Phase1OutboxState::ReadyToSign + ) { + self.phase1_queue_add_intent(Phase1QueueIntent::new( + child_id, + child.draft().revision().get(), + )?) + .await?; + status = self.phase1_revision_status(replacement_draft_id).await?; + } + let child = status + .retraction + .as_ref() + .ok_or(Phase1DraftError::Corrupt)?; + if matches!( + child.state(), + Phase1OutboxState::Queued + | Phase1OutboxState::Retryable + | Phase1OutboxState::PartiallyDelivered + ) { + drop(admission); + self.phase1_advance_draft(child_id, child.draft().revision().get()) + .await?; + } + self.phase1_revision_status(replacement_draft_id).await + } + + /// Cancels only still-pending work. If a kind-1 replacement is already + /// visible, a cancelled child records the deliberate partial effect and + /// prevents a later recovery from retracting the original unexpectedly. + pub async fn phase1_cancel_revision( + &self, + replacement_draft_id: [u8; 16], + ) -> Result<Phase1RevisionStatus, Phase1DraftError> { + let _command = self.lifecycle.enter()?; + let admission = self.mutations.draft(replacement_draft_id)?; + let mut status = self.phase1_revision_status(replacement_draft_id).await?; + if !matches!( + status.replacement.state(), + Phase1OutboxState::Complete + | Phase1OutboxState::Terminal + | Phase1OutboxState::Cancelled + ) { + self.phase1_cancel_draft_admitted( + &admission, + replacement_draft_id, + status.replacement.draft().revision().get(), + phase1_operation_now_unix_ms()?, + ) + .await?; + status = self.phase1_revision_status(replacement_draft_id).await?; + } + if (status.replacement.state() == Phase1OutboxState::Complete + || status.retraction.is_some()) + && status.policy == Phase1RevisionPolicy::ReplaceThenRetract + { + let child_id = + revision_child_id(status.replacement.draft())?.ok_or(Phase1DraftError::Corrupt)?; + if status.retraction.is_none() { + self.phase1_create_revision_retraction( + &status.target, + child_id, + replacement_draft_id, + ) + .await?; + status = self.phase1_revision_status(replacement_draft_id).await?; + } + let child = status + .retraction + .as_ref() + .ok_or(Phase1DraftError::Corrupt)?; + if !matches!( + child.state(), + Phase1OutboxState::Complete + | Phase1OutboxState::Terminal + | Phase1OutboxState::Cancelled + ) { + self.phase1_cancel_add_intent(child_id, child.draft().revision().get()) + .await?; + } + } + self.phase1_revision_status(replacement_draft_id).await + } + + pub(super) async fn phase1_create_revision_retraction( + &self, + target: &Phase1RevisionTarget, + draft_id: [u8; 16], + replacement_draft_id: [u8; 16], + ) -> Result<Phase1DraftStatus, Phase1DraftError> { + let admission = self.mutations.draft(draft_id)?; + match self.phase1_draft_status(draft_id).await { + Ok(existing) => return Ok(existing), + Err(Phase1DraftError::NotFound) => {} + Err(error) => return Err(error), + } + let now_unix_ms = phase1_operation_now_unix_ms()?; + self.phase1_save_retraction_draft_admitted( + &admission, + draft_id, + target.command_type, + target.card_id, + &target.source_event_id, + target.source_kind, + target.source_address.as_deref(), + REVISION_RETRACTION_REASON, + now_unix_ms / 1_000, + now_unix_ms, + Some(replacement_draft_id), + ) + .await + } +} diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/revision_delivery.rs @@ -0,0 +1,237 @@ +//! Revision children retain the full frozen destination policy and admit only +//! targets with exact replacement evidence. No aggregate state grants admission. + +use super::*; +use crate::runtime::{ + mutation_admission::MutationPermit, + product_surface::publication_targets::{PublicationTargetDetails, PublicationTargetEvidence}, +}; + +pub(super) enum RevisionDelivery { + Independent, + Held, + Selected(TargetSet), +} + +impl Phase1DraftPayload { + pub(super) fn revision_parent(&self) -> Result<Option<[u8; 16]>, Phase1DraftError> { + if let Some(parent) = self.revision_parent_draft_id { + return Ok(Some(parent)); + } + // Old revision children have no exact reverse key. Their recognizable + // reserved reason is held, never rebound to a guessed parent or policy. + if self.kind == Phase1DraftKind::Retraction { + let plan = PlanWireV1::from_json(&self.plan_wire_json) + .map_err(|_| Phase1DraftError::Corrupt)?; + if plan.plan().body().content() == REVISION_RETRACTION_REASON { + return Err(Phase1DraftError::InvalidRevision); + } + } + Ok(None) + } +} + +impl TeraRuntime { + pub(super) async fn revision_has_replacement_evidence( + &self, + replacement: &Phase1DraftStatus, + ) -> Result<bool, Phase1DraftError> { + let Some(push) = replacement.push() else { + return Ok(false); + }; + if replacement.draft().stage() == AuthoredDraftStage::Cancelled + || push.delivery_plan().stop_requested_at_unix_ms().is_some() + { + return Ok(false); + } + let storage = self + .client + .storage() + .map_err(|_| Phase1DraftError::Storage)?; + let evidence = PublicationTargetDetails::load(push, storage).await; + Ok(evidence + .targets + .iter() + .any(|target| meets_requirement(target, evidence.requires_delivery))) + } + + pub(super) fn revision_parent_admission( + &self, + head: &AuthoredDraft, + ) -> Result<Option<MutationPermit<'_>>, Phase1DraftError> { + Phase1DraftPayload::decode(head)? + .revision_parent()? + .map(|parent| self.mutations.draft(parent)) + .transpose() + } + + /// Validates the exact relation independently of current relay configuration. + async fn revision_child_parent( + &self, + child: &AuthoredDraft, + ) -> Result<Option<Phase1DraftStatus>, Phase1DraftError> { + let payload = Phase1DraftPayload::decode(child)?; + let Some(parent_id) = payload.revision_parent()? else { + return Ok(None); + }; + if parent_id == *child.draft_id().as_bytes() { + return Err(Phase1DraftError::Corrupt); + } + let parent = self.phase1_draft_status(parent_id).await?; + let parent_payload = Phase1DraftPayload::decode(parent.draft())?; + let revision = parent_payload.revision.ok_or(Phase1DraftError::Corrupt)?; + if revision.policy != Phase1RevisionPolicy::ReplaceThenRetract + || revision.retraction_draft_id != Some(*child.draft_id().as_bytes()) + || child.author() != parent.draft().author() + || revision.target.author_public_key != hex::encode(parent.draft().author()) + { + return Err(Phase1DraftError::Corrupt); + } + validate_revision_retraction( + &self.draft_status_from(child.clone()).await?, + &revision.target, + )?; + if parent.draft().stage() == AuthoredDraftStage::Cancelled + || parent + .push() + .is_some_and(|push| push.delivery_plan().stop_requested_at_unix_ms().is_some()) + { + return Err(Phase1DraftError::Terminal); + } + Ok(Some(parent)) + } + + pub(super) async fn revision_child_queue_policy( + &self, + child: &AuthoredDraft, + ) -> Result<Option<Phase1QueuePolicy>, Phase1DraftError> { + let Some(parent) = Box::pin(self.revision_child_parent(child)).await? else { + return Ok(None); + }; + Phase1DraftPayload::decode(parent.draft())? + .queue + .map(Some) + .ok_or(Phase1DraftError::InvalidRevision) + } + + /// Called with parent mutation admission retained across signing/delivery. + pub(super) async fn revision_delivery_selection( + &self, + child: &AuthoredDraft, + ) -> Result<RevisionDelivery, Phase1DraftError> { + let Some(parent) = Box::pin(self.revision_child_parent(child)).await? else { + return Ok(RevisionDelivery::Independent); + }; + let frozen = Phase1DraftPayload::decode(parent.draft())? + .queue + .ok_or(Phase1DraftError::InvalidRevision)?; + if Phase1DraftPayload::decode(child)?.queue.as_ref() != Some(&frozen) { + return Err(Phase1DraftError::InvalidRevision); + } + let Some(parent_push) = parent.push() else { + return Ok(RevisionDelivery::Held); + }; + let storage = self + .client + .storage() + .map_err(|_| Phase1DraftError::Storage)?; + let replacement = PublicationTargetDetails::load(parent_push, storage).await; + let child_details = match self.push_status_for(child).await? { + Some(push) => Some(PublicationTargetDetails::load(&push, storage).await), + None => None, + }; + let (targets, _, _) = frozen.materialize()?; + let eligible = targets + .targets() + .iter() + .filter(|target| { + let fingerprint = target.fingerprint().as_str(); + replacement.targets.iter().any(|evidence| { + evidence.fingerprint == fingerprint + && meets_requirement(evidence, replacement.requires_delivery) + }) && !child_details.as_ref().is_some_and(|details| { + details.targets.iter().any(|evidence| { + evidence.fingerprint == fingerprint + && meets_requirement(evidence, details.requires_delivery) + }) + }) + }) + .cloned() + .collect::<Vec<_>>(); + if eligible.is_empty() { + Ok(RevisionDelivery::Held) + } else { + TargetSet::new(eligible) + .map(RevisionDelivery::Selected) + .map_err(|_| Phase1DraftError::Corrupt) + } + } + + pub(super) async fn advance_revision_child_request( + &self, + head: &AuthoredDraft, + request: PushRequest, + ) -> Result<(), Phase1DraftError> { + match self.revision_delivery_selection(head).await? { + RevisionDelivery::Independent => self.advance_push_request(request).await, + RevisionDelivery::Selected(targets) => { + self.advance_push_request_selected(request, targets).await + } + RevisionDelivery::Held => { + // Reconciliation cannot initiate another effect in this call. + // Preserve it without claiming/consuming a held delivery attempt. + let push = self + .push_status_for(head) + .await? + .ok_or(Phase1DraftError::Corrupt)?; + if push + .delivery_plan() + .pending_delivery_facts() + .next() + .is_some() + { + self.sync()? + .deliver_push(request.operation_id()) + .await + .map_err(|_| Phase1DraftError::Operation)?; + } + Ok(()) + } + } + } +} + +fn meets_requirement(evidence: &PublicationTargetEvidence, requires_delivery: bool) -> bool { + evidence.read_back_observed_at_unix_ms.is_some() + || evidence.delivered + || (!requires_delivery && evidence.accepted) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn replacement_requirement_distinguishes_acceptance_delivery_and_positive_read_back() { + let mut evidence = PublicationTargetEvidence { + fingerprint: "one".into(), + endpoint: "wss://one.example".into(), + attempted: true, + accepted: true, + delivered: false, + rejected: false, + uncertain: true, + read_back_observed_at_unix_ms: None, + }; + assert!(meets_requirement(&evidence, false)); + assert!(!meets_requirement(&evidence, true)); + evidence.delivered = true; + assert!(meets_requirement(&evidence, true)); + evidence.delivered = false; + evidence.accepted = false; + assert!(!meets_requirement(&evidence, false)); + evidence.read_back_observed_at_unix_ms = Some(1); + assert!(meets_requirement(&evidence, false)); + assert!(meets_requirement(&evidence, true)); + } +} diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs @@ -0,0 +1,173 @@ +use super::*; +use futures_util::{SinkExt, StreamExt}; +use radroots_sdk::transport::{ + RelayAccess, RelayEndpoint, RelayProfile, RelayProfileKind, RelayUrlPolicy, +}; +use std::sync::{ + Mutex, + atomic::{AtomicBool, Ordering}, +}; +use std::time::Duration; +use tokio::net::TcpListener; +use tokio_tungstenite::{accept_async, tungstenite::Message}; + +pub(super) struct Relay { + pub(super) url: String, + pub(super) accept_replacement: Arc<AtomicBool>, + pub(super) events: Arc<Mutex<Vec<serde_json::Value>>>, + task: tokio::task::JoinHandle<()>, +} + +impl Relay { + pub(super) async fn start(accept_replacement: bool) -> Self { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let url = format!("ws://{}", listener.local_addr().unwrap()); + let accept_replacement = Arc::new(AtomicBool::new(accept_replacement)); + let events = Arc::new(Mutex::new(Vec::new())); + let accepted = accept_replacement.clone(); + let captured = events.clone(); + let task = tokio::spawn(async move { + loop { + let (stream, _) = listener.accept().await.unwrap(); + let mut socket = accept_async(stream).await.unwrap(); + while let Some(Ok(frame)) = socket.next().await { + let Message::Text(wire) = frame else { + continue; + }; + let frame: serde_json::Value = serde_json::from_str(&wire).unwrap(); + if frame[0] != "EVENT" { + continue; + } + captured.lock().unwrap().push(frame[1].clone()); + // A received replacement without an OK is not acceptance. + if frame[1]["kind"] == 1 && !accepted.load(Ordering::SeqCst) { + break; + } + socket + .send(Message::Text( + serde_json::json!(["OK", frame[1]["id"], true, ""]) + .to_string() + .into(), + )) + .await + .unwrap(); + // Keep the connection alive for the next EVENT: the production + // client may reuse a relay socket across replacement and child. + } + } + }); + Self { + url, + accept_replacement, + events, + task, + } + } + + pub(super) fn kinds(&self) -> Vec<u64> { + self.events + .lock() + .unwrap() + .iter() + .map(|event| event["kind"].as_u64().unwrap()) + .collect() + } +} + +impl Drop for Relay { + fn drop(&mut self) { + self.task.abort(); + } +} + +pub(super) async fn persistent_runtime(root: &std::path::Path, urls: &[String]) -> TeraRuntime { + let store = MobileUserStoreConfig::from_encoded( + root, + AUTHOR, + &hex::encode([4; 32]), + 1_900_000_000_000, + ProtectedDataAvailability::Available, + ) + .unwrap(); + std::fs::create_dir_all(store.owner_directory()).unwrap(); + let signer = radroots_nostr::signing::LocalSigner::new( + radroots_nostr::key::SecretKey::parse(SECRET).unwrap(), + ) + .unwrap(); + RuntimeBuilder::new(store) + .signer(Arc::new(signer)) + .relay_profile( + RelayProfile::explicit( + RelayProfileKind::Simulator, + urls.iter().map(|url| { + RelayEndpoint::new(url, RelayUrlPolicy::Local, RelayAccess::ReadWrite).unwrap() + }), + ) + .unwrap(), + ) + .build() + .await + .unwrap() +} + +pub(super) async fn saved_revision(runtime: &TeraRuntime) -> Phase1RevisionStatus { + let event = "b".repeat(64); + let target = Phase1RevisionTarget::new( + AddCommandType::CreateUpdate, + CardId::derive( + TodayCardType::Update, + &CardSourceIdentity::Event(radroots_event::EventId::parse(&event).unwrap()), + ), + event, + 1, + None, + AUTHOR, + ) + .unwrap(); + runtime + .prepare_revision_intent( + [102; 16], + Phase1ReviseIntent::new( + target, + Phase1AddCommand::CreateUpdate(CreateUpdate::new("Corrected harvest").unwrap()), + vec![], + Phase1DraftFormSnapshot { + content: "Corrected harvest".into(), + ..update_form() + }, + ) + .unwrap(), + ) + .await + .unwrap() +} + +pub(super) async fn wait_retry(runtime: &TeraRuntime, status: &Phase1DraftStatus) { + let Some(push) = status.push() else { + return; + }; + let now = phase1_operation_now_unix_ms().unwrap(); + if let crate::runtime::product_surface::PublicationRetryDecision::DeferredUntil(at) = + runtime.publication_retry_at(push, now).unwrap() + { + assert!( + at.saturating_sub(now) < 10_000, + "test must retain a bounded real wait" + ); + tokio::time::sleep(Duration::from_millis(at.saturating_sub(now) + 10)).await; + } +} + +pub(super) fn raw_child(status: &Phase1RevisionStatus) -> String { + status + .retraction() + .unwrap() + .push() + .unwrap() + .artifact() + .signed() + .unwrap() + .event() + .raw_json() + .to_owned() +} diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs @@ -0,0 +1,393 @@ +use super::revision_delivery_support::*; +use super::*; +use std::sync::atomic::Ordering; + +#[tokio::test] +async fn aggregate_any_acceptance_never_authorizes_the_other_relay() { + let root = tempfile::tempdir().unwrap(); + let a = Relay::start(true).await; + let b = Relay::start(false).await; + let urls = vec![a.url.clone(), b.url.clone()]; + let runtime = persistent_runtime(root.path(), &urls).await; + let saved = saved_revision(&runtime).await; + let id = *saved.replacement().draft().draft_id().as_bytes(); + let now = phase1_operation_now_unix_ms().unwrap(); + let policy = Phase1QueuePolicy::new( + vec![a.url.clone(), b.url.clone()], + Phase1RelaySatisfaction::AnyAccepted, + now + 60_000, + Phase1CancellationPolicy::LocalCooperative, + ) + .unwrap(); + runtime + .phase1_queue_draft( + id, + saved.replacement().draft().revision().get(), + policy, + now, + ) + .await + .unwrap(); + let status = runtime.phase1_advance_revision(id).await.unwrap(); + assert_eq!(status.replacement().state(), Phase1OutboxState::Complete); + assert_eq!( + status + .retraction() + .unwrap() + .push() + .unwrap() + .delivery_plan() + .request() + .unwrap() + .target_set() + .len(), + 2 + ); + assert_eq!(a.kinds(), vec![1, 5]); + assert_eq!(b.kinds(), vec![1]); + runtime.shutdown().await.unwrap(); +} + +#[tokio::test] +async fn per_target_revision_freezes_policy_and_reopens_one_signed_child() { + let root = tempfile::tempdir().unwrap(); + let a = Relay::start(true).await; + let b = Relay::start(false).await; + let c = Relay::start(true).await; + let mut urls = vec![a.url.clone(), b.url.clone()]; + let runtime = persistent_runtime(root.path(), &urls).await; + let saved = saved_revision(&runtime).await; + let id = *saved.replacement().draft().draft_id().as_bytes(); + let queued = runtime + .phase1_queue_add_intent( + Phase1QueueIntent::new(id, saved.replacement().draft().revision().get()).unwrap(), + ) + .await + .unwrap(); + runtime + .phase1_advance_draft(id, queued.draft().revision().get()) + .await + .unwrap(); + urls.push(c.url.clone()); + runtime + .configure_simulator_relays(urls.clone()) + .await + .unwrap(); + let partial = runtime.phase1_advance_revision(id).await.unwrap(); + let child = partial + .retraction() + .expect("A acceptance permits only A deletion"); + let child_id = *child.draft().draft_id().as_bytes(); + assert_eq!(a.kinds(), vec![1, 5]); + assert_eq!(b.kinds(), vec![1]); + assert!(c.kinds().is_empty()); + let parent_policy = Phase1DraftPayload::decode(partial.replacement().draft()) + .unwrap() + .queue; + assert_eq!( + Phase1DraftPayload::decode(child.draft()).unwrap().queue, + parent_policy + ); + assert_eq!( + child + .push() + .unwrap() + .delivery_plan() + .request() + .unwrap() + .target_set() + .len(), + 2 + ); + let raw = raw_child(&partial); + let attempts = child.push().unwrap().delivery_plan().attempt_count(); + wait_retry(&runtime, child).await; + let held = runtime + .phase1_advance_draft(child_id, child.draft().revision().get()) + .await + .unwrap(); + assert_eq!( + held.push().unwrap().delivery_plan().attempt_count(), + attempts + ); + assert_eq!(a.kinds().iter().filter(|kind| **kind == 5).count(), 1); + assert_eq!(b.kinds(), vec![1]); + runtime.shutdown().await.unwrap(); + drop(runtime); + + b.accept_replacement.store(true, Ordering::SeqCst); + let runtime = persistent_runtime(root.path(), &urls).await; + let recovered = runtime.phase1_revision_status(id).await.unwrap(); + assert_eq!(raw_child(&recovered), raw); + wait_retry(&runtime, recovered.replacement()).await; + wait_retry(&runtime, recovered.retraction().unwrap()).await; + let complete = runtime.phase1_advance_revision(id).await.unwrap(); + assert_eq!(complete.replacement().state(), Phase1OutboxState::Complete); + assert_eq!( + complete.retraction().unwrap().state(), + Phase1OutboxState::Complete + ); + assert_eq!(raw_child(&complete), raw); + assert_eq!(a.kinds().iter().filter(|kind| **kind == 5).count(), 1); + assert_eq!(b.kinds(), vec![1, 1, 5]); + assert!(c.kinds().is_empty()); + let expected: serde_json::Value = serde_json::from_str(&raw).unwrap(); + assert_eq!( + a.events + .lock() + .unwrap() + .iter() + .find(|event| event["kind"] == 5) + .unwrap(), + &expected + ); + assert_eq!(b.events.lock().unwrap().last().unwrap(), &expected); + runtime.shutdown().await.unwrap(); +} + +#[tokio::test] +async fn cancellation_stops_both_partial_branches_and_direct_child_after_reopen() { + let root = tempfile::tempdir().unwrap(); + let a = Relay::start(true).await; + let b = Relay::start(false).await; + let urls = vec![a.url.clone(), b.url.clone()]; + let runtime = persistent_runtime(root.path(), &urls).await; + let saved = saved_revision(&runtime).await; + let id = *saved.replacement().draft().draft_id().as_bytes(); + let partial = runtime.phase1_advance_revision(id).await.unwrap(); + let raw = raw_child(&partial); + let child_id = *partial.retraction().unwrap().draft().draft_id().as_bytes(); + let stopped = runtime.phase1_cancel_revision(id).await.unwrap(); + assert_eq!( + stopped.replacement().draft().stage(), + AuthoredDraftStage::Cancelled + ); + assert_eq!( + stopped.retraction().unwrap().draft().stage(), + AuthoredDraftStage::Cancelled + ); + assert_eq!(raw_child(&stopped), raw); + assert!( + !stopped + .retraction() + .unwrap() + .push() + .unwrap() + .delivery_plan() + .delivery_facts() + .is_empty() + ); + runtime.shutdown().await.unwrap(); + drop(runtime); + b.accept_replacement.store(true, Ordering::SeqCst); + let runtime = persistent_runtime(root.path(), &urls).await; + let reopened = runtime.phase1_advance_revision(id).await.unwrap(); + assert_eq!(raw_child(&reopened), raw); + assert!( + runtime + .phase1_advance_draft( + child_id, + reopened.retraction().unwrap().draft().revision().get() + ) + .await + .is_err() + ); + assert_eq!(a.kinds(), vec![1, 5]); + assert_eq!(b.kinds(), vec![1]); + runtime.shutdown().await.unwrap(); +} + +#[tokio::test] +async fn historical_unlinked_revision_reason_is_held_without_rewriting_old_payload() { + let runtime = signing_runtime(); + let source = "b".repeat(64); + let card = CardId::derive( + TodayCardType::Update, + &CardSourceIdentity::Event(radroots_event::EventId::parse(&source).unwrap()), + ); + let old = runtime + .phase1_save_retraction_draft( + [103; 16], + AddCommandType::CreateUpdate, + card, + &source, + 1, + None, + REVISION_RETRACTION_REASON, + 1_900_000_000, + 1_900_000_000_000, + ) + .await + .unwrap(); + let bytes = old.draft().payload().to_vec(); + assert!( + !std::str::from_utf8(&bytes) + .unwrap() + .contains("revision_parent_draft_id") + ); + assert_eq!( + Phase1DraftPayload::decode(old.draft()) + .unwrap() + .encode() + .unwrap(), + bytes + ); + assert_eq!( + runtime + .phase1_queue_draft( + [103; 16], + old.draft().revision().get(), + policy(), + 1_900_000_000_001, + ) + .await + .unwrap_err(), + Phase1DraftError::InvalidRevision + ); + assert_eq!( + runtime + .phase1_draft_status([103; 16]) + .await + .unwrap() + .draft() + .payload(), + bytes + ); + let independent = runtime + .phase1_save_retraction_draft( + [104; 16], + AddCommandType::CreateUpdate, + card, + &source, + 1, + None, + "I retract this post", + 1_900_000_000, + 1_900_000_000_000, + ) + .await + .unwrap(); + let queued = runtime + .phase1_queue_draft( + [104; 16], + independent.draft().revision().get(), + policy(), + 1_900_000_000_001, + ) + .await + .unwrap(); + assert_eq!(queued.state(), Phase1OutboxState::Queued); + assert!(matches!( + runtime + .revision_delivery_selection(queued.draft()) + .await + .unwrap(), + RevisionDelivery::Independent + )); +} + +#[tokio::test] +async fn child_queue_rejects_changed_frozen_policy_and_foreign_parent_link() { + let root = tempfile::tempdir().unwrap(); + let relay = Relay::start(true).await; + let runtime = persistent_runtime(root.path(), std::slice::from_ref(&relay.url)).await; + let saved = saved_revision(&runtime).await; + let id = *saved.replacement().draft().draft_id().as_bytes(); + let parent = runtime + .phase1_queue_add_intent( + Phase1QueueIntent::new(id, saved.replacement().draft().revision().get()).unwrap(), + ) + .await + .unwrap(); + let child_id = revision_child_id(parent.draft()).unwrap().unwrap(); + let child = runtime + .phase1_create_revision_retraction(saved.target(), child_id, id) + .await + .unwrap(); + assert_eq!( + runtime + .phase1_queue_draft( + child_id, + child.draft().revision().get(), + policy(), + phase1_operation_now_unix_ms().unwrap(), + ) + .await + .unwrap_err(), + Phase1DraftError::InvalidQueuePolicy + ); + let queued = runtime + .phase1_queue_add_intent( + Phase1QueueIntent::new(child_id, child.draft().revision().get()).unwrap(), + ) + .await + .unwrap(); + let parent_admission = runtime.mutations.draft(id).unwrap(); + assert_eq!( + runtime + .phase1_advance_draft(child_id, queued.draft().revision().get()) + .await + .unwrap_err(), + Phase1DraftError::OperationInProgress + ); + drop(parent_admission); + assert!(matches!( + runtime + .revision_delivery_selection(queued.draft()) + .await + .unwrap(), + RevisionDelivery::Held + )); + runtime + .phase1_advance_draft(child_id, queued.draft().revision().get()) + .await + .unwrap(); + assert!(relay.kinds().is_empty()); + assert!( + runtime + .phase1_draft_status(child_id) + .await + .unwrap() + .push() + .unwrap() + .artifact() + .signed() + .is_none() + ); + let other = runtime + .phase1_save_revision_intent( + Phase1ReviseIntent::new( + saved.target().clone(), + Phase1AddCommand::CreateUpdate(CreateUpdate::new("Other").unwrap()), + vec![], + Phase1DraftFormSnapshot { + content: "Other".into(), + ..update_form() + }, + ) + .unwrap(), + ) + .await + .unwrap(); + let mut malformed = Phase1DraftPayload::decode(child.draft()).unwrap(); + malformed.revision_parent_draft_id = Some(*other.replacement().draft().draft_id().as_bytes()); + let invalid = AuthoredDraft::initial( + child.draft().draft_id(), + *child.draft().author(), + DRAFT_PAYLOAD_SCHEMA, + malformed.encode().unwrap(), + AuthoredDraftStage::Draft, + None, + child.draft().created_at_unix_ms(), + ) + .unwrap(); + assert_eq!( + runtime + .revision_child_queue_policy(&invalid) + .await + .unwrap_err(), + Phase1DraftError::Corrupt + ); + assert!(relay.kinds().is_empty()); + runtime.shutdown().await.unwrap(); +} diff --git a/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs b/core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs @@ -264,7 +264,11 @@ async fn revision_child() { // Exercise exactly the durable child creation boundary. Delivery eligibility // is independently tested by the coordinator and belongs to C102. runtime - .phase1_create_revision_retraction(&captured.target, child) + .phase1_create_revision_retraction( + &captured.target, + child, + *saved.replacement().draft().draft_id().as_bytes(), + ) .await .unwrap(); println!("{BARRIER}"); @@ -332,7 +336,11 @@ async fn revision_child_process_death_replays_one_graph() { assert_eq!(retained.draft_id().as_bytes(), &child_id); for _ in 0..3 { let replay = runtime - .phase1_create_revision_retraction(recovered.target(), child_id) + .phase1_create_revision_retraction( + recovered.target(), + child_id, + *recovered.replacement().draft().draft_id().as_bytes(), + ) .await .unwrap(); assert_eq!(replay.draft(), &retained); diff --git a/radroots.lib.source-lock.v1.toml b/radroots.lib.source-lock.v1.toml @@ -1,8 +1,8 @@ schema = "radroots.lib.source-lock.v1" repository = "https://github.com/radrootslabs/lib" -revision = "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" +revision = "77aa55c0894c0142dbae43e272a515fd093eac36" architecture = "radroots.crates.release.v2" workspace_catalog_sha256 = "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200" version = "0.1.0-alpha" -source_archive_sha256 = "0c0b852806a21f217c370ce69babaf19658aefbece6d63148d05260f10b2fee4" -lockfile_sha256 = "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258" +source_archive_sha256 = "0aa57e84a408834686f476f1cb2d2d834d2668e541d45e40456c3de1f605d958" +lockfile_sha256 = "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0" diff --git a/release/provenance.json b/release/provenance.json @@ -2,10 +2,10 @@ "artifacts": { "app_api_sha256": "020924097c0d7efc33128cb8fd3d3b2026d95f57c44da71880e585aff80f070b", "ffi_api_sha256": "ac334ffc196a74bea9f23048cdab34ccb09925b60ffae9702d6bfabc1590e465", - "ffi_provenance_sha256": "f0e228bd1272bbd4bf29d8d2a11f241734a17b83575d7fca916dbfa16e70d847", + "ffi_provenance_sha256": "d21fc3a4670d86233045861a54bb802398a8e1296607436be83dd72aeac6fafc", "info_plist_sha256": "15ef08b1cdd1096cfb9eeaf5be5bf8f814807a7ca9350bbbb47860fa72ec13ef", "privacy_manifest_sha256": "a331d51864743ebe4e00dd22360b4a538b6b3ac26a6b3eb54094e60a36959a12", - "sbom_sha256": "d65b792e2be7b95ae70c95aa8f9710074004610f8f252f0fc7340533114f4cbb", + "sbom_sha256": "80b80b053b6da5d3d05e01ab9af68ab0fb2f7ed9cb8af0a561c1102702e69537", "xcode_project_sha256": "561abfdf6f690c35bc3d07907b95d950b521de7860d22b469afc6d0ad9c405d4" }, "disposition": "unsigned", @@ -17,12 +17,12 @@ "repository": "https://github.com/radrootslabs/tera", "schema": "tera.release-provenance.v1", "source": { - "cargo_lock_sha256": "293c71b3d3a7dda121980b57e9033e97d55f8b917f5b1fd3af2231f84c37b258", - "consumer_source_lock_sha256": "6ca89e25c098bc3adc34f67a26713be23e8f9b2826273034b8cd71f2b6e22e6d", - "lib_revision": "858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo_lock_sha256": "6552dd4abf5d242e526d03f3a288c99384ac7a32db86b09e8980ed8a5b842ec0", + "consumer_source_lock_sha256": "d668f57c9b6ecbea1ccb90d058153b475161d9da43173bb2d6476507a033c193", + "lib_revision": "77aa55c0894c0142dbae43e272a515fd093eac36", "source_date_epoch": 1787871027, "swift_package_lock_sha256": "a7e31d77d31ecbc1e0e5a78f2681e3fb0c6f367af0edf8b4ceef0af973a78681", - "tera_ffi_source_tree": "3fd45b713b327106c84b09a8ea06133019f86e43", + "tera_ffi_source_tree": "3a880e433bbaa2f8e7bf09e7da296b32d2cac958", "xcode_package_lock_sha256": "d98a614a38dce7b55c2925dee51c2d4bf8dcfc4e31779d0c5fe8561c45d6e3ba" }, "version": "0.1.0-alpha" diff --git a/release/sbom.cdx.json b/release/sbom.cdx.json @@ -4034,7 +4034,7 @@ "version": "6.0.0" }, { - "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4048,14 +4048,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4069,14 +4069,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4090,14 +4090,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4111,14 +4111,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4132,14 +4132,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4153,14 +4153,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4174,14 +4174,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4195,14 +4195,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4216,14 +4216,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4237,14 +4237,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4258,14 +4258,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4279,14 +4279,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4300,14 +4300,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4321,14 +4321,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4342,14 +4342,14 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", "version": "0.1.0-alpha" }, { - "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "licenses": [ { "expression": "MIT OR Apache-2.0" @@ -4363,7 +4363,7 @@ }, { "name": "radroots.package.source", - "value": "git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "value": "git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" } ], "type": "library", @@ -9273,45 +9273,45 @@ "cargo:unicode-general-category@1.1.0?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:rust_decimal@1.42.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:jiff-tzdb@0.1.8?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:unicode-general-category@1.1.0?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:secp256k1@0.29.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ @@ -9319,51 +9319,51 @@ "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:thiserror@2.0.19?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:base64@0.22.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr@0.44.8?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:thiserror@2.0.19?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:reqwest@0.12.28?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:tokio@1.53.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:uuid@1.24.0?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ @@ -9372,81 +9372,81 @@ "cargo:subtle@2.6.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:zeroize@1.9.0?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:fs2@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sqlx@0.9.0?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ "cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ @@ -9454,17 +9454,17 @@ "cargo:futures@0.3.33?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr-relay-pool@0.44.3?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr-sdk@0.44.1?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:tokio-tungstenite@0.26.2?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:tokio@1.53.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index" ], - "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8" + "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36" }, { "dependsOn": [ @@ -9959,18 +9959,18 @@ "cargo:jiff-tzdb@0.1.8?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:jiff@0.2.35?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:nostr@0.44.8?source=registry+https://github.com/rust-lang/crates.io-index", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index", @@ -9991,11 +9991,11 @@ "cargo:nostr-relay-builder@0.44.0?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219", "cargo:nostr-sdk@0.44.0?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219", "cargo:nostr@0.44.1?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219", - "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", - "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8#858b9e0d4fc25c3bc53ca9550c898fe8148c1bd8", + "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", + "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=77aa55c0894c0142dbae43e272a515fd093eac36#77aa55c0894c0142dbae43e272a515fd093eac36", "cargo:rustix@1.1.4?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:secp256k1@0.29.1?source=registry+https://github.com/rust-lang/crates.io-index", "cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index", diff --git a/test-fixtures/legacy-identifiers.v1.json b/test-fixtures/legacy-identifiers.v1.json @@ -4879,6 +4879,14 @@ "count": 5 }, { + "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs", + "count": 1 + }, + { + "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_tests.rs", + "count": 1 + }, + { "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_preparation_tests.rs", "count": 1 }, @@ -5283,6 +5291,10 @@ "count": 2 }, { + "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs", + "count": 2 + }, + { "path": "core/crates/tera_core/src/runtime/product_surface/submission/media_authorization_tests.rs", "count": 1 }, @@ -5439,6 +5451,10 @@ "count": 4 }, { + "path": "core/crates/tera_core/src/runtime/product_surface/outbox/tests/revision_delivery_support.rs", + "count": 1 + }, + { "path": "core/crates/tera_core/src/runtime/product_surface/outbox/upload_attempt.rs", "count": 1 },