@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
@@ -88,15 +88,46 @@ mod security_tests {
88
88
  use state_contract::FieldType;
89
89
 
90
90
  let schema = make_schema_with_collections(vec![
91
- make_collection("Project", vec![
92
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
93
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
94
- ]),
95
- make_collection("Membership", vec![
96
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
97
- make_field("user", FieldType::Reference { collection: "User".into() }),
98
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
99
- ]),
91
+ make_collection(
92
+ "Project",
93
+ vec![
94
+ make_field(
95
+ "_id",
96
+ FieldType::Primitive {
97
+ primitive: state_contract::PrimitiveType::String,
98
+ },
99
+ ),
100
+ make_field(
101
+ "organization",
102
+ FieldType::Reference {
103
+ collection: "Organization".into(),
104
+ },
105
+ ),
106
+ ],
107
+ ),
108
+ make_collection(
109
+ "Membership",
110
+ vec![
111
+ make_field(
112
+ "_id",
113
+ FieldType::Primitive {
114
+ primitive: state_contract::PrimitiveType::String,
115
+ },
116
+ ),
117
+ make_field(
118
+ "user",
119
+ FieldType::Reference {
120
+ collection: "User".into(),
121
+ },
122
+ ),
123
+ make_field(
124
+ "organization",
125
+ FieldType::Reference {
126
+ collection: "Organization".into(),
127
+ },
128
+ ),
129
+ ],
130
+ ),
100
131
  ]);
101
132
 
102
133
  let project = json!({"_id": "proj1", "organization": "org-A"});
@@ -149,15 +180,46 @@ mod security_tests {
149
180
  use state_contract::FieldType;
150
181
 
151
182
  let schema = make_schema_with_collections(vec![
152
- make_collection("Project", vec![
153
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
154
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
155
- ]),
156
- make_collection("Membership", vec![
157
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
158
- make_field("user", FieldType::Reference { collection: "User".into() }),
159
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
160
- ]),
183
+ make_collection(
184
+ "Project",
185
+ vec![
186
+ make_field(
187
+ "_id",
188
+ FieldType::Primitive {
189
+ primitive: state_contract::PrimitiveType::String,
190
+ },
191
+ ),
192
+ make_field(
193
+ "organization",
194
+ FieldType::Reference {
195
+ collection: "Organization".into(),
196
+ },
197
+ ),
198
+ ],
199
+ ),
200
+ make_collection(
201
+ "Membership",
202
+ vec![
203
+ make_field(
204
+ "_id",
205
+ FieldType::Primitive {
206
+ primitive: state_contract::PrimitiveType::String,
207
+ },
208
+ ),
209
+ make_field(
210
+ "user",
211
+ FieldType::Reference {
212
+ collection: "User".into(),
213
+ },
214
+ ),
215
+ make_field(
216
+ "organization",
217
+ FieldType::Reference {
218
+ collection: "Organization".into(),
219
+ },
220
+ ),
221
+ ],
222
+ ),
161
223
  ]);
162
224
 
163
225
  let project = json!({"_id": "proj1", "organization": "org-A"});
@@ -192,21 +254,50 @@ mod security_tests {
192
254
  use state_contract::FieldType;
193
255
 
194
256
  let schema = make_schema_with_collections(vec![
195
- make_collection("Project", vec![
196
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
197
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
198
- ]),
199
- make_collection("Membership", vec![
200
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
201
- make_field("user", FieldType::Reference { collection: "User".into() }),
202
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
203
- ]),
257
+ make_collection(
258
+ "Project",
259
+ vec![
260
+ make_field(
261
+ "_id",
262
+ FieldType::Primitive {
263
+ primitive: state_contract::PrimitiveType::String,
264
+ },
265
+ ),
266
+ make_field(
267
+ "organization",
268
+ FieldType::Reference {
269
+ collection: "Organization".into(),
270
+ },
271
+ ),
272
+ ],
273
+ ),
274
+ make_collection(
275
+ "Membership",
276
+ vec![
277
+ make_field(
278
+ "_id",
279
+ FieldType::Primitive {
280
+ primitive: state_contract::PrimitiveType::String,
281
+ },
282
+ ),
283
+ make_field(
284
+ "user",
285
+ FieldType::Reference {
286
+ collection: "User".into(),
287
+ },
288
+ ),
289
+ make_field(
290
+ "organization",
291
+ FieldType::Reference {
292
+ collection: "Organization".into(),
293
+ },
294
+ ),
295
+ ],
296
+ ),
204
297
  ]);
205
298
 
206
299
  let project = json!({"_id": "proj1", "organization": "org-A"});
207
- let snapshot = vec![
208
- make_stored_row("Project", "proj1", project),
209
- ];
300
+ let snapshot = vec![make_stored_row("Project", "proj1", project)];
210
301
 
211
302
  let auth_state = make_auth_state(schema, snapshot);
212
303
 
@@ -237,15 +328,46 @@ mod security_tests {
237
328
  use state_contract::FieldType;
238
329
 
239
330
  let schema = make_schema_with_collections(vec![
240
- make_collection("Project", vec![
241
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
242
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
243
- ]),
244
- make_collection("Membership", vec![
245
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
246
- make_field("user", FieldType::Reference { collection: "User".into() }),
247
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
248
- ]),
331
+ make_collection(
332
+ "Project",
333
+ vec![
334
+ make_field(
335
+ "_id",
336
+ FieldType::Primitive {
337
+ primitive: state_contract::PrimitiveType::String,
338
+ },
339
+ ),
340
+ make_field(
341
+ "organization",
342
+ FieldType::Reference {
343
+ collection: "Organization".into(),
344
+ },
345
+ ),
346
+ ],
347
+ ),
348
+ make_collection(
349
+ "Membership",
350
+ vec![
351
+ make_field(
352
+ "_id",
353
+ FieldType::Primitive {
354
+ primitive: state_contract::PrimitiveType::String,
355
+ },
356
+ ),
357
+ make_field(
358
+ "user",
359
+ FieldType::Reference {
360
+ collection: "User".into(),
361
+ },
362
+ ),
363
+ make_field(
364
+ "organization",
365
+ FieldType::Reference {
366
+ collection: "Organization".into(),
367
+ },
368
+ ),
369
+ ],
370
+ ),
249
371
  ]);
250
372
 
251
373
  // Three projects: alice can access proj1 and proj3 (org-A),
@@ -301,19 +423,28 @@ mod security_tests {
301
423
  fn invariant_d_update_auth_uses_existing_state() {
302
424
  use state_contract::FieldType;
303
425
 
304
- let schema = make_schema_with_collections(vec![
305
- make_collection("Project", vec![
306
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
307
- make_field("owner_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
308
- ]),
309
- ]);
426
+ let schema = make_schema_with_collections(vec![make_collection(
427
+ "Project",
428
+ vec![
429
+ make_field(
430
+ "_id",
431
+ FieldType::Primitive {
432
+ primitive: state_contract::PrimitiveType::String,
433
+ },
434
+ ),
435
+ make_field(
436
+ "owner_id",
437
+ FieldType::Primitive {
438
+ primitive: state_contract::PrimitiveType::String,
439
+ },
440
+ ),
441
+ ],
442
+ )]);
310
443
 
311
444
  // Existing project owned by alice
312
445
  let existing = json!({"_id": "proj1", "owner_id": "alice", "title": "Secret"});
313
446
 
314
- let snapshot = vec![
315
- make_stored_row("Project", "proj1", existing.clone()),
316
- ];
447
+ let snapshot = vec![make_stored_row("Project", "proj1", existing.clone())];
317
448
 
318
449
  let auth_state = make_auth_state(schema, snapshot);
319
450
 
@@ -345,15 +476,46 @@ mod security_tests {
345
476
  use state_contract::FieldType;
346
477
 
347
478
  let schema = make_schema_with_collections(vec![
348
- make_collection("Project", vec![
349
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
350
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
351
- ]),
352
- make_collection("Membership", vec![
353
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
354
- make_field("user", FieldType::Reference { collection: "User".into() }),
355
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
356
- ]),
479
+ make_collection(
480
+ "Project",
481
+ vec![
482
+ make_field(
483
+ "_id",
484
+ FieldType::Primitive {
485
+ primitive: state_contract::PrimitiveType::String,
486
+ },
487
+ ),
488
+ make_field(
489
+ "organization",
490
+ FieldType::Reference {
491
+ collection: "Organization".into(),
492
+ },
493
+ ),
494
+ ],
495
+ ),
496
+ make_collection(
497
+ "Membership",
498
+ vec![
499
+ make_field(
500
+ "_id",
501
+ FieldType::Primitive {
502
+ primitive: state_contract::PrimitiveType::String,
503
+ },
504
+ ),
505
+ make_field(
506
+ "user",
507
+ FieldType::Reference {
508
+ collection: "User".into(),
509
+ },
510
+ ),
511
+ make_field(
512
+ "organization",
513
+ FieldType::Reference {
514
+ collection: "Organization".into(),
515
+ },
516
+ ),
517
+ ],
518
+ ),
357
519
  ]);
358
520
 
359
521
  // Alice is member of org-A only
@@ -392,15 +554,46 @@ mod security_tests {
392
554
  use state_contract::FieldType;
393
555
 
394
556
  let schema = make_schema_with_collections(vec![
395
- make_collection("Project", vec![
396
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
397
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
398
- ]),
399
- make_collection("Membership", vec![
400
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
401
- make_field("user", FieldType::Reference { collection: "User".into() }),
402
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
403
- ]),
557
+ make_collection(
558
+ "Project",
559
+ vec![
560
+ make_field(
561
+ "_id",
562
+ FieldType::Primitive {
563
+ primitive: state_contract::PrimitiveType::String,
564
+ },
565
+ ),
566
+ make_field(
567
+ "organization",
568
+ FieldType::Reference {
569
+ collection: "Organization".into(),
570
+ },
571
+ ),
572
+ ],
573
+ ),
574
+ make_collection(
575
+ "Membership",
576
+ vec![
577
+ make_field(
578
+ "_id",
579
+ FieldType::Primitive {
580
+ primitive: state_contract::PrimitiveType::String,
581
+ },
582
+ ),
583
+ make_field(
584
+ "user",
585
+ FieldType::Reference {
586
+ collection: "User".into(),
587
+ },
588
+ ),
589
+ make_field(
590
+ "organization",
591
+ FieldType::Reference {
592
+ collection: "Organization".into(),
593
+ },
594
+ ),
595
+ ],
596
+ ),
404
597
  ]);
405
598
 
406
599
  // Alice is member of org-A
@@ -446,17 +639,21 @@ mod security_tests {
446
639
  fn reference_missing_organization_reference_in_schema() {
447
640
  use state_contract::FieldType;
448
641
 
449
- let schema = make_schema_with_collections(vec![
450
- make_collection("Project", vec![
451
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
642
+ let schema = make_schema_with_collections(vec![make_collection(
643
+ "Project",
644
+ vec![
645
+ make_field(
646
+ "_id",
647
+ FieldType::Primitive {
648
+ primitive: state_contract::PrimitiveType::String,
649
+ },
650
+ ),
452
651
  // No organization reference
453
- ]),
454
- ]);
652
+ ],
653
+ )]);
455
654
 
456
655
  let proj = json!({"_id": "proj1"});
457
- let snapshot = vec![
458
- make_stored_row("Project", "proj1", proj),
459
- ];
656
+ let snapshot = vec![make_stored_row("Project", "proj1", proj)];
460
657
 
461
658
  let auth_state = make_auth_state(schema, snapshot);
462
659
 
@@ -482,17 +679,26 @@ mod security_tests {
482
679
  fn reference_missing_organization_value_in_record() {
483
680
  use state_contract::FieldType;
484
681
 
485
- let schema = make_schema_with_collections(vec![
486
- make_collection("Project", vec![
487
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
488
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
489
- ]),
490
- ]);
682
+ let schema = make_schema_with_collections(vec![make_collection(
683
+ "Project",
684
+ vec![
685
+ make_field(
686
+ "_id",
687
+ FieldType::Primitive {
688
+ primitive: state_contract::PrimitiveType::String,
689
+ },
690
+ ),
691
+ make_field(
692
+ "organization",
693
+ FieldType::Reference {
694
+ collection: "Organization".into(),
695
+ },
696
+ ),
697
+ ],
698
+ )]);
491
699
 
492
700
  let proj = json!({"_id": "proj1"}); // Missing organization field
493
- let snapshot = vec![
494
- make_stored_row("Project", "proj1", proj),
495
- ];
701
+ let snapshot = vec![make_stored_row("Project", "proj1", proj)];
496
702
 
497
703
  let auth_state = make_auth_state(schema, snapshot);
498
704
 
@@ -517,17 +723,26 @@ mod security_tests {
517
723
  fn reference_null_organization_value() {
518
724
  use state_contract::FieldType;
519
725
 
520
- let schema = make_schema_with_collections(vec![
521
- make_collection("Project", vec![
522
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
523
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
524
- ]),
525
- ]);
726
+ let schema = make_schema_with_collections(vec![make_collection(
727
+ "Project",
728
+ vec![
729
+ make_field(
730
+ "_id",
731
+ FieldType::Primitive {
732
+ primitive: state_contract::PrimitiveType::String,
733
+ },
734
+ ),
735
+ make_field(
736
+ "organization",
737
+ FieldType::Reference {
738
+ collection: "Organization".into(),
739
+ },
740
+ ),
741
+ ],
742
+ )]);
526
743
 
527
744
  let proj = json!({"_id": "proj1", "organization": null});
528
- let snapshot = vec![
529
- make_stored_row("Project", "proj1", proj),
530
- ];
745
+ let snapshot = vec![make_stored_row("Project", "proj1", proj)];
531
746
 
532
747
  let auth_state = make_auth_state(schema, snapshot);
533
748
 
@@ -557,26 +772,57 @@ mod security_tests {
557
772
  use state_contract::FieldType;
558
773
 
559
774
  let schema = make_schema_with_collections(vec![
560
- make_collection("Project", vec![
561
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
562
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
563
- ]),
564
- make_collection("Membership", vec![
565
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
566
- make_field("user", FieldType::Reference { collection: "User".into() }),
567
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
568
- ]),
775
+ make_collection(
776
+ "Project",
777
+ vec![
778
+ make_field(
779
+ "_id",
780
+ FieldType::Primitive {
781
+ primitive: state_contract::PrimitiveType::String,
782
+ },
783
+ ),
784
+ make_field(
785
+ "organization",
786
+ FieldType::Reference {
787
+ collection: "Organization".into(),
788
+ },
789
+ ),
790
+ ],
791
+ ),
792
+ make_collection(
793
+ "Membership",
794
+ vec![
795
+ make_field(
796
+ "_id",
797
+ FieldType::Primitive {
798
+ primitive: state_contract::PrimitiveType::String,
799
+ },
800
+ ),
801
+ make_field(
802
+ "user",
803
+ FieldType::Reference {
804
+ collection: "User".into(),
805
+ },
806
+ ),
807
+ make_field(
808
+ "organization",
809
+ FieldType::Reference {
810
+ collection: "Organization".into(),
811
+ },
812
+ ),
813
+ ],
814
+ ),
569
815
  ]);
570
816
 
571
817
  let proj = json!({"_id": "proj1", "organization": "org-A"});
572
- let mut mem = make_stored_row("Membership", "mem1",
573
- json!({"_id": "mem1", "user": "alice", "organization": "org-A"}));
818
+ let mut mem = make_stored_row(
819
+ "Membership",
820
+ "mem1",
821
+ json!({"_id": "mem1", "user": "alice", "organization": "org-A"}),
822
+ );
574
823
  mem.deleted = true; // Mark as deleted
575
824
 
576
- let snapshot = vec![
577
- make_stored_row("Project", "proj1", proj),
578
- mem,
579
- ];
825
+ let snapshot = vec![make_stored_row("Project", "proj1", proj), mem];
580
826
 
581
827
  let auth_state = make_auth_state(schema, snapshot);
582
828
 
@@ -603,15 +849,46 @@ mod security_tests {
603
849
  use state_contract::FieldType;
604
850
 
605
851
  let schema = make_schema_with_collections(vec![
606
- make_collection("Project", vec![
607
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
608
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
609
- ]),
610
- make_collection("Membership", vec![
611
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
612
- make_field("user", FieldType::Reference { collection: "User".into() }),
613
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
614
- ]),
852
+ make_collection(
853
+ "Project",
854
+ vec![
855
+ make_field(
856
+ "_id",
857
+ FieldType::Primitive {
858
+ primitive: state_contract::PrimitiveType::String,
859
+ },
860
+ ),
861
+ make_field(
862
+ "organization",
863
+ FieldType::Reference {
864
+ collection: "Organization".into(),
865
+ },
866
+ ),
867
+ ],
868
+ ),
869
+ make_collection(
870
+ "Membership",
871
+ vec![
872
+ make_field(
873
+ "_id",
874
+ FieldType::Primitive {
875
+ primitive: state_contract::PrimitiveType::String,
876
+ },
877
+ ),
878
+ make_field(
879
+ "user",
880
+ FieldType::Reference {
881
+ collection: "User".into(),
882
+ },
883
+ ),
884
+ make_field(
885
+ "organization",
886
+ FieldType::Reference {
887
+ collection: "Organization".into(),
888
+ },
889
+ ),
890
+ ],
891
+ ),
615
892
  ]);
616
893
 
617
894
  let proj = json!({"_id": "proj1", "organization": "org-B"});
@@ -654,15 +931,46 @@ mod security_tests {
654
931
  use state_contract::FieldType;
655
932
 
656
933
  let schema = make_schema_with_collections(vec![
657
- make_collection("Project", vec![
658
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
659
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
660
- ]),
661
- make_collection("Membership", vec![
662
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
663
- make_field("user", FieldType::Reference { collection: "User".into() }),
664
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
665
- ]),
934
+ make_collection(
935
+ "Project",
936
+ vec![
937
+ make_field(
938
+ "_id",
939
+ FieldType::Primitive {
940
+ primitive: state_contract::PrimitiveType::String,
941
+ },
942
+ ),
943
+ make_field(
944
+ "organization",
945
+ FieldType::Reference {
946
+ collection: "Organization".into(),
947
+ },
948
+ ),
949
+ ],
950
+ ),
951
+ make_collection(
952
+ "Membership",
953
+ vec![
954
+ make_field(
955
+ "_id",
956
+ FieldType::Primitive {
957
+ primitive: state_contract::PrimitiveType::String,
958
+ },
959
+ ),
960
+ make_field(
961
+ "user",
962
+ FieldType::Reference {
963
+ collection: "User".into(),
964
+ },
965
+ ),
966
+ make_field(
967
+ "organization",
968
+ FieldType::Reference {
969
+ collection: "Organization".into(),
970
+ },
971
+ ),
972
+ ],
973
+ ),
666
974
  ]);
667
975
 
668
976
  let proj = json!({"_id": "proj1", "organization": "org-A"});
@@ -697,12 +1005,8 @@ mod security_tests {
697
1005
  fn anonymous_owner_policy_denied() {
698
1006
  let proj = json!({"_id": "proj1", "owner": "alice"});
699
1007
 
700
- let context = policy_evaluation::RecordAuthorizationContext::new(
701
- None,
702
- "Project",
703
- "proj1",
704
- proj,
705
- );
1008
+ let context =
1009
+ policy_evaluation::RecordAuthorizationContext::new(None, "Project", "proj1", proj);
706
1010
 
707
1011
  let result = policy_evaluation::PolicyEvaluator::evaluate_record(
708
1012
  policy_evaluation::PolicySubject::Owner,
@@ -722,15 +1026,46 @@ mod security_tests {
722
1026
  use state_contract::FieldType;
723
1027
 
724
1028
  let schema = make_schema_with_collections(vec![
725
- make_collection("Project", vec![
726
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
727
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
728
- ]),
729
- make_collection("Membership", vec![
730
- make_field("_id", FieldType::Primitive { primitive: state_contract::PrimitiveType::String }),
731
- make_field("user", FieldType::Reference { collection: "User".into() }),
732
- make_field("organization", FieldType::Reference { collection: "Organization".into() }),
733
- ]),
1029
+ make_collection(
1030
+ "Project",
1031
+ vec![
1032
+ make_field(
1033
+ "_id",
1034
+ FieldType::Primitive {
1035
+ primitive: state_contract::PrimitiveType::String,
1036
+ },
1037
+ ),
1038
+ make_field(
1039
+ "organization",
1040
+ FieldType::Reference {
1041
+ collection: "Organization".into(),
1042
+ },
1043
+ ),
1044
+ ],
1045
+ ),
1046
+ make_collection(
1047
+ "Membership",
1048
+ vec![
1049
+ make_field(
1050
+ "_id",
1051
+ FieldType::Primitive {
1052
+ primitive: state_contract::PrimitiveType::String,
1053
+ },
1054
+ ),
1055
+ make_field(
1056
+ "user",
1057
+ FieldType::Reference {
1058
+ collection: "User".into(),
1059
+ },
1060
+ ),
1061
+ make_field(
1062
+ "organization",
1063
+ FieldType::Reference {
1064
+ collection: "Organization".into(),
1065
+ },
1066
+ ),
1067
+ ],
1068
+ ),
734
1069
  ]);
735
1070
 
736
1071
  let proj = json!({"_id": "proj1", "organization": "org-A"});