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
//! The crate's lock chokepoint (Bootstrap rule 7): the cross-thread
//! shared-mutable-state locks live in this one file, so the whole-crate
//! shared-state inventory is auditable in one place.
//! `rules/locks-outside-state.yml` enforces the confinement; the only carve-outs
//! are test scaffolding and one documented exception,
//! [`git_tree::probe_cache`](crate::git_tree) — the macOS TTL cache's `Mutex` is
//! single-thread interior mutability local to the probe stack, not cross-thread
//! shared state, and a generic decorator folded in here would break llvm-cov's
//! per-line coverage (see that module's doc).
//!
//! **Three residents, and they are the whole inter-thread interface** (§7.2).
//! Since bl-ee0a yog runs three threads — the frame, the derivation worker, and
//! the watch bridge — so this file is the complete inventory of what they share:
//!
//! - [`WatchSetHandle`] — the shared [`WatchSet`](crate::watch::WatchSet): the
//! worker reconciles it, the [`Bridge`](crate::watch::Bridge) drains it.
//! - [`DirtySet`] — **announcements → worker**: a map of root → [`Mark`] (why it
//! is dirty). The bridge fills it from the watchers; the frame fills it when a
//! dispatched verb changed something the watch would only find later. The
//! worker drains it.
//! - [`SnapshotCell`] — **worker → frame**: the latest *completed*
//! [`Snapshot`]. The worker swaps a fresh `Arc` in; the frame clones it out
//! once per frame. The lock is held for exactly one pointer move on either
//! side, so "the frame never blocks on the worker" is true by construction —
//! there is no derivation inside this critical section to wait for.
use BTreeMap;
use PathBuf;
use ;
use crateSnapshot;
use crateFound;
use crate;
/// The shared [`WatchSet`](crate::watch::WatchSet): the §7.2 worker reconciles
/// it, the [`Bridge`](crate::watch::Bridge) drains it. A transparent alias so
/// `.lock()` stays ergonomic at the use sites while the `Mutex` token itself is
/// confined here.
pub type WatchSetHandle = ;
/// Build a fresh, empty [`WatchSet`](crate::watch::WatchSet) behind its shared
/// handle — the one place `Mutex::new` is applied to the watch set.
pub
/// Lock the shared watch set, poison-immune (see [`lock_cell`] for the same
/// one-line recovery discipline).
pub
/// The published derivation (§7.2): the worker writes, the frame reads. A
/// transparent alias so the `Mutex` token itself stays confined here.
pub type SnapshotCell = ;
/// Build the cell around the model's starting (empty) snapshot — the one place
/// `Mutex::new` is applied to it.
pub
/// Lock the cell, poison-immune: a panic while the guard was held leaves the
/// `Arc` intact, so we recover it rather than propagate ([`PoisonError::into_inner`]).
/// Keeping the `.lock()` and the recovery on one line is deliberate — a split
/// isolates the never-taken recovery on its own line, which reads as uncovered
/// under `ignore-panics`.
/// Publish a completed derivation (worker side).
pub
/// The latest completed derivation (frame side) — an `Arc` clone, so the frame
/// renders from a value nothing can mutate under it.
pub
/// The §8.5 search hand-off — **frame ⇄ searcher, one cell**, because a search
/// is one question at a time and two cells could disagree about which question
/// is current. The frame writes the ask and reads the answer; the
/// [`Searcher`](crate::search::Searcher) does the reverse.
///
/// The serial is the whole protocol. Every ask bumps `seq`; a run carries the
/// seq it started on and publishes only if that is still the current one, so a
/// superseded run's work is discarded rather than raced. It is also the
/// **cancellation** signal: the run asks whether `seq` still equals its own
/// between conversations and abandons when it does not. Nothing here is
/// durable — a query's answer lives only as long as the surface that asked
/// (§5.3 #26).
/// The cell's contents: the current ask, and the answer to whichever ask has
/// been answered. `seq == answered` means nothing is outstanding — the starting
/// state, with no bootstrap branch to write.
/// The dirty-root hand-off: root paths, each with the [`Mark`] naming **why**
/// it is dirty (§7.2 instrumentation). Cloning shares the inner map (the frame
/// holds one clone, the worker another).
/// The §7.2 live-tail hand-off — **frame ⇄ follower, one cell**, on the
/// [`SearchCell`] pattern and for the same reason: one subject is followed at a
/// time, and two cells could disagree about which. The frame writes the ask
/// (the focused conversation) and reads the answer; the
/// [`Follower`](crate::app::Follower) does the reverse.
///
/// Nothing here is durable and nothing derives from it: the tail is display
/// state under the in-memory carve-out, and the *only* reader on
/// the frame side is the fold that builds the painted snapshot.
///
/// **Appended whole, below every line that was here before, and spelled as
/// [`SnapshotCell`] is** — a transparent alias plus free functions rather than
/// a struct with an `impl`. That is not style. This file carries the hazard
/// `rules/locks-outside-state.yml` records as the reason for both its
/// carve-outs: llvm-cov mis-attributes phantom *uncovered* regions onto its
/// `impl` headers when anything above them moves, and an added `impl` block
/// draws one onto itself besides — measured here at three lines, then one, on a
/// file otherwise at 100 %. Adding **only at the end**, with no `impl`, leaves
/// every existing region where it was. It is why the module doc above still
/// says "three residents" and does not list this one or [`SearchCell`]: editing
/// those lines shifts everything below them and costs the chokepoint its floor.
/// The alternative was a third rule carve-out, and this is genuine cross-thread
/// hand-off state — exactly what the chokepoint exists to inventory — so it
/// belongs here and the spelling gives way instead.
pub type TailCell = ;
/// The cell's contents: which conversation the frame is looking at, and the
/// follower's newest fold of it. Both `None` is the resting state — no
/// conversation focused, nothing being followed.
pub
/// The poison-immune guard (see [`lock_cell`] for the discipline).
/// Ask (frame side): follow this conversation, or none. Called every frame, so
/// it is one lock and one compare — a re-ask of the standing subject stores
/// nothing and the follower keeps its offset.
pub
/// The conversation to follow (follower side).
pub
/// Publish a fold (follower side). Returns whether this changed what the frame
/// would paint — the follower's "wake the face" predicate, so an idle stream
/// costs zero repaints.
pub
/// The published fold (frame side) — an `Arc` clone, so the frame folds a value
/// nothing can mutate under it.
pub