A board reads through interfaces and holds nothing. Everything it needs is already answered — as text, for people, which is not something a page can read. `--json` rather than a serving API, because nothing needs one yet: whatever serves a board runs the command, and the constraint holds either way — the board never touches a context's store. An API is the larger thing and should wait until something asks for it. Both forms are gathered from the same reads before either says anything, so they answer the same questions rather than being two implementations that can drift. That was not true of the first version: the JSON printed after the text, because the branch was too late. Four properties, each asserted and each confirmed to fail when removed: - refused and failed stay distinct all the way out. They are fixed in different places, so one word for both sends half a page's readers to the wrong one — and how much DID apply is carried, since "three of eight" and "none of eight" are different machines - a machine that never spoke carries no time at all, rather than a zero one that any page would format as a date in 1970 - nothing is null. A page distinguishing "no machines are wrong" from "this field is missing" has to handle both, and null is the one that gets forgotten - no field is named like a secret. Everything here comes from records that hold no readable one, but a shape a page is built against is exactly where one would eventually be added for convenience
21 lines
952 B
Docker
21 lines
952 B
Docker
# The builder, as a module ships one.
|
|
#
|
|
# Not FROM scratch, unlike the control plane: this one runs git and a container client, so it
|
|
# needs a filesystem with them on it. That is the honest cost of a machine whose job is to build —
|
|
# and it is why building is a MODULE on a machine that has a runtime rather than something the
|
|
# control plane does (novox/hq ADR 0005).
|
|
FROM golang:1.25-alpine AS build
|
|
WORKDIR /src
|
|
COPY go.mod go.sum ./
|
|
RUN go mod download
|
|
COPY . .
|
|
RUN CGO_ENABLED=0 go build -trimpath -ldflags '-s -w' -o /mesh-builder ./cmd/mesh-builder
|
|
|
|
FROM alpine:3
|
|
# git to clone what it is asked to build, and the docker client to build and push it. The daemon
|
|
# is the machine's, reached through its socket — a build machine shares the runtime it was given
|
|
# rather than running one inside itself.
|
|
RUN apk add --no-cache git docker-cli
|
|
COPY --from=build /mesh-builder /usr/local/bin/mesh-builder
|
|
ENTRYPOINT ["/usr/local/bin/mesh-builder"]
|