@feltdb/core 0.8.4 → 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 (149) 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 +507 -6
  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_algebra.rs +12 -11
  53. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +9 -4
  54. package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +65 -18
  55. package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +193 -57
  56. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +37 -27
  57. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +38 -10
  58. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +20 -14
  59. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +394 -229
  60. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +8 -6
  61. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +11 -13
  62. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +79 -70
  63. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +3 -3
  64. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +33 -11
  65. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +6 -6
  66. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +14 -56
  67. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +29 -27
  68. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +35 -17
  69. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +8 -2
  70. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +59 -15
  71. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +70 -17
  72. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +23 -6
  73. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +12 -3
  74. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +41 -11
  75. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +56 -25
  76. package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +701 -245
  77. package/dist/create/server-source/crates/feltdb/src/production_api.rs +31 -13
  78. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +6 -8
  79. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +5 -5
  80. package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +48 -18
  81. package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +30 -11
  82. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +6 -3
  83. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +4 -3
  84. package/dist/create/server-source/crates/feltdb/src/sharding.rs +36 -10
  85. package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +516 -0
  86. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +13 -4
  87. package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +222 -0
  88. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +82 -54
  89. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +2 -2
  90. package/dist/create/server-source/crates/feltdb/src/state_model.rs +1514 -537
  91. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +6 -3
  92. package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +672 -0
  93. package/dist/create/server-source/crates/feltdb/src/submission.rs +5 -11
  94. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +6 -8
  95. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +24 -35
  96. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +24 -8
  97. package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +248 -59
  98. package/dist/create/server-source/crates/feltdb/src/transactions.rs +17 -20
  99. package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +749 -0
  100. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +1 -0
  101. package/dist/create/server-source/crates/feltdb/src/workload.rs +512 -4
  102. package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +3 -4
  103. package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +299 -0
  104. package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +288 -0
  105. package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +392 -0
  106. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +436 -220
  107. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +1916 -0
  108. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +1878 -0
  109. package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +1862 -0
  110. package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +2 -1
  111. package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +80 -25
  112. package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +5 -8
  113. package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +52 -44
  114. package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +33 -16
  115. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +22 -7
  116. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +41 -22
  117. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +25 -8
  118. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +9 -6
  119. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +120 -69
  120. package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +21 -10
  121. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +1032 -0
  122. package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +868 -0
  123. package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +221 -0
  124. package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +338 -0
  125. package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +1039 -0
  126. package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +739 -0
  127. package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +427 -0
  128. package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +3 -3
  129. package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +25 -22
  130. package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +1799 -0
  131. package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +1316 -0
  132. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +53 -61
  133. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +156 -61
  134. package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +299 -0
  135. package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +255 -0
  136. package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +249 -0
  137. package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +994 -0
  138. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +2 -1
  139. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +164 -13
  140. package/dist/create/server-source/crates/feltdb-server/src/main.rs +326 -6
  141. package/dist/studio-app/assets/{feltdb_wasm-CVQWgXO-.js → feltdb_wasm-DaNwCLRX.js} +1 -1
  142. package/dist/studio-app/assets/feltdb_wasm_bg-DnsHNv6g.wasm +0 -0
  143. package/dist/studio-app/assets/{index-DwgNAIIX.js → index-j8IlhNqJ.js} +1 -1
  144. package/dist/studio-app/index.html +1 -1
  145. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  146. package/dist/workload.d.ts +2 -1
  147. package/dist/workload.d.ts.map +1 -1
  148. package/package.json +1 -1
  149. package/dist/studio-app/assets/feltdb_wasm_bg-CNVpvaZV.wasm +0 -0
@@ -24,7 +24,9 @@ mod tests {
24
24
  };
25
25
  use crate::metrics::ClusterMetrics;
26
26
  use crate::state_hash::StateHash;
27
- use crate::transactions::{ConsistencyContract, Operation, OperationCommand, OperationId, StateVersion};
27
+ use crate::transactions::{
28
+ ConsistencyContract, Operation, OperationCommand, OperationId, StateVersion,
29
+ };
28
30
  use serde_json::json;
29
31
  use std::collections::HashMap;
30
32
  use std::sync::Arc;
@@ -241,14 +243,24 @@ mod tests {
241
243
  let mut report = String::new();
242
244
  report.push_str("=== Baseline Workload Report ===\n\n");
243
245
  report.push_str(&format!("Uptime: {} seconds\n", snapshot.uptime_secs));
244
- report.push_str(&format!("Total Operations: {}\n", snapshot.total_operations_applied));
246
+ report.push_str(&format!(
247
+ "Total Operations: {}\n",
248
+ snapshot.total_operations_applied
249
+ ));
245
250
  report.push_str(&format!("Total Crashes: {}\n", snapshot.total_crashes));
246
- report.push_str(&format!("Divergence Events: {}\n", snapshot.divergence_events));
247
- report.push_str(&format!("Data Loss Events: {}\n", snapshot.data_loss_events));
251
+ report.push_str(&format!(
252
+ "Divergence Events: {}\n",
253
+ snapshot.divergence_events
254
+ ));
255
+ report.push_str(&format!(
256
+ "Data Loss Events: {}\n",
257
+ snapshot.data_loss_events
258
+ ));
248
259
  report.push_str("\nNode Metrics:\n");
249
260
 
250
261
  for node in &snapshot.node_snapshots {
251
- report.push_str(&format!(" {}: {} ops applied, {} acked, {} committed\n",
262
+ report.push_str(&format!(
263
+ " {}: {} ops applied, {} acked, {} committed\n",
252
264
  node.node_id,
253
265
  node.operations_applied,
254
266
  node.operations_acknowledged,
@@ -280,7 +292,10 @@ mod tests {
280
292
  println!("Baseline result: {:?}", result);
281
293
  println!("{}", workload.export_baseline_report());
282
294
 
283
- assert!(result.total_operations > 0, "Should have processed operations");
295
+ assert!(
296
+ result.total_operations > 0,
297
+ "Should have processed operations"
298
+ );
284
299
  assert!(result.all_converged, "All nodes should converge");
285
300
  assert_eq!(result.divergences, 0, "Zero divergences during clean run");
286
301
 
@@ -295,7 +310,10 @@ mod tests {
295
310
 
296
311
  println!("Medium baseline result: {:?}", result);
297
312
 
298
- assert!(result.total_operations > 100, "Should process 100+ operations");
313
+ assert!(
314
+ result.total_operations > 100,
315
+ "Should process 100+ operations"
316
+ );
299
317
  assert!(result.all_converged, "All nodes should converge");
300
318
  assert_eq!(result.divergences, 0, "Zero divergences");
301
319
 
@@ -311,7 +329,10 @@ mod tests {
311
329
  assert!(workload.verify_convergence(), "Final convergence check");
312
330
  assert_eq!(result.divergences, 0, "No divergences during baseline");
313
331
 
314
- println!("✓ Convergence consistency verified over {} ops", result.total_operations);
332
+ println!(
333
+ "✓ Convergence consistency verified over {} ops",
334
+ result.total_operations
335
+ );
315
336
  }
316
337
 
317
338
  // Test 4: High-throughput baseline
@@ -320,9 +341,15 @@ mod tests {
320
341
  let workload = BaselineWorkload::new(2);
321
342
  let result = workload.run_clean_workload(20, 50);
322
343
 
323
- println!("High-throughput baseline: {} ops/sec", result.throughput_ops_sec);
344
+ println!(
345
+ "High-throughput baseline: {} ops/sec",
346
+ result.throughput_ops_sec
347
+ );
324
348
 
325
- assert!(result.throughput_ops_sec > 0, "Should measure positive throughput");
349
+ assert!(
350
+ result.throughput_ops_sec > 0,
351
+ "Should measure positive throughput"
352
+ );
326
353
  assert_eq!(result.divergences, 0, "Zero divergences");
327
354
 
328
355
  println!("✓ High-throughput: {} ops/sec", result.throughput_ops_sec);
@@ -339,7 +366,10 @@ mod tests {
339
366
  let json = metrics.export_json();
340
367
 
341
368
  assert!(csv.contains("leader"), "CSV should contain leader metrics");
342
- assert!(json.contains("total_operations_applied"), "JSON should contain operations");
369
+ assert!(
370
+ json.contains("total_operations_applied"),
371
+ "JSON should contain operations"
372
+ );
343
373
 
344
374
  println!("✓ Metrics export validated");
345
375
  }
@@ -29,7 +29,9 @@ mod tests {
29
29
  };
30
30
  use crate::metrics::ClusterMetrics;
31
31
  use crate::state_hash::StateHash;
32
- use crate::transactions::{ConsistencyContract, Operation, OperationCommand, OperationId, StateVersion};
32
+ use crate::transactions::{
33
+ ConsistencyContract, Operation, OperationCommand, OperationId, StateVersion,
34
+ };
33
35
  use serde_json::json;
34
36
  use std::collections::HashMap;
35
37
  use std::sync::atomic::{AtomicBool, Ordering};
@@ -48,19 +50,19 @@ mod tests {
48
50
  impl FailureInjectionConfig {
49
51
  fn default() -> Self {
50
52
  Self {
51
- node_crash_interval_secs: 45, // Every 45 seconds
52
- partition_interval_secs: 180, // Every 3 minutes
53
- restart_interval_secs: 600, // Every 10 minutes
54
- compaction_interval_secs: 900, // Every 15 minutes
53
+ node_crash_interval_secs: 45, // Every 45 seconds
54
+ partition_interval_secs: 180, // Every 3 minutes
55
+ restart_interval_secs: 600, // Every 10 minutes
56
+ compaction_interval_secs: 900, // Every 15 minutes
55
57
  }
56
58
  }
57
59
 
58
60
  fn test_mode() -> Self {
59
61
  Self {
60
- node_crash_interval_secs: 5, // Every 5 seconds (for testing)
61
- partition_interval_secs: 15, // Every 15 seconds
62
- restart_interval_secs: 30, // Every 30 seconds
63
- compaction_interval_secs: 60, // Every 60 seconds
62
+ node_crash_interval_secs: 5, // Every 5 seconds (for testing)
63
+ partition_interval_secs: 15, // Every 15 seconds
64
+ restart_interval_secs: 30, // Every 30 seconds
65
+ compaction_interval_secs: 60, // Every 60 seconds
64
66
  }
65
67
  }
66
68
  }
@@ -131,7 +133,9 @@ mod tests {
131
133
  }
132
134
 
133
135
  fn apply_replicated_operation(&self, message: ReplicationMessage) -> Result<(), String> {
134
- if self.is_crashed.load(Ordering::Relaxed) || self.is_partitioned.load(Ordering::Relaxed) {
136
+ if self.is_crashed.load(Ordering::Relaxed)
137
+ || self.is_partitioned.load(Ordering::Relaxed)
138
+ {
135
139
  return Err("Node unavailable".to_string());
136
140
  }
137
141
 
@@ -263,7 +267,9 @@ mod tests {
263
267
  }
264
268
 
265
269
  // Inject crashes periodically
266
- if last_crash_time.elapsed().as_secs() >= self.failure_config.node_crash_interval_secs {
270
+ if last_crash_time.elapsed().as_secs()
271
+ >= self.failure_config.node_crash_interval_secs
272
+ {
267
273
  if let Some(follower) = self.followers.first() {
268
274
  follower.crash();
269
275
  failures_injected += 1;
@@ -277,7 +283,9 @@ mod tests {
277
283
  }
278
284
 
279
285
  // Inject partitions periodically
280
- if last_partition_time.elapsed().as_secs() >= self.failure_config.partition_interval_secs {
286
+ if last_partition_time.elapsed().as_secs()
287
+ >= self.failure_config.partition_interval_secs
288
+ {
281
289
  if let Some(follower) = self.followers.get(1) {
282
290
  follower.partition();
283
291
  failures_injected += 1;
@@ -358,8 +366,10 @@ mod tests {
358
366
  assert_eq!(result.divergences, 0, "Zero divergences under failures");
359
367
  assert!(result.final_hash_match, "Final convergence achieved");
360
368
 
361
- println!("✓ Short soak: {} ops, {} failures, {} divergences",
362
- result.total_operations, result.failures_injected, result.divergences);
369
+ println!(
370
+ "✓ Short soak: {} ops, {} failures, {} divergences",
371
+ result.total_operations, result.failures_injected, result.divergences
372
+ );
363
373
  }
364
374
 
365
375
  // Test 2: Medium soak (60 seconds)
@@ -371,13 +381,21 @@ mod tests {
371
381
 
372
382
  println!("Medium soak result: {:?}", result);
373
383
 
374
- assert!(result.total_operations > 1000, "Should process 1000+ operations");
375
- assert!(result.failures_injected > 5, "Should inject multiple failures");
384
+ assert!(
385
+ result.total_operations > 1000,
386
+ "Should process 1000+ operations"
387
+ );
388
+ assert!(
389
+ result.failures_injected > 5,
390
+ "Should inject multiple failures"
391
+ );
376
392
  assert_eq!(result.divergences, 0, "Zero divergences");
377
393
  assert!(result.all_stable, "System remains stable");
378
394
 
379
- println!("✓ Medium soak: {} ops, {} failures injected",
380
- result.total_operations, result.failures_injected);
395
+ println!(
396
+ "✓ Medium soak: {} ops, {} failures injected",
397
+ result.total_operations, result.failures_injected
398
+ );
381
399
  }
382
400
 
383
401
  // Test 3: Verify recovery consistency
@@ -390,7 +408,10 @@ mod tests {
390
408
  assert!(result.convergence_checks > 0, "Should check convergence");
391
409
  assert_eq!(result.divergences, 0, "Recovery is consistent");
392
410
 
393
- println!("✓ Recovery consistency over {} checks", result.convergence_checks);
411
+ println!(
412
+ "✓ Recovery consistency over {} checks",
413
+ result.convergence_checks
414
+ );
394
415
  }
395
416
 
396
417
  // Test 4: Long soak with stable operation
@@ -402,13 +423,21 @@ mod tests {
402
423
 
403
424
  println!("Long soak result: {:?}", result);
404
425
 
405
- assert!(result.total_operations > 2000, "Should process 2000+ operations");
406
- assert!(result.all_stable, "System remains stable under sustained load");
426
+ assert!(
427
+ result.total_operations > 2000,
428
+ "Should process 2000+ operations"
429
+ );
430
+ assert!(
431
+ result.all_stable,
432
+ "System remains stable under sustained load"
433
+ );
407
434
  assert_eq!(result.divergences, 0, "No divergences over extended period");
408
435
  assert!(result.final_hash_match, "Final state converges");
409
436
 
410
- println!("✓ Long soak: {} ops under {} failures",
411
- result.total_operations, result.failures_injected);
437
+ println!(
438
+ "✓ Long soak: {} ops under {} failures",
439
+ result.total_operations, result.failures_injected
440
+ );
412
441
  }
413
442
 
414
443
  // Test 5: Metrics validation during soak
@@ -424,7 +453,9 @@ mod tests {
424
453
  assert!(snapshot.divergence_events >= 0, "Metrics track divergences");
425
454
  assert_eq!(snapshot.data_loss_events, 0, "No data loss detected");
426
455
 
427
- println!("✓ Metrics: {} divergence events, {} data loss events",
428
- snapshot.divergence_events, snapshot.data_loss_events);
456
+ println!(
457
+ "✓ Metrics: {} divergence events, {} data loss events",
458
+ snapshot.divergence_events, snapshot.data_loss_events
459
+ );
429
460
  }
430
461
  }