lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

commit 27d111ac59140eb023423a2d0e872650d676de56
parent 5fb6c08684f622df27739d908c0a69cdd25f2612
Author: triesap <tyson@radroots.org>
Date:   Mon, 27 Jul 2026 07:32:17 +0000

release: freeze package publication during refactor

- Set every currently publishable lib package to publish false.
- Enforce the freeze and the Step 305 enablement boundary.
- Add negative coverage for publishable and uncontrolled manifests.
- Regenerate and validate the governed source-maintenance authority.

Diffstat:
MAGENTS.md | 2+-
Mcontracts/releases/publish_policy.toml | 5+++++
Mcrates/blossom/Cargo.toml | 2+-
Mcrates/core/Cargo.toml | 2+-
Mcrates/event/Cargo.toml | 2+-
Mcrates/event_codec/Cargo.toml | 2+-
Mcrates/event_index/Cargo.toml | 2+-
Mcrates/event_store/contracts/source_maintenance_v1.manifest.json | 4++--
Mcrates/event_store/contracts/source_maintenance_v1.manifest.sha256 | 2+-
Mcrates/event_store/src/generated/source_maintenance_manifest.rs | 4++--
Mcrates/geocoder/Cargo.toml | 2+-
Mcrates/identity/Cargo.toml | 2+-
Mcrates/log/Cargo.toml | 2+-
Mcrates/nostr/Cargo.toml | 2+-
Mcrates/nostr_accounts/Cargo.toml | 2+-
Mcrates/nostr_connect/Cargo.toml | 2+-
Mcrates/nostr_signer/Cargo.toml | 2+-
Mcrates/protected_store/Cargo.toml | 2+-
Mcrates/protocol_contract_v1/Cargo.toml | 2+-
Mcrates/replica_schema/Cargo.toml | 2+-
Mcrates/replica_store/Cargo.toml | 2+-
Mcrates/replica_sync/Cargo.toml | 2+-
Mcrates/runtime/Cargo.toml | 2+-
Mcrates/runtime_distribution/Cargo.toml | 2+-
Mcrates/runtime_manager/Cargo.toml | 2+-
Mcrates/runtime_paths/Cargo.toml | 2+-
Mcrates/runtime_store/Cargo.toml | 2+-
Mcrates/secret_vault/Cargo.toml | 2+-
Mcrates/sql_core/Cargo.toml | 2+-
Mcrates/trade/Cargo.toml | 2+-
Adocs/implementation/PUBLICATION_FREEZE.md | 24++++++++++++++++++++++++
Mtools/xtask/src/contract.rs | 162++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
32 files changed, 221 insertions(+), 32 deletions(-)

diff --git a/AGENTS.md b/AGENTS.md @@ -94,7 +94,7 @@ Before editing code: feature closures. - During the migration, every package remains non-publishable until its package-realistic release gates pass and publication is explicitly - authorized. + authorized. Follow `docs/implementation/PUBLICATION_FREEZE.md`. ## 8. Irreversible actions diff --git a/contracts/releases/publish_policy.toml b/contracts/releases/publish_policy.toml @@ -1,6 +1,11 @@ [release] version = "1.0.0-alpha.1" +[publication] +frozen = true +registry = "crates-io" +final_enablement_step = 305 + [classification] public = [ "radroots_blossom", diff --git a/crates/blossom/Cargo.toml b/crates/blossom/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_blossom" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_core" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/event/Cargo.toml b/crates/event/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_event" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/event_codec/Cargo.toml b/crates/event_codec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_event_codec" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/event_index/Cargo.toml b/crates/event_index/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_event_index" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.json b/crates/event_store/contracts/source_maintenance_v1.manifest.json @@ -257,8 +257,8 @@ { "role": "contract_command_authority", "path": "tools/xtask/src/contract.rs", - "byte_length": 479999, - "sha256": "3c9a51a467fa806c1f38a76149289ca5d0e6fb6d7d897cc6fe4883118a939410", + "byte_length": 484443, + "sha256": "3ca21a35c0fa412ee8788a7593645b6cb30187daae83e0b7e4af5ced6ca00ed6", "hash_algorithm": "sha256_bytes_v1" }, { diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.sha256 b/crates/event_store/contracts/source_maintenance_v1.manifest.sha256 @@ -1 +1 @@ -f5fa284963a5b980086f2b26710044b44cda0678003daa10ccd84d550460077a +e76e00dba774c095c5abdc822bfaa73d287fd45cb1ba990855ce8725d370f619 diff --git a/crates/event_store/src/generated/source_maintenance_manifest.rs b/crates/event_store/src/generated/source_maintenance_manifest.rs @@ -1,8 +1,8 @@ // @generated by `cargo xtask contract source-maintenance-manifest --write`; do not edit. -pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"ad4a6c8ae9488fc8033792bc6952af04687f312901c1847d8c668a62913bb642\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"425dc799f392b87f265a6fb81f89c4a1c7a5db8391ab0380970708cb9c66704d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"d526d96ea02be12b4b0aed99e97cfdde17c4474ace67111506a7b900ee78b186\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 10725,\n \"sha256\": \"e1975711f349abc7651b29dd1144613865084206eba9f59c92da05ff9dabb6b5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19421,\n \"sha256\": \"4772e041cb20a4963afb2f3159804c777e2f2be61bfdb6ee267e7a7c04258972\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33617,\n \"sha256\": \"79296b8f263aa06d17005795e4515f769f064ea6fd971eeb1296e1151debaf20\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184407,\n \"sha256\": \"c455d40fc736e3db264f567c7809af7bd897d89be8a33dfb21667a6ef6b8d6c6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394574,\n \"sha256\": \"db57dc3e35e64c7194683142fe55edba853671a829269449dd2273056dfc3a0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30140,\n \"sha256\": \"210112eeaa6975a3b4fbb97d5c52588f8c6d8d07975e531d39737fd11235de51\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51756,\n \"sha256\": \"f8d5b62f0613104aa86658d5bf1baade92c7df83f00ef0cddadd734b9797afca\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 194901,\n \"sha256\": \"01fe9546c95244b4197b3d2a6cec3d72e1f7c48f088bc93f168b5e2e4977b048\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 833937,\n \"sha256\": \"0d326a4e459b2026f7ae9fc57a9741def98a2cd1ee6fbdf89713157d964d2547\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 176811,\n \"sha256\": \"c22612787364ae417fd4da582130f5fe934820ba0f40f92a47b4eeeb6dffbf16\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 479999,\n \"sha256\": \"3c9a51a467fa806c1f38a76149289ca5d0e6fb6d7d897cc6fe4883118a939410\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 14077,\n \"sha256\": \"d815e65241e47143a51dd87d95e014d975be1d9b94075f3920e4812f41188353\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n"; +pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"ad4a6c8ae9488fc8033792bc6952af04687f312901c1847d8c668a62913bb642\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"425dc799f392b87f265a6fb81f89c4a1c7a5db8391ab0380970708cb9c66704d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"d526d96ea02be12b4b0aed99e97cfdde17c4474ace67111506a7b900ee78b186\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 10725,\n \"sha256\": \"e1975711f349abc7651b29dd1144613865084206eba9f59c92da05ff9dabb6b5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19421,\n \"sha256\": \"4772e041cb20a4963afb2f3159804c777e2f2be61bfdb6ee267e7a7c04258972\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33617,\n \"sha256\": \"79296b8f263aa06d17005795e4515f769f064ea6fd971eeb1296e1151debaf20\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184407,\n \"sha256\": \"c455d40fc736e3db264f567c7809af7bd897d89be8a33dfb21667a6ef6b8d6c6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394574,\n \"sha256\": \"db57dc3e35e64c7194683142fe55edba853671a829269449dd2273056dfc3a0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30140,\n \"sha256\": \"210112eeaa6975a3b4fbb97d5c52588f8c6d8d07975e531d39737fd11235de51\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51756,\n \"sha256\": \"f8d5b62f0613104aa86658d5bf1baade92c7df83f00ef0cddadd734b9797afca\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 194901,\n \"sha256\": \"01fe9546c95244b4197b3d2a6cec3d72e1f7c48f088bc93f168b5e2e4977b048\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 833937,\n \"sha256\": \"0d326a4e459b2026f7ae9fc57a9741def98a2cd1ee6fbdf89713157d964d2547\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 176811,\n \"sha256\": \"c22612787364ae417fd4da582130f5fe934820ba0f40f92a47b4eeeb6dffbf16\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 484443,\n \"sha256\": \"3ca21a35c0fa412ee8788a7593645b6cb30187daae83e0b7e4af5ced6ca00ed6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 14077,\n \"sha256\": \"d815e65241e47143a51dd87d95e014d975be1d9b94075f3920e4812f41188353\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n"; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_BYTE_LENGTH: usize = 14459; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SHA256: &str = - "f5fa284963a5b980086f2b26710044b44cda0678003daa10ccd84d550460077a"; + "e76e00dba774c095c5abdc822bfaa73d287fd45cb1ba990855ce8725d370f619"; pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SCHEMA_VERSION: u32 = 1; pub(crate) const SOURCE_MAINTENANCE_CONTRACT_ID: &str = "radroots_event_store.source_maintenance_v1"; diff --git a/crates/geocoder/Cargo.toml b/crates/geocoder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_geocoder" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/identity/Cargo.toml b/crates/identity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_identity" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/log/Cargo.toml b/crates/log/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_log" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/nostr/Cargo.toml b/crates/nostr/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_nostr" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/nostr_accounts/Cargo.toml b/crates/nostr_accounts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_nostr_accounts" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/nostr_connect/Cargo.toml b/crates/nostr_connect/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_nostr_connect" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/nostr_signer/Cargo.toml b/crates/nostr_signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_nostr_signer" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/protected_store/Cargo.toml b/crates/protected_store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_protected_store" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/protocol_contract_v1/Cargo.toml b/crates/protocol_contract_v1/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_protocol_contract_v1" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/replica_schema/Cargo.toml b/crates/replica_schema/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_replica_schema" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/replica_store/Cargo.toml b/crates/replica_store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_replica_store" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/replica_sync/Cargo.toml b/crates/replica_sync/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_replica_sync" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/runtime/Cargo.toml b/crates/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_runtime" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/runtime_distribution/Cargo.toml b/crates/runtime_distribution/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_runtime_distribution" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/runtime_manager/Cargo.toml b/crates/runtime_manager/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_runtime_manager" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/runtime_paths/Cargo.toml b/crates/runtime_paths/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_runtime_paths" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/runtime_store/Cargo.toml b/crates/runtime_store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_runtime_store" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/secret_vault/Cargo.toml b/crates/secret_vault/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_secret_vault" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/sql_core/Cargo.toml b/crates/sql_core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_sql_core" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/crates/trade/Cargo.toml b/crates/trade/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "radroots_trade" -publish = ["crates-io"] +publish = false version = "1.0.0-alpha.1" edition.workspace = true authors = ["Tyson Lupul <tyson@radroots.org>"] diff --git a/docs/implementation/PUBLICATION_FREEZE.md b/docs/implementation/PUBLICATION_FREEZE.md @@ -0,0 +1,24 @@ +# Crates.io publication freeze + +Crates.io publication is frozen for the complete release-v1 crate refactor. +Every workspace package, including packages intended to become public, must +set: + +```toml +publish = false +``` + +`contracts/releases/publish_policy.toml` is the machine authority for this +freeze. Repository contract and release-preflight validation reject a missing +publication-control section, an unexpected registry, a different enablement +checkpoint, or any package that is implicitly or explicitly publishable. + +The only planned exception is release plan Step 305, after the final package +inventory, resolved public dependency graph, API surface, target matrix, and +security gates are green. That checkpoint may set `publication.frozen = false` +and enable exactly the approved release packages for package-validation +staging. It does not authorize upload or any crates.io mutation. + +Changing the freeze requires an independently reviewed release-control commit. +Actual publication, tag creation, registry ownership changes, and +trusted-publisher changes always require separate explicit authorization. diff --git a/tools/xtask/src/contract.rs b/tools/xtask/src/contract.rs @@ -3077,6 +3077,8 @@ const CANONICAL_EVENT_BOUNDARY_EXPECTATIONS: [EventBoundaryExpectation; 44] = [ struct ReleaseContractFile { release: ReleaseSection, #[serde(default)] + publication: Option<PublicationControl>, + #[serde(default)] classification: ReleaseClassification, #[serde(default)] publish: Option<ReleaseCrateSet>, @@ -3105,6 +3107,13 @@ struct ReleaseSection { } #[derive(Debug, Deserialize)] +struct PublicationControl { + frozen: bool, + registry: String, + final_enablement_step: u16, +} + +#[derive(Debug, Deserialize)] struct ReleaseCrateSet { crates: Vec<String>, } @@ -8152,6 +8161,37 @@ fn publish_config_is_non_public(publish: Option<&PackagePublish>) -> bool { matches!(publish, Some(PackagePublish::Bool(false))) } +fn validate_publication_control( + release: &ReleaseContractFile, + publish_configs: &BTreeMap<String, Option<PackagePublish>>, + require_control: bool, +) -> Result<bool, String> { + let Some(control) = release.publication.as_ref() else { + if require_control { + return Err("publication control is required".to_string()); + } + return Ok(false); + }; + if control.registry != "crates-io" { + return Err("publication.registry must be crates-io".to_string()); + } + if control.final_enablement_step != 305 { + return Err("publication.final_enablement_step must be 305".to_string()); + } + if !control.frozen { + return Ok(false); + } + for (crate_name, publish) in publish_configs { + if !publish_config_is_non_public(publish.as_ref()) { + return Err(format!( + "publication freeze requires workspace crate {} to set publish = false", + crate_name + )); + } + } + Ok(true) +} + #[cfg(test)] fn validate_release_publish_policy( workspace_root: &Path, @@ -8281,6 +8321,9 @@ fn validate_release_publish_policy( let publish_configs = workspace_package_publish_configs(workspace_root) .expect("workspace publish configs are stable"); + if validate_publication_control(&release, &publish_configs, false)? { + return Ok(()); + } for crate_name in &public_set { let publish = publish_configs[crate_name].as_ref(); if !publish_config_is_public(publish) { @@ -8441,20 +8484,41 @@ fn validate_contract_bundle_with_release_policy_override_and_profile( validate_core_unit_dimension_variant_order(workspace_root)?; validate_coverage_policy_parity(workspace_root, &bundle.root)?; validate_version_governance(bundle, workspace_root)?; - validate_release_publish_policy_with_override( + validate_release_publish_policy_with_override_and_control( workspace_root, &bundle.root, bundle.version.contract.version.as_str(), release_policy_override, + matches!( + authority_profile, + OperationAuthorityProfile::CapsuleCanonical + ), )?; Ok(()) } +#[cfg(test)] fn validate_release_publish_policy_with_override( workspace_root: &Path, + contract_root: &Path, + contract_version: &str, + release_policy_override: Option<PathBuf>, +) -> Result<(), String> { + validate_release_publish_policy_with_override_and_control( + workspace_root, + contract_root, + contract_version, + release_policy_override, + true, + ) +} + +fn validate_release_publish_policy_with_override_and_control( + workspace_root: &Path, _contract_root: &Path, contract_version: &str, release_policy_override: Option<PathBuf>, + require_publication_control: bool, ) -> Result<(), String> { let release = load_release_contract_with_override( workspace_root, @@ -8583,6 +8647,9 @@ fn validate_release_publish_policy_with_override( let publish_configs = workspace_package_publish_configs(workspace_root) .expect("workspace publish configs are stable"); + if validate_publication_control(&release, &publish_configs, require_publication_control)? { + return Ok(()); + } for crate_name in &public_set { let publish = publish_configs[crate_name].as_ref(); if !publish_config_is_public(publish) { @@ -11256,6 +11323,7 @@ readme = { workspace = true } release: ReleaseSection { version: release.version.clone(), }, + publication: None, classification: ReleaseClassification::default(), publish: Some(ReleaseCrateSet { crates: vec!["radroots_public".to_string()], @@ -11278,6 +11346,7 @@ readme = { workspace = true } release: ReleaseSection { version: release.version.clone(), }, + publication: None, classification: ReleaseClassification::default(), publish: None, internal: None, @@ -11293,6 +11362,7 @@ readme = { workspace = true } release: ReleaseSection { version: release.version.clone(), }, + publication: None, classification: ReleaseClassification { internal: vec!["radroots_internal_only".to_string()], ..ReleaseClassification::default() @@ -11309,6 +11379,7 @@ readme = { workspace = true } release: ReleaseSection { version: release.version.clone(), }, + publication: None, classification: ReleaseClassification { deferred: vec!["radroots_deferred".to_string()], ..ReleaseClassification::default() @@ -11329,6 +11400,7 @@ readme = { workspace = true } release: ReleaseSection { version: release.version.clone(), }, + publication: None, classification: ReleaseClassification { retired: vec!["radroots_retired".to_string()], ..ReleaseClassification::default() @@ -11347,6 +11419,7 @@ readme = { workspace = true } let yank_only = ReleaseContractFile { release, + publication: None, classification: ReleaseClassification { yank_only: vec!["radroots_yank_only".to_string()], ..ReleaseClassification::default() @@ -11923,6 +11996,93 @@ edition = "2024" } #[test] + fn publication_freeze_requires_every_workspace_package_to_be_private() { + let root = create_synthetic_workspace("publication_freeze"); + let contract_root = root.join("contracts"); + let release_policy_path = root_release_policy_path(&root); + write_file( + &root.join("crates").join("a").join("Cargo.toml"), + r#"[package] +name = "radroots_a" +version = "1.0.0" +edition = "2024" +publish = false +"#, + ); + write_file( + &release_policy_path, + r#"[release] +version = "1.0.0" + +[publication] +frozen = true +registry = "crates-io" +final_enablement_step = 305 + +[publish] +crates = ["radroots_a"] + +[internal] +crates = ["radroots_b"] + +[publish_order] +crates = ["radroots_a"] +"#, + ); + validate_release_publish_policy_with_override( + &root, + &contract_root, + "1.0.0", + Some(release_policy_path.clone()), + ) + .expect("fully private workspace should satisfy publication freeze"); + + write_file( + &root.join("crates").join("a").join("Cargo.toml"), + r#"[package] +name = "radroots_a" +version = "1.0.0" +edition = "2024" +publish = ["crates-io"] +"#, + ); + let publishable = validate_release_publish_policy_with_override( + &root, + &contract_root, + "1.0.0", + Some(release_policy_path.clone()), + ) + .expect_err("publication freeze must reject a publishable package"); + assert!(publishable.contains("publication freeze requires workspace crate radroots_a")); + + write_file( + &release_policy_path, + r#"[release] +version = "1.0.0" + +[publish] +crates = ["radroots_a"] + +[internal] +crates = ["radroots_b"] + +[publish_order] +crates = ["radroots_a"] +"#, + ); + let missing_control = validate_release_publish_policy_with_override( + &root, + &contract_root, + "1.0.0", + Some(release_policy_path), + ) + .expect_err("release policy must carry explicit publication control"); + assert!(missing_control.contains("publication control is required")); + + let _ = fs::remove_dir_all(root); + } + + #[test] fn release_preflight_rejects_public_dto_tooling_git_or_path_sources() { let root = create_synthetic_workspace("release_policy_dto_tooling_sources");