A failing unit
A leaf of a scroll tree is the failure-isolation boundary: one leaf’s failure
never rolls back a sibling. examples/fishnet-farm/farm.emet is where you watch
that happen, because one of its nine leaves cannot possibly work.
Start from Bring up the fleet — this needs scaly
and talos running with golemd deployed. Commands are nushell, from the repo
root.
The tree, and the leaf that will not settle
farm.emet is one host, scaly, as nine leaf units: three fishnet-move
clients, two fishnet-analysis clients, a lila-gif workload, the nftables
firewall, a base leaf, and a canary:
canaryImage : ImagecanaryImage = image "docker.io" "golem-example/does-not-exist" "latest"
canary : Scrollcanary = scroll { name = "canary" , policy = keep , glyphs = worker "fishnet-canary" canaryImage }
scaly : Scrollscaly = scroll { name = "scaly" , groups = [ scroll { name = "fishnet-move", groups = List.map moveClient [ 1, 2, 3 ] } , scroll { name = "fishnet-analysis", groups = List.map analysisClient [ 1, 2 ] } , lilaGif , firewall , base , canary ] }The canary’s image cannot be pulled, and it carries policy = keep.
Break it
-
Read the diff before enacting it.
Terminal window fleet plan examples/fishnet-farm/farm.emet --hosts scalyfleetcompiles the scroll, reports the manifest it produced and which running hosts it will reach, then golemctl prints the diff under a heading naming the host and its address:scaly ssh://golem@127.0.0.1:2259against revision 1 · manifest <id>……one collapsed line per action…N changes · N install, N replace, N remove · N unchangedNothing is written. A plan is safe to run while an apply is in flight.
-
Apply it.
Terminal window fleet apply examples/fishnet-farm/farm.emet --hosts scalyA live tree draws as the units settle. Eight leaves finish
✓. The canary’s leaf finishes✗with the podman pull error in the forensics block beneath it, and the run closes with a summary under scaly’s heading:scaly ssh://golem@127.0.0.1:2259apply partial — revision 2 — scaly / canary: 1 glyph failed (kept)fleet applypasses golemctl’s exit code through, andpartialis a nonzero outcome — so this successful lesson exits 1. That is the point: eight units settled, one did not, and golem said so instead of rolling the whole host back. -
Apply it a second time.
Terminal window fleet apply examples/fishnet-farm/farm.emet --hosts scalySame ending. The canary resurfaces on every reconcile rather than disappearing into “unchanged” — a kept failure stays visible, because a unit that has never worked is not a unit that needs no attention.
-
Read the journal on the box.
Terminal window fleet ssh scaly -- journalctl -u fishnet-move-1.service -n 5No
sudo. cloud-init put thegolemuser insystemd-journalon first boot.
Regroup one host while standing another up
examples/lichess/fleet.emet emits six scrolls. Two of them — manta and
orbit — name ghcr.io images that are not publicly pullable; scaly and
talos are the live-tested pair, so name them explicitly.
-
Bring
talosback if you let it go.Terminal window fleet up --hosts talosfleet deploy --hosts talosBoth are no-ops if you left it running.
-
Plan both hosts at once.
Terminal window fleet plan examples/lichess/fleet.emet --hosts scaly,talosTwo headings, one per host, each with its own change count —
scalymostly removes,talosalmost entirely installs:scaly ssh://golem@127.0.0.1:2259against revision 3 · manifest <id>…N changes · N install, N replace, N remove · N unchangedtalos ssh://golem@127.0.0.1:2219against revision 1 · manifest <id>…N changes · N install, N replace, N remove · N unchanged -
Apply them.
Terminal window fleet apply examples/lichess/fleet.emet --hosts scaly,talosOne live tree across both hosts, then a summary line under each heading. Both settle; the run exits 0.
scaly goes from the nine-leaf farm tree to a single flat scroll holding one
fishnet workload. Its farm units come down in the reverse of their install
order, each undone by the inverse golem recorded when it installed them — golem
removes only what golem put there. See
Reversible reconcile.
On talos, dns publishes on 5353 because systemd-resolved already owns 53 on
the guests.
Explore from here
- Fix the canary. Point
canaryImageat an image that exists and re-apply — the leaf that has failed every reconcile since revision 2 settles, and the eight that were already green stayunchanged. - Reverse a host entirely. Apply a scroll named
scalywith an emptyglyphslist. Every glyph golem installed comes off, each by its recorded inverse; a package that was already on the box is left alone. - Read a revision. golemd’s
/revisions/:idcarries each op and the inverse it recorded — the receipts that make removal exact.
Where to next
- A registry on the fleet — a real container registry on a VM, reachable from the others.
- A tour of the lichess fleet — every scroll
fleet.emetemits, and the four glyphs they lower to. - The four glyphs — what a leaf’s
glyphslist can hold.