Skip to main content

max / makenotwork

Say which recipes may call glibc_check, and which structurally cannot The rule was never written down and all four service recipes already follow it, which is the only reason nothing has gone wrong. glibc_check reads the recipe's [[deploy]] entry to learn which machine runs the bytes, so a handed-off service cannot call it at all and its absence is the Sando/Bento boundary rather than an omission. A new recipe now takes its answer from whether it carries a [[deploy]] table instead of from whichever sibling it was copied from.
Author: Max Johnson <me@maxj.phd> · 2026-08-25 13:57 UTC
Signed with PGP, not checked
Commit: dbcdfa04063f65d8e21299b97a6aa8bb33c6c8c6
Parent: a384d1d
3 files changed, +37 insertions, -15 deletions
@@ -153,7 +153,7 @@
153 153
154 154 [[package]]
155 155 name = "bento-daemon"
156 - version = "0.1.1"
156 + version = "0.1.2"
157 157 dependencies = [
158 158 "anyhow",
159 159 "async-trait",
@@ -3301,6 +3301,14 @@
3301 3301 source = "registry+https://github.com/rust-lang/crates.io-index"
3302 3302 checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
3303 3303
3304 + [[patch.unused]]
3305 + name = "synckit-client"
3306 + version = "0.9.1"
3307 +
3308 + [[patch.unused]]
3309 + name = "synckit-config"
3310 + version = "0.2.0"
3311 +
3304 3312 [[patch.unused]]
3305 3313 name = "quasi-axum"
3306 3314 version = "0.56.0"
@@ -3337,10 +3345,6 @@
3337 3345 name = "quasi-webview"
3338 3346 version = "0.56.0"
3339 3347
3340 - [[patch.unused]]
3341 - name = "docengine"
3342 - version = "0.7.0"
3343 -
3344 3348 [[patch.unused]]
3345 3349 name = "kberg"
3346 3350 version = "0.1.0"
@@ -3353,14 +3357,10 @@
3353 3357 name = "tagtree"
3354 3358 version = "0.4.1"
3355 3359
3356 - [[patch.unused]]
3357 - name = "synckit-client"
3358 - version = "0.9.1"
3359 -
3360 - [[patch.unused]]
3361 - name = "synckit-config"
3362 - version = "0.2.0"
3363 -
3364 3360 [[patch.unused]]
3365 3361 name = "quasi-type"
3366 3362 version = "0.1.0"
3363 +
3364 + [[patch.unused]]
3365 + name = "docengine"
3366 + version = "0.7.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "bento-daemon"
3 - version = "0.1.1"
3 + version = "0.1.2"
4 4 edition = "2024"
5 5 license = "MIT"
6 6
@@ -1742,7 +1742,29 @@
1742 1742
1743 1743 // --- glibc_check(binary) -> string: assert the build host did not produce
1744 1744 // a binary the service host's glibc is too old to exec. Aborts the run
1745 - // if it did; returns "needs X, host has Y" for the log if it did not. ---
1745 + // if it did; returns "needs X, host has Y" for the log if it did not.
1746 + //
1747 + // WHICH RECIPES CALL THIS, AND WHY THE OTHERS MUST NOT. The rule is not
1748 + // a style preference and it is not optional: this reads the recipe's
1749 + // `[[deploy]]` entry to learn which machine runs the bytes, so a recipe
1750 + // with no `[[deploy]]` cannot call it at all.
1751 + //
1752 + // - A service that installs ITSELF (`[[deploy]]` present: magicmirror,
1753 + // wam, mnw-cli) SHOULD call it. Bento is both builder and installer
1754 + // there, so it knows the service host, and nothing downstream will
1755 + // check on its behalf.
1756 + // - A service HANDED OFF to Sando (`[[deploy]]` absent: pom) MUST NOT,
1757 + // and the absence is the Sando/Bento boundary rather than an omission.
1758 + // Which machine runs the bytes is environment knowledge, which is
1759 + // Sando's half. Sando covers it on the far side, more strongly: it runs
1760 + // the node's own loader against the rsynced bytes before the symlink
1761 + // swap (`sando_daemon::deploy::ldd_guard_script`), and since 0.2.12
1762 + // also compares the bundle's glibc floor against the node's declared
1763 + // `libc` before the rsync (`check_bundle_fits_node`).
1764 + //
1765 + // So a new service recipe takes its answer from whether it carries a
1766 + // `[[deploy]]` table, not from whichever sibling recipe it was copied
1767 + // from. Wiki `sando-bento-boundary`, `host-base-images`. ---
1746 1768 {
1747 1769 let ctx = ctx.clone();
1748 1770 engine.register_fn(