1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
[]
# `macrame` is taken on crates.io — an unrelated wasm-bindgen macro crate at
# 0.0.1 — so the *package* is published as `macrame-db`. The `[lib]` name below
# keeps the import path `use macrame::…` unchanged, so this is a registry name
# and not a rename of the crate anyone writes against.
= "macrame-db"
= "0.13.0"
= "2021"
# Measured, not declared: `cargo +1.88.0 check --all-features --all-targets`
# passes and 1.85 does not.
#
# **This floor is not ours.** Macrame's own code needs 1.73 (`div_ceil`; 1.70
# for `Option::is_some_and`). The binding constraint is `home@0.5.12` at 1.88,
# reached through `libsql-ffi`'s *build*-dependency on bindgen -> which -> home
# — and a build-dependency binds consumers too, because libsql-ffi compiles the
# amalgamation on every downstream build. Lowering it means pinning that chain
# (`cargo update home --precise …`), not changing anything here.
= "1.88"
= ["opticsWolf"]
= "A Bitemporal Graph Ledger on libSQL · Embedded knowledge database"
# crates.io only *warns* locally when these are missing — `cargo publish
# --dry-run` passes without them — but the registry API rejects an upload with
# no license, so the first real publish would fail after a full verify build.
= "MIT OR Apache-2.0"
= "https://github.com/opticsWolf/Macrame"
= "README.md"
= ["bitemporal", "graph", "libsql", "ledger", "database"]
= ["database", "database-implementations", "data-structures"]
# The Python binding's tree, kept out of the `.crate` tarball (P0, D-098).
#
# The package root is the repo root — deliberately, because `tests/` reaches
# `docs/` and `src/` through `include_str!` and moving the crate down a level
# would put those outside the published tarball. The cost of that choice is
# this list: everything at the root is packaged unless named here.
#
# `bindings/` is **not** listed and does not need to be. Cargo already skips a
# subdirectory that carries its own `Cargo.toml`, since that is another
# package; `cargo package --list` is the check, and it is asserted by
# `tests/packaging_tests.rs` rather than left to memory.
= [
"pyproject.toml",
"python/",
"tests_py/",
"/.venv/",
"*.whl",
]
# The Python bindings (P0, D-098). Additive on purpose: the root stays a
# *package*, and Cargo's default for a workspace root that is itself a package
# is that package alone — so `default-members` is deliberately absent and
# `cargo test`, `cargo clippy --all-targets`, `cargo check --all-features` and
# `cargo publish` here are the same commands they were before, scoped to
# `macrame-db`. pyo3 is compiled only when something names it (`-p macrame-py`,
# or maturin).
#
# That is a claim about Cargo's behaviour, so it is checked rather than
# believed: `tests/packaging_tests.rs` asserts `cargo metadata`'s
# `workspace_default_members` is this package alone.
#
# `bindings/python` is `publish = false`, so `cargo publish` still uploads
# exactly one package.
[]
= ["bindings/python"]
# The import path stays `macrame`, independent of the registry name above.
# Without this a dependent would have to write `use macrame_db::…`, and every
# rustdoc link, doc-test and example in the crate says `macrame`.
[]
= "macrame"
= "src/lib.rs"
[]
= "0.9.30"
= { = "1", = ["full"] }
= { = "1.0", = ["derive"] }
= "1.0"
= "1.3"
= "0.13"
= "1.0"
= "0.1"
= "1.1"
[]
= "3.8"
= "0.4"
= "1"
# §9's harness (D-055). `default-features = false` drops the plotting and HTML
# report stack, which is most of criterion's dependency tree and none of the
# measurement — the numbers come out on stdout and into `target/criterion` either
# way.
= { = "0.5", = false, = [
"async_tokio",
"cargo_bench_support",
] }
[]
# `metrics` is on by default since 0.12.11 (W4.5, D-154). See its own paragraph
# below for the cost and for the argument, which is not that the cost is small.
= ["metrics"]
# The generated-history test binaries. Off by default, as the second half of
# the R15 mitigation — the first half is `RUST_TEST_THREADS = "1"` in
# .cargo/config.toml. These do not follow it there: a property case needs its
# own database, and `doctrine_property_tests` still faults often enough
# serialised to be unusable as a gate on Windows. The rate is recorded in one
# place only, .cargo/config.toml — this comment carried a stale `~3/25` from
# 0.5.4 long after that file had moved on, and in 0.8.0 the gap between the two
# was briefly misread as a regression, so no figure is restated here. A suite
# that fails for reasons unrelated to the code under test trains people to
# ignore red, so the residue is quarantined rather than tolerated.
#
# D-148 sharpened *why* this set is the residue rather than bad luck: R15 counts
# cumulative `connect()`, and a database per generated case is the highest-volume
# shape in the repo. Serialising cannot help it, because serialising does not
# lower the total.
#
# Quarantined, not silenced. These are the tests that found D-035, they run as
# their own step, and `.proptest-regressions` replays every failure ever found
# before a single new case is generated.
#
# cargo test --features property-tests
= []
# Write-actor latency counters (T1.4, D-079). **On by default since 0.12.11**
# (W4.5, D-154), having been off from 0.6.0 to 0.12.10.
#
# The argument is not that the cost is small. It is that a crate organised
# entirely around a latency bound must not ship a default build that cannot
# report whether the bound is met. `violations()` is the answer to the only
# question this design asks about itself, and through 0.12.10 the default build
# could not answer it. D-093 made exactly this argument for the Python wheel --
# where a caller cannot rebuild the extension -- and won it; the Rust default
# was left on the other side of the same reasoning for six releases.
#
# Turn it off with `--no-default-features` if the counters are genuinely not
# wanted. That path is still built and tested.
#
# CORRECTED 0.12.8 (W4.1, review §6.2). This paragraph used to read:
#
# > with the feature off `HoldTimer` reads no clock and `ActorMetrics` is a
# > ZST whose methods are empty, so the actor loop compiles to what it
# > compiled to before
#
# The first half has been false since 0.12.0. W1 made the clock UNCONDITIONAL —
# `src/metrics.rs` says so at length — because `next_chunk_size` sizes each
# chunk from the previous chunk's measured hold, so the reading is a control
# input in every build rather than an observation in some of them. Left gated,
# a default build would have sized its chunks off `Duration::ZERO`, which reads
# as "comfortably under budget", and grown every chunk to the ceiling in
# exactly the builds nobody was measuring.
#
# What is actually gated, and what it actually costs:
#
# always, feature or not one `Instant::now()` pair per actor turn
# gated behind `metrics` the histogram — `record_hold` and the counters
# around it are no-ops without the feature
#
# So the honest statement of the default is: the *clock* is paid unconditionally
# and the *counters* are what the feature buys. `ActorMetrics` is still a ZST
# with empty methods when off, and `src/metrics.rs` explains why that is two
# impls of one type rather than `#[cfg]` inside the loop.
#
# This correction is deliberately kept rather than quietly rewritten, because
# the false half was the stated justification for the off-by-default decision
# and W4.5 revisits that decision. A justification that was wrong for six
# releases should be visible to whoever re-examines it.
#
# cargo test --features metrics
= []
[[]]
= "actor_metrics_tests"
= ["metrics"]
# §8 item 2's evidence (D-166). Needs `metrics` for the same reason as the
# `*_diag` examples below: the question is what the *actor* held the write lock
# for, and the caller's wall time includes queueing. It also reads the turn
# count, to prove the hold it reports belongs to the call it made rather than to
# an `optimize()` some other path ran.
#
# This entry was missing when the example landed in 0.12.23, which broke
# `cargo test --no-default-features` — §8 item 6's configuration, already
# checked one release earlier and so not re-checked (D-169).
[[]]
= "analyze_hold"
= ["metrics"]
# T1.1's evidence. Needs `metrics` because the question is what the *actor* held
# for, and wall time on the caller's side includes queueing.
[[]]
= "archive_window_diag"
= ["metrics"]
# T1.3's evidence, for the same reason.
[[]]
= "bulk_atomic_diag"
= ["metrics"]
# T3.4's evidence: the hold must not move while the total does.
[[]]
= "pipeline_diag"
= ["metrics"]
# T1.2's evidence. The question is the longest single *turn*, which only the
# actor's own counters can answer.
[[]]
= "shadow_rebuild_diag"
= ["metrics"]
[[]]
= "integrity_property_tests"
= ["property-tests"]
[[]]
= "doctrine_property_tests"
= ["property-tests"]
[[]]
= "graph_property_tests"
= ["property-tests"]
# §9's budgets, measured (D-055). Not a CI gate — see the note at the top of the
# file for why absolute durations on arbitrary hardware are the wrong shape, and
# what criterion baselines do instead.
[[]]
= "budgets"
= false