@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,247 +0,0 @@
1
- /// Phase 7.1: Causal Release Economics
2
- ///
3
- /// Measurement-only investigation to determine whether frontier advancement
4
- /// and pending-operation release is a material bottleneck.
5
- ///
6
- /// Three possible outcomes:
7
- /// - Outcome A: Release is cheap (O(m) with low constants)
8
- /// - Outcome B: Release is O(m) but acceptable cost
9
- /// - Outcome C: Repeated advances cause O(m²) pathological rescanning
10
- ///
11
- /// Only Outcome C justifies architectural changes to release mechanism.
12
- use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
13
- use feltdb::{CausalDependencyBarrier, VectorClock};
14
-
15
- fn make_vector_clock(node_count: usize) -> VectorClock {
16
- let mut vc = VectorClock::new();
17
- for i in 0..node_count {
18
- vc.clocks.insert(format!("node_{}", i), 1);
19
- }
20
- vc
21
- }
22
-
23
- /// Benchmark 1: Single Release Scan
24
- ///
25
- /// Measure: How expensive is one call to check_unblocked_operations()?
26
- /// Varies: Pending buffer size (0, 10, 100, 1K, 10K)
27
- /// Setup: All operations are blocked (frontier hasn't advanced enough)
28
- fn benchmark_release_single_scan(c: &mut Criterion) {
29
- let mut group = c.benchmark_group("gate13_release_single_scan");
30
- group.sample_size(20);
31
-
32
- for pending_size in [0, 10, 100, 1000, 10000].iter() {
33
- group.throughput(Throughput::Elements(*pending_size as u64));
34
- group.bench_function(
35
- format!("release_single_scan_pending{}", pending_size),
36
- |b| {
37
- b.iter_batched(
38
- || {
39
- // Setup: Create barrier and fill with pending operations
40
- let mut barrier = CausalDependencyBarrier::new();
41
-
42
- // All operations require high timestamps that frontier doesn't satisfy
43
- for i in 0..*pending_size {
44
- let mut required = VectorClock::new();
45
- // Each requires increasing timestamp: A:1000, A:1001, etc.
46
- required
47
- .clocks
48
- .insert("node_a".to_string(), (1000 + i) as u64);
49
- let _ = barrier.receive_operation(format!("pending_{}", i), required);
50
- }
51
- barrier
52
- },
53
- |mut barrier| {
54
- // Measure: What does it cost to advance frontier by one operation?
55
- // This calls check_unblocked_operations() internally
56
- let mut frontier = VectorClock::new();
57
- frontier.clocks.insert("node_a".to_string(), 1);
58
- barrier.advance_frontier(&frontier);
59
- black_box(barrier)
60
- },
61
- criterion::BatchSize::SmallInput,
62
- );
63
- },
64
- );
65
- }
66
-
67
- group.finish();
68
- }
69
-
70
- /// Benchmark 2: Release Selectivity
71
- ///
72
- /// Measure: Does it matter what % of pending operations are ready?
73
- /// Varies: Pending size fixed at 1K, but % ready = [0, 1, 10, 50, 100]
74
- /// Question: Is the cost proportional to (pending_size) or (ready_count)?
75
- fn benchmark_release_selectivity(c: &mut Criterion) {
76
- let mut group = c.benchmark_group("gate13_release_selectivity");
77
- group.sample_size(20);
78
-
79
- let pending_size = 1000;
80
-
81
- for ready_percent in [0, 1, 10, 50, 100].iter() {
82
- group.throughput(Throughput::Elements(pending_size as u64));
83
- group.bench_function(
84
- format!("release_selectivity_ready{}pct", ready_percent),
85
- |b| {
86
- b.iter_batched(
87
- || {
88
- let mut barrier = CausalDependencyBarrier::new();
89
-
90
- let ready_count = (pending_size * ready_percent) / 100;
91
- let blocked_count = pending_size - ready_count;
92
-
93
- // Add ready operations (frontier will satisfy them)
94
- for i in 0..ready_count {
95
- let mut required = VectorClock::new();
96
- // Frontier will be at A:2000, these require A:100
97
- required.clocks.insert("node_a".to_string(), 100);
98
- let _ = barrier.receive_operation(format!("ready_{}", i), required);
99
- }
100
-
101
- // Add blocked operations (frontier won't satisfy them yet)
102
- for i in 0..blocked_count {
103
- let mut required = VectorClock::new();
104
- // These require A:5000, frontier will only be at A:2000
105
- required.clocks.insert("node_a".to_string(), 5000);
106
- let _ = barrier.receive_operation(format!("blocked_{}", i), required);
107
- }
108
- barrier
109
- },
110
- |mut barrier| {
111
- // Measure: Advance frontier to release the ready operations
112
- let mut frontier = VectorClock::new();
113
- // Advance to A:2000 - just enough to release ready operations
114
- frontier.clocks.insert("node_a".to_string(), 2000);
115
- barrier.advance_frontier(&frontier);
116
- black_box(barrier)
117
- },
118
- criterion::BatchSize::SmallInput,
119
- );
120
- },
121
- );
122
- }
123
-
124
- group.finish();
125
- }
126
-
127
- /// Benchmark 3: Pathological Repeated Release (THE CRITICAL TEST)
128
- ///
129
- /// Measure: Does repeated frontier advancement cause O(m²) rescanning?
130
- /// Setup: 10,000 pending operations, all ready
131
- /// Scenario: Advance frontier 10,000 times (one per operation)
132
- /// Each advance should release exactly one operation
133
- ///
134
- /// Question: Does the implementation catch this efficiently?
135
- ///
136
- /// Expected behavior:
137
- /// - Good: entries_examined ≈ 10,000 (one pass through, each op examined once)
138
- /// - Bad: entries_examined ≈ 50,000,000 (each advance scans remaining operations)
139
- fn benchmark_release_pathological_repeated(c: &mut Criterion) {
140
- let mut group = c.benchmark_group("gate13_release_pathological_repeated");
141
- group.sample_size(5); // Fewer samples for large workload
142
- group.measurement_time(std::time::Duration::from_secs(30));
143
-
144
- // Note: Using 1000 instead of 10000 to keep benchmark runtime reasonable
145
- // The scaling pattern will still show if O(m²) is happening
146
- let pending_size = 1000;
147
-
148
- group.throughput(Throughput::Elements(pending_size as u64));
149
- group.bench_function(
150
- format!("release_pathological_{}ops_one_at_a_time", pending_size),
151
- |b| {
152
- b.iter_batched(
153
- || {
154
- let mut barrier = CausalDependencyBarrier::new();
155
-
156
- // Create pending operations requiring A:1, A:2, A:3, ..., A:pending_size
157
- for i in 0..pending_size {
158
- let mut required = VectorClock::new();
159
- // Each requires A:(i+1)
160
- required.clocks.insert("node_a".to_string(), (i + 1) as u64);
161
- let _ = barrier.receive_operation(format!("seq_{}", i), required);
162
- }
163
- barrier
164
- },
165
- |mut barrier| {
166
- // Now advance frontier one step at a time
167
- // This is the pathological scenario
168
- // Simulate advancing frontier one operation at a time
169
- for step in 1..=pending_size {
170
- let mut frontier = VectorClock::new();
171
- // Advance to A:step
172
- frontier.clocks.insert("node_a".to_string(), step as u64);
173
- barrier.advance_frontier(&frontier);
174
- }
175
- black_box(barrier)
176
- },
177
- criterion::BatchSize::SmallInput,
178
- );
179
- },
180
- );
181
-
182
- group.finish();
183
- }
184
-
185
- /// Benchmark 4: Mixed Frontier Advances
186
- ///
187
- /// Measure: Realistic scenario with varying frontier advances
188
- /// Setup: Operations with different dependency timestamps
189
- /// Scenario: Advance frontier gradually, each step releases some operations
190
- ///
191
- /// This tests whether the implementation efficiently handles the common case
192
- /// of incremental frontier progress.
193
- fn benchmark_release_mixed_advances(c: &mut Criterion) {
194
- let mut group = c.benchmark_group("gate13_release_mixed_advances");
195
- group.sample_size(10);
196
-
197
- for pending_size in [100, 1000].iter() {
198
- group.throughput(Throughput::Elements(*pending_size as u64));
199
- group.bench_function(
200
- format!("release_mixed_advances_pending{}", pending_size),
201
- |b| {
202
- b.iter_batched(
203
- || {
204
- let mut barrier = CausalDependencyBarrier::new();
205
-
206
- // Create pending operations with mixed dependencies
207
- // Some require A:100, some A:500, some A:1000, etc.
208
- for i in 0..*pending_size {
209
- let mut required = VectorClock::new();
210
-
211
- // Distribute dependencies: some low, some high
212
- let dependency_level = ((i * 997) % 1000) as u64 + 1;
213
- required
214
- .clocks
215
- .insert("node_a".to_string(), dependency_level);
216
-
217
- let _ = barrier.receive_operation(format!("mixed_{}", i), required);
218
- }
219
- barrier
220
- },
221
- |mut barrier| {
222
- // Measure: Series of frontier advances
223
- // Simulate gradual frontier advancement
224
- for level in (100..=1000).step_by(100) {
225
- let mut frontier = VectorClock::new();
226
- frontier.clocks.insert("node_a".to_string(), level as u64);
227
- barrier.advance_frontier(&frontier);
228
- }
229
- black_box(barrier)
230
- },
231
- criterion::BatchSize::SmallInput,
232
- );
233
- },
234
- );
235
- }
236
-
237
- group.finish();
238
- }
239
-
240
- criterion_group!(
241
- benches,
242
- benchmark_release_single_scan,
243
- benchmark_release_selectivity,
244
- benchmark_release_pathological_repeated,
245
- benchmark_release_mixed_advances,
246
- );
247
- criterion_main!(benches);
@@ -1,440 +0,0 @@
1
- /// Gate 13 Redux: Production-Readiness Frozen Baseline
2
- ///
3
- /// Establishes authoritative metrics across 16 dimensions for FeltDB with Phase 7.1 optimizations.
4
- /// This benchmark captures variance through multiple repetitions and serves as the reference
5
- /// for regression gate thresholds. Production uses indexed release path.
6
- ///
7
- /// Metrics captured:
8
- /// 1. transactions/sec
9
- /// 2. operations/sec
10
- /// 3. replication ops/sec
11
- /// 4. p50 / p95 / p99 latency
12
- /// 5. causal readiness latency
13
- /// 6. causal release latency
14
- /// 7. CPU utilization
15
- /// 8. memory (RSS)
16
- /// 9. disk I/O
17
- /// 10. dependency-index memory
18
- /// 11. index maintenance cost
19
- /// 12. vector clock cost
20
- /// 13. deduplication cost
21
- /// 14. state hashing cost
22
- /// 15. snapshot cost
23
- /// 16. recovery cost
24
- ///
25
- /// This is a FROZEN baseline. No further causal barrier optimization until Gate 14
26
- /// demonstrates that the causal release path has become a system bottleneck.
27
- use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
28
- use feltdb::{CausalDependencyBarrier, VectorClock};
29
- use std::time::Instant;
30
-
31
- // ============================================================================
32
- // BASELINE FIXTURE: Helper functions for consistent workload generation
33
- // ============================================================================
34
-
35
- /// Create a vector clock with N nodes at sequential timestamps
36
- fn create_vector_clock_with_nodes(node_count: usize) -> VectorClock {
37
- let mut clock = VectorClock::new();
38
- for i in 0..node_count {
39
- clock.clocks.insert(format!("node_{}", i), (i + 1) as u64);
40
- }
41
- clock
42
- }
43
-
44
- /// Create N pending operations in the barrier
45
- fn populate_pending_operations(
46
- barrier: &mut CausalDependencyBarrier,
47
- count: usize,
48
- node_count: usize,
49
- ) {
50
- for i in 0..count {
51
- let mut required = create_vector_clock_with_nodes(node_count);
52
- // Make each operation depend on a node that hasn't been reached yet
53
- required
54
- .clocks
55
- .insert(format!("node_{}", node_count % 2), (node_count * 10) as u64);
56
- let _ = barrier.receive_operation(format!("op_{}", i), required);
57
- }
58
- }
59
-
60
- // ============================================================================
61
- // DIMENSION 1-3: Throughput Metrics (transactions/sec, operations/sec, replication ops/sec)
62
- // ============================================================================
63
-
64
- /// Measure transaction throughput: operations through the causal barrier
65
- fn benchmark_transaction_throughput(c: &mut Criterion) {
66
- let mut group = c.benchmark_group("gate13_redux_transaction_throughput");
67
- group.sample_size(50); // Multiple samples to establish variance
68
-
69
- for pending_count in [100, 1000, 10000].iter() {
70
- group.throughput(Throughput::Elements(*pending_count as u64));
71
- group.bench_with_input(
72
- BenchmarkId::new("pending_ops_released", pending_count),
73
- pending_count,
74
- |b, &pending| {
75
- b.iter_batched(
76
- || {
77
- let mut barrier = CausalDependencyBarrier::new();
78
- populate_pending_operations(&mut barrier, pending, 4);
79
-
80
- // Advance frontier to release all operations
81
- let mut frontier = create_vector_clock_with_nodes(4);
82
- frontier.clocks.insert("node_0".to_string(), 100);
83
- barrier.get_frontier_mut().merge(&frontier);
84
-
85
- barrier
86
- },
87
- |mut barrier| {
88
- let released = barrier.check_unblocked_operations();
89
- black_box(released.len())
90
- },
91
- criterion::BatchSize::LargeInput,
92
- );
93
- },
94
- );
95
- }
96
-
97
- group.finish();
98
- }
99
-
100
- // ============================================================================
101
- // DIMENSION 4-6: Latency Percentiles (p50, p95, p99)
102
- // ============================================================================
103
-
104
- /// Measure causal readiness latency across percentiles
105
- fn benchmark_causal_readiness_latency(c: &mut Criterion) {
106
- let mut group = c.benchmark_group("gate13_redux_causal_readiness");
107
- group.sample_size(100); // High sample count for percentile stability
108
-
109
- for node_count in [4, 8, 16].iter() {
110
- group.bench_with_input(
111
- BenchmarkId::new("readiness_check_nodes", node_count),
112
- node_count,
113
- |b, &nodes| {
114
- let required = create_vector_clock_with_nodes(nodes);
115
- b.iter(|| {
116
- let mut barrier = CausalDependencyBarrier::new();
117
- barrier.advance_frontier(&required);
118
- let result = barrier.is_ready_frontier(black_box(&required));
119
- black_box(result)
120
- });
121
- },
122
- );
123
- }
124
-
125
- group.finish();
126
- }
127
-
128
- // ============================================================================
129
- // DIMENSION 7-8: Release-Path Latency (causal readiness + release)
130
- // ============================================================================
131
-
132
- /// Measure causal release latency: full path from receive to check
133
- fn benchmark_causal_release_latency(c: &mut Criterion) {
134
- let mut group = c.benchmark_group("gate13_redux_causal_release");
135
- group.sample_size(50); // Lower sample count; this test is expensive
136
-
137
- for buffer_size in [100, 1000].iter() {
138
- group.bench_with_input(
139
- BenchmarkId::new("release_latency_buffer", buffer_size),
140
- buffer_size,
141
- |b, &size| {
142
- b.iter_batched(
143
- || {
144
- let mut barrier = CausalDependencyBarrier::new();
145
- populate_pending_operations(&mut barrier, size, 4);
146
- barrier
147
- },
148
- |mut barrier| {
149
- // Measure end-to-end: frontier advance + release check
150
- let mut frontier = create_vector_clock_with_nodes(4);
151
- frontier.clocks.insert("node_0".to_string(), 100);
152
- barrier.get_frontier_mut().merge(&frontier);
153
-
154
- let released = barrier.check_unblocked_operations_indexed();
155
- black_box(released.len())
156
- },
157
- criterion::BatchSize::LargeInput,
158
- );
159
- },
160
- );
161
- }
162
-
163
- group.finish();
164
- }
165
-
166
- // ============================================================================
167
- // DIMENSION 9: CPU Utilization (via operation count)
168
- // ============================================================================
169
-
170
- /// Measure CPU cost per operation through the indexed release path
171
- fn benchmark_cpu_per_operation(c: &mut Criterion) {
172
- let mut group = c.benchmark_group("gate13_redux_cpu_cost");
173
- group.sample_size(100);
174
-
175
- for op_count in [10, 100, 1000].iter() {
176
- group.throughput(Throughput::Elements(*op_count as u64));
177
- group.bench_with_input(
178
- BenchmarkId::new("cpu_per_indexed_release", op_count),
179
- op_count,
180
- |b, &count| {
181
- b.iter(|| {
182
- let mut barrier = CausalDependencyBarrier::new();
183
- for i in 0..count {
184
- let mut required = VectorClock::new();
185
- required.increment("node_0");
186
- let _ = barrier.receive_operation(format!("op_{}", i), required);
187
- }
188
- let mut frontier = VectorClock::new();
189
- frontier.increment("node_0");
190
- barrier.get_frontier_mut().merge(&frontier);
191
-
192
- black_box(barrier.check_unblocked_operations_indexed())
193
- });
194
- },
195
- );
196
- }
197
-
198
- group.finish();
199
- }
200
-
201
- // ============================================================================
202
- // DIMENSION 10: Dependency-Index Memory Overhead
203
- // ============================================================================
204
-
205
- /// Measure dependency index size as a function of pending operations
206
- fn benchmark_index_memory_overhead(c: &mut Criterion) {
207
- let mut group = c.benchmark_group("gate13_redux_index_memory");
208
- group.sample_size(10); // Low sample; this measures steady-state
209
-
210
- for pending_count in [100, 1000, 10000].iter() {
211
- group.bench_with_input(
212
- BenchmarkId::new("index_entries", pending_count),
213
- pending_count,
214
- |b, &count| {
215
- b.iter(|| {
216
- let mut barrier = CausalDependencyBarrier::new();
217
- populate_pending_operations(&mut barrier, count, 4);
218
-
219
- let index_entries = barrier.get_dependency_index().entry_count();
220
- black_box(index_entries)
221
- });
222
- },
223
- );
224
- }
225
-
226
- group.finish();
227
- }
228
-
229
- // ============================================================================
230
- // DIMENSION 11: Index Maintenance Cost
231
- // ============================================================================
232
-
233
- /// Measure cost of maintaining the dependency index during operations
234
- fn benchmark_index_maintenance_cost(c: &mut Criterion) {
235
- let mut group = c.benchmark_group("gate13_redux_index_maintenance");
236
- group.sample_size(100);
237
-
238
- for node_count in [2, 4, 8].iter() {
239
- group.throughput(Throughput::Elements(1));
240
- group.bench_with_input(
241
- BenchmarkId::new("receive_and_index", node_count),
242
- node_count,
243
- |b, &nodes| {
244
- let required = create_vector_clock_with_nodes(nodes);
245
- b.iter(|| {
246
- let mut barrier = CausalDependencyBarrier::new();
247
- let _ = barrier
248
- .receive_operation("op_test".to_string(), black_box(required.clone()));
249
- black_box(barrier.get_dependency_index().entry_count())
250
- });
251
- },
252
- );
253
- }
254
-
255
- group.finish();
256
- }
257
-
258
- // ============================================================================
259
- // DIMENSION 12: Vector Clock Cost
260
- // ============================================================================
261
-
262
- /// Measure vector clock operations (comparison, increment, merge)
263
- fn benchmark_vector_clock_cost(c: &mut Criterion) {
264
- let mut group = c.benchmark_group("gate13_redux_vector_clock");
265
- group.sample_size(100);
266
-
267
- for node_count in [1, 4, 8, 16].iter() {
268
- // Increment cost
269
- group.throughput(Throughput::Elements(1));
270
- group.bench_with_input(
271
- BenchmarkId::new("increment", node_count),
272
- node_count,
273
- |b, &nodes| {
274
- let mut clock = create_vector_clock_with_nodes(nodes);
275
- b.iter(|| {
276
- clock.increment("node_0");
277
- black_box(clock.get("node_0"))
278
- });
279
- },
280
- );
281
-
282
- // Comparison cost
283
- group.throughput(Throughput::Elements(1));
284
- group.bench_with_input(
285
- BenchmarkId::new("compare", node_count),
286
- node_count,
287
- |b, &nodes| {
288
- let clock1 = create_vector_clock_with_nodes(nodes);
289
- let clock2 = create_vector_clock_with_nodes(nodes);
290
- b.iter(|| black_box(black_box(&clock1).happens_before(black_box(&clock2))));
291
- },
292
- );
293
- }
294
-
295
- group.finish();
296
- }
297
-
298
- // ============================================================================
299
- // DIMENSION 13: Deduplication Cost
300
- // ============================================================================
301
-
302
- /// Measure cost of deduplication via operation ID lookup
303
- fn benchmark_deduplication_cost(c: &mut Criterion) {
304
- let mut group = c.benchmark_group("gate13_redux_deduplication");
305
- group.sample_size(100);
306
-
307
- for dedup_set_size in [10, 100, 1000].iter() {
308
- group.throughput(Throughput::Elements(1));
309
- group.bench_with_input(
310
- BenchmarkId::new("dedup_lookup", dedup_set_size),
311
- dedup_set_size,
312
- |b, &size| {
313
- let mut dedup = std::collections::HashSet::new();
314
- for i in 0..size {
315
- dedup.insert(format!("op_{}", i));
316
- }
317
-
318
- b.iter(|| {
319
- let op_id = format!("op_{}", black_box(size / 2));
320
- black_box(dedup.contains(&op_id))
321
- });
322
- },
323
- );
324
- }
325
-
326
- group.finish();
327
- }
328
-
329
- // ============================================================================
330
- // DIMENSION 14: State Hashing Cost
331
- // ============================================================================
332
-
333
- /// Measure cost of state hashing for convergence validation
334
- fn benchmark_state_hashing_cost(c: &mut Criterion) {
335
- let mut group = c.benchmark_group("gate13_redux_state_hashing");
336
- group.sample_size(50);
337
-
338
- for record_count in [100, 1000, 10000].iter() {
339
- group.throughput(Throughput::Elements(1));
340
- group.bench_with_input(
341
- BenchmarkId::new("hash_records", record_count),
342
- record_count,
343
- |b, &count| {
344
- b.iter(|| {
345
- let mut hasher = std::collections::hash_map::DefaultHasher::new();
346
- use std::hash::{Hash, Hasher};
347
-
348
- for i in 0..count {
349
- format!("record_{}_state", i).hash(&mut hasher);
350
- }
351
- black_box(hasher.finish())
352
- });
353
- },
354
- );
355
- }
356
-
357
- group.finish();
358
- }
359
-
360
- // ============================================================================
361
- // DIMENSION 15: Snapshot Cost (simplified)
362
- // ============================================================================
363
-
364
- /// Measure cost of creating a snapshot via barrier state
365
- fn benchmark_snapshot_cost(c: &mut Criterion) {
366
- let mut group = c.benchmark_group("gate13_redux_snapshots");
367
- group.sample_size(50);
368
-
369
- for pending_count in [100, 1000].iter() {
370
- group.bench_with_input(
371
- BenchmarkId::new("snapshot_pending", pending_count),
372
- pending_count,
373
- |b, &count| {
374
- b.iter(|| {
375
- let mut barrier = CausalDependencyBarrier::new();
376
- populate_pending_operations(&mut barrier, count, 4);
377
-
378
- // Snapshot: collect current pending state
379
- let pending = barrier.get_pending_operations();
380
- black_box(pending.len())
381
- });
382
- },
383
- );
384
- }
385
-
386
- group.finish();
387
- }
388
-
389
- // ============================================================================
390
- // DIMENSION 16: Recovery Cost (simplified)
391
- // ============================================================================
392
-
393
- /// Measure cost of recovering barrier state
394
- fn benchmark_recovery_cost(c: &mut Criterion) {
395
- let mut group = c.benchmark_group("gate13_redux_recovery");
396
- group.sample_size(50);
397
-
398
- for pending_count in [100, 1000].iter() {
399
- group.bench_with_input(
400
- BenchmarkId::new("recovery_reconstruct", pending_count),
401
- pending_count,
402
- |b, &count| {
403
- b.iter(|| {
404
- // Recovery: reconstruct barrier from pending log
405
- let mut barrier = CausalDependencyBarrier::new();
406
- for i in 0..count {
407
- let mut required = create_vector_clock_with_nodes(2);
408
- required.clocks.insert("node_0".to_string(), 100);
409
- let _ = barrier.receive_operation(format!("op_{}", i), required);
410
- }
411
-
412
- black_box(barrier.get_pending_operations().len())
413
- });
414
- },
415
- );
416
- }
417
-
418
- group.finish();
419
- }
420
-
421
- // ============================================================================
422
- // Registry and main
423
- // ============================================================================
424
-
425
- criterion_group!(
426
- benches,
427
- benchmark_transaction_throughput,
428
- benchmark_causal_readiness_latency,
429
- benchmark_causal_release_latency,
430
- benchmark_cpu_per_operation,
431
- benchmark_index_memory_overhead,
432
- benchmark_index_maintenance_cost,
433
- benchmark_vector_clock_cost,
434
- benchmark_deduplication_cost,
435
- benchmark_state_hashing_cost,
436
- benchmark_snapshot_cost,
437
- benchmark_recovery_cost,
438
- );
439
-
440
- criterion_main!(benches);