A useful local alpha.
Its limits are now measurable.
All executed correctness checks passed; capacity refusals below remain findings.
At 4,096 base records, RURAL point-read p95 was 1.198 ms and filtered/sorted-page p95 was 28.632 ms. The corresponding SurrealDB observations were 2.387 ms and 2.114 ms. These are specific local API paths on this machine, not a universal database ranking.
What looks promising
Local typed point operations, explicit replay receipts, isolated nested branches and compact evidence can form a useful project/workspace database. The branch tests mutate descendants, remove ancestors and verify that the main branch stays unchanged.
What needs work
General scans and sorting matter as much as point reads. The current sorted path retains matching candidates before applying its result limit; its memory behavior differs from the bounded unsorted selection path. A small requested page can still exceed the callback budget.
- unfiltered_sort20_postload, 5,628 base records: Rejected: request_budget_exhausted
Latency, with the costs visible.
Median of per-trial p95 values. Each workload's bar scale is independent; compare engines within one workload. Smaller is better. HTTP includes serialization, loopback, authentication and response validation; SQLite executes in-process.
On narrow screens, scroll the chart horizontally to see every value. Exact values also appear in the searchable ledger.
HTTP traffic is capped at 200 requests/s to protect temporary TCP ports. Operation latency excludes explicitly recorded pacing sleep; achieved throughput includes it. These rates are not maximum engine capacity. Both active and wall samples are retained in the raw JSON.
Batch charts report latency per transaction, not per document. The ledger reports logical documents/s for batched writes. A/B/C/F mixes are inspired by YCSB, with deterministic uniform keys; these are not certified YCSB or TPC scores.
Writes arrive. Readers keep working.
One writer submits 64-event batches while two readers each target 20 queries/s. Every accepted event is checked by exact analytics and again after restart. The short schedule exposes contention and lateness; it does not establish sustained capacity or global delivery guarantees.
| Offered events/s | Accepted events/s | Read p95 ms | Batch p95 ms | Scheduled p95 ms | Total accepted across trials |
|---|---|---|---|---|---|
| 64 | 64.0 | 2.839 | 17.405 | 17.740 | 768 |
| 256 | 255.6 | 2.470 | 13.677 | 18.700 | 3,072 |
| 512 | 511.3 | 2.888 | 16.442 | 21.481 | 6,144 |
| 2,048 | 2,046.5 | 1.448 | 19.426 | 21.601 | 24,576 |
Entries are medians across trials, except total accepted. Scheduled latency starts at the intended arrival time, so accumulated backlog is visible. A delayed batch remains counted; there are no automatic retries. Limits remain 20,000 raw events and a 64 MiB journal in the current service profile.
Speed only counts when the answer survives.
Checked against explicit expected results
- Every retained document matches its expected JSON after graceful restart.
- Query population, order and projection match an independent fixture model.
- Branches preserve parent isolation and descendants after ancestor deletion.
- Graph traversal, cycles and all 128 paged edges match expected identities.
- Exact request replay returns the original receipt across restart.
- Duplicate event identity adds no event; changed content is rejected.
- Missing-source analytics retains unknown external completeness.
- An oversized response is refused; a bounded projection returns its full requested page.
AI evidence: measure bytes honestly
The same 20 records used 15,269 response bytes in full form and 4,663 with selected fields: 69.5% fewer bytes.
This is projection, not semantic understanding. No LLM was called and no token, quality or inference-cost saving was measured. Embedding inference and vector similarity are not implemented benchmark paths.
| Engine | Trial | Exact records read after restart | Ready after reopen ms | Profile MiB | RURAL events verified |
|---|---|---|---|---|---|
| RURAL HTTP | 1 | 5,628 | 105.07 | 8.96 | 12168 |
| SQLite embedded | 1 | 5,628 | 0.33 | 4.31 | not tested |
| SurrealDB HTTP RocksDB | 1 | 5,628 | 205.02 | 0.93 | not tested |
| SQLite embedded | 2 | 5,628 | 0.42 | 4.31 | not tested |
| SurrealDB HTTP RocksDB | 2 | 5,628 | 244.45 | 0.93 | not tested |
| RURAL HTTP | 2 | 5,628 | 105.04 | 8.96 | 12168 |
| SurrealDB HTTP RocksDB | 3 | 5,628 | 207.66 | 0.93 | not tested |
| RURAL HTTP | 3 | 5,628 | 136.44 | 8.96 | 12168 |
| SQLite embedded | 3 | 5,628 | 0.30 | 4.31 | not tested |
RURAL profiles also contain branch history, graph records, event facts and receipts. Other profiles contain the shared CRUD workload only. Compression, auxiliary data and retained history differ, so profile sizes are not a storage-efficiency ranking. Reopen timings include different lifecycle work for embedded and server engines.
Choose by workload, not by a single winner.
Architectural assessment below; only the explicitly measured adapters have timing results in this report.
| Workflow | RURAL position | Alternative and tradeoff |
|---|---|---|
| Local project state and offline tools | Typed CRUD, graph, branches and receipts share one service. Point paths have measured local latency. | SQLite is a strong embedded option with fewer process/transport costs. An application must add RURAL-like authority, receipt and branch behavior itself. Durability modes. |
| Document, graph and richer query applications | Useful bounded primitives; sorted candidate growth is a concrete limitation. | SurrealDB is the measured HTTP alternative here. Its broader multi-model design may reduce application plumbing; this test uses only schemafull CRUD and no field indexes. Architecture. |
| Relational business data and concurrent readers | Snapshot reads exist, but this run does not establish planner/index maturity or broad SQL coverage. | PostgreSQL already provides MVCC snapshots and concurrent read/write behavior. It was not run in this budget. MVCC. |
| Large distributed document workloads | Local branch identity is not replication. No cluster or WAN results exist. | MongoDB sharding distributes collections across servers with operational complexity and shard-key tradeoffs. It was not benchmarked here. Sharding. |
| Agent balances and settlement | Only synthetic TEST_CREDIT behavior exists; no wallet throughput or real-money safety is measured in this suite. | TigerBeetle focuses on ledger transfers, including pending/post/void lifecycles. It is not a replacement for this document/graph model and was not timed. Transfer semantics. |
| Semantic text and viral analytics | Text payloads, projected evidence and finite event intake are measured. Embedding generation, ANN search, regional admission and disk-scale warehouse scans remain outside the implemented path. | Evaluate a separate embedding engine and analytical storage path with their own correctness, cost and quality tests. No language choice alone establishes an advantage. |
Engineering priorities suggested by these observations
- Bound the sorted-query candidate path, with a regression for the observed callback-budget refusal.
- Add measurable indexing/query-plan visibility before positioning RURAL as a warehouse.
- Run longer intake/reader/analytics schedules with overload, drain, backup and native frame telemetry; keep P26 separate.
- Measure end-to-end Oracle quality and actual model-reported tokens before making AI-cost claims.
- Qualify durable compaction, backups, restores and large histories before raising the service's caps.
The complete measurement ledger.
| Workload | Engine | Base records | Successful samples | Median trial p95 ms | Trial p95 min / max ms | Median logical units/s | Outcome |
|---|---|---|---|---|---|---|---|
| analytics_count_with_missing_source | RURAL HTTP | 5,628 | 60 | 1.990 | 1.838 / 2.107 | 199.879 | measured |
| create_batch128_payload512 | RURAL HTTP | 4,096 | 24 | 10.235 | 9.664 / 11.037 | 14,443.820 | measured |
| create_batch128_payload512 | SQLite embedded | 4,096 | 24 | 5.404 | 4.301 / 5.478 | 29,377.626 | measured |
| create_batch128_payload512 | SurrealDB HTTP RocksDB | 4,096 | 24 | 8.195 | 7.891 / 12.607 | 17,321.534 | measured |
| create_batch1_payload4096 | RURAL HTTP | 4,096 | 24 | 0.651 | 0.650 / 0.937 | 1,096.616 | measured |
| create_batch1_payload4096 | SQLite embedded | 4,096 | 24 | 0.270 | 0.259 / 0.276 | 4,427.330 | measured |
| create_batch1_payload4096 | SurrealDB HTTP RocksDB | 4,096 | 24 | 1.611 | 0.748 / 6.485 | 384.414 | measured |
| create_batch1_payload512 | RURAL HTTP | 4,096 | 24 | 0.973 | 0.799 / 2.386 | 196.173 | measured |
| create_batch1_payload512 | SQLite embedded | 4,096 | 24 | 0.083 | 0.081 / 0.087 | 14,481.840 | measured |
| create_batch1_payload512 | SurrealDB HTTP RocksDB | 4,096 | 24 | 1.261 | 0.680 / 2.366 | 202.213 | measured |
| create_batch32_payload4096 | RURAL HTTP | 4,096 | 24 | 8.495 | 8.233 / 11.124 | 3,882.008 | measured |
| create_batch32_payload4096 | SQLite embedded | 4,096 | 24 | 10.847 | 9.071 / 11.287 | 4,770.142 | measured |
| create_batch32_payload4096 | SurrealDB HTTP RocksDB | 4,096 | 24 | 8.471 | 7.287 / 49.432 | 4,157.914 | measured |
| create_batch32_payload512 | RURAL HTTP | 4,096 | 24 | 4.331 | 3.999 / 5.738 | 6,287.326 | measured |
| create_batch32_payload512 | SQLite embedded | 4,096 | 24 | 1.174 | 1.133 / 1.406 | 29,441.504 | measured |
| create_batch32_payload512 | SurrealDB HTTP RocksDB | 4,096 | 24 | 3.258 | 2.489 / 5.707 | 6,362.159 | measured |
| delete_single | RURAL HTTP | 4,096 | 60 | 0.663 | 0.585 / 2.237 | 268.656 | measured |
| delete_single | SQLite embedded | 4,096 | 60 | 0.054 | 0.051 / 0.056 | 23,751.784 | measured |
| delete_single | SurrealDB HTTP RocksDB | 4,096 | 60 | 1.099 | 0.691 / 1.944 | 256.135 | measured |
| event_batch1 | RURAL HTTP | 5,628 | 24 | 0.543 | 0.530 / 0.592 | 2,214.610 | measured |
| event_batch16 | RURAL HTTP | 5,628 | 24 | 0.692 | 0.628 / 1.397 | 25,272.928 | measured |
| event_batch64 | RURAL HTTP | 5,628 | 24 | 2.168 | 1.878 / 2.318 | 40,641.239 | measured |
| event_exact_request_replay | RURAL HTTP | 5,628 | 60 | 0.723 | 0.670 / 0.898 | 366.110 | measured |
| filter_sort20 | RURAL HTTP | 256 | 60 | 3.563 | 3.053 / 4.410 | 197.108 | measured |
| filter_sort20 | SQLite embedded | 256 | 60 | 0.160 | 0.148 / 0.172 | 6,689.151 | measured |
| filter_sort20 | SurrealDB HTTP RocksDB | 256 | 60 | 1.703 | 1.027 / 2.282 | 200.219 | measured |
| filter_sort20 | RURAL HTTP | 1,024 | 60 | 9.171 | 8.837 / 10.643 | 137.423 | measured |
| filter_sort20 | SQLite embedded | 1,024 | 60 | 0.275 | 0.231 / 0.368 | 4,447.369 | measured |
| filter_sort20 | SurrealDB HTTP RocksDB | 1,024 | 60 | 2.664 | 1.250 / 2.936 | 202.043 | measured |
| filter_sort20 | RURAL HTTP | 4,096 | 60 | 28.632 | 25.725 / 30.108 | 40.553 | measured |
| filter_sort20 | SQLite embedded | 4,096 | 60 | 0.606 | 0.548 / 0.763 | 2,018.410 | measured |
| filter_sort20 | SurrealDB HTTP RocksDB | 4,096 | 60 | 2.114 | 1.906 / 3.709 | 198.625 | measured |
| fork_depth1 | RURAL HTTP | 256 | 3 | 0.472 | 0.362 / 0.603 | 208.144 | measured |
| fork_depth1 | RURAL HTTP | 1,024 | 3 | 0.436 | 0.360 / 0.876 | 214.479 | measured |
| fork_depth1 | RURAL HTTP | 4,096 | 3 | 1.413 | 0.367 / 2.957 | 180.402 | measured |
| fork_depth2 | RURAL HTTP | 256 | 3 | 0.463 | 0.385 / 0.645 | 197.156 | measured |
| fork_depth2 | RURAL HTTP | 1,024 | 3 | 0.650 | 0.382 / 0.725 | 187.786 | measured |
| fork_depth2 | RURAL HTTP | 4,096 | 3 | 0.637 | 0.444 / 1.077 | 196.586 | measured |
| fork_depth3 | RURAL HTTP | 256 | 3 | 0.649 | 0.490 / 1.133 | 196.179 | measured |
| fork_depth3 | RURAL HTTP | 1,024 | 3 | 0.819 | 0.448 / 1.430 | 185.524 | measured |
| fork_depth3 | RURAL HTTP | 4,096 | 3 | 0.616 | 0.445 / 0.617 | 202.058 | measured |
| graph_degree128 | RURAL HTTP | 5,628 | 30 | 39.175 | 35.882 / 40.034 | 29.471 | measured |
| graph_degree16 | RURAL HTTP | 5,628 | 30 | 2.609 | 2.011 / 3.611 | 197.004 | measured |
| graph_degree64 | RURAL HTTP | 5,628 | 30 | 20.578 | 14.168 / 22.881 | 83.592 | measured |
| load_batch32 | RURAL HTTP | 256 | 24 | 1.734 | 1.352 / 2.625 | 22,799.639 | measured |
| load_batch32 | SQLite embedded | 256 | 24 | 0.384 | 0.263 / 0.809 | 122,634.554 | measured |
| load_batch32 | SurrealDB HTTP RocksDB | 256 | 24 | 7.712 | 1.351 / 7.868 | 17,429.491 | measured |
| load_batch32 | RURAL HTTP | 1,024 | 72 | 2.282 | 2.027 / 2.900 | 8,328.818 | measured |
| load_batch32 | SQLite embedded | 1,024 | 72 | 0.274 | 0.253 / 0.338 | 131,601.652 | measured |
| load_batch32 | SurrealDB HTTP RocksDB | 1,024 | 72 | 1.749 | 1.707 / 2.461 | 8,437.671 | measured |
| load_batch32 | RURAL HTTP | 4,096 | 288 | 2.025 | 1.800 / 2.228 | 8,115.211 | measured |
| load_batch32 | SQLite embedded | 4,096 | 288 | 0.296 | 0.256 / 0.647 | 125,269.731 | measured |
| load_batch32 | SurrealDB HTTP RocksDB | 4,096 | 288 | 1.983 | 1.759 / 2.127 | 8,183.674 | measured |
| mix_A_50read_50update | RURAL HTTP | 256 | 360 | 1.190 | 0.643 / 2.026 | 200.533 | measured |
| mix_A_50read_50update | SQLite embedded | 256 | 360 | 0.044 | 0.043 / 0.049 | 53,332.338 | measured |
| mix_A_50read_50update | SurrealDB HTTP RocksDB | 256 | 360 | 1.360 | 1.143 / 2.368 | 199.988 | measured |
| mix_A_50read_50update | RURAL HTTP | 1,024 | 360 | 1.004 | 0.879 / 1.354 | 226.049 | measured |
| mix_A_50read_50update | SQLite embedded | 1,024 | 360 | 0.043 | 0.042 / 0.044 | 56,521.577 | measured |
| mix_A_50read_50update | SurrealDB HTTP RocksDB | 1,024 | 360 | 2.231 | 1.335 / 2.520 | 200.107 | measured |
| mix_A_50read_50update | RURAL HTTP | 4,096 | 360 | 1.096 | 0.901 / 1.155 | 271.928 | measured |
| mix_A_50read_50update | SQLite embedded | 4,096 | 360 | 0.038 | 0.037 / 0.040 | 60,186.820 | measured |
| mix_A_50read_50update | SurrealDB HTTP RocksDB | 4,096 | 360 | 1.882 | 1.174 / 2.343 | 200.248 | measured |
| mix_B_95read_5update | RURAL HTTP | 256 | 360 | 1.247 | 0.777 / 1.528 | 199.960 | measured |
| mix_B_95read_5update | SQLite embedded | 256 | 360 | 0.004 | 0.004 / 0.005 | 245,210.728 | measured |
| mix_B_95read_5update | SurrealDB HTTP RocksDB | 256 | 360 | 2.011 | 1.017 / 2.247 | 200.064 | measured |
| mix_B_95read_5update | RURAL HTTP | 1,024 | 360 | 2.344 | 1.719 / 2.370 | 199.958 | measured |
| mix_B_95read_5update | SQLite embedded | 1,024 | 360 | 0.004 | 0.004 / 0.005 | 242,485.476 | measured |
| mix_B_95read_5update | SurrealDB HTTP RocksDB | 1,024 | 360 | 1.748 | 1.137 / 2.130 | 200.060 | measured |
| mix_B_95read_5update | RURAL HTTP | 4,096 | 360 | 1.388 | 1.341 / 1.913 | 199.991 | measured |
| mix_B_95read_5update | SQLite embedded | 4,096 | 360 | 0.004 | 0.004 / 0.005 | 243,243.408 | measured |
| mix_B_95read_5update | SurrealDB HTTP RocksDB | 4,096 | 360 | 0.956 | 0.891 / 1.918 | 200.038 | measured |
| mix_C_read_only | RURAL HTTP | 256 | 360 | 2.171 | 1.414 / 2.392 | 200.050 | measured |
| mix_C_read_only | SQLite embedded | 256 | 360 | 0.004 | 0.003 / 0.004 | 266,394.944 | measured |
| mix_C_read_only | SurrealDB HTTP RocksDB | 256 | 360 | 2.310 | 0.953 / 4.695 | 199.936 | measured |
| mix_C_read_only | RURAL HTTP | 1,024 | 360 | 1.686 | 1.518 / 2.308 | 200.049 | measured |
| mix_C_read_only | SQLite embedded | 1,024 | 360 | 0.004 | 0.004 / 0.004 | 258,829.873 | measured |
| mix_C_read_only | SurrealDB HTTP RocksDB | 1,024 | 360 | 2.111 | 1.022 / 2.130 | 199.875 | measured |
| mix_C_read_only | RURAL HTTP | 4,096 | 360 | 1.748 | 1.086 / 4.160 | 200.015 | measured |
| mix_C_read_only | SQLite embedded | 4,096 | 360 | 0.004 | 0.004 / 0.006 | 242,383.600 | measured |
| mix_C_read_only | SurrealDB HTTP RocksDB | 4,096 | 360 | 1.127 | 0.963 / 2.264 | 199.969 | measured |
| mix_F_read_modify_write | RURAL HTTP | 256 | 90 | 3.069 | 2.246 / 5.321 | 99.966 | measured |
| mix_F_read_modify_write | SQLite embedded | 256 | 90 | 0.051 | 0.045 / 0.056 | 23,160.050 | measured |
| mix_F_read_modify_write | SurrealDB HTTP RocksDB | 256 | 90 | 4.584 | 2.034 / 5.666 | 100.208 | measured |
| mix_F_read_modify_write | RURAL HTTP | 1,024 | 90 | 3.219 | 2.971 / 3.723 | 99.876 | measured |
| mix_F_read_modify_write | SQLite embedded | 1,024 | 90 | 0.084 | 0.061 / 0.151 | 18,059.147 | measured |
| mix_F_read_modify_write | SurrealDB HTTP RocksDB | 1,024 | 90 | 3.271 | 2.512 / 4.360 | 99.997 | measured |
| mix_F_read_modify_write | RURAL HTTP | 4,096 | 90 | 4.099 | 3.201 / 4.614 | 99.952 | measured |
| mix_F_read_modify_write | SQLite embedded | 4,096 | 90 | 0.042 | 0.040 / 0.049 | 28,465.240 | measured |
| mix_F_read_modify_write | SurrealDB HTTP RocksDB | 4,096 | 90 | 2.241 | 1.724 / 3.785 | 100.071 | measured |
| patch_single | RURAL HTTP | 256 | 120 | 3.444 | 1.171 / 3.646 | 200.053 | measured |
| patch_single | SQLite embedded | 256 | 120 | 0.059 | 0.050 / 0.103 | 19,433.202 | measured |
| patch_single | SurrealDB HTTP RocksDB | 256 | 120 | 1.795 | 1.066 / 2.692 | 200.152 | measured |
| patch_single | RURAL HTTP | 1,024 | 120 | 2.631 | 2.007 / 2.865 | 200.017 | measured |
| patch_single | SQLite embedded | 1,024 | 120 | 0.046 | 0.046 / 0.047 | 25,165.811 | measured |
| patch_single | SurrealDB HTTP RocksDB | 1,024 | 120 | 1.345 | 1.073 / 2.177 | 199.980 | measured |
| patch_single | RURAL HTTP | 4,096 | 120 | 2.398 | 1.625 / 2.597 | 199.641 | measured |
| patch_single | SQLite embedded | 4,096 | 120 | 0.039 | 0.033 / 0.053 | 32,745.524 | measured |
| patch_single | SurrealDB HTTP RocksDB | 4,096 | 120 | 2.407 | 0.834 / 2.559 | 200.153 | measured |
| point_miss | RURAL HTTP | 256 | 60 | 1.072 | 0.622 / 1.279 | 200.288 | measured |
| point_miss | SQLite embedded | 256 | 60 | 0.002 | 0.002 / 0.002 | 450,704.225 | measured |
| point_miss | SurrealDB HTTP RocksDB | 256 | 60 | 1.189 | 0.993 / 2.135 | 199.778 | measured |
| point_miss | RURAL HTTP | 1,024 | 60 | 1.705 | 0.627 / 2.204 | 200.524 | measured |
| point_miss | SQLite embedded | 1,024 | 60 | 0.002 | 0.002 / 0.003 | 481,452.059 | measured |
| point_miss | SurrealDB HTTP RocksDB | 1,024 | 60 | 1.448 | 0.600 / 2.420 | 198.361 | measured |
| point_miss | RURAL HTTP | 4,096 | 60 | 0.978 | 0.885 / 1.094 | 200.087 | measured |
| point_miss | SQLite embedded | 4,096 | 60 | 0.002 | 0.002 / 0.003 | 473,843.821 | measured |
| point_miss | SurrealDB HTTP RocksDB | 4,096 | 60 | 1.150 | 0.602 / 1.535 | 200.031 | measured |
| point_read | RURAL HTTP | 256 | 360 | 1.535 | 0.785 / 1.640 | 226.269 | measured |
| point_read | SQLite embedded | 256 | 360 | 0.004 | 0.004 / 0.004 | 237,310.794 | measured |
| point_read | SurrealDB HTTP RocksDB | 256 | 360 | 0.942 | 0.677 / 2.105 | 234.824 | measured |
| point_read | RURAL HTTP | 1,024 | 360 | 2.249 | 1.076 / 2.604 | 199.881 | measured |
| point_read | SQLite embedded | 1,024 | 360 | 0.005 | 0.005 / 0.005 | 224,666.511 | measured |
| point_read | SurrealDB HTTP RocksDB | 1,024 | 360 | 1.925 | 0.901 / 2.185 | 199.871 | measured |
| point_read | RURAL HTTP | 4,096 | 360 | 1.198 | 1.155 / 2.147 | 199.989 | measured |
| point_read | SQLite embedded | 4,096 | 360 | 0.005 | 0.005 / 0.007 | 209,104.770 | measured |
| point_read | SurrealDB HTTP RocksDB | 4,096 | 360 | 2.387 | 0.969 / 4.241 | 200.087 | measured |
| point_read_4kib | RURAL HTTP | 4,096 | 60 | 0.596 | 0.566 / 0.815 | 202.470 | measured |
| point_read_4kib | SQLite embedded | 4,096 | 60 | 0.011 | 0.009 / 0.013 | 102,607.777 | measured |
| point_read_4kib | SurrealDB HTTP RocksDB | 4,096 | 60 | 1.087 | 0.560 / 1.577 | 204.044 | measured |
| project20 | RURAL HTTP | 256 | 60 | 3.649 | 2.767 / 3.661 | 200.160 | measured |
| project20 | SQLite embedded | 256 | 60 | 0.173 | 0.157 / 0.197 | 6,453.609 | measured |
| project20 | SurrealDB HTTP RocksDB | 256 | 60 | 1.084 | 0.817 / 1.125 | 200.753 | measured |
| project20 | RURAL HTTP | 1,024 | 60 | 6.388 | 5.641 / 7.271 | 171.693 | measured |
| project20 | SQLite embedded | 1,024 | 60 | 0.246 | 0.231 / 0.261 | 4,332.248 | measured |
| project20 | SurrealDB HTTP RocksDB | 1,024 | 60 | 3.240 | 1.201 / 8.414 | 199.798 | measured |
| project20 | RURAL HTTP | 4,096 | 60 | 27.063 | 22.646 / 30.023 | 41.585 | measured |
| project20 | SQLite embedded | 4,096 | 60 | 0.499 | 0.498 / 1.064 | 2,075.721 | measured |
| project20 | SurrealDB HTTP RocksDB | 4,096 | 60 | 2.324 | 1.639 / 2.611 | 199.983 | measured |
| unfiltered_sort20 | RURAL HTTP | 256 | 30 | 3.103 | 2.818 / 3.877 | 199.667 | measured |
| unfiltered_sort20 | RURAL HTTP | 1,024 | 30 | 6.825 | 6.333 / 7.580 | 155.604 | measured |
| unfiltered_sort20 | RURAL HTTP | 4,096 | 30 | 29.771 | 25.738 / 33.626 | 36.568 | measured |
| unfiltered_sort20_postload | RURAL HTTP | 5,628 | 0 | not measured | not measured / not measured | not measured | REJECTED: Rejected: request_budget_exhausted |
Rejected operations are excluded from successful latency/throughput. Single-sample fork cases and eight-transaction batch cases are descriptive observations, not stable tail estimates. Raw p99 values are retained in JSON with an insufficient-sample flag; no stable p99 claim is made here. Base records identify the stage; payload and specialty probes add records afterward.
A bounded, versioned experiment.
Peak aggregate CPU sample: 96.3% (100% is one logical core). Peak scratch files: 43.7 MiB. CPU/RSS/disk ceilings are sampled stop thresholds; they reserve no hardware and can briefly overshoot. Tests run on a shared machine with warm OS caches and lower scheduling priority. They are not clean-lab maximum-throughput or hardware failure tests.
RURAL binary SHA-256: 46cf9b51a60b6ab12eaff7355b4fc4a5aa53d63f6c1cfe1418df7901d0586cf4. SQLite: 3.53.4. SurrealDB: 3.2.4+20260803.93ab219 for macos on aarch64. The source commit is 2b4c49e56ac21c6ca3876d44b992b47c779e0805; the JSON also binds each harness source file.
RURAL and SurrealDB use one fresh HTTP connection per operation and bearer authentication. SQLite uses WAL + synchronous FULL, an 8 MiB cache and no secondary field index. SurrealDB uses RocksDB with explicitly requested synchronous commits, background flush disabled, one storage background thread and two Tokio workers. RURAL writes include domain validation and durable replay receipts. These contracts are not identical; the report compares observed application paths.
Exact workload, resource budget and host
{
"config": {
"suite": "rural-bench/1",
"results": "rural-bench-results/1",
"adapter": "rural-http/1",
"protocol": "rural.prototype/1",
"seed": 2077,
"budget": {
"rss_mib": 768,
"disk_mib": 256,
"wall_seconds": 900,
"process_cpu_seconds": 180,
"sustained_cpu_percent": 200,
"clients": 3
},
"scales": [
256,
1024,
4096
],
"trials": 3,
"samples": 120,
"payload_bytes": 512,
"notes": "Synthetic local service observations; YCSB-inspired A/B/C/F, not a conformant YCSB or TPC result. Version this contract when workload semantics change."
},
"host": {
"system": "macOS-26.6.2-arm64-arm-64bit-Mach-O",
"machine": "arm64",
"cpus": 8,
"python": "3.14.6"
}
}Unmeasured acceptance obligations
Native frame/input latency; P26 long soak, overload/drain and pinned readers; large merges; timed backup/restore; real-money or synthetic-wallet throughput; power loss; adversarial network behavior; embeddings/vector search; WAN replication; decentralized consensus; million-user warehouse capacity. Empty measurements are not zero latency.