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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
[]
# `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.15.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.
#
# `fuzz/` (0.13.14, W8.4) is out for the same reason and by the same mechanism,
# and it is not a workspace member either -- its manifest carries an empty
# `[workspace]` table, which is what keeps libFuzzer and a nightly-only
# dependency out of every command run here.
= [
"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
= []
# Doors for `fuzz/` (0.13.14, W8.4, D-187). Off by default and turned on by
# nothing but the fuzz crate, which needs to reach two items a caller has no
# business reaching: the byte-level parser behind `load_snapshot`, and a way to
# build a *valid* container around arbitrary bytes.
#
# The second is the one that matters. A CRC-32 over the header and the payload
# is exactly the shape coverage-guided mutation cannot solve, so a fuzzer
# pointed at the whole container spends its budget bouncing off the checksum and
# never reaches zstd or bincode -- the two components W8.2 bounded, and the two
# where a defect would actually live. W8.2 made this format fuzz-hostile on
# purpose; this feature is what gets a fuzzer past its own defences.
#
# Adds no public API: the module behind it is `#[doc(hidden)]` and is not
# compiled without the flag.
#
# cargo +nightly fuzz run snapshot_payload
= []
[[]]
= "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"]
# The same omission as `analyze_hold`'s above, three examples wide and found the
# same way: `cargo test --no-default-features` is §8 item 6's configuration, the
# README published a test count for it, and nothing ran it between 0.12.26 and
# 0.13.36 (D-209, and D-169 is the first instance). `chunk_matrix` is the fourth
# metrics user and needs no entry -- it gates the function itself, which is the
# other correct answer and the one to prefer when only part of an example needs
# the counters.
[[]]
= "bulk_optimize"
= ["metrics"]
[[]]
= "fairness_probe"
= ["metrics"]
[[]]
= "optimize_hold"
= ["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