@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
@@ -27,14 +27,14 @@
27
27
 
28
28
  use feltdb::{
29
29
  state_contract::{
30
- StateSchema, CollectionSchema, FieldSchema, FieldType, PrimitiveType,
31
- FieldConstraints, AuthorizationContext,
30
+ AuthorizationContext, CollectionSchema, FieldConstraints, FieldSchema, FieldType,
31
+ PrimitiveType, StateSchema,
32
32
  },
33
33
  FeltDb,
34
34
  };
35
35
  use serde_json::json;
36
- use tempfile::TempDir;
37
36
  use std::collections::HashMap;
37
+ use tempfile::TempDir;
38
38
 
39
39
  /// Evidence record for each authorization test
40
40
  #[derive(Debug, Clone)]
@@ -95,15 +95,36 @@ impl TeamDeleteAuthTest {
95
95
  let team_id = "team-backend".to_string();
96
96
 
97
97
  // Create users
98
- db.insert("User#user-owner", json!({"_id": owner_id, "email": "owner@example.com"}))?;
99
- db.insert("User#user-admin", json!({"_id": admin_id, "email": "admin@example.com"}))?;
100
- db.insert("User#user-member", json!({"_id": member_id, "email": "member@example.com"}))?;
101
- db.insert("User#user-non-member", json!({"_id": non_member_id, "email": "non-member@example.com"}))?;
102
- db.insert("User#user-revoked", json!({"_id": revoked_id, "email": "revoked@example.com"}))?;
103
- db.insert("User#user-cross-tenant", json!({"_id": cross_tenant_id, "email": "cross-tenant@example.com"}))?;
98
+ db.insert(
99
+ "User#user-owner",
100
+ json!({"_id": owner_id, "email": "owner@example.com"}),
101
+ )?;
102
+ db.insert(
103
+ "User#user-admin",
104
+ json!({"_id": admin_id, "email": "admin@example.com"}),
105
+ )?;
106
+ db.insert(
107
+ "User#user-member",
108
+ json!({"_id": member_id, "email": "member@example.com"}),
109
+ )?;
110
+ db.insert(
111
+ "User#user-non-member",
112
+ json!({"_id": non_member_id, "email": "non-member@example.com"}),
113
+ )?;
114
+ db.insert(
115
+ "User#user-revoked",
116
+ json!({"_id": revoked_id, "email": "revoked@example.com"}),
117
+ )?;
118
+ db.insert(
119
+ "User#user-cross-tenant",
120
+ json!({"_id": cross_tenant_id, "email": "cross-tenant@example.com"}),
121
+ )?;
104
122
 
105
123
  // Create organization
106
- db.insert("Organization#org-1", json!({"_id": org_id, "name": "Org 1"}))?;
124
+ db.insert(
125
+ "Organization#org-1",
126
+ json!({"_id": org_id, "name": "Org 1"}),
127
+ )?;
107
128
 
108
129
  // Create organization memberships
109
130
  // owner, admin, member, revoked: all in organization
@@ -232,11 +253,17 @@ impl TeamDeleteAuthTest {
232
253
  println!("AUTHORIZATION EVIDENCE MATRIX");
233
254
  println!("───────────────────────────────────────────────────────────────────\n");
234
255
 
235
- println!("Actor\t\tRole\t\tTeam.owner?\tOrg Mbr?\tExpected\tActual\t\tAuth Path\t\t\tClass");
256
+ println!(
257
+ "Actor\t\tRole\t\tTeam.owner?\tOrg Mbr?\tExpected\tActual\t\tAuth Path\t\t\tClass"
258
+ );
236
259
  println!("────────────────────────────────────────────────────────────────────────────────────────────────────────");
237
260
 
238
261
  for (_, evidence) in &self.evidence {
239
- let owner_match = if evidence.team_owner == evidence.actor_id { "YES" } else { "NO" };
262
+ let owner_match = if evidence.team_owner == evidence.actor_id {
263
+ "YES"
264
+ } else {
265
+ "NO"
266
+ };
240
267
  let org_member = if evidence.is_org_member { "YES" } else { "NO" };
241
268
 
242
269
  println!(
@@ -286,7 +313,9 @@ impl TeamDeleteAuthTest {
286
313
  println!("This suggests frozen vocabulary may directly handle role-based auth.\n");
287
314
  } else if path_b_candidates > 0 {
288
315
  println!("PATH B INDICATOR: Some results suggest workflow pattern could work.");
289
- println!("Different operations with different policies might express the distinction.\n");
316
+ println!(
317
+ "Different operations with different policies might express the distinction.\n"
318
+ );
290
319
  } else {
291
320
  println!("PATH C INDICATOR: Results suggest vocabulary gap.");
292
321
  println!("Frozen vocabulary may not be able to express this security invariant.\n");
@@ -325,7 +354,9 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
325
354
  // Test owner (has Team.owner field and write capability)
326
355
  println!("Testing owner delete...");
327
356
  let owner_ctx = test.actor_context(&test.owner_id);
328
- let owner_result = test.db.delete_with_authorization(&format!("Team#{}", test.team_id), &owner_ctx);
357
+ let owner_result = test
358
+ .db
359
+ .delete_with_authorization(&format!("Team#{}", test.team_id), &owner_ctx);
329
360
  let owner_actual = match owner_result {
330
361
  Ok(_) => "PERMIT".to_string(),
331
362
  Err(e) => format!("DENY: {}", e),
@@ -344,22 +375,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
344
375
 
345
376
  // Re-insert for subsequent tests
346
377
  if owner_actual.contains("PERMIT") {
347
- test.db.insert(
348
- "Team#team-backend",
349
- json!({
350
- "_id": test.team_id,
351
- "organization": test.org_id,
352
- "name": "Backend Team",
353
- "owner": test.owner_id,
354
- "created_at": "2026-08-22T00:00:00Z"
355
- }),
356
- ).ok();
378
+ test.db
379
+ .insert(
380
+ "Team#team-backend",
381
+ json!({
382
+ "_id": test.team_id,
383
+ "organization": test.org_id,
384
+ "name": "Backend Team",
385
+ "owner": test.owner_id,
386
+ "created_at": "2026-08-22T00:00:00Z"
387
+ }),
388
+ )
389
+ .ok();
357
390
  }
358
391
 
359
392
  // Test admin (has TeamMembership.role="admin" and write capability)
360
393
  println!("Testing admin delete...");
361
394
  let admin_ctx = test.actor_context(&test.admin_id);
362
- let admin_result = test.db.delete_with_authorization(&format!("Team#{}", test.team_id), &admin_ctx);
395
+ let admin_result = test
396
+ .db
397
+ .delete_with_authorization(&format!("Team#{}", test.team_id), &admin_ctx);
363
398
  let admin_actual = match admin_result {
364
399
  Ok(_) => "PERMIT".to_string(),
365
400
  Err(e) => format!("DENY: {}", e),
@@ -377,22 +412,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
377
412
  );
378
413
 
379
414
  if admin_actual.contains("PERMIT") {
380
- test.db.insert(
381
- "Team#team-backend",
382
- json!({
383
- "_id": test.team_id,
384
- "organization": test.org_id,
385
- "name": "Backend Team",
386
- "owner": test.owner_id,
387
- "created_at": "2026-08-22T00:00:00Z"
388
- }),
389
- ).ok();
415
+ test.db
416
+ .insert(
417
+ "Team#team-backend",
418
+ json!({
419
+ "_id": test.team_id,
420
+ "organization": test.org_id,
421
+ "name": "Backend Team",
422
+ "owner": test.owner_id,
423
+ "created_at": "2026-08-22T00:00:00Z"
424
+ }),
425
+ )
426
+ .ok();
390
427
  }
391
428
 
392
429
  // Test member (has TeamMembership.role="member" and write capability)
393
430
  println!("Testing member delete...");
394
431
  let member_ctx = test.actor_context(&test.member_id);
395
- let member_result = test.db.delete_with_authorization(&format!("Team#{}", test.team_id), &member_ctx);
432
+ let member_result = test
433
+ .db
434
+ .delete_with_authorization(&format!("Team#{}", test.team_id), &member_ctx);
396
435
  let member_actual = match member_result {
397
436
  Ok(_) => "PERMIT".to_string(),
398
437
  Err(e) => format!("DENY: {}", e),
@@ -410,22 +449,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
410
449
  );
411
450
 
412
451
  if member_actual.contains("PERMIT") {
413
- test.db.insert(
414
- "Team#team-backend",
415
- json!({
416
- "_id": test.team_id,
417
- "organization": test.org_id,
418
- "name": "Backend Team",
419
- "owner": test.owner_id,
420
- "created_at": "2026-08-22T00:00:00Z"
421
- }),
422
- ).ok();
452
+ test.db
453
+ .insert(
454
+ "Team#team-backend",
455
+ json!({
456
+ "_id": test.team_id,
457
+ "organization": test.org_id,
458
+ "name": "Backend Team",
459
+ "owner": test.owner_id,
460
+ "created_at": "2026-08-22T00:00:00Z"
461
+ }),
462
+ )
463
+ .ok();
423
464
  }
424
465
 
425
466
  // Test non_member (no team membership at all)
426
467
  println!("Testing non_member delete...");
427
468
  let non_member_ctx = test.actor_context(&test.non_member_id);
428
- let non_member_result = test.db.delete_with_authorization(&format!("Team#{}", test.team_id), &non_member_ctx);
469
+ let non_member_result = test
470
+ .db
471
+ .delete_with_authorization(&format!("Team#{}", test.team_id), &non_member_ctx);
429
472
  let non_member_actual = match non_member_result {
430
473
  Ok(_) => "PERMIT".to_string(),
431
474
  Err(e) => format!("DENY: {}", e),
@@ -443,22 +486,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
443
486
  );
444
487
 
445
488
  if non_member_actual.contains("PERMIT") {
446
- test.db.insert(
447
- "Team#team-backend",
448
- json!({
449
- "_id": test.team_id,
450
- "organization": test.org_id,
451
- "name": "Backend Team",
452
- "owner": test.owner_id,
453
- "created_at": "2026-08-22T00:00:00Z"
454
- }),
455
- ).ok();
489
+ test.db
490
+ .insert(
491
+ "Team#team-backend",
492
+ json!({
493
+ "_id": test.team_id,
494
+ "organization": test.org_id,
495
+ "name": "Backend Team",
496
+ "owner": test.owner_id,
497
+ "created_at": "2026-08-22T00:00:00Z"
498
+ }),
499
+ )
500
+ .ok();
456
501
  }
457
502
 
458
503
  // Test revoked (org member but revoked from team)
459
504
  println!("Testing revoked delete...");
460
505
  let revoked_ctx = test.actor_context(&test.revoked_id);
461
- let revoked_result = test.db.delete_with_authorization(&format!("Team#{}", test.team_id), &revoked_ctx);
506
+ let revoked_result = test
507
+ .db
508
+ .delete_with_authorization(&format!("Team#{}", test.team_id), &revoked_ctx);
462
509
  let revoked_actual = match revoked_result {
463
510
  Ok(_) => "PERMIT".to_string(),
464
511
  Err(e) => format!("DENY: {}", e),
@@ -476,16 +523,18 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
476
523
  );
477
524
 
478
525
  if revoked_actual.contains("PERMIT") {
479
- test.db.insert(
480
- "Team#team-backend",
481
- json!({
482
- "_id": test.team_id,
483
- "organization": test.org_id,
484
- "name": "Backend Team",
485
- "owner": test.owner_id,
486
- "created_at": "2026-08-22T00:00:00Z"
487
- }),
488
- ).ok();
526
+ test.db
527
+ .insert(
528
+ "Team#team-backend",
529
+ json!({
530
+ "_id": test.team_id,
531
+ "organization": test.org_id,
532
+ "name": "Backend Team",
533
+ "owner": test.owner_id,
534
+ "created_at": "2026-08-22T00:00:00Z"
535
+ }),
536
+ )
537
+ .ok();
489
538
  }
490
539
 
491
540
  // Test cross_tenant (not in tenant)
@@ -500,7 +549,9 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
500
549
  writable_collections: Default::default(),
501
550
  field_projections: Default::default(),
502
551
  };
503
- let cross_tenant_result = test.db.delete_with_authorization(&format!("Team#{}", test.team_id), &cross_tenant_ctx);
552
+ let cross_tenant_result = test
553
+ .db
554
+ .delete_with_authorization(&format!("Team#{}", test.team_id), &cross_tenant_ctx);
504
555
  let cross_tenant_actual = match cross_tenant_result {
505
556
  Ok(_) => "PERMIT".to_string(),
506
557
  Err(e) => format!("DENY: {}", e),
@@ -17,8 +17,7 @@
17
17
 
18
18
  use feltdb::{
19
19
  state_contract::{
20
- StateSchema, CollectionSchema, FieldSchema, FieldType, PrimitiveType,
21
- FieldConstraints,
20
+ CollectionSchema, FieldConstraints, FieldSchema, FieldType, PrimitiveType, StateSchema,
22
21
  },
23
22
  FeltDb,
24
23
  };
@@ -301,16 +300,28 @@ fn pr9_team_creation_and_basic_access() -> Result<(), Box<dyn std::error::Error>
301
300
  let team_id = "team-backend";
302
301
 
303
302
  // Setup: Alice, Bob, Charlie
304
- db.insert("User#user-alice", json!({ "_id": alice_id, "email": "alice@example.com" }))
305
- .map_err(|e| format!("{:?}", e))?;
306
- db.insert("User#user-bob", json!({ "_id": bob_id, "email": "bob@example.com" }))
307
- .map_err(|e| format!("{:?}", e))?;
308
- db.insert("User#user-charlie", json!({ "_id": charlie_id, "email": "charlie@example.com" }))
309
- .map_err(|e| format!("{:?}", e))?;
303
+ db.insert(
304
+ "User#user-alice",
305
+ json!({ "_id": alice_id, "email": "alice@example.com" }),
306
+ )
307
+ .map_err(|e| format!("{:?}", e))?;
308
+ db.insert(
309
+ "User#user-bob",
310
+ json!({ "_id": bob_id, "email": "bob@example.com" }),
311
+ )
312
+ .map_err(|e| format!("{:?}", e))?;
313
+ db.insert(
314
+ "User#user-charlie",
315
+ json!({ "_id": charlie_id, "email": "charlie@example.com" }),
316
+ )
317
+ .map_err(|e| format!("{:?}", e))?;
310
318
 
311
319
  // Setup: Organization
312
- db.insert("Organization#org-acme", json!({ "_id": org_id, "name": "ACME Corp" }))
313
- .map_err(|e| format!("{:?}", e))?;
320
+ db.insert(
321
+ "Organization#org-acme",
322
+ json!({ "_id": org_id, "name": "ACME Corp" }),
323
+ )
324
+ .map_err(|e| format!("{:?}", e))?;
314
325
 
315
326
  // Setup: All three are org members (required for team access)
316
327
  db.insert(