Skip to main content

max / alloy

Make fw12 fw13's mirror rather than a minimal testbed Ruled 2026-09-07 (Max): "Lets stop treating fw12 as a minimal testbed and plan to have it essentially mirror fw13. fw13 is probably going to be a stay at home machine for awhile, always on. fw12 is the better portable machine, but ideally is a near mirror image." So fw12 takes fw13's dials whole: LANGS=rust,c,js,go, GUI=tauri, DB=postgres16. Where the two differ it is identity and hardware, never capability. build/hosts/fw12.requires is new and is deliberately fw13's list minus nothing. That is what makes the mirror an assertion rather than an intention: if the recipes drift, the mint that lost a capability fails its preflight instead of booting and disappointing somebody a week later on a train. It also settles a blocker measured an hour earlier. On fw12 with LANGS=rust,c,go and no GUI dial, `cargo install sccache` failed at "Package openssl was not found in the pkg-config search path" and took four of the eleven recorded tools with it. openssl-devel arrives with GUI=tauri, which fw13 and astra have always had, so neither ever saw it. Mirroring fixes it without widening the `c` dial, which is scoped to compilers and build systems rather than library headers. Two earlier headers argued fw12 was the stock client mint that proved what an ordinary person installs. Nothing on hardware proves that now, and the header says so: the property was that the image boots and is usable with nothing added, and a VM answers that as well as a laptop.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01WFBzMprSmNCfvdj2cGZyka
Author: Max Johnson <me@maxj.phd> · 2026-09-07 21:11 UTC
Signed with PGP, not checked
Commit: 71ada7abc79fe079cb64a0bb4730885e3f19a82f
Parent: 72749c3
2 files changed, +119 insertions, -34 deletions
@@ -1,22 +1,34 @@
1 - # fw12 — Framework 12, Intel, second daily driver.
1 + # fw12 — Framework 12, Intel. The portable half of a two-machine pair.
2 2 #
3 - # One dial beyond identity, and it is LANGS. Everything else is still stock:
4 - # no PROFILE, no DB.
3 + # RECLASSIFIED 2026-09-07 (Max): "Lets stop treating fw12 as a minimal testbed
4 + # and plan to have it essentially mirror fw13. fw13 is probably going to be a
5 + # stay at home machine for awhile, always on. fw12 is the better portable
6 + # machine, but ideally is a near mirror image."
5 7 #
6 - # THIS STILL PROVES THE ORDINARY INSTALL, and the reasoning that says otherwise
7 - # is worth writing down because this file used to carry it. The old header held
8 - # that setting no dial at all was what made fw12 representative. That assumed an
9 - # ordinary Alloy user takes the image as it comes, and Alloy is an operating
10 - # system for developers: essentially every real mint names at least one
11 - # language, so the empty-LANGS mint is the unusual one. fw12 asking for rust
12 - # moves it toward the install most people will actually perform, not away from
13 - # it.
8 + # So the dials below are fw13's, and that is the whole design of this file now.
9 + # Where the two differ it is identity and hardware, never capability. If fw13
10 + # gains a dial, this file gains it in the same commit; a divergence here is a
11 + # bug rather than a choice, and build/hosts/fw12.requires is what catches one.
14 12 #
15 - # What a no-LANGS mint proves is narrower than it was credited with: that the
16 - # image boots and is usable with nothing added. Worth keeping true, and it does
17 - # not need a permanent machine sitting on it.
13 + # WHAT THIS FILE USED TO BE, said plainly because two earlier headers argued
14 + # for it. fw12 was the stock client mint, the machine that proved what an
15 + # ordinary person installs, and it set no dial on purpose. That reading died in
16 + # two steps on the same day: first because Alloy is an operating system for
17 + # developers, so an empty-LANGS mint is the unusual install rather than the
18 + # representative one, and then because the pair is not one daily driver and one
19 + # testbed. It is a desk machine and a machine that leaves the house, and the
20 + # only thing a person carrying the portable one wants is for it to be the
21 + # machine they left.
18 22 #
19 - # What it does set is identity, and only because the alternative is a chore.
23 + # Nothing now proves the bare mint on hardware. That is accepted: the property
24 + # it demonstrated is that the image boots and is usable with nothing added, and
25 + # a VM answers that as well as a laptop does.
26 + #
27 + # The cost of the mirror is size and build time, both paid at mint. fw12 now
28 + # carries the Tauri GUI set, PostgreSQL 16 and four language toolchains it
29 + # would not have asked for as a testbed.
30 + #
31 + # What it also sets is identity, and only because the alternative is a chore.
20 32 # fw12 gets reinstalled every time the image moves far enough to be worth
21 33 # re-proving, and a machine that needs a person at the keyboard to become
22 34 # reachable afterwards is how the last round of hardware verification turned
@@ -28,27 +40,31 @@
28 40 # still lands on the right name.
29 41 ALLOY_HOSTNAME=fw12
30 42
31 - # Ruled 2026-09-07 (Max), over layering the toolchain onto the installed
32 - # machine and over dropping the build clause from infra 1c115df0.
43 + # THE DIALS, mirrored from build/hosts/fw13.env. Read that file for what each
44 + # one costs; the reasons are the same reasons and are not restated here.
33 45 #
34 - # A stock fedora-bootc mint carries no compiler at all: glibc 2.42 is there and
35 - # glibc-devel is not, so cargo dies at `error: linker cc not found` and every
36 - # cargo-installed tool fails to build. `rust` pulls gcc, binutils and
37 - # glibc-devel with it, so naming the language here is also what puts cc on the
38 - # machine. 610 MiB across 16 packages, most of it rust-std-static and
39 - # llvm-libs.
46 + # LANGS. rust is what the tree is written in and is also what puts a C
47 + # toolchain on the machine: a stock fedora-bootc mint has glibc and not
48 + # glibc-devel, so without it cargo dies at `error: linker cc not found`. c adds
49 + # the compilers and build systems for an arbitrary checkout. js builds MNW's
50 + # frontends. go is blessed for Make Creative software where it is warranted.
51 + LANGS=rust,c,js,go
52 +
53 + # GUI. The Tauri build set: webkit2gtk, gtk3, libsoup3, librsvg and openssl,
54 + # all as -devel. Without it this machine cannot build goingson,
55 + # balanced_breakfast or audiofiles.
40 56 #
41 - # rustup still installs into $HOME on top of this and stays the answer for the
42 - # pinned toolchain the tree builds against. What the image supplies is the C
43 - # toolchain underneath it, which is the half $HOME cannot provide.
44 - #
45 - # go rides along from 2026-09-07, when Max blessed Go for Make Creative
46 - # software where it is warranted. Nothing in ~/Code is Go today, so this is
47 - # provision rather than need: the point of blessing a language is that the
48 - # machines can already build it when somebody uses it. 356 MB. It also covers
49 - # the Go tier of what this image ships, which is syncthing, restic, tailscale,
50 - # direnv, fzf, gopass and cliphist.
51 - LANGS=rust,c,go
57 + # It is also what carries openssl-devel, and that is worth knowing rather than
58 + # rediscovering: measured 2026-09-07 on a fw12 with LANGS=rust,c,go and no GUI
59 + # dial, `cargo install sccache` failed at `Package openssl was not found in the
60 + # pkg-config search path` and took four of the eleven recorded tools with it.
61 + # fw13 and astra never saw that because their GUI dial had been supplying the
62 + # header all along.
63 + GUI=tauri
64 +
65 + # DB. PostgreSQL 16 binaries and no cluster, matching fw13. The major matters:
66 + # it is what production runs and what a restored dump expects.
67 + DB=postgres16
52 68
53 69 # fw13's public key, read at mint time rather than committed: this repo is
54 70 # public, and a key pasted into it would also go stale silently. The installer
@@ -1,0 +1,69 @@
1 + # What fw12's ROLE needs, as opposed to which dials its mint sets.
2 + #
3 + # fw12 is fw13's portable mirror (2026-09-07). The recipes say what goes in and
4 + # this says what has to come out, and the point of having both is that every
5 + # dial was correct on fw13 on 2026-09-04 while the image still could not build
6 + # a Tauri app or restore a prod dump, because nothing anywhere said those were
7 + # things the machine has to be able to do.
8 + #
9 + # THIS FILE IS DELIBERATELY fw13's, MINUS NOTHING. That is the mirror stated as
10 + # an assertion rather than as an intention: if the two recipes drift, the mint
11 + # that lost a capability fails its preflight instead of booting and
12 + # disappointing somebody a week later on a train. Where fw12 genuinely differs
13 + # from fw13 it is identity and hardware, and neither is a capability, so
14 + # neither belongs here.
15 + #
16 + # The one thing fw13 has that this does not assert is a role rather than a
17 + # capability: fw13 is Sando's controller and the crates.io publish host because
18 + # it is always on. fw12 can do both and is not asked to.
19 + #
20 + # Syntax: bin:<name>, pkgconfig:<module>, file:<glob>.
21 +
22 + # --- the tree's own builds
23 + bin:cargo
24 + bin:rustc
25 + bin:gcc # arrives with rust; a mint without it has no C toolchain
26 + bin:git # the publish recipe runs `git describe --exact-match`
27 +
28 + # --- an arbitrary checkout, which is what the `c` dial is for. Named because
29 + # the compilers and the build systems are the whole of what that dial promises,
30 + # and a promise nothing checks is one that quietly stops being true.
31 + bin:g++
32 + bin:make
33 + bin:cmake
34 + bin:meson
35 +
36 + # --- Go, blessed 2026-09-07 for Make Creative software where it is warranted.
37 + bin:go
38 +
39 + # --- the frontends Sando's code_smoke gate compiles
40 + bin:node
41 + bin:npm
42 +
43 + # --- a restored production dump, same as fw13. The extensions are not
44 + # optional: a restore stops at the first CREATE EXTENSION it cannot satisfy.
45 + bin:psql
46 + bin:postgres
47 + bin:initdb
48 + file:*/pgcrypto.control
49 + file:*/pg_trgm.control
50 +
51 + # --- the four Tauri apps. webkit2gtk is the one that matters; the rest are
52 + # what cargo-tauri and linuxdeploy reach for. openssl is here for a second
53 + # reason worth naming: sccache links it, and on a fw12 without this dial
54 + # `cargo install sccache` failed and took four other recorded tools with it.
55 + pkgconfig:webkit2gtk-4.1
56 + pkgconfig:gtk+-3.0
57 + pkgconfig:libsoup-3.0
58 + pkgconfig:librsvg-2.0
59 + pkgconfig:openssl
60 +
61 + # --- the fleet control plane. ops-exec spawns the binary by name, so a machine
62 + # without it cannot collect a build from another host or hand a release over.
63 + bin:rsync
64 + bin:ssh
65 +
66 + # --- release signing. dist/sign-artifacts.sh hard-fails without minisign, and
67 + # the key material is a $HOME restore rather than image content, so the binary
68 + # is the part an image can be asked for.
69 + bin:minisign