@feltdb/core 0.15.0 → 0.16.0

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 (247) hide show
  1. package/dist/agent-state.d.ts +20 -0
  2. package/dist/agent-state.d.ts.map +1 -1
  3. package/dist/agent-state.js +36 -0
  4. package/dist/build-identity.json +12 -4
  5. package/dist/cli/commands.js +187 -4
  6. package/dist/cli/publish-engine.js +116 -16
  7. package/dist/collection.d.ts.map +1 -1
  8. package/dist/collection.js +3 -0
  9. package/dist/create/build-identity.json +12 -4
  10. package/dist/create/managed-account.js +93 -35
  11. package/dist/create/package-versions.js +1 -1
  12. package/dist/create/server-source/Cargo.lock +6 -509
  13. package/dist/create/server-source/Cargo.toml +2 -13
  14. package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
  15. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
  16. package/dist/create/server-source/crates/feltdb-server/src/main.rs +255 -12
  17. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
  18. package/dist/db.d.ts +11 -1
  19. package/dist/db.d.ts.map +1 -1
  20. package/dist/db.js +15 -2
  21. package/dist/error-codes.d.ts +5 -0
  22. package/dist/error-codes.d.ts.map +1 -1
  23. package/dist/error-codes.js +9 -1
  24. package/dist/http-db.d.ts +16 -0
  25. package/dist/http-db.d.ts.map +1 -1
  26. package/dist/http-db.js +36 -6
  27. package/dist/managed-recovery.d.ts +6 -0
  28. package/dist/managed-recovery.d.ts.map +1 -1
  29. package/dist/managed-recovery.js +9 -0
  30. package/dist/studio-app/assets/{feltdb_wasm-BjM1ylL3.js → feltdb_wasm-DtybUY0q.js} +1 -1
  31. package/dist/studio-app/assets/feltdb_wasm_bg-DsgIUwaB.wasm +0 -0
  32. package/dist/studio-app/assets/index-C4OffsZl.js +37 -0
  33. package/dist/studio-app/index.html +1 -1
  34. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  35. package/dist/wasm/package.json +1 -1
  36. package/dist/workload.d.ts +55 -3
  37. package/dist/workload.d.ts.map +1 -1
  38. package/dist/workload.js +23 -0
  39. package/dist/workspace/workspace-connection.d.ts.map +1 -1
  40. package/dist/workspace/workspace-connection.js +14 -3
  41. package/package.json +1 -1
  42. package/dist/create/server-source/crates/feltdb/Cargo.lock +0 -175
  43. package/dist/create/server-source/crates/feltdb/Cargo.toml +0 -102
  44. package/dist/create/server-source/crates/feltdb/LICENSE +0 -21
  45. package/dist/create/server-source/crates/feltdb/README.md +0 -75
  46. package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +0 -370
  47. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +0 -589
  48. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +0 -247
  49. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +0 -440
  50. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +0 -275
  51. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +0 -381
  52. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +0 -467
  53. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +0 -489
  54. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +0 -281
  55. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +0 -606
  56. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +0 -531
  57. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +0 -462
  58. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +0 -505
  59. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +0 -484
  60. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +0 -758
  61. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +0 -421
  62. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +0 -329
  63. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +0 -1705
  64. package/dist/create/server-source/crates/feltdb/src/acquisition.rs +0 -286
  65. package/dist/create/server-source/crates/feltdb/src/admission.rs +0 -185
  66. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +0 -507
  67. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +0 -539
  68. package/dist/create/server-source/crates/feltdb/src/agent_state.rs +0 -320
  69. package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +0 -1545
  70. package/dist/create/server-source/crates/feltdb/src/analytics.rs +0 -521
  71. package/dist/create/server-source/crates/feltdb/src/application.rs +0 -2674
  72. package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +0 -1070
  73. package/dist/create/server-source/crates/feltdb/src/authority.rs +0 -479
  74. package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +0 -847
  75. package/dist/create/server-source/crates/feltdb/src/authorization.rs +0 -1030
  76. package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +0 -1122
  77. package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority-client.rs +0 -32
  78. package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority.rs +0 -19
  79. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +0 -1474
  80. package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +0 -8
  81. package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +0 -418
  82. package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +0 -482
  83. package/dist/create/server-source/crates/feltdb/src/capability.rs +0 -903
  84. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +0 -263
  85. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -77
  86. package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +0 -496
  87. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +0 -2574
  88. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +0 -212
  89. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +0 -422
  90. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +0 -445
  91. package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +0 -465
  92. package/dist/create/server-source/crates/feltdb/src/convergence.rs +0 -634
  93. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +0 -427
  94. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +0 -376
  95. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +0 -365
  96. package/dist/create/server-source/crates/feltdb/src/cron.rs +0 -294
  97. package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +0 -483
  98. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +0 -477
  99. package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +0 -1003
  100. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +0 -1334
  101. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +0 -368
  102. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +0 -231
  103. package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +0 -482
  104. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +0 -203
  105. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +0 -317
  106. package/dist/create/server-source/crates/feltdb/src/equality_index.rs +0 -595
  107. package/dist/create/server-source/crates/feltdb/src/execution.rs +0 -426
  108. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +0 -214
  109. package/dist/create/server-source/crates/feltdb/src/indexing.rs +0 -776
  110. package/dist/create/server-source/crates/feltdb/src/lib.rs +0 -7365
  111. package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +0 -234
  112. package/dist/create/server-source/crates/feltdb/src/materialization.rs +0 -184
  113. package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -266
  114. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +0 -310
  115. package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +0 -736
  116. package/dist/create/server-source/crates/feltdb/src/observability.rs +0 -379
  117. package/dist/create/server-source/crates/feltdb/src/operation.rs +0 -290
  118. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +0 -439
  119. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +0 -349
  120. package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +0 -332
  121. package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +0 -718
  122. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +0 -487
  123. package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +0 -166
  124. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +0 -289
  125. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +0 -566
  126. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +0 -3391
  127. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +0 -203
  128. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +0 -261
  129. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +0 -502
  130. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +0 -216
  131. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +0 -303
  132. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +0 -323
  133. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +0 -531
  134. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +0 -406
  135. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +0 -436
  136. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +0 -387
  137. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +0 -378
  138. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +0 -359
  139. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +0 -372
  140. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +0 -404
  141. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +0 -376
  142. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +0 -461
  143. package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +0 -2125
  144. package/dist/create/server-source/crates/feltdb/src/production_api.rs +0 -418
  145. package/dist/create/server-source/crates/feltdb/src/provenance.rs +0 -207
  146. package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +0 -126
  147. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +0 -218
  148. package/dist/create/server-source/crates/feltdb/src/read_basis.rs +0 -257
  149. package/dist/create/server-source/crates/feltdb/src/references.rs +0 -404
  150. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +0 -401
  151. package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +0 -501
  152. package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +0 -680
  153. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +0 -163
  154. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +0 -133
  155. package/dist/create/server-source/crates/feltdb/src/routing.rs +0 -409
  156. package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +0 -2029
  157. package/dist/create/server-source/crates/feltdb/src/semantic_query.rs +0 -599
  158. package/dist/create/server-source/crates/feltdb/src/sharding.rs +0 -549
  159. package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +0 -516
  160. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +0 -6003
  161. package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +0 -222
  162. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +0 -320
  163. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +0 -291
  164. package/dist/create/server-source/crates/feltdb/src/state_model.rs +0 -4158
  165. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +0 -379
  166. package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +0 -673
  167. package/dist/create/server-source/crates/feltdb/src/storage.rs +0 -273
  168. package/dist/create/server-source/crates/feltdb/src/submission.rs +0 -471
  169. package/dist/create/server-source/crates/feltdb/src/sync.rs +0 -495
  170. package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +0 -822
  171. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +0 -433
  172. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +0 -462
  173. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +0 -965
  174. package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +0 -1120
  175. package/dist/create/server-source/crates/feltdb/src/transactions.rs +0 -643
  176. package/dist/create/server-source/crates/feltdb/src/trigger.rs +0 -390
  177. package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +0 -749
  178. package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +0 -708
  179. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +0 -1269
  180. package/dist/create/server-source/crates/feltdb/src/workflow.rs +0 -713
  181. package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +0 -510
  182. package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +0 -354
  183. package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +0 -594
  184. package/dist/create/server-source/crates/feltdb/src/workload.rs +0 -4222
  185. package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +0 -456
  186. package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +0 -1188
  187. package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +0 -2884
  188. package/dist/create/server-source/crates/feltdb/tests/authority_process.rs +0 -297
  189. package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +0 -534
  190. package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +0 -132
  191. package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +0 -299
  192. package/dist/create/server-source/crates/feltdb/tests/common/mod.rs +0 -96
  193. package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +0 -272
  194. package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +0 -467
  195. package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +0 -309
  196. package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +0 -445
  197. package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +0 -518
  198. package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +0 -392
  199. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +0 -850
  200. package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +0 -23340
  201. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +0 -1916
  202. package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +0 -1878
  203. package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +0 -1862
  204. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +0 -123
  205. package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +0 -299
  206. package/dist/create/server-source/crates/feltdb/tests/local_process_ownership.rs +0 -69
  207. package/dist/create/server-source/crates/feltdb/tests/managed_incident_regression.rs +0 -191
  208. package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +0 -278
  209. package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +0 -234
  210. package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +0 -947
  211. package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +0 -404
  212. package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +0 -916
  213. package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +0 -1045
  214. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +0 -347
  215. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +0 -361
  216. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +0 -330
  217. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +0 -93
  218. package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +0 -622
  219. package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +0 -517
  220. package/dist/create/server-source/crates/feltdb/tests/production_certification.rs +0 -1153
  221. package/dist/create/server-source/crates/feltdb/tests/production_contract.rs +0 -771
  222. package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +0 -1383
  223. package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +0 -868
  224. package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +0 -221
  225. package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +0 -417
  226. package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +0 -338
  227. package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +0 -1039
  228. package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +0 -739
  229. package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +0 -452
  230. package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +0 -81
  231. package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +0 -438
  232. package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +0 -1165
  233. package/dist/create/server-source/crates/feltdb/tests/semantic_query.rs +0 -767
  234. package/dist/create/server-source/crates/feltdb/tests/semantic_query_contract.rs +0 -363
  235. package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +0 -1799
  236. package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +0 -1316
  237. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +0 -358
  238. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +0 -365
  239. package/dist/create/server-source/crates/feltdb/tests/state_ref_authority.rs +0 -918
  240. package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +0 -299
  241. package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +0 -328
  242. package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +0 -255
  243. package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +0 -249
  244. package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +0 -994
  245. package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +0 -484
  246. package/dist/studio-app/assets/feltdb_wasm_bg-TseJn2Ax.wasm +0 -0
  247. package/dist/studio-app/assets/index-1wd0uKua.js +0 -30
@@ -1,850 +0,0 @@
1
- //! Comprehensive FeltDB State Boundary Tests
2
- //!
3
- //! These tests verify that all proven contracts from feltgit PRs #6-#14
4
- //! are re-proven at the FeltDB public API boundary using FeltDBStateSystem.
5
- //!
6
- //! This is evidence that the graduated state model is canonical and
7
- //! ready for real applications.
8
-
9
- #[cfg(test)]
10
- mod feltdb_state_boundary_tests {
11
- use feltdb::{
12
- ConflictClass, ConflictClassification, FeltDBStateSystem, Relationship, SemanticDiff,
13
- StateTopology,
14
- };
15
- use serde_json::json;
16
-
17
- // ========================================================================
18
- // STATE IDENTITY & IMMUTABILITY TESTS
19
- // ========================================================================
20
-
21
- #[test]
22
- fn boundary_state_id_deterministic() {
23
- let store = FeltDBStateSystem::create_test_store();
24
-
25
- let state1 = store
26
- .create("docs:1", r#"{"x":1}"#.to_string(), "auth1".to_string())
27
- .unwrap();
28
- let state2 = store
29
- .create("docs:2", r#"{"x":1}"#.to_string(), "auth2".to_string())
30
- .unwrap();
31
-
32
- // Same content on two resources is the same *state* and two distinct
33
- // *revisions*. Content identity is deterministic; revision identity
34
- // names the occurrence, and an occurrence belongs to a resource.
35
- assert_eq!(state1.content_id, state2.content_id);
36
- assert_ne!(state1.id, state2.id);
37
- }
38
-
39
- #[test]
40
- fn boundary_state_id_representation_sensitive() {
41
- let store = FeltDBStateSystem::create_test_store();
42
-
43
- let string_state = store
44
- .create("docs:3", r#"{"v":"1"}"#.to_string(), "auth".to_string())
45
- .unwrap();
46
- let number_state = store
47
- .create("docs:4", r#"{"v":1}"#.to_string(), "auth".to_string())
48
- .unwrap();
49
-
50
- // "1" ≠ 1 in JSON representation
51
- assert_ne!(string_state.id, number_state.id);
52
- }
53
-
54
- #[test]
55
- fn boundary_revision_immutability() {
56
- let store = FeltDBStateSystem::create_test_store();
57
- let rev1 = store
58
- .create(
59
- "docs:5",
60
- r#"{"data":"initial"}"#.to_string(),
61
- "auth".to_string(),
62
- )
63
- .unwrap();
64
-
65
- let rev1_id = rev1.id.clone();
66
-
67
- // Create another state
68
- let _rev2 = store
69
- .commit(
70
- r#"{"data":"modified"}"#.to_string(),
71
- &rev1,
72
- "auth".to_string(),
73
- )
74
- .unwrap();
75
-
76
- // First revision is unchanged
77
- let retrieved = store.get(&rev1_id).unwrap();
78
- assert_eq!(retrieved.id, rev1_id);
79
- assert_eq!(retrieved.content, r#"{"data":"initial"}"#);
80
- }
81
-
82
- // ========================================================================
83
- // PERSISTENCE & RESTART RECOVERY TESTS
84
- // ========================================================================
85
-
86
- #[test]
87
- fn boundary_state_persistence() {
88
- let store = FeltDBStateSystem::create_test_store();
89
- let state = store
90
- .create(
91
- "docs:6",
92
- r#"{"persistent":"data"}"#.to_string(),
93
- "auth".to_string(),
94
- )
95
- .unwrap();
96
-
97
- let state_id = state.id.clone();
98
-
99
- // Verify it persists in store
100
- assert!(store.exists(&state_id));
101
- assert_eq!(store.get(&state_id).unwrap().id, state_id);
102
- }
103
-
104
- #[test]
105
- fn boundary_current_pointer_persistence() {
106
- let store = FeltDBStateSystem::create_test_store();
107
-
108
- let state1 = store
109
- .create("docs:7", r#"{"v":1}"#.to_string(), "auth".to_string())
110
- .unwrap();
111
- assert_eq!(store.get(&state1.id).unwrap().id, state1.id);
112
-
113
- let state2 = store
114
- .commit(r#"{"v":2}"#.to_string(), &state1, "auth".to_string())
115
- .unwrap();
116
- assert_eq!(store.get(&state2.id).unwrap().id, state2.id);
117
-
118
- // Verify both exist
119
- assert!(store.exists(&state1.id));
120
- assert!(store.exists(&state2.id));
121
- }
122
-
123
- // ========================================================================
124
- // STATE TRANSITIONS & ATOMICITY TESTS
125
- // ========================================================================
126
-
127
- #[test]
128
- fn boundary_expected_parent_validation() {
129
- let store = FeltDBStateSystem::create_test_store();
130
- let parent = store
131
- .create("docs:8", r#"{"v":1}"#.to_string(), "auth".to_string())
132
- .unwrap();
133
-
134
- // Create child with explicit parent
135
- let child = store
136
- .commit(r#"{"v":2}"#.to_string(), &parent, "auth".to_string())
137
- .unwrap();
138
-
139
- // Child must have parent
140
- assert_eq!(child.parent_id, Some(parent.id.clone()));
141
- }
142
-
143
- #[test]
144
- fn boundary_stale_transition_rejection() {
145
- let store = FeltDBStateSystem::create_test_store();
146
-
147
- let state1 = store
148
- .create("docs:9", r#"{"seq":1}"#.to_string(), "auth".to_string())
149
- .unwrap();
150
- let state2 = store
151
- .commit(r#"{"seq":2}"#.to_string(), &state1, "auth".to_string())
152
- .unwrap();
153
-
154
- // Create a branch from state1 (before state2)
155
- let branch = store
156
- .commit(r#"{"seq":1.5}"#.to_string(), &state1, "auth".to_string())
157
- .unwrap();
158
-
159
- // Verify topology catches this divergence
160
- let mut topology = StateTopology::new();
161
- topology.add_revision(state1.clone());
162
- topology.add_revision(state2.clone());
163
- topology.add_revision(branch.clone());
164
-
165
- match topology.relationship(&state2.id, &branch.id) {
166
- Relationship::Diverged => {} // Expected
167
- _ => panic!("Expected Diverged relationship"),
168
- }
169
- }
170
-
171
- #[test]
172
- fn boundary_revision_persistence_before_pointer_advancement() {
173
- let store = FeltDBStateSystem::create_test_store();
174
-
175
- let state1 = store
176
- .create("docs:10", r#"{"v":1}"#.to_string(), "auth".to_string())
177
- .unwrap();
178
- let state1_id = state1.id.clone();
179
-
180
- // Create and advance current
181
- let state2 = store
182
- .commit(r#"{"v":2}"#.to_string(), &state1, "auth".to_string())
183
- .unwrap();
184
-
185
- // Current points to state2
186
- assert_eq!(store.get(&state2.id).unwrap().id, state2.id);
187
-
188
- // But state1 still exists
189
- assert!(store.exists(&state1_id));
190
- assert_eq!(store.get(&state1_id).unwrap().id, state1_id);
191
- }
192
-
193
- // ========================================================================
194
- // BRANCHING & DIVERGENCE TESTS
195
- // ========================================================================
196
-
197
- #[test]
198
- fn boundary_explicit_parent_required() {
199
- let store = FeltDBStateSystem::create_test_store();
200
- let parent = store
201
- .create(
202
- "docs:11",
203
- r#"{"parent":true}"#.to_string(),
204
- "auth".to_string(),
205
- )
206
- .unwrap();
207
-
208
- // Initial state has no parent
209
- assert_eq!(parent.parent_id, None);
210
-
211
- // Child must have parent
212
- let child = store
213
- .commit(
214
- r#"{"parent":true,"child":true}"#.to_string(),
215
- &parent,
216
- "auth".to_string(),
217
- )
218
- .unwrap();
219
- assert_eq!(child.parent_id, Some(parent.id.clone()));
220
- }
221
-
222
- #[test]
223
- fn boundary_revisions_are_immutable_and_addressed_by_identity() {
224
- let store = FeltDBStateSystem::create_test_store();
225
- let state = store
226
- .create("docs:12", r#"{"v":1}"#.to_string(), "auth".to_string())
227
- .unwrap();
228
-
229
- // Committing a descendant does not disturb its parent. There is no
230
- // named branch to create: the identity is what a name would point at.
231
- let child = store
232
- .commit(r#"{"v":2}"#.to_string(), &state, "auth".to_string())
233
- .unwrap();
234
-
235
- let original = store.get(&state.id).unwrap();
236
- assert_eq!(original.id, state.id);
237
- assert_eq!(original.content, r#"{"v":1}"#);
238
- assert_eq!(store.parent(&child.id).unwrap().id, state.id);
239
- }
240
-
241
- #[test]
242
- fn boundary_branch_does_not_advance_current() {
243
- let store = FeltDBStateSystem::create_test_store();
244
- let state1 = store
245
- .create(
246
- "docs:13",
247
- r#"{"current":"first"}"#.to_string(),
248
- "auth".to_string(),
249
- )
250
- .unwrap();
251
-
252
- let state2 = store
253
- .commit(
254
- r#"{"current":"second"}"#.to_string(),
255
- &state1,
256
- "auth".to_string(),
257
- )
258
- .unwrap();
259
- assert_eq!(store.get(&state2.id).unwrap().id, state2.id);
260
-
261
- // Both revisions remain independently addressable. Neither is
262
- // privileged, because the store keeps no pointer that could privilege
263
- // one of them.
264
- assert_eq!(store.get(&state1.id).unwrap().id, state1.id);
265
- assert_eq!(store.get(&state2.id).unwrap().id, state2.id);
266
- }
267
-
268
- #[test]
269
- fn boundary_no_automatic_merge() {
270
- let store = FeltDBStateSystem::create_test_store();
271
-
272
- let initial = store
273
- .create(
274
- "docs:14",
275
- r#"{"shared":100}"#.to_string(),
276
- "auth".to_string(),
277
- )
278
- .unwrap();
279
-
280
- let branch_a = store
281
- .commit(
282
- r#"{"shared":150}"#.to_string(),
283
- &initial,
284
- "auth".to_string(),
285
- )
286
- .unwrap();
287
- let branch_b = store
288
- .commit(
289
- r#"{"shared":120}"#.to_string(),
290
- &initial,
291
- "auth".to_string(),
292
- )
293
- .unwrap();
294
-
295
- // Two divergent branches exist
296
- let mut topology = StateTopology::new();
297
- topology.add_revision(initial.clone());
298
- topology.add_revision(branch_a.clone());
299
- topology.add_revision(branch_b.clone());
300
-
301
- assert!(matches!(
302
- topology.relationship(&branch_a.id, &branch_b.id),
303
- Relationship::Diverged
304
- ));
305
-
306
- // No merge happened automatically: both divergent revisions are still
307
- // exactly what their authors wrote, and no third revision appeared.
308
- assert_eq!(
309
- store.get(&branch_a.id).unwrap().content,
310
- r#"{"shared":150}"#
311
- );
312
- assert_eq!(
313
- store.get(&branch_b.id).unwrap().content,
314
- r#"{"shared":120}"#
315
- );
316
- }
317
-
318
- // ========================================================================
319
- // TOPOLOGY & ANCESTRY TESTS
320
- // ========================================================================
321
-
322
- #[test]
323
- fn boundary_ancestors_linear() {
324
- let store = FeltDBStateSystem::create_test_store();
325
-
326
- let s1 = store
327
- .create("docs:15", r#"{"seq":1}"#.to_string(), "auth".to_string())
328
- .unwrap();
329
- let s2 = store
330
- .commit(r#"{"seq":2}"#.to_string(), &s1, "auth".to_string())
331
- .unwrap();
332
- let s3 = store
333
- .commit(r#"{"seq":3}"#.to_string(), &s2, "auth".to_string())
334
- .unwrap();
335
-
336
- let mut topology = StateTopology::new();
337
- topology.add_revision(s1.clone());
338
- topology.add_revision(s2.clone());
339
- topology.add_revision(s3.clone());
340
-
341
- let ancestors = topology.ancestors(&s3.id);
342
- assert!(ancestors.contains(&s2.id));
343
- assert!(ancestors.contains(&s1.id));
344
- assert!(!ancestors.contains(&s3.id));
345
- }
346
-
347
- #[test]
348
- fn boundary_is_ancestor() {
349
- let store = FeltDBStateSystem::create_test_store();
350
-
351
- let parent = store
352
- .create("docs:16", r#"{"v":1}"#.to_string(), "auth".to_string())
353
- .unwrap();
354
- let child = store
355
- .commit(r#"{"v":2}"#.to_string(), &parent, "auth".to_string())
356
- .unwrap();
357
- let grandchild = store
358
- .commit(r#"{"v":3}"#.to_string(), &child, "auth".to_string())
359
- .unwrap();
360
-
361
- let mut topology = StateTopology::new();
362
- topology.add_revision(parent.clone());
363
- topology.add_revision(child.clone());
364
- topology.add_revision(grandchild.clone());
365
-
366
- assert!(topology.is_ancestor(&parent.id, &grandchild.id));
367
- assert!(topology.is_ancestor(&child.id, &grandchild.id));
368
- assert!(!topology.is_ancestor(&grandchild.id, &parent.id));
369
- }
370
-
371
- #[test]
372
- fn boundary_common_ancestor() {
373
- let store = FeltDBStateSystem::create_test_store();
374
-
375
- let root = store
376
- .create(
377
- "docs:17",
378
- r#"{"root":true}"#.to_string(),
379
- "auth".to_string(),
380
- )
381
- .unwrap();
382
- let left = store
383
- .commit(r#"{"left":true}"#.to_string(), &root, "auth".to_string())
384
- .unwrap();
385
- let right = store
386
- .commit(r#"{"right":true}"#.to_string(), &root, "auth".to_string())
387
- .unwrap();
388
-
389
- let mut topology = StateTopology::new();
390
- topology.add_revision(root.clone());
391
- topology.add_revision(left.clone());
392
- topology.add_revision(right.clone());
393
-
394
- let common = topology.common_ancestor(&left.id, &right.id);
395
- assert_eq!(common, Some(root.id.clone()));
396
- }
397
-
398
- #[test]
399
- fn boundary_relationship_types() {
400
- let store = FeltDBStateSystem::create_test_store();
401
-
402
- let s1 = store
403
- .create("docs:18", r#"{"v":1}"#.to_string(), "auth".to_string())
404
- .unwrap();
405
- let s2 = store
406
- .commit(r#"{"v":2}"#.to_string(), &s1, "auth".to_string())
407
- .unwrap();
408
- let s3 = store
409
- .commit(r#"{"v":3}"#.to_string(), &s1, "auth".to_string())
410
- .unwrap();
411
-
412
- let mut topology = StateTopology::new();
413
- topology.add_revision(s1.clone());
414
- topology.add_revision(s2.clone());
415
- topology.add_revision(s3.clone());
416
-
417
- // Identity
418
- assert!(matches!(
419
- topology.relationship(&s1.id, &s1.id),
420
- Relationship::Identity
421
- ));
422
-
423
- // Ancestor
424
- assert!(matches!(
425
- topology.relationship(&s1.id, &s2.id),
426
- Relationship::Ancestor
427
- ));
428
-
429
- // Descendant
430
- assert!(matches!(
431
- topology.relationship(&s2.id, &s1.id),
432
- Relationship::Descendant
433
- ));
434
-
435
- // Diverged
436
- assert!(matches!(
437
- topology.relationship(&s2.id, &s3.id),
438
- Relationship::Diverged
439
- ));
440
- }
441
-
442
- #[test]
443
- fn boundary_unrelated_histories() {
444
- let store = FeltDBStateSystem::create_test_store();
445
-
446
- let hist1_root = store
447
- .create(
448
- "docs:19",
449
- r#"{"history":1}"#.to_string(),
450
- "auth".to_string(),
451
- )
452
- .unwrap();
453
- let hist2_root = store
454
- .create(
455
- "docs:20",
456
- r#"{"history":2}"#.to_string(),
457
- "auth".to_string(),
458
- )
459
- .unwrap();
460
-
461
- let mut topology = StateTopology::new();
462
- topology.add_revision(hist1_root.clone());
463
- topology.add_revision(hist2_root.clone());
464
-
465
- assert!(matches!(
466
- topology.relationship(&hist1_root.id, &hist2_root.id),
467
- Relationship::Unrelated
468
- ));
469
- }
470
-
471
- // ========================================================================
472
- // SEMANTIC DIFF TESTS
473
- // ========================================================================
474
-
475
- #[test]
476
- fn boundary_diff_deterministic_paths() {
477
- let base: serde_json::Value = json!({"a": 1, "b": 2});
478
- let modified: serde_json::Value = json!({"a": 2, "b": 2});
479
-
480
- let diff = SemanticDiff::compute(&base, &modified);
481
-
482
- // Should have exactly one change
483
- assert_eq!(diff.changes.len(), 1);
484
- assert!(!diff.changes[0].path.is_empty());
485
- }
486
-
487
- #[test]
488
- fn boundary_diff_key_vs_index() {
489
- let base: serde_json::Value = json!({
490
- "users": [
491
- {"name": "alice"},
492
- {"name": "bob"}
493
- ]
494
- });
495
- let modified: serde_json::Value = json!({
496
- "users": [
497
- {"name": "alice"},
498
- {"name": "bob"},
499
- {"name": "charlie"}
500
- ]
501
- });
502
-
503
- let diff = SemanticDiff::compute(&base, &modified);
504
-
505
- // Should detect array element addition
506
- assert!(!diff.changes.is_empty());
507
- }
508
-
509
- #[test]
510
- fn boundary_diff_added_removed_changed() {
511
- let base: serde_json::Value = json!({"x": 1, "y": 2});
512
- let modified: serde_json::Value = json!({"x": 10, "z": 3});
513
-
514
- let diff = SemanticDiff::compute(&base, &modified);
515
-
516
- // Should have changes for: x changed, y removed, z added
517
- assert!(diff.changes.len() >= 2);
518
- }
519
-
520
- #[test]
521
- fn boundary_diff_type_sensitive() {
522
- let base: serde_json::Value = json!({"v": "1"});
523
- let modified: serde_json::Value = json!({"v": 1});
524
-
525
- let diff = SemanticDiff::compute(&base, &modified);
526
-
527
- // Should detect type change
528
- assert!(!diff.changes.is_empty());
529
- }
530
-
531
- #[test]
532
- fn boundary_diff_read_only() {
533
- let base: serde_json::Value = json!({"original": true});
534
- let modified: serde_json::Value = json!({"modified": true});
535
-
536
- let _diff = SemanticDiff::compute(&base, &modified);
537
-
538
- // Diff should not modify inputs
539
- assert_eq!(base.get("original"), Some(&json!(true)));
540
- assert_eq!(modified.get("modified"), Some(&json!(true)));
541
- }
542
-
543
- // ========================================================================
544
- // CONFLICT CLASSIFICATION TESTS
545
- // ========================================================================
546
-
547
- #[test]
548
- fn boundary_conflict_independent() {
549
- let store = FeltDBStateSystem::create_test_store();
550
-
551
- let base = store
552
- .create(
553
- "docs:21",
554
- r#"{"a":1,"b":1}"#.to_string(),
555
- "auth".to_string(),
556
- )
557
- .unwrap();
558
- let left = store
559
- .commit(r#"{"a":2,"b":1}"#.to_string(), &base, "auth".to_string())
560
- .unwrap();
561
- let right = store
562
- .commit(r#"{"a":1,"b":2}"#.to_string(), &base, "auth".to_string())
563
- .unwrap();
564
-
565
- let classification = ConflictClassification::classify(&base, &left, &right);
566
-
567
- // Modifications to different fields are independent
568
- assert_eq!(classification.overall, ConflictClass::Independent);
569
- }
570
-
571
- #[test]
572
- fn boundary_conflict_convergent() {
573
- let store = FeltDBStateSystem::create_test_store();
574
-
575
- let base = store
576
- .create("docs:22", r#"{"value":1}"#.to_string(), "auth".to_string())
577
- .unwrap();
578
- let left = store
579
- .commit(r#"{"value":2}"#.to_string(), &base, "auth".to_string())
580
- .unwrap();
581
- let right = store
582
- .commit(r#"{"value":2}"#.to_string(), &base, "auth".to_string())
583
- .unwrap();
584
-
585
- let classification = ConflictClassification::classify(&base, &left, &right);
586
-
587
- // Both made same change → convergent
588
- assert_eq!(classification.overall, ConflictClass::Convergent);
589
- }
590
-
591
- #[test]
592
- fn boundary_conflict_actual_conflict() {
593
- let store = FeltDBStateSystem::create_test_store();
594
-
595
- let base = store
596
- .create(
597
- "docs:23",
598
- r#"{"balance":100}"#.to_string(),
599
- "auth".to_string(),
600
- )
601
- .unwrap();
602
- let left = store
603
- .commit(r#"{"balance":150}"#.to_string(), &base, "auth".to_string())
604
- .unwrap();
605
- let right = store
606
- .commit(r#"{"balance":120}"#.to_string(), &base, "auth".to_string())
607
- .unwrap();
608
-
609
- let classification = ConflictClassification::classify(&base, &left, &right);
610
-
611
- // Different modifications to same field → conflict
612
- assert_eq!(classification.overall, ConflictClass::Conflict);
613
- }
614
-
615
- #[test]
616
- fn boundary_conflict_authority_neutral() {
617
- let store = FeltDBStateSystem::create_test_store();
618
-
619
- let base = store
620
- .create("docs:24", r#"{"v":1}"#.to_string(), "alice".to_string())
621
- .unwrap();
622
- let left = store
623
- .commit(r#"{"v":2}"#.to_string(), &base, "alice".to_string())
624
- .unwrap();
625
- let right = store
626
- .commit(r#"{"v":2}"#.to_string(), &base, "bob".to_string())
627
- .unwrap();
628
-
629
- let classification = ConflictClassification::classify(&base, &left, &right);
630
-
631
- // Classification doesn't prefer one authority over another
632
- // It should classify based on content, not authority
633
- assert_eq!(classification.overall, ConflictClass::Convergent);
634
- }
635
-
636
- // ========================================================================
637
- // AUTHORITY & IMMUTABILITY TESTS
638
- // ========================================================================
639
-
640
- #[test]
641
- fn boundary_authority_recorded() {
642
- let store = FeltDBStateSystem::create_test_store();
643
-
644
- let state = store
645
- .create(
646
- "docs:25",
647
- r#"{"data":"value"}"#.to_string(),
648
- "my-authority".to_string(),
649
- )
650
- .unwrap();
651
-
652
- assert_eq!(state.authority, "my-authority");
653
-
654
- let retrieved = store.get(&state.id).unwrap();
655
- assert_eq!(retrieved.authority, "my-authority");
656
- }
657
-
658
- #[test]
659
- fn boundary_authority_does_not_affect_id() {
660
- let store = FeltDBStateSystem::create_test_store();
661
-
662
- let state1 = store
663
- .create("docs:26", r#"{"x":1}"#.to_string(), "auth1".to_string())
664
- .unwrap();
665
- let state2 = store
666
- .create("docs:27", r#"{"x":1}"#.to_string(), "auth2".to_string())
667
- .unwrap();
668
-
669
- // Authority takes no part in either identity. The content identity is
670
- // equal; the revision identities differ only because the resources do.
671
- assert_eq!(state1.content_id, state2.content_id);
672
- assert_ne!(state1.id, state2.id);
673
- }
674
-
675
- // ========================================================================
676
- // READ-ONLY BOUNDARY TESTS
677
- // ========================================================================
678
-
679
- #[test]
680
- fn boundary_topology_is_read_only() {
681
- let store = FeltDBStateSystem::create_test_store();
682
-
683
- let s1 = store
684
- .create("docs:28", r#"{"v":1}"#.to_string(), "auth".to_string())
685
- .unwrap();
686
- let s2 = store
687
- .commit(r#"{"v":2}"#.to_string(), &s1, "auth".to_string())
688
- .unwrap();
689
-
690
- let mut topology = StateTopology::new();
691
- topology.add_revision(s1.clone());
692
- topology.add_revision(s2.clone());
693
-
694
- // Topology operations shouldn't mutate states
695
- let _rel = topology.relationship(&s1.id, &s2.id);
696
- let _anc = topology.is_ancestor(&s1.id, &s2.id);
697
- let _ancestors = topology.ancestors(&s2.id);
698
-
699
- // States unchanged
700
- assert_eq!(store.get(&s1.id).unwrap().id, s1.id);
701
- assert_eq!(store.get(&s2.id).unwrap().id, s2.id);
702
- }
703
-
704
- #[test]
705
- fn boundary_diff_is_read_only() {
706
- let base: serde_json::Value = json!({"immutable": "base"});
707
- let modified: serde_json::Value = json!({"immutable": "base", "changed": true});
708
-
709
- let _diff = SemanticDiff::compute(&base, &modified);
710
-
711
- // Input values unchanged
712
- assert_eq!(base.get("immutable"), Some(&json!("base")));
713
- assert_eq!(modified.get("immutable"), Some(&json!("base")));
714
- }
715
-
716
- #[test]
717
- fn boundary_classification_is_read_only() {
718
- let store = FeltDBStateSystem::create_test_store();
719
-
720
- let base = store
721
- .create("docs:29", r#"{"v":1}"#.to_string(), "auth".to_string())
722
- .unwrap();
723
- let left = store
724
- .commit(r#"{"v":2}"#.to_string(), &base, "auth".to_string())
725
- .unwrap();
726
- let right = store
727
- .commit(r#"{"v":3}"#.to_string(), &base, "auth".to_string())
728
- .unwrap();
729
-
730
- let _classification = ConflictClassification::classify(&base, &left, &right);
731
-
732
- // States unchanged
733
- assert_eq!(store.get(&base.id).unwrap().id, base.id);
734
- assert_eq!(store.get(&left.id).unwrap().id, left.id);
735
- assert_eq!(store.get(&right.id).unwrap().id, right.id);
736
- }
737
-
738
- // ========================================================================
739
- // GIT INDEPENDENCE TESTS
740
- // ========================================================================
741
-
742
- #[test]
743
- fn boundary_no_git_dependency() {
744
- // This test should pass without any .git directory or Git runtime
745
- let store = FeltDBStateSystem::create_test_store();
746
-
747
- let state = store
748
- .create(
749
- "docs:30",
750
- r#"{"git-independent": true}"#.to_string(),
751
- "auth".to_string(),
752
- )
753
- .expect("State operations should work without Git");
754
-
755
- assert!(store.exists(&state.id));
756
- }
757
-
758
- #[test]
759
- fn boundary_topology_no_git() {
760
- let store = FeltDBStateSystem::create_test_store();
761
-
762
- let s1 = store
763
- .create("docs:31", r#"{"seq":1}"#.to_string(), "auth".to_string())
764
- .unwrap();
765
- let s2 = store
766
- .commit(r#"{"seq":2}"#.to_string(), &s1, "auth".to_string())
767
- .unwrap();
768
-
769
- let mut topology = StateTopology::new();
770
- topology.add_revision(s1.clone());
771
- topology.add_revision(s2.clone());
772
-
773
- // All topology operations should work without Git
774
- let _ancestors = topology.ancestors(&s2.id);
775
- let _is_anc = topology.is_ancestor(&s1.id, &s2.id);
776
- let _common = topology.common_ancestor(&s1.id, &s2.id);
777
- let _rel = topology.relationship(&s1.id, &s2.id);
778
- }
779
-
780
- // ========================================================================
781
- // INTEGRATION WORKFLOW TEST
782
- // ========================================================================
783
-
784
- #[test]
785
- fn boundary_complete_application_workflow() {
786
- // Simulate a complete application workflow using canonical FeltDB state
787
-
788
- // 1. Initialize
789
- let store = FeltDBStateSystem::create_test_store();
790
-
791
- // 2. Create initial application state
792
- let initial = store
793
- .create(
794
- "docs:32",
795
- r#"{"users":{"alice":{"balance":100}}}"#.to_string(),
796
- "app-authority".to_string(),
797
- )
798
- .expect("Create initial state");
799
-
800
- // 3. Make first update
801
- let update1 = store
802
- .commit(
803
- r#"{"users":{"alice":{"balance":150}}}"#.to_string(),
804
- &initial,
805
- "alice".to_string(),
806
- )
807
- .expect("First update");
808
-
809
- // 4. Branch: parallel update from initial
810
- let update2 = store
811
- .commit(
812
- r#"{"users":{"alice":{"balance":100},"bob":{"balance":50}}}"#.to_string(),
813
- &initial,
814
- "bob".to_string(),
815
- )
816
- .expect("Parallel update");
817
-
818
- // 5. Analyze topology
819
- let mut topology = StateTopology::new();
820
- topology.add_revision(initial.clone());
821
- topology.add_revision(update1.clone());
822
- topology.add_revision(update2.clone());
823
-
824
- assert!(matches!(
825
- topology.relationship(&update1.id, &update2.id),
826
- Relationship::Diverged
827
- ));
828
-
829
- // 6. Compute diffs
830
- let initial_json: serde_json::Value =
831
- serde_json::from_str(r#"{"users":{"alice":{"balance":100}}}"#).unwrap();
832
- let update1_json: serde_json::Value =
833
- serde_json::from_str(r#"{"users":{"alice":{"balance":150}}}"#).unwrap();
834
-
835
- let diff = SemanticDiff::compute(&initial_json, &update1_json);
836
- assert!(!diff.changes.is_empty());
837
-
838
- // 7. Classify conflict
839
- let classification = ConflictClassification::classify(&initial, &update1, &update2);
840
- assert_eq!(classification.overall, ConflictClass::Independent);
841
-
842
- // 8. Verify current pointer
843
- assert_eq!(store.get(&update2.id).unwrap().id, update2.id);
844
-
845
- // 9. Verify all states exist
846
- assert!(store.exists(&initial.id));
847
- assert!(store.exists(&update1.id));
848
- assert!(store.exists(&update2.id));
849
- }
850
- }