@feltdb/core 0.8.4 → 0.8.6

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 (160) hide show
  1. package/dist/create/package-versions.js +1 -1
  2. package/dist/create/server-source/Cargo.lock +165 -0
  3. package/dist/create/server-source/Cargo.toml +9 -0
  4. package/dist/create/server-source/crates/feltdb/Cargo.toml +3 -0
  5. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +44 -44
  6. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +12 -24
  7. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +7 -13
  8. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +13 -10
  9. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +12 -9
  10. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +78 -25
  11. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +16 -13
  12. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +13 -5
  13. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +41 -22
  14. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +33 -15
  15. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +100 -33
  16. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +56 -20
  17. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +116 -41
  18. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +186 -55
  19. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +64 -26
  20. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +46 -15
  21. package/dist/create/server-source/crates/feltdb/src/admission.rs +8 -15
  22. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +43 -13
  23. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +15 -42
  24. package/dist/create/server-source/crates/feltdb/src/analytics.rs +65 -19
  25. package/dist/create/server-source/crates/feltdb/src/application.rs +113 -30
  26. package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +475 -140
  27. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +17 -15
  28. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -1
  29. package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +59 -15
  30. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +266 -114
  31. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +25 -7
  32. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +10 -15
  33. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +3 -11
  34. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +14 -5
  35. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +21 -25
  36. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +14 -11
  37. package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +103 -22
  38. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +18 -15
  39. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +12 -8
  40. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +1 -5
  41. package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +87 -23
  42. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +3 -7
  43. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +10 -9
  44. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +1 -6
  45. package/dist/create/server-source/crates/feltdb/src/indexing.rs +35 -38
  46. package/dist/create/server-source/crates/feltdb/src/lib.rs +1648 -46
  47. package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +4 -1
  48. package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -1
  49. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +1 -2
  50. package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +107 -30
  51. package/dist/create/server-source/crates/feltdb/src/observability.rs +19 -6
  52. package/dist/create/server-source/crates/feltdb/src/operation.rs +39 -0
  53. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +12 -11
  54. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +9 -4
  55. package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +65 -18
  56. package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +193 -57
  57. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +37 -27
  58. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +38 -10
  59. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +20 -14
  60. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +394 -229
  61. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +8 -6
  62. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +11 -13
  63. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +79 -70
  64. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +3 -3
  65. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +33 -11
  66. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +6 -6
  67. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +14 -56
  68. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +29 -27
  69. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +35 -17
  70. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +8 -2
  71. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +59 -15
  72. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +70 -17
  73. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +23 -6
  74. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +12 -3
  75. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +41 -11
  76. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +56 -25
  77. package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +701 -245
  78. package/dist/create/server-source/crates/feltdb/src/production_api.rs +31 -13
  79. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +6 -8
  80. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +5 -5
  81. package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +48 -18
  82. package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +30 -11
  83. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +6 -3
  84. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +4 -3
  85. package/dist/create/server-source/crates/feltdb/src/sharding.rs +36 -10
  86. package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +516 -0
  87. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +13 -4
  88. package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +222 -0
  89. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +82 -54
  90. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +2 -2
  91. package/dist/create/server-source/crates/feltdb/src/state_model.rs +1565 -536
  92. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +6 -3
  93. package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +672 -0
  94. package/dist/create/server-source/crates/feltdb/src/storage.rs +9 -3
  95. package/dist/create/server-source/crates/feltdb/src/submission.rs +5 -11
  96. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +6 -8
  97. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +24 -35
  98. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +24 -8
  99. package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +248 -59
  100. package/dist/create/server-source/crates/feltdb/src/transactions.rs +17 -20
  101. package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +749 -0
  102. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +1 -0
  103. package/dist/create/server-source/crates/feltdb/src/workload.rs +512 -4
  104. package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +3 -4
  105. package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +132 -0
  106. package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +299 -0
  107. package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +272 -0
  108. package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +467 -0
  109. package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +309 -0
  110. package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +445 -0
  111. package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +518 -0
  112. package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +392 -0
  113. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +436 -220
  114. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +1916 -0
  115. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +1878 -0
  116. package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +1862 -0
  117. package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +278 -0
  118. package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +2 -1
  119. package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +80 -25
  120. package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +5 -8
  121. package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +52 -44
  122. package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +33 -16
  123. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +22 -7
  124. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +41 -22
  125. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +25 -8
  126. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +9 -6
  127. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +120 -69
  128. package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +21 -10
  129. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +1365 -0
  130. package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +868 -0
  131. package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +221 -0
  132. package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +417 -0
  133. package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +338 -0
  134. package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +1039 -0
  135. package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +739 -0
  136. package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +427 -0
  137. package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +3 -3
  138. package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +25 -22
  139. package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +1799 -0
  140. package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +1316 -0
  141. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +53 -61
  142. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +156 -61
  143. package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +299 -0
  144. package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +255 -0
  145. package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +249 -0
  146. package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +994 -0
  147. package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +442 -0
  148. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +16 -1
  149. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +164 -13
  150. package/dist/create/server-source/crates/feltdb-server/src/main.rs +695 -47
  151. package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +21 -0
  152. package/dist/studio-app/assets/{feltdb_wasm-CVQWgXO-.js → feltdb_wasm-C1VhI-U5.js} +1 -1
  153. package/dist/studio-app/assets/feltdb_wasm_bg-C8HXbAXb.wasm +0 -0
  154. package/dist/studio-app/assets/{index-DwgNAIIX.js → index-Bbos1m2U.js} +1 -1
  155. package/dist/studio-app/index.html +1 -1
  156. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  157. package/dist/workload.d.ts +2 -1
  158. package/dist/workload.d.ts.map +1 -1
  159. package/package.json +1 -1
  160. package/dist/studio-app/assets/feltdb_wasm_bg-CNVpvaZV.wasm +0 -0
@@ -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]