@feltdb/core 0.8.3 → 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist/cli/commands.js +4 -1
  2. package/dist/cli/provisioning-neutrality.js +79 -0
  3. package/dist/collection.d.ts +43 -1
  4. package/dist/collection.d.ts.map +1 -1
  5. package/dist/collection.js +192 -22
  6. package/dist/create/create.js +25 -21
  7. package/dist/create/managed-account.js +11 -0
  8. package/dist/create/package-versions.js +1 -1
  9. package/dist/create/server-source/Cargo.lock +165 -0
  10. package/dist/create/server-source/Cargo.toml +9 -0
  11. package/dist/create/server-source/crates/feltdb/Cargo.toml +3 -0
  12. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +44 -44
  13. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +12 -24
  14. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +7 -13
  15. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +13 -10
  16. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +12 -9
  17. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +78 -25
  18. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +16 -13
  19. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +13 -5
  20. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +41 -22
  21. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +33 -15
  22. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +100 -33
  23. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +56 -20
  24. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +116 -41
  25. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +186 -55
  26. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +64 -26
  27. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +46 -15
  28. package/dist/create/server-source/crates/feltdb/src/admission.rs +8 -15
  29. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +43 -13
  30. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +15 -42
  31. package/dist/create/server-source/crates/feltdb/src/analytics.rs +65 -19
  32. package/dist/create/server-source/crates/feltdb/src/application.rs +113 -30
  33. package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +475 -140
  34. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +17 -15
  35. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -1
  36. package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +59 -15
  37. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +266 -114
  38. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +25 -7
  39. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +10 -15
  40. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +3 -11
  41. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +14 -5
  42. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +21 -25
  43. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +14 -11
  44. package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +103 -22
  45. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +18 -15
  46. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +12 -8
  47. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +1 -5
  48. package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +87 -23
  49. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +3 -7
  50. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +10 -9
  51. package/dist/create/server-source/crates/feltdb/src/equality_index.rs +595 -0
  52. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +1 -6
  53. package/dist/create/server-source/crates/feltdb/src/indexing.rs +35 -38
  54. package/dist/create/server-source/crates/feltdb/src/lib.rs +1050 -117
  55. package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +4 -1
  56. package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -1
  57. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +1 -2
  58. package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +107 -30
  59. package/dist/create/server-source/crates/feltdb/src/observability.rs +19 -6
  60. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +12 -11
  61. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +9 -4
  62. package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +65 -18
  63. package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +193 -57
  64. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +37 -27
  65. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +38 -10
  66. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +20 -14
  67. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +394 -229
  68. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +8 -6
  69. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +11 -13
  70. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +90 -72
  71. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +3 -3
  72. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +33 -11
  73. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +6 -6
  74. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +14 -56
  75. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +29 -27
  76. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +35 -17
  77. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +8 -2
  78. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +59 -15
  79. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +70 -17
  80. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +23 -6
  81. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +12 -3
  82. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +41 -11
  83. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +56 -25
  84. package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +701 -245
  85. package/dist/create/server-source/crates/feltdb/src/production_api.rs +31 -13
  86. package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +126 -0
  87. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +6 -8
  88. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +5 -5
  89. package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +48 -18
  90. package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +30 -11
  91. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +6 -3
  92. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +4 -3
  93. package/dist/create/server-source/crates/feltdb/src/sharding.rs +36 -10
  94. package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +516 -0
  95. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +305 -6
  96. package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +222 -0
  97. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +82 -54
  98. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +2 -2
  99. package/dist/create/server-source/crates/feltdb/src/state_model.rs +1514 -537
  100. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +6 -3
  101. package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +672 -0
  102. package/dist/create/server-source/crates/feltdb/src/submission.rs +5 -11
  103. package/dist/create/server-source/crates/feltdb/src/sync.rs +12 -0
  104. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +6 -8
  105. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +24 -35
  106. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +24 -8
  107. package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +248 -59
  108. package/dist/create/server-source/crates/feltdb/src/transactions.rs +17 -20
  109. package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +749 -0
  110. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +1 -0
  111. package/dist/create/server-source/crates/feltdb/src/workload.rs +512 -4
  112. package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +442 -0
  113. package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +299 -0
  114. package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +288 -0
  115. package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +392 -0
  116. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +436 -220
  117. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +1916 -0
  118. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +1878 -0
  119. package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +1862 -0
  120. package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +234 -0
  121. package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +947 -0
  122. package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +5 -8
  123. package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +52 -44
  124. package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +33 -16
  125. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +22 -7
  126. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +41 -22
  127. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +25 -8
  128. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +9 -6
  129. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +120 -69
  130. package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +21 -10
  131. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +1032 -0
  132. package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +868 -0
  133. package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +221 -0
  134. package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +338 -0
  135. package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +1039 -0
  136. package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +739 -0
  137. package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +427 -0
  138. package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +3 -3
  139. package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +25 -22
  140. package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +1799 -0
  141. package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +1316 -0
  142. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +53 -61
  143. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +156 -61
  144. package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +299 -0
  145. package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +255 -0
  146. package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +249 -0
  147. package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +994 -0
  148. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +2 -1
  149. package/dist/create/server-source/crates/feltdb-server/src/audit.rs +1137 -29
  150. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +164 -13
  151. package/dist/create/server-source/crates/feltdb-server/src/main.rs +800 -34
  152. package/dist/db.d.ts +33 -34
  153. package/dist/db.d.ts.map +1 -1
  154. package/dist/db.js +74 -20
  155. package/dist/deployment.d.ts +30 -0
  156. package/dist/deployment.d.ts.map +1 -0
  157. package/dist/deployment.js +130 -0
  158. package/dist/embedded-transaction.d.ts +22 -4
  159. package/dist/embedded-transaction.d.ts.map +1 -1
  160. package/dist/embedded-transaction.js +51 -5
  161. package/dist/feltdb.d.ts +14 -2
  162. package/dist/feltdb.d.ts.map +1 -1
  163. package/dist/file-db.js +1 -1
  164. package/dist/http-client.d.ts +14 -0
  165. package/dist/http-client.d.ts.map +1 -1
  166. package/dist/http-client.js +23 -5
  167. package/dist/http-db.d.ts +119 -1
  168. package/dist/http-db.d.ts.map +1 -1
  169. package/dist/http-db.js +346 -31
  170. package/dist/index-core.d.ts +2 -0
  171. package/dist/index-core.d.ts.map +1 -1
  172. package/dist/index-core.js +2 -0
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.js +9 -0
  175. package/dist/indexeddb-db.d.ts.map +1 -1
  176. package/dist/indexeddb-db.js +35 -21
  177. package/dist/managed-recovery.d.ts +192 -0
  178. package/dist/managed-recovery.d.ts.map +1 -0
  179. package/dist/managed-recovery.js +242 -0
  180. package/dist/memory-db.js +1 -1
  181. package/dist/studio-app/assets/{feltdb_wasm-DB8cX151.js → feltdb_wasm-DaNwCLRX.js} +1 -1
  182. package/dist/studio-app/assets/feltdb_wasm_bg-DnsHNv6g.wasm +0 -0
  183. package/dist/studio-app/assets/index-j8IlhNqJ.js +29 -0
  184. package/dist/studio-app/index.html +1 -1
  185. package/dist/transaction.d.ts +30 -0
  186. package/dist/transaction.d.ts.map +1 -1
  187. package/dist/transaction.js +41 -0
  188. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  189. package/dist/workload.d.ts +2 -1
  190. package/dist/workload.d.ts.map +1 -1
  191. package/package.json +1 -1
  192. package/dist/studio-app/assets/feltdb_wasm_bg-ClhDHp0S.wasm +0 -0
  193. package/dist/studio-app/assets/index-B0k4UAlI.js +0 -29
@@ -135,7 +135,9 @@ pub struct CapabilityBinding {
135
135
  #[serde(default = "public_capability_visibility")]
136
136
  pub visibility: String,
137
137
  }
138
- fn public_capability_visibility() -> String { "public".into() }
138
+ fn public_capability_visibility() -> String {
139
+ "public".into()
140
+ }
139
141
  #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
140
142
  pub struct SecretReference {
141
143
  pub binding: String,
@@ -381,11 +383,16 @@ pub struct ValidationReport {
381
383
  fn is_valid_policy_subject(subject: &str) -> bool {
382
384
  subject.split('|').map(str::trim).all(|term| {
383
385
  matches!(term, "authenticated" | "owner" | "member")
384
- || term.strip_prefix("self(").and_then(|value| value.strip_suffix(')')).is_some_and(|field| {
385
- let mut characters = field.chars();
386
- characters.next().is_some_and(|value| value == '_' || value.is_ascii_alphabetic())
387
- && characters.all(|value| value == '_' || value.is_ascii_alphanumeric())
388
- })
386
+ || term
387
+ .strip_prefix("self(")
388
+ .and_then(|value| value.strip_suffix(')'))
389
+ .is_some_and(|field| {
390
+ let mut characters = field.chars();
391
+ characters
392
+ .next()
393
+ .is_some_and(|value| value == '_' || value.is_ascii_alphabetic())
394
+ && characters.all(|value| value == '_' || value.is_ascii_alphanumeric())
395
+ })
389
396
  })
390
397
  }
391
398
 
@@ -559,8 +566,15 @@ pub fn validate_manifest(
559
566
  .map(|v| v.name.as_str())
560
567
  .collect();
561
568
  for capability in &manifest.capabilities {
562
- if !matches!(capability.visibility.as_str(), "public" | "agent" | "workflow" | "internal") {
563
- issues.push(issue("semantic", format!("capabilities.{}.visibility", capability.name), "visibility must be public, agent, workflow, or internal"));
569
+ if !matches!(
570
+ capability.visibility.as_str(),
571
+ "public" | "agent" | "workflow" | "internal"
572
+ ) {
573
+ issues.push(issue(
574
+ "semantic",
575
+ format!("capabilities.{}.visibility", capability.name),
576
+ "visibility must be public, agent, workflow, or internal",
577
+ ));
564
578
  }
565
579
  }
566
580
  let workflows: BTreeSet<_> = manifest.workflows.iter().map(|v| v.name.as_str()).collect();
@@ -743,7 +757,11 @@ pub fn validate_manifest(
743
757
  }
744
758
  for (index, module) in manifest.modules.iter().enumerate() {
745
759
  if contains_plaintext_secret(module) || module.get("value").is_some() {
746
- issues.push(issue("security", format!("modules.{index}"), "module contracts may declare secret requirements but never secret values"));
760
+ issues.push(issue(
761
+ "security",
762
+ format!("modules.{index}"),
763
+ "module contracts may declare secret requirements but never secret values",
764
+ ));
747
765
  }
748
766
  }
749
767
  for environment in &manifest.environments {
@@ -881,7 +899,11 @@ fn sorted(mut manifest: ApplicationManifest) -> ApplicationManifest {
881
899
  agent.capabilities.sort();
882
900
  }
883
901
  sort_name!(manifest.capabilities);
884
- manifest.modules.sort_by(|a, b| a.get("id").and_then(Value::as_str).cmp(&b.get("id").and_then(Value::as_str)));
902
+ manifest.modules.sort_by(|a, b| {
903
+ a.get("id")
904
+ .and_then(Value::as_str)
905
+ .cmp(&b.get("id").and_then(Value::as_str))
906
+ });
885
907
  sort_name!(manifest.connections);
886
908
  sort_name!(manifest.policies);
887
909
  sort_name!(manifest.ui.bindings);
@@ -1202,14 +1224,20 @@ impl ApplicationStore {
1202
1224
  .records
1203
1225
  .write()
1204
1226
  .map_err(|_| "application store lock poisoned")?;
1205
- r.drafts.retain(|value| value.application_id != application_id);
1206
- r.revisions.retain(|value| value.application_id != application_id);
1207
- r.promotions.retain(|value| value.application_id != application_id);
1208
- r.previews.retain(|value| value.application_id != application_id);
1227
+ r.drafts
1228
+ .retain(|value| value.application_id != application_id);
1229
+ r.revisions
1230
+ .retain(|value| value.application_id != application_id);
1231
+ r.promotions
1232
+ .retain(|value| value.application_id != application_id);
1233
+ r.previews
1234
+ .retain(|value| value.application_id != application_id);
1209
1235
  r.environment_pointers.remove(application_id);
1210
- r.audit.retain(|value| value.application_id != application_id);
1236
+ r.audit
1237
+ .retain(|value| value.application_id != application_id);
1211
1238
  r.untrusted_revisions.remove(application_id);
1212
- r.recoveries.retain(|value| value.application_id != application_id);
1239
+ r.recoveries
1240
+ .retain(|value| value.application_id != application_id);
1213
1241
  self.persist(&r)
1214
1242
  }
1215
1243
  fn event(
@@ -2329,27 +2357,78 @@ mod tests {
2329
2357
  let s = store("revision-recovery");
2330
2358
  let d = s.create_draft("t", "a", "App", "owner", None).unwrap();
2331
2359
  let corrupt = s.commit("t", "a", &d.draft_id, "owner").unwrap();
2332
- s.move_environment_pointer("t", "a", &corrupt.revision_id, "staging", None,
2333
- "owner", "initial", true, false).unwrap();
2334
- let d = s.create_draft("t", "a", "App", "owner", Some(&corrupt.revision_id)).unwrap();
2360
+ s.move_environment_pointer(
2361
+ "t",
2362
+ "a",
2363
+ &corrupt.revision_id,
2364
+ "staging",
2365
+ None,
2366
+ "owner",
2367
+ "initial",
2368
+ true,
2369
+ false,
2370
+ )
2371
+ .unwrap();
2372
+ let d = s
2373
+ .create_draft("t", "a", "App", "owner", Some(&corrupt.revision_id))
2374
+ .unwrap();
2335
2375
  let clean = s.commit("t", "a", &d.draft_id, "owner").unwrap();
2336
2376
 
2337
2377
  // Historical source corruption must not prevent recovery away from it.
2338
2378
  {
2339
2379
  let mut records = s.records.write().unwrap();
2340
- records.revisions.iter_mut().find(|value| value.revision_id == corrupt.revision_id)
2341
- .unwrap().manifest.metadata.name = "corrupted without updating its integrity hash".into();
2380
+ records
2381
+ .revisions
2382
+ .iter_mut()
2383
+ .find(|value| value.revision_id == corrupt.revision_id)
2384
+ .unwrap()
2385
+ .manifest
2386
+ .metadata
2387
+ .name = "corrupted without updating its integrity hash".into();
2342
2388
  s.persist(&records).unwrap();
2343
2389
  }
2344
- let recovered = s.recover_environment_pointer("t", "a", "staging", &corrupt.revision_id,
2345
- &clean.revision_id, "sherpa", "Replace corrupt historical revision", "ELEVATED",
2346
- "recovery-1").unwrap();
2390
+ let recovered = s
2391
+ .recover_environment_pointer(
2392
+ "t",
2393
+ "a",
2394
+ "staging",
2395
+ &corrupt.revision_id,
2396
+ &clean.revision_id,
2397
+ "sherpa",
2398
+ "Replace corrupt historical revision",
2399
+ "ELEVATED",
2400
+ "recovery-1",
2401
+ )
2402
+ .unwrap();
2347
2403
  assert_eq!(recovered.target_revision, clean.revision_id);
2348
- assert_eq!(s.recover_environment_pointer("t", "a", "staging", &corrupt.revision_id,
2349
- &clean.revision_id, "sherpa", "Replace corrupt historical revision", "ELEVATED",
2350
- "recovery-1").unwrap(), recovered);
2351
- assert!(s.move_environment_pointer("t", "a", &corrupt.revision_id, "staging",
2352
- Some(&clean.revision_id), "owner", "rollback", true, true).unwrap_err()
2404
+ assert_eq!(
2405
+ s.recover_environment_pointer(
2406
+ "t",
2407
+ "a",
2408
+ "staging",
2409
+ &corrupt.revision_id,
2410
+ &clean.revision_id,
2411
+ "sherpa",
2412
+ "Replace corrupt historical revision",
2413
+ "ELEVATED",
2414
+ "recovery-1"
2415
+ )
2416
+ .unwrap(),
2417
+ recovered
2418
+ );
2419
+ assert!(s
2420
+ .move_environment_pointer(
2421
+ "t",
2422
+ "a",
2423
+ &corrupt.revision_id,
2424
+ "staging",
2425
+ Some(&clean.revision_id),
2426
+ "owner",
2427
+ "rollback",
2428
+ true,
2429
+ true
2430
+ )
2431
+ .unwrap_err()
2353
2432
  .contains("untrusted"));
2354
2433
 
2355
2434
  let reloaded = ApplicationStore::load(s.path.clone()).unwrap();
@@ -2528,7 +2607,11 @@ mod tests {
2528
2607
  });
2529
2608
 
2530
2609
  let report = validate_manifest(&manifest, "tenant", "app", None);
2531
- assert!(report.valid, "composed identity policy should be valid: {:?}", report.issues);
2610
+ assert!(
2611
+ report.valid,
2612
+ "composed identity policy should be valid: {:?}",
2613
+ report.issues
2614
+ );
2532
2615
  }
2533
2616
 
2534
2617
  #[test]