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
[]
= "ffai-cli"
= "The ffai binary — a thin shell over the FFai library crates"
# follows its dependencies.
= "0.6.6"
= true
= true
= true
= true
= true
= "README.md"
= ["cli", "speech-to-text", "tts", "ocr", "ai"]
= ["command-line-utilities", "multimedia", "science"]
[[]]
= "ffai"
= "src/main.rs"
[]
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
= { = true }
# The allocator is a MEASURED component of this binary, not a preference.
#
# The system allocator re-faults nearly every byte it hands back: 58,634 page
# faults per image, ~234 MiB of freshly-faulted pages against 293.7 MiB/image
# of allocation. Swapping to an allocator that keeps pages mapped measured
# 74.6 -> 45.5 ms per image, 6/6 with non-overlapping ranges.
#
# A library cannot set a global allocator, so it is set here in the binary.
# Downstream users of `ffai-diana` as a crate do NOT inherit it and should
# make the same choice for themselves; the README says so.
#
# SUPERSEDED as the default by `rusty_alloc`, the pure-Rust remake of the same
# design — measured at parity-or-better (z = +2.43 over 49 paired rounds) with
# a better memory profile above the n tier. See the `#[global_allocator]` doc
# comment in `src/main.rs` for the table.
#
# Kept, optional, as the oracle: `--features mimalloc` switches back, which is
# what makes "our pure-Rust allocator matches the C one" a claim anyone can
# re-measure rather than one they have to take on trust.
= { = "0.1", = false, = true }
# PINNED EXACTLY, and the `=` is load-bearing. 0.3.1 introduces a
# PROBABILISTIC SEGFAULT: 6 of 8 runs of `detect --track` over 50 frames die,
# where 0.3.0, 0.1.0-alpha.1 and 0.1.0-alpha.2 are 0 of 8. A caret requirement
# ("0.3.0") silently resolved to 0.3.1 mid-session and shipped a crashing
# binary, which is exactly the failure an exact pin exists to prevent.
#
# MOVED 0.3.2 -> 1.1.4 (2026-08-26). **0.3.2 has a segfault of its own**, on a
# different workload than the one that condemned 0.3.1 — which is why pinning
# away from 0.3.1 did not escape the class. Argus's vision tower runs six tile
# workers each churning a 50 MB score tensor, 12 layers x 17 tiles; under
# 0.3.2 a caption segfaults 3/3, and under 1.1.4 it is 0/3 with the allocator
# as the only variable.
#
# This is also the root cause of `ffai bench vlm` dying on its second
# `describe_image` — the crash that blocked re-running the four-gate verdict.
# It reproduced in the CLI (which declares this allocator) and never in an
# example (which declared none and got the system one), and that difference is
# what finally identified it.
= "=1.1.4"
# The core, for `alloc::collect` — see `spawn_page_trimmer` in main.rs.
# Without it rusty_alloc's RSS does not bound on a rayon pool.
= "=1.1.4"
= { = true }
[]
# Swap the pure-Rust allocator back out for the C library it replaced.
# Enabling this is a measurement tool, not a supported configuration.
= ["dep:mimalloc"]
[]
# Mirrors [workspace.lints.rust]; restated because this crate needs its own
# [lints.clippy] table, and `[lints] workspace = true` is all-or-nothing.
= "warn"
# Gate H-15: pedantic + nursery, enforced.
#
# The allows below are documentation and style. The numeric-cast lints that
# matter - truncation, sign loss, wrap - are NOT allowed here: this crate does
# not do the arithmetic, it calls the crates that do, and those carry the
# policy that found this audit's defects.
[]
= { = "warn", = -1 }
= { = "warn", = -1 }
# Documentation debt: revisit 2026-11-15.
= "allow"
= "allow"
= "allow"
# Counts and indices converted for display or reporting; rounding only.
= "allow"
# The depth-map writer scales a normalised value into u16 range. Guarded twice
# at the site: `is_finite()` rejects NaN and infinities, and `.clamp(0.0, 1.0)`
# bounds the value before scaling. `main` is a single long function, so the
# allow lives here rather than on a 500-line item.
= "allow"
= "allow"
# Style preferences that do not change behaviour.
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"
= "allow"