Skip to main content

max / makenotwork

sando: fix TUI compile + gate both crates via workspace (ultra-fuzz Run 2 C1) The TUI crate stopped compiling at a0a22c5 (boot_smoke /health probe added PassNote::HealthyProbe and GateFailure::BootHealthProbeFailed to the daemon) because its exhaustive matches were never updated, and nothing built the TUI crate so it went unnoticed. Add the two match arms, then add a root workspace Cargo.toml over daemon+tui so cargo build/test at sando/ covers both crates and a future daemon enum-variant addition is a build error. Self-update/bootstrap build with -p sando-daemon against the relocated workspace target/. Also: distinct mark for an unknown gate status (vs in-flight), and surface a notice when a confirmed action can't be sent (full channel) instead of dropping it silently. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-06-23 00:47 UTC
Commit: 2d2eb4eb984719e9fa72c01f3fdfd7375428a9bd
Parent: 095d05c
7 files changed, +538 insertions, -1012 deletions
@@ -0,0 +1,3433 @@
1 + # This file is automatically @generated by Cargo.
2 + # It is not intended for manual editing.
3 + version = 4
4 +
5 + [[package]]
6 + name = "aho-corasick"
7 + version = "1.1.4"
8 + source = "registry+https://github.com/rust-lang/crates.io-index"
9 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
10 + dependencies = [
11 + "memchr",
12 + ]
13 +
14 + [[package]]
15 + name = "allocator-api2"
16 + version = "0.2.21"
17 + source = "registry+https://github.com/rust-lang/crates.io-index"
18 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
19 +
20 + [[package]]
21 + name = "android_system_properties"
22 + version = "0.1.5"
23 + source = "registry+https://github.com/rust-lang/crates.io-index"
24 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
25 + dependencies = [
26 + "libc",
27 + ]
28 +
29 + [[package]]
30 + name = "anyhow"
31 + version = "1.0.102"
32 + source = "registry+https://github.com/rust-lang/crates.io-index"
33 + checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
34 +
35 + [[package]]
36 + name = "async-trait"
37 + version = "0.1.89"
38 + source = "registry+https://github.com/rust-lang/crates.io-index"
39 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
40 + dependencies = [
41 + "proc-macro2",
42 + "quote",
43 + "syn",
44 + ]
45 +
46 + [[package]]
47 + name = "atoi"
48 + version = "2.0.0"
49 + source = "registry+https://github.com/rust-lang/crates.io-index"
50 + checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
51 + dependencies = [
52 + "num-traits",
53 + ]
54 +
55 + [[package]]
56 + name = "atomic-waker"
57 + version = "1.1.2"
58 + source = "registry+https://github.com/rust-lang/crates.io-index"
59 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
60 +
61 + [[package]]
62 + name = "autocfg"
63 + version = "1.5.1"
64 + source = "registry+https://github.com/rust-lang/crates.io-index"
65 + checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
66 +
67 + [[package]]
68 + name = "axum"
69 + version = "0.8.9"
70 + source = "registry+https://github.com/rust-lang/crates.io-index"
71 + checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
72 + dependencies = [
73 + "axum-core",
74 + "axum-macros",
75 + "base64",
76 + "bytes",
77 + "form_urlencoded",
78 + "futures-util",
79 + "http",
80 + "http-body",
81 + "http-body-util",
82 + "hyper",
83 + "hyper-util",
84 + "itoa",
85 + "matchit",
86 + "memchr",
87 + "mime",
88 + "percent-encoding",
89 + "pin-project-lite",
90 + "serde_core",
91 + "serde_json",
92 + "serde_path_to_error",
93 + "serde_urlencoded",
94 + "sha1",
95 + "sync_wrapper",
96 + "tokio",
97 + "tokio-tungstenite 0.29.0",
98 + "tower",
99 + "tower-layer",
100 + "tower-service",
101 + "tracing",
102 + ]
103 +
104 + [[package]]
105 + name = "axum-core"
106 + version = "0.5.6"
107 + source = "registry+https://github.com/rust-lang/crates.io-index"
108 + checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
109 + dependencies = [
110 + "bytes",
111 + "futures-core",
112 + "http",
113 + "http-body",
114 + "http-body-util",
115 + "mime",
116 + "pin-project-lite",
117 + "sync_wrapper",
118 + "tower-layer",
119 + "tower-service",
120 + "tracing",
121 + ]
122 +
123 + [[package]]
124 + name = "axum-macros"
125 + version = "0.5.1"
126 + source = "registry+https://github.com/rust-lang/crates.io-index"
127 + checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca"
128 + dependencies = [
129 + "proc-macro2",
130 + "quote",
131 + "syn",
132 + ]
133 +
134 + [[package]]
135 + name = "base64"
136 + version = "0.22.1"
137 + source = "registry+https://github.com/rust-lang/crates.io-index"
138 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
139 +
140 + [[package]]
141 + name = "base64ct"
142 + version = "1.8.3"
143 + source = "registry+https://github.com/rust-lang/crates.io-index"
144 + checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
145 +
146 + [[package]]
147 + name = "bitflags"
148 + version = "2.13.0"
149 + source = "registry+https://github.com/rust-lang/crates.io-index"
150 + checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
151 + dependencies = [
152 + "serde_core",
153 + ]
154 +
155 + [[package]]
156 + name = "block-buffer"
157 + version = "0.10.4"
158 + source = "registry+https://github.com/rust-lang/crates.io-index"
159 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
160 + dependencies = [
161 + "generic-array",
162 + ]
163 +
164 + [[package]]
165 + name = "bumpalo"
166 + version = "3.20.3"
167 + source = "registry+https://github.com/rust-lang/crates.io-index"
168 + checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
169 +
170 + [[package]]
171 + name = "byteorder"
172 + version = "1.5.0"
173 + source = "registry+https://github.com/rust-lang/crates.io-index"
174 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
175 +
176 + [[package]]
177 + name = "bytes"
178 + version = "1.12.0"
179 + source = "registry+https://github.com/rust-lang/crates.io-index"
180 + checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
181 +
182 + [[package]]
183 + name = "cassowary"
184 + version = "0.3.0"
185 + source = "registry+https://github.com/rust-lang/crates.io-index"
186 + checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
187 +
188 + [[package]]
189 + name = "castaway"
190 + version = "0.2.4"
191 + source = "registry+https://github.com/rust-lang/crates.io-index"
192 + checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
193 + dependencies = [
194 + "rustversion",
195 + ]
196 +
197 + [[package]]
198 + name = "cc"
199 + version = "1.2.65"
200 + source = "registry+https://github.com/rust-lang/crates.io-index"
201 + checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"
202 + dependencies = [
203 + "find-msvc-tools",
204 + "shlex",
205 + ]
206 +
207 + [[package]]
208 + name = "cfg-if"
209 + version = "1.0.4"
210 + source = "registry+https://github.com/rust-lang/crates.io-index"
211 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
212 +
213 + [[package]]
214 + name = "cfg_aliases"
215 + version = "0.2.1"
216 + source = "registry+https://github.com/rust-lang/crates.io-index"
217 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
218 +
219 + [[package]]
220 + name = "chrono"
221 + version = "0.4.45"
222 + source = "registry+https://github.com/rust-lang/crates.io-index"
223 + checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
224 + dependencies = [
225 + "iana-time-zone",
226 + "js-sys",
227 + "num-traits",
228 + "serde",
229 + "wasm-bindgen",
230 + "windows-link",
231 + ]
232 +
233 + [[package]]
234 + name = "compact_str"
235 + version = "0.8.2"
236 + source = "registry+https://github.com/rust-lang/crates.io-index"
237 + checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e"
238 + dependencies = [
239 + "castaway",
240 + "cfg-if",
241 + "itoa",
242 + "rustversion",
243 + "ryu",
244 + "static_assertions",
245 + ]
246 +
247 + [[package]]
248 + name = "concurrent-queue"
249 + version = "2.5.0"
250 + source = "registry+https://github.com/rust-lang/crates.io-index"
251 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
252 + dependencies = [
253 + "crossbeam-utils",
254 + ]
255 +
256 + [[package]]
257 + name = "const-oid"
258 + version = "0.9.6"
259 + source = "registry+https://github.com/rust-lang/crates.io-index"
260 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
261 +
262 + [[package]]
263 + name = "core-foundation-sys"
264 + version = "0.8.7"
265 + source = "registry+https://github.com/rust-lang/crates.io-index"
266 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
267 +
268 + [[package]]
269 + name = "cpufeatures"
270 + version = "0.2.17"
271 + source = "registry+https://github.com/rust-lang/crates.io-index"
272 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
273 + dependencies = [
274 + "libc",
275 + ]
276 +
277 + [[package]]
278 + name = "crc"
279 + version = "3.4.0"
280 + source = "registry+https://github.com/rust-lang/crates.io-index"
281 + checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
282 + dependencies = [
283 + "crc-catalog",
284 + ]
285 +
286 + [[package]]
287 + name = "crc-catalog"
288 + version = "2.5.0"
289 + source = "registry+https://github.com/rust-lang/crates.io-index"
290 + checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853"
291 +
292 + [[package]]
293 + name = "crossbeam-epoch"
294 + version = "0.9.18"
295 + source = "registry+https://github.com/rust-lang/crates.io-index"
296 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
297 + dependencies = [
298 + "crossbeam-utils",
299 + ]
300 +
301 + [[package]]
302 + name = "crossbeam-queue"
303 + version = "0.3.12"
304 + source = "registry+https://github.com/rust-lang/crates.io-index"
305 + checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
306 + dependencies = [
307 + "crossbeam-utils",
308 + ]
309 +
310 + [[package]]
311 + name = "crossbeam-utils"
312 + version = "0.8.21"
313 + source = "registry+https://github.com/rust-lang/crates.io-index"
314 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
315 +
316 + [[package]]
317 + name = "crossterm"
318 + version = "0.28.1"
319 + source = "registry+https://github.com/rust-lang/crates.io-index"
320 + checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
321 + dependencies = [
322 + "bitflags",
323 + "crossterm_winapi",
324 + "mio",
325 + "parking_lot",
326 + "rustix 0.38.44",
327 + "signal-hook",
328 + "signal-hook-mio",
329 + "winapi",
330 + ]
331 +
332 + [[package]]
333 + name = "crossterm_winapi"
334 + version = "0.9.1"
335 + source = "registry+https://github.com/rust-lang/crates.io-index"
336 + checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
337 + dependencies = [
338 + "winapi",
339 + ]
340 +
341 + [[package]]
342 + name = "crypto-common"
343 + version = "0.1.7"
344 + source = "registry+https://github.com/rust-lang/crates.io-index"
345 + checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
346 + dependencies = [
347 + "generic-array",
348 + "typenum",
349 + ]
350 +
351 + [[package]]
352 + name = "darling"
353 + version = "0.23.0"
354 + source = "registry+https://github.com/rust-lang/crates.io-index"
355 + checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
356 + dependencies = [
357 + "darling_core",
358 + "darling_macro",
359 + ]
360 +
361 + [[package]]
362 + name = "darling_core"
363 + version = "0.23.0"
364 + source = "registry+https://github.com/rust-lang/crates.io-index"
365 + checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
366 + dependencies = [
367 + "ident_case",
368 + "proc-macro2",
369 + "quote",
370 + "strsim",
371 + "syn",
372 + ]
373 +
374 + [[package]]
375 + name = "darling_macro"
376 + version = "0.23.0"
377 + source = "registry+https://github.com/rust-lang/crates.io-index"
378 + checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
379 + dependencies = [
380 + "darling_core",
381 + "quote",
382 + "syn",
383 + ]
384 +
385 + [[package]]
386 + name = "data-encoding"
387 + version = "2.11.0"
388 + source = "registry+https://github.com/rust-lang/crates.io-index"
389 + checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
390 +
391 + [[package]]
392 + name = "der"
393 + version = "0.7.10"
394 + source = "registry+https://github.com/rust-lang/crates.io-index"
395 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
396 + dependencies = [
397 + "const-oid",
398 + "pem-rfc7468",
399 + "zeroize",
400 + ]
401 +
402 + [[package]]
403 + name = "digest"
404 + version = "0.10.7"
405 + source = "registry+https://github.com/rust-lang/crates.io-index"
406 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
407 + dependencies = [
408 + "block-buffer",
409 + "const-oid",
410 + "crypto-common",
411 + "subtle",
412 + ]
413 +
414 + [[package]]
415 + name = "displaydoc"
416 + version = "0.2.6"
417 + source = "registry+https://github.com/rust-lang/crates.io-index"
418 + checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
419 + dependencies = [
420 + "proc-macro2",
421 + "quote",
422 + "syn",
423 + ]
424 +
425 + [[package]]
426 + name = "dotenvy"
427 + version = "0.15.7"
428 + source = "registry+https://github.com/rust-lang/crates.io-index"
429 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
430 +
431 + [[package]]
432 + name = "either"
433 + version = "1.16.0"
434 + source = "registry+https://github.com/rust-lang/crates.io-index"
435 + checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
436 + dependencies = [
437 + "serde",
438 + ]
439 +
440 + [[package]]
441 + name = "equivalent"
442 + version = "1.0.2"
443 + source = "registry+https://github.com/rust-lang/crates.io-index"
444 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
445 +
446 + [[package]]
447 + name = "errno"
448 + version = "0.3.14"
449 + source = "registry+https://github.com/rust-lang/crates.io-index"
450 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
451 + dependencies = [
452 + "libc",
453 + "windows-sys 0.61.2",
454 + ]
455 +
456 + [[package]]
457 + name = "etcetera"
458 + version = "0.8.0"
459 + source = "registry+https://github.com/rust-lang/crates.io-index"
460 + checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
461 + dependencies = [
462 + "cfg-if",
463 + "home",
464 + "windows-sys 0.48.0",
465 + ]
466 +
467 + [[package]]
468 + name = "event-listener"
469 + version = "5.4.1"
470 + source = "registry+https://github.com/rust-lang/crates.io-index"
471 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
472 + dependencies = [
473 + "concurrent-queue",
474 + "parking",
475 + "pin-project-lite",
476 + ]
477 +
478 + [[package]]
479 + name = "evmap"
480 + version = "11.0.0"
481 + source = "registry+https://github.com/rust-lang/crates.io-index"
482 + checksum = "1b8874945f036109c72242964c1174cf99434e30cfa45bf45fedc983f50046f8"
483 + dependencies = [
484 + "hashbag",
485 + "left-right",
486 + "smallvec",
487 + ]
488 +
489 + [[package]]
490 + name = "fastrand"
491 + version = "2.4.1"
492 + source = "registry+https://github.com/rust-lang/crates.io-index"
493 + checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
494 +
495 + [[package]]
496 + name = "find-msvc-tools"
497 + version = "0.1.9"
498 + source = "registry+https://github.com/rust-lang/crates.io-index"
499 + checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
500 +
Lines truncated
@@ -0,0 +1,8 @@
1 + # Workspace root so `cargo build`/`cargo test` at sando/ covers BOTH crates.
2 + # The daemon and TUI share types (tui depends on sando-daemon by path); without
3 + # this gate a daemon enum-variant addition compiles clean while silently breaking
4 + # the TUI's exhaustive matches (ultra-fuzz Run 2, C1). Building both here makes
5 + # that a build error.
6 + [workspace]
7 + resolver = "3"
8 + members = ["daemon", "tui"]
@@ -1,3055 +0,0 @@
1 - # This file is automatically @generated by Cargo.
2 - # It is not intended for manual editing.
3 - version = 4
4 -
5 - [[package]]
6 - name = "aho-corasick"
7 - version = "1.1.4"
8 - source = "registry+https://github.com/rust-lang/crates.io-index"
9 - checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
10 - dependencies = [
11 - "memchr",
12 - ]
13 -
14 - [[package]]
15 - name = "allocator-api2"
16 - version = "0.2.21"
17 - source = "registry+https://github.com/rust-lang/crates.io-index"
18 - checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
19 -
20 - [[package]]
21 - name = "android_system_properties"
22 - version = "0.1.5"
23 - source = "registry+https://github.com/rust-lang/crates.io-index"
24 - checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
25 - dependencies = [
26 - "libc",
27 - ]
28 -
29 - [[package]]
30 - name = "anyhow"
31 - version = "1.0.102"
32 - source = "registry+https://github.com/rust-lang/crates.io-index"
33 - checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
34 -
35 - [[package]]
36 - name = "async-trait"
37 - version = "0.1.89"
38 - source = "registry+https://github.com/rust-lang/crates.io-index"
39 - checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
40 - dependencies = [
41 - "proc-macro2",
42 - "quote",
43 - "syn",
44 - ]
45 -
46 - [[package]]
47 - name = "atoi"
48 - version = "2.0.0"
49 - source = "registry+https://github.com/rust-lang/crates.io-index"
50 - checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
51 - dependencies = [
52 - "num-traits",
53 - ]
54 -
55 - [[package]]
56 - name = "atomic-waker"
57 - version = "1.1.2"
58 - source = "registry+https://github.com/rust-lang/crates.io-index"
59 - checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
60 -
61 - [[package]]
62 - name = "autocfg"
63 - version = "1.5.1"
64 - source = "registry+https://github.com/rust-lang/crates.io-index"
65 - checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
66 -
67 - [[package]]
68 - name = "axum"
69 - version = "0.8.9"
70 - source = "registry+https://github.com/rust-lang/crates.io-index"
71 - checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
72 - dependencies = [
73 - "axum-core",
74 - "axum-macros",
75 - "base64",
76 - "bytes",
77 - "form_urlencoded",
78 - "futures-util",
79 - "http",
80 - "http-body",
81 - "http-body-util",
82 - "hyper",
83 - "hyper-util",
84 - "itoa",
85 - "matchit",
86 - "memchr",
87 - "mime",
88 - "percent-encoding",
89 - "pin-project-lite",
90 - "serde_core",
91 - "serde_json",
92 - "serde_path_to_error",
93 - "serde_urlencoded",
94 - "sha1",
95 - "sync_wrapper",
96 - "tokio",
97 - "tokio-tungstenite",
98 - "tower",
99 - "tower-layer",
100 - "tower-service",
101 - "tracing",
102 - ]
103 -
104 - [[package]]
105 - name = "axum-core"
106 - version = "0.5.6"
107 - source = "registry+https://github.com/rust-lang/crates.io-index"
108 - checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
109 - dependencies = [
110 - "bytes",
111 - "futures-core",
112 - "http",
113 - "http-body",
114 - "http-body-util",
115 - "mime",
116 - "pin-project-lite",
117 - "sync_wrapper",
118 - "tower-layer",
119 - "tower-service",
120 - "tracing",
121 - ]
122 -
123 - [[package]]
124 - name = "axum-macros"
125 - version = "0.5.1"
126 - source = "registry+https://github.com/rust-lang/crates.io-index"
127 - checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca"
128 - dependencies = [
129 - "proc-macro2",
130 - "quote",
131 - "syn",
132 - ]
133 -
134 - [[package]]
135 - name = "base64"
136 - version = "0.22.1"
137 - source = "registry+https://github.com/rust-lang/crates.io-index"
138 - checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
139 -
140 - [[package]]
141 - name = "base64ct"
142 - version = "1.8.3"
143 - source = "registry+https://github.com/rust-lang/crates.io-index"
144 - checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
145 -
146 - [[package]]
147 - name = "bitflags"
148 - version = "2.11.1"
149 - source = "registry+https://github.com/rust-lang/crates.io-index"
150 - checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
151 - dependencies = [
152 - "serde_core",
153 - ]
154 -
155 - [[package]]
156 - name = "block-buffer"
157 - version = "0.10.4"
158 - source = "registry+https://github.com/rust-lang/crates.io-index"
159 - checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
160 - dependencies = [
161 - "generic-array",
162 - ]
163 -
164 - [[package]]
165 - name = "bumpalo"
166 - version = "3.20.3"
167 - source = "registry+https://github.com/rust-lang/crates.io-index"
168 - checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
169 -
170 - [[package]]
171 - name = "byteorder"
172 - version = "1.5.0"
173 - source = "registry+https://github.com/rust-lang/crates.io-index"
174 - checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
175 -
176 - [[package]]
177 - name = "bytes"
178 - version = "1.11.1"
179 - source = "registry+https://github.com/rust-lang/crates.io-index"
180 - checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
181 -
182 - [[package]]
183 - name = "cc"
184 - version = "1.2.62"
185 - source = "registry+https://github.com/rust-lang/crates.io-index"
186 - checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
187 - dependencies = [
188 - "find-msvc-tools",
189 - "shlex",
190 - ]
191 -
192 - [[package]]
193 - name = "cfg-if"
194 - version = "1.0.4"
195 - source = "registry+https://github.com/rust-lang/crates.io-index"
196 - checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
197 -
198 - [[package]]
199 - name = "cfg_aliases"
200 - version = "0.2.1"
201 - source = "registry+https://github.com/rust-lang/crates.io-index"
202 - checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
203 -
204 - [[package]]
205 - name = "chrono"
206 - version = "0.4.44"
207 - source = "registry+https://github.com/rust-lang/crates.io-index"
208 - checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
209 - dependencies = [
210 - "iana-time-zone",
211 - "js-sys",
212 - "num-traits",
213 - "serde",
214 - "wasm-bindgen",
215 - "windows-link",
216 - ]
217 -
218 - [[package]]
219 - name = "concurrent-queue"
220 - version = "2.5.0"
221 - source = "registry+https://github.com/rust-lang/crates.io-index"
222 - checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
223 - dependencies = [
224 - "crossbeam-utils",
225 - ]
226 -
227 - [[package]]
228 - name = "const-oid"
229 - version = "0.9.6"
230 - source = "registry+https://github.com/rust-lang/crates.io-index"
231 - checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
232 -
233 - [[package]]
234 - name = "core-foundation-sys"
235 - version = "0.8.7"
236 - source = "registry+https://github.com/rust-lang/crates.io-index"
237 - checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
238 -
239 - [[package]]
240 - name = "cpufeatures"
241 - version = "0.2.17"
242 - source = "registry+https://github.com/rust-lang/crates.io-index"
243 - checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
244 - dependencies = [
245 - "libc",
246 - ]
247 -
248 - [[package]]
249 - name = "crc"
250 - version = "3.4.0"
251 - source = "registry+https://github.com/rust-lang/crates.io-index"
252 - checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
253 - dependencies = [
254 - "crc-catalog",
255 - ]
256 -
257 - [[package]]
258 - name = "crc-catalog"
259 - version = "2.5.0"
260 - source = "registry+https://github.com/rust-lang/crates.io-index"
261 - checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853"
262 -
263 - [[package]]
264 - name = "crossbeam-epoch"
265 - version = "0.9.18"
266 - source = "registry+https://github.com/rust-lang/crates.io-index"
267 - checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
268 - dependencies = [
269 - "crossbeam-utils",
270 - ]
271 -
272 - [[package]]
273 - name = "crossbeam-queue"
274 - version = "0.3.12"
275 - source = "registry+https://github.com/rust-lang/crates.io-index"
276 - checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
277 - dependencies = [
278 - "crossbeam-utils",
279 - ]
280 -
281 - [[package]]
282 - name = "crossbeam-utils"
283 - version = "0.8.21"
284 - source = "registry+https://github.com/rust-lang/crates.io-index"
285 - checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
286 -
287 - [[package]]
288 - name = "crypto-common"
289 - version = "0.1.7"
290 - source = "registry+https://github.com/rust-lang/crates.io-index"
291 - checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
292 - dependencies = [
293 - "generic-array",
294 - "typenum",
295 - ]
296 -
297 - [[package]]
298 - name = "data-encoding"
299 - version = "2.11.0"
300 - source = "registry+https://github.com/rust-lang/crates.io-index"
301 - checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
302 -
303 - [[package]]
304 - name = "der"
305 - version = "0.7.10"
306 - source = "registry+https://github.com/rust-lang/crates.io-index"
307 - checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
308 - dependencies = [
309 - "const-oid",
310 - "pem-rfc7468",
311 - "zeroize",
312 - ]
313 -
314 - [[package]]
315 - name = "digest"
316 - version = "0.10.7"
317 - source = "registry+https://github.com/rust-lang/crates.io-index"
318 - checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
319 - dependencies = [
320 - "block-buffer",
321 - "const-oid",
322 - "crypto-common",
323 - "subtle",
324 - ]
325 -
326 - [[package]]
327 - name = "displaydoc"
328 - version = "0.2.5"
329 - source = "registry+https://github.com/rust-lang/crates.io-index"
330 - checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
331 - dependencies = [
332 - "proc-macro2",
333 - "quote",
334 - "syn",
335 - ]
336 -
337 - [[package]]
338 - name = "dotenvy"
339 - version = "0.15.7"
340 - source = "registry+https://github.com/rust-lang/crates.io-index"
341 - checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
342 -
343 - [[package]]
344 - name = "either"
345 - version = "1.16.0"
346 - source = "registry+https://github.com/rust-lang/crates.io-index"
347 - checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
348 - dependencies = [
349 - "serde",
350 - ]
351 -
352 - [[package]]
353 - name = "equivalent"
354 - version = "1.0.2"
355 - source = "registry+https://github.com/rust-lang/crates.io-index"
356 - checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
357 -
358 - [[package]]
359 - name = "errno"
360 - version = "0.3.14"
361 - source = "registry+https://github.com/rust-lang/crates.io-index"
362 - checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
363 - dependencies = [
364 - "libc",
365 - "windows-sys 0.61.2",
366 - ]
367 -
368 - [[package]]
369 - name = "etcetera"
370 - version = "0.8.0"
371 - source = "registry+https://github.com/rust-lang/crates.io-index"
372 - checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
373 - dependencies = [
374 - "cfg-if",
375 - "home",
376 - "windows-sys 0.48.0",
377 - ]
378 -
379 - [[package]]
380 - name = "event-listener"
381 - version = "5.4.1"
382 - source = "registry+https://github.com/rust-lang/crates.io-index"
383 - checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
384 - dependencies = [
385 - "concurrent-queue",
386 - "parking",
387 - "pin-project-lite",
388 - ]
389 -
390 - [[package]]
391 - name = "evmap"
392 - version = "11.0.0"
393 - source = "registry+https://github.com/rust-lang/crates.io-index"
394 - checksum = "1b8874945f036109c72242964c1174cf99434e30cfa45bf45fedc983f50046f8"
395 - dependencies = [
396 - "hashbag",
397 - "left-right",
398 - "smallvec",
399 - ]
400 -
401 - [[package]]
402 - name = "fastrand"
403 - version = "2.4.1"
404 - source = "registry+https://github.com/rust-lang/crates.io-index"
405 - checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
406 -
407 - [[package]]
408 - name = "find-msvc-tools"
409 - version = "0.1.9"
410 - source = "registry+https://github.com/rust-lang/crates.io-index"
411 - checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
412 -
413 - [[package]]
414 - name = "flume"
415 - version = "0.11.1"
416 - source = "registry+https://github.com/rust-lang/crates.io-index"
417 - checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
418 - dependencies = [
419 - "futures-core",
420 - "futures-sink",
421 - "spin",
422 - ]
423 -
424 - [[package]]
425 - name = "foldhash"
426 - version = "0.1.5"
427 - source = "registry+https://github.com/rust-lang/crates.io-index"
428 - checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
429 -
430 - [[package]]
431 - name = "foldhash"
432 - version = "0.2.0"
433 - source = "registry+https://github.com/rust-lang/crates.io-index"
434 - checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
435 -
436 - [[package]]
437 - name = "form_urlencoded"
438 - version = "1.2.2"
439 - source = "registry+https://github.com/rust-lang/crates.io-index"
440 - checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
441 - dependencies = [
442 - "percent-encoding",
443 - ]
444 -
445 - [[package]]
446 - name = "futures-channel"
447 - version = "0.3.32"
448 - source = "registry+https://github.com/rust-lang/crates.io-index"
449 - checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
450 - dependencies = [
451 - "futures-core",
452 - "futures-sink",
453 - ]
454 -
455 - [[package]]
456 - name = "futures-core"
457 - version = "0.3.32"
458 - source = "registry+https://github.com/rust-lang/crates.io-index"
459 - checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
460 -
461 - [[package]]
462 - name = "futures-executor"
463 - version = "0.3.32"
464 - source = "registry+https://github.com/rust-lang/crates.io-index"
465 - checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d"
466 - dependencies = [
467 - "futures-core",
468 - "futures-task",
469 - "futures-util",
470 - ]
471 -
472 - [[package]]
473 - name = "futures-intrusive"
474 - version = "0.5.0"
475 - source = "registry+https://github.com/rust-lang/crates.io-index"
476 - checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
477 - dependencies = [
478 - "futures-core",
479 - "lock_api",
480 - "parking_lot",
481 - ]
482 -
483 - [[package]]
484 - name = "futures-io"
485 - version = "0.3.32"
486 - source = "registry+https://github.com/rust-lang/crates.io-index"
487 - checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
488 -
489 - [[package]]
490 - name = "futures-sink"
491 - version = "0.3.32"
492 - source = "registry+https://github.com/rust-lang/crates.io-index"
493 - checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
494 -
495 - [[package]]
496 - name = "futures-task"
497 - version = "0.3.32"
498 - source = "registry+https://github.com/rust-lang/crates.io-index"
499 - checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
500 -
Lines truncated
@@ -242,14 +242,15 @@ install -m 0644 -o root -g root \
242 242 systemctl daemon-reload
243 243
244 244 if [[ "$BUILD_SANDOD" == "1" ]]; then
245 - log "12/13 sandod binary (cargo build --release → /usr/local/bin/sandod)"
245 + log "12/13 sandod binary (cargo build --release -p sando-daemon → /usr/local/bin/sandod)"
246 246 daemon_dir="$SANDO_REPO/daemon"
247 247 if [[ ! -d "$daemon_dir" ]]; then
248 248 log " warn: cannot locate sando/daemon source at $daemon_dir; skipping build"
249 249 else
250 - # cargo only needs network + tmp; resulting binary owned root, mode 755.
251 - (cd "$daemon_dir" && cargo build --release --quiet)
252 - install -m 0755 "$daemon_dir/target/release/sandod" /usr/local/bin/sandod
250 + # Build from the workspace root so the binary lands in the shared
251 + # sando/target; -p sando-daemon skips the TUI. Binary owned root, mode 755.
252 + (cd "$SANDO_REPO" && cargo build --release --quiet -p sando-daemon)
253 + install -m 0755 "$SANDO_REPO/target/release/sandod" /usr/local/bin/sandod
253 254 fi
254 255 else
255 256 log "12/13 skipping sandod build (BUILD_SANDOD=0)"
@@ -48,11 +48,13 @@ runuser -u "$BUILD_USER" -- env \
48 48 cd '$REPO_DIR'
49 49 git fetch --prune origin
50 50 git checkout --detach '$SHA'
51 - cd sando/daemon
52 - cargo build --release --locked
51 + cd sando
52 + cargo build --release --locked -p sando-daemon
53 53 "
54 54
55 - NEW_BIN="$REPO_DIR/sando/daemon/target/release/sandod"
55 + # Workspace shares one target dir at sando/target; -p sando-daemon avoids
56 + # compiling the TUI on the build host.
57 + NEW_BIN="$REPO_DIR/sando/target/release/sandod"
56 58 [[ -x "$NEW_BIN" ]] || { echo "sando-self-update: build produced no binary at $NEW_BIN" >&2; exit 3; }
57 59
58 60 # Install + restart as root. install is atomic (writes a temp then renames), so
@@ -1,3375 +0,0 @@
1 - # This file is automatically @generated by Cargo.
2 - # It is not intended for manual editing.
3 - version = 4
4 -
5 - [[package]]
6 - name = "aho-corasick"
7 - version = "1.1.4"
8 - source = "registry+https://github.com/rust-lang/crates.io-index"
9 - checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
10 - dependencies = [
11 - "memchr",
12 - ]
13 -
14 - [[package]]
15 - name = "allocator-api2"
16 - version = "0.2.21"
17 - source = "registry+https://github.com/rust-lang/crates.io-index"
18 - checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
19 -
20 - [[package]]
21 - name = "android_system_properties"
22 - version = "0.1.5"
23 - source = "registry+https://github.com/rust-lang/crates.io-index"
24 - checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
25 - dependencies = [
26 - "libc",
27 - ]
28 -
29 - [[package]]
30 - name = "anyhow"
31 - version = "1.0.102"
32 - source = "registry+https://github.com/rust-lang/crates.io-index"
33 - checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
34 -
35 - [[package]]
36 - name = "async-trait"
37 - version = "0.1.89"
38 - source = "registry+https://github.com/rust-lang/crates.io-index"
39 - checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
40 - dependencies = [
41 - "proc-macro2",
42 - "quote",
43 - "syn",
44 - ]
45 -
46 - [[package]]
47 - name = "atoi"
48 - version = "2.0.0"
49 - source = "registry+https://github.com/rust-lang/crates.io-index"
50 - checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
51 - dependencies = [
52 - "num-traits",
53 - ]
54 -
55 - [[package]]
56 - name = "atomic-waker"
57 - version = "1.1.2"
58 - source = "registry+https://github.com/rust-lang/crates.io-index"
59 - checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
60 -
61 - [[package]]
62 - name = "autocfg"
63 - version = "1.5.1"
64 - source = "registry+https://github.com/rust-lang/crates.io-index"
65 - checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
66 -
67 - [[package]]
68 - name = "axum"
69 - version = "0.8.9"
70 - source = "registry+https://github.com/rust-lang/crates.io-index"
71 - checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
72 - dependencies = [
73 - "axum-core",
74 - "axum-macros",
75 - "base64",
76 - "bytes",
77 - "form_urlencoded",
78 - "futures-util",
79 - "http",
80 - "http-body",
81 - "http-body-util",
82 - "hyper",
83 - "hyper-util",
84 - "itoa",
85 - "matchit",
86 - "memchr",
87 - "mime",
88 - "percent-encoding",
89 - "pin-project-lite",
90 - "serde_core",
91 - "serde_json",
92 - "serde_path_to_error",
93 - "serde_urlencoded",
94 - "sha1",
95 - "sync_wrapper",
96 - "tokio",
97 - "tokio-tungstenite 0.29.0",
98 - "tower",
99 - "tower-layer",
100 - "tower-service",
101 - "tracing",
102 - ]
103 -
104 - [[package]]
105 - name = "axum-core"
106 - version = "0.5.6"
107 - source = "registry+https://github.com/rust-lang/crates.io-index"
108 - checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
109 - dependencies = [
110 - "bytes",
111 - "futures-core",
112 - "http",
113 - "http-body",
114 - "http-body-util",
115 - "mime",
116 - "pin-project-lite",
117 - "sync_wrapper",
118 - "tower-layer",
119 - "tower-service",
120 - "tracing",
121 - ]
122 -
123 - [[package]]
124 - name = "axum-macros"
125 - version = "0.5.1"
126 - source = "registry+https://github.com/rust-lang/crates.io-index"
127 - checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca"
128 - dependencies = [
129 - "proc-macro2",
130 - "quote",
131 - "syn",
132 - ]
133 -
134 - [[package]]
135 - name = "base64"
136 - version = "0.22.1"
137 - source = "registry+https://github.com/rust-lang/crates.io-index"
138 - checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
139 -
140 - [[package]]
141 - name = "base64ct"
142 - version = "1.8.3"
143 - source = "registry+https://github.com/rust-lang/crates.io-index"
144 - checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"
145 -
146 - [[package]]
147 - name = "bitflags"
148 - version = "2.11.1"
149 - source = "registry+https://github.com/rust-lang/crates.io-index"
150 - checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
151 - dependencies = [
152 - "serde_core",
153 - ]
154 -
155 - [[package]]
156 - name = "block-buffer"
157 - version = "0.10.4"
158 - source = "registry+https://github.com/rust-lang/crates.io-index"
159 - checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
160 - dependencies = [
161 - "generic-array",
162 - ]
163 -
164 - [[package]]
165 - name = "bumpalo"
166 - version = "3.20.3"
167 - source = "registry+https://github.com/rust-lang/crates.io-index"
168 - checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
169 -
170 - [[package]]
171 - name = "byteorder"
172 - version = "1.5.0"
173 - source = "registry+https://github.com/rust-lang/crates.io-index"
174 - checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
175 -
176 - [[package]]
177 - name = "bytes"
178 - version = "1.11.1"
179 - source = "registry+https://github.com/rust-lang/crates.io-index"
180 - checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
181 -
182 - [[package]]
183 - name = "cassowary"
184 - version = "0.3.0"
185 - source = "registry+https://github.com/rust-lang/crates.io-index"
186 - checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
187 -
188 - [[package]]
189 - name = "castaway"
190 - version = "0.2.4"
191 - source = "registry+https://github.com/rust-lang/crates.io-index"
192 - checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
193 - dependencies = [
194 - "rustversion",
195 - ]
196 -
197 - [[package]]
198 - name = "cc"
199 - version = "1.2.62"
200 - source = "registry+https://github.com/rust-lang/crates.io-index"
201 - checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
202 - dependencies = [
203 - "find-msvc-tools",
204 - "shlex",
205 - ]
206 -
207 - [[package]]
208 - name = "cfg-if"
209 - version = "1.0.4"
210 - source = "registry+https://github.com/rust-lang/crates.io-index"
211 - checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
212 -
213 - [[package]]
214 - name = "cfg_aliases"
215 - version = "0.2.1"
216 - source = "registry+https://github.com/rust-lang/crates.io-index"
217 - checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
218 -
219 - [[package]]
220 - name = "chrono"
221 - version = "0.4.44"
222 - source = "registry+https://github.com/rust-lang/crates.io-index"
223 - checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
224 - dependencies = [
225 - "iana-time-zone",
226 - "js-sys",
227 - "num-traits",
228 - "serde",
229 - "wasm-bindgen",
230 - "windows-link",
231 - ]
232 -
233 - [[package]]
234 - name = "compact_str"
235 - version = "0.8.1"
236 - source = "registry+https://github.com/rust-lang/crates.io-index"
237 - checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
238 - dependencies = [
239 - "castaway",
240 - "cfg-if",
241 - "itoa",
242 - "rustversion",
243 - "ryu",
244 - "static_assertions",
245 - ]
246 -
247 - [[package]]
248 - name = "concurrent-queue"
249 - version = "2.5.0"
250 - source = "registry+https://github.com/rust-lang/crates.io-index"
251 - checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
252 - dependencies = [
253 - "crossbeam-utils",
254 - ]
255 -
256 - [[package]]
257 - name = "const-oid"
258 - version = "0.9.6"
259 - source = "registry+https://github.com/rust-lang/crates.io-index"
260 - checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
261 -
262 - [[package]]
263 - name = "core-foundation-sys"
264 - version = "0.8.7"
265 - source = "registry+https://github.com/rust-lang/crates.io-index"
266 - checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
267 -
268 - [[package]]
269 - name = "cpufeatures"
270 - version = "0.2.17"
271 - source = "registry+https://github.com/rust-lang/crates.io-index"
272 - checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
273 - dependencies = [
274 - "libc",
275 - ]
276 -
277 - [[package]]
278 - name = "crc"
279 - version = "3.4.0"
280 - source = "registry+https://github.com/rust-lang/crates.io-index"
281 - checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d"
282 - dependencies = [
283 - "crc-catalog",
284 - ]
285 -
286 - [[package]]
287 - name = "crc-catalog"
288 - version = "2.5.0"
289 - source = "registry+https://github.com/rust-lang/crates.io-index"
290 - checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853"
291 -
292 - [[package]]
293 - name = "crossbeam-epoch"
294 - version = "0.9.18"
295 - source = "registry+https://github.com/rust-lang/crates.io-index"
296 - checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
297 - dependencies = [
298 - "crossbeam-utils",
299 - ]
300 -
301 - [[package]]
302 - name = "crossbeam-queue"
303 - version = "0.3.12"
304 - source = "registry+https://github.com/rust-lang/crates.io-index"
305 - checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
306 - dependencies = [
307 - "crossbeam-utils",
308 - ]
309 -
310 - [[package]]
311 - name = "crossbeam-utils"
312 - version = "0.8.21"
313 - source = "registry+https://github.com/rust-lang/crates.io-index"
314 - checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
315 -
316 - [[package]]
317 - name = "crossterm"
318 - version = "0.28.1"
319 - source = "registry+https://github.com/rust-lang/crates.io-index"
320 - checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
321 - dependencies = [
322 - "bitflags",
323 - "crossterm_winapi",
324 - "mio",
325 - "parking_lot",
326 - "rustix",
327 - "signal-hook",
328 - "signal-hook-mio",
329 - "winapi",
330 - ]
331 -
332 - [[package]]
333 - name = "crossterm_winapi"
334 - version = "0.9.1"
335 - source = "registry+https://github.com/rust-lang/crates.io-index"
336 - checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
337 - dependencies = [
338 - "winapi",
339 - ]
340 -
341 - [[package]]
342 - name = "crypto-common"
343 - version = "0.1.7"
344 - source = "registry+https://github.com/rust-lang/crates.io-index"
345 - checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
346 - dependencies = [
347 - "generic-array",
348 - "typenum",
349 - ]
350 -
351 - [[package]]
352 - name = "darling"
353 - version = "0.23.0"
354 - source = "registry+https://github.com/rust-lang/crates.io-index"
355 - checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
356 - dependencies = [
357 - "darling_core",
358 - "darling_macro",
359 - ]
360 -
361 - [[package]]
362 - name = "darling_core"
363 - version = "0.23.0"
364 - source = "registry+https://github.com/rust-lang/crates.io-index"
365 - checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
366 - dependencies = [
367 - "ident_case",
368 - "proc-macro2",
369 - "quote",
370 - "strsim",
371 - "syn",
372 - ]
373 -
374 - [[package]]
375 - name = "darling_macro"
376 - version = "0.23.0"
377 - source = "registry+https://github.com/rust-lang/crates.io-index"
378 - checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
379 - dependencies = [
380 - "darling_core",
381 - "quote",
382 - "syn",
383 - ]
384 -
385 - [[package]]
386 - name = "data-encoding"
387 - version = "2.11.0"
388 - source = "registry+https://github.com/rust-lang/crates.io-index"
389 - checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
390 -
391 - [[package]]
392 - name = "der"
393 - version = "0.7.10"
394 - source = "registry+https://github.com/rust-lang/crates.io-index"
395 - checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
396 - dependencies = [
397 - "const-oid",
398 - "pem-rfc7468",
399 - "zeroize",
400 - ]
401 -
402 - [[package]]
403 - name = "digest"
404 - version = "0.10.7"
405 - source = "registry+https://github.com/rust-lang/crates.io-index"
406 - checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
407 - dependencies = [
408 - "block-buffer",
409 - "const-oid",
410 - "crypto-common",
411 - "subtle",
412 - ]
413 -
414 - [[package]]
415 - name = "displaydoc"
416 - version = "0.2.5"
417 - source = "registry+https://github.com/rust-lang/crates.io-index"
418 - checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
419 - dependencies = [
420 - "proc-macro2",
421 - "quote",
422 - "syn",
423 - ]
424 -
425 - [[package]]
426 - name = "dotenvy"
427 - version = "0.15.7"
428 - source = "registry+https://github.com/rust-lang/crates.io-index"
429 - checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
430 -
431 - [[package]]
432 - name = "either"
433 - version = "1.16.0"
434 - source = "registry+https://github.com/rust-lang/crates.io-index"
435 - checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
436 - dependencies = [
437 - "serde",
438 - ]
439 -
440 - [[package]]
441 - name = "equivalent"
442 - version = "1.0.2"
443 - source = "registry+https://github.com/rust-lang/crates.io-index"
444 - checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
445 -
446 - [[package]]
447 - name = "errno"
448 - version = "0.3.14"
449 - source = "registry+https://github.com/rust-lang/crates.io-index"
450 - checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
451 - dependencies = [
452 - "libc",
453 - "windows-sys 0.52.0",
454 - ]
455 -
456 - [[package]]
457 - name = "etcetera"
458 - version = "0.8.0"
459 - source = "registry+https://github.com/rust-lang/crates.io-index"
460 - checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
461 - dependencies = [
462 - "cfg-if",
463 - "home",
464 - "windows-sys 0.48.0",
465 - ]
466 -
467 - [[package]]
468 - name = "event-listener"
469 - version = "5.4.1"
470 - source = "registry+https://github.com/rust-lang/crates.io-index"
471 - checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
472 - dependencies = [
473 - "concurrent-queue",
474 - "parking",
475 - "pin-project-lite",
476 - ]
477 -
478 - [[package]]
479 - name = "evmap"
480 - version = "11.0.0"
481 - source = "registry+https://github.com/rust-lang/crates.io-index"
482 - checksum = "1b8874945f036109c72242964c1174cf99434e30cfa45bf45fedc983f50046f8"
483 - dependencies = [
484 - "hashbag",
485 - "left-right",
486 - "smallvec",
487 - ]
488 -
489 - [[package]]
490 - name = "find-msvc-tools"
491 - version = "0.1.9"
492 - source = "registry+https://github.com/rust-lang/crates.io-index"
493 - checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
494 -
495 - [[package]]
496 - name = "flume"
497 - version = "0.11.1"
498 - source = "registry+https://github.com/rust-lang/crates.io-index"
499 - checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
500 - dependencies = [
Lines truncated
@@ -475,6 +475,7 @@ fn format_event_body(e: &Event) -> String {
475 475 fn pass_note_short(n: &PassNote) -> String {
476 476 match n {
477 477 PassNote::StayedUp { duration_s } => format!("up {duration_s}s"),
478 + PassNote::HealthyProbe { after_ms } => format!("/health {after_ms}ms"),
478 479 PassNote::BurnInElapsed { hours } => format!("{hours}h elapsed"),
479 480 PassNote::Migrated { backup_path } => {
480 481 // Show just the basename; full path lives in /state if needed.
@@ -507,6 +508,9 @@ fn failure_short(f: &GateFailure) -> String {
507 508 GateFailure::BootPanic { .. } => "panic".into(),
508 509 GateFailure::BootExitedEarly { exit_code: Some(c) } => format!("exited {c}"),
509 510 GateFailure::BootExitedEarly { .. } => "exited early".into(),
511 + GateFailure::BootHealthProbeFailed { last_error } => {
512 + format!("no /health: {}", last_error.chars().take(40).collect::<String>())
513 + }
510 514 GateFailure::SpawnFailed { message } => format!("spawn: {message}"),
511 515 GateFailure::Timeout { gate, after_s } => format!("{gate} timeout {after_s}s"),
512 516 GateFailure::Unclassified { legacy_detail: Some(d) } => {
@@ -524,7 +528,10 @@ fn gate_mark_and_style(g: &GateView) -> (&'static str, Style) {
524 528 Some("passed") => ("ok", Style::default().fg(Color::Green)),
525 529 Some("failed") => ("FAIL", Style::default().fg(Color::Red).add_modifier(Modifier::BOLD)),
526 530 Some("blocked") => ("blocked", Style::default().fg(Color::Yellow)),
527 - Some(_) | None => ("...", Style::default().fg(Color::DarkGray)),
531 + // A genuinely unknown status string from the daemon is a contract drift,
532 + // not an in-flight gate — surface it distinctly rather than masking it as "...".
533 + Some(_) => ("?", Style::default().fg(Color::Magenta)),
534 + None => ("...", Style::default().fg(Color::DarkGray)),
528 535 }
529 536 }
530 537
@@ -586,8 +593,10 @@ fn ui_loop<B: Backend>(
586 593 loop {
587 594 term.draw(|f| draw(f, daemon, shared))?;
588 595
589 - if event::poll(Duration::from_millis(120))? {
590 - if let XEvent::Key(k) = event::read()? {
596 + if event::poll(Duration::from_millis(120))?
597 + && let XEvent::Key(k) = event::read()?
598 + {
599 + {
591 600 // Ctrl+C always quits, even mid-confirmation.
592 601 if k.code == KeyCode::Char('c') && k.modifiers.contains(KeyModifiers::CONTROL) {
593 602 return Ok(());
@@ -601,7 +610,13 @@ fn ui_loop<B: Backend>(
601 610 if let Some(act) = pending {
602 611 match k.code {
603 612 KeyCode::Char('y') | KeyCode::Char('Y') | KeyCode::Enter => {
604 - let _ = action_tx.try_send(act);
613 + // Don't swallow a full-channel drop: the operator must not
614 + // believe a promote was sent when it wasn't.
615 + if let Err(e) = action_tx.try_send(act) {
616 + let act = e.into_inner();
617 + shared.lock().unwrap().notice =
618 + Some(format!("{act} not sent (daemon busy) - retry"));
619 + }
605 620 }
606 621 _ => {
607 622 shared.lock().unwrap().notice = Some(format!("{act} cancelled"));
@@ -1050,7 +1065,7 @@ mod tests {
1050 1065 }
1051 1066
1052 1067 #[test]
1053 - fn format_event_gate_done_blocked_is_not_FAIL() {
1068 + fn format_event_gate_done_blocked_is_not_fail() {
1054 1069 // The whole point of the Blocked variant: an unstarted burn-in
1055 1070 // clock is not a defect, so the TUI renders it distinctly from a
1056 1071 // genuine failure. No "FAIL" string.