A runner declares the job images its box must hold, and the declaration carries them to the box #4
Labels
No labels
wayfinder:task
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
jimmy/hatchery#4
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What is wrong
A runner's declaration names its labels and the image each maps to, and nothing more. The images a build box must hold beyond the default one (roost-swift-ci:6.1-noble, roost-swift-ci:6.3.2-noble on the opi) are declared nowhere, so on 2026-10-04 the box's prune took two of them and nothing the box could read said they were wanted (jimmy/house#98). roost's
bin/job-images.pyalready reads arunner.imagesfield, and falls back to the box's own memory of what it held because the field cannot reach the box.Jimmy ruled on 2026-10-05: plan the hatchery change. A job image is a build box resource and belongs on the runner.
The plan
RunnerSpec(Sources/HatcheryKit/BuildBox.swift:8) gainsimages: a list of{image, recipe, registry?}.imageis the local name a workflow or a label uses,recipeis the path in roost that builds it, andregistryis the forge package it is pushed to and pulled from, where it has one.Declaration.Runner(Declaration.swift:66) publishes the list, and the image each label maps to, which it strips today. The box reads it from pulse's/api/declared.hatchery box runnerrebuilds the spec at BuildBox.swift:157 and would drop the field: it keeps it.~/infra-state/box/hatchery.jsondeclares the three images on theact_runnerservice, and the mini's runner declares none, with its modehost.hatchery checkon the box stack says when a declared image is not held, from the reader's rows on pulse, so the declaration and the box are compared in one place.Done when
/api/declaredon the opi names each image with its recipe.job-images.pyon the opi shows the two Swift images as wanted by the declaration, with no help from the box's memory.hatchery box runnerleaves the list as it was.Not in this ticket
The push of the images to the forge registry is jimmy/house's ticket; this one only gives it a field to name the package in.
Landed in hatchery
27b9c51and infra-state 9a1c894, and proven on the opi on 2026-10-06.~/roost/bin/job-images.pyon the opi reads "the runner's block declares it" for roost-swift-ci:6.1-noble and roost-swift-ci:6.3.2-noble, where it read "nothing this host can read names it".hatchery box runner act_runner -s box --checkreads the three as held on opi, says "the declaration already says this; nothing to write", and exits 0.Not forced on the live box: a missing image. Its line and the exit 1 are held by tests.