From 239b1ed8d90713213bd7c12ec0611a807d5b1f5a Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 27 Aug 2026 09:26:58 -0400 Subject: [PATCH] ci: build :dev images again so the dev channel can carry a build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit build.yml triggered on main and tags only. The 2026-05-26 comment gave the reason: "operator tests from :latest after merge-to-main, not from the dev branch image. Saves one full docker build per dev push." That trade has since been named as a fault. Family rule 147 — main IS production, test on :dev, never by shipping — and rule 146 — a rolling channel refreshes itself, and a channel that can only be refreshed by shipping is not a channel. 146's note on 147 describes this exact shape: the pressure to test by shipping does not come from carelessness, it comes from :dev being unable to carry the build. Two live consequences, not hypotheticals: - docker-compose.yml pins fabledcurator:dev, an image nothing has published since May. The registry-image path of the documented quick-start could not have worked. - trying an extension change required merging to main, because sign-extension is gated to main and :dev did not exist to carry an XPI. Shipping was the only way to test. All three images build on dev. Deliberate: a :dev web image paired with a stale :dev ml or agent is a worse trap than no dev channel, because the mismatch surfaces as a runtime failure rather than a missing tag. The cost the 2026-05-26 note was avoiding is real and is now paid on every dev push — layer reuse should keep ml's cost to the COPY layers, but if it bites, narrowing is a `paths:` filter away. :dev only. The dev path never writes :c-: that is the rollback unit (rule 145), and a rolling tag may legitimately carry newer contents than the :c- of the same commit. This does NOT yet put an XPI on :dev — sign-extension is still gated to main, and ungating it has to wait for the derived version to control publishing, or dev would sign the hand-set 1.0.11, hit the existing cache and ship main's stale XPI. That is the next step. --- .forgejo/workflows/build.yml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml index a63cee9..e5ffbd6 100644 --- a/.forgejo/workflows/build.yml +++ b/.forgejo/workflows/build.yml @@ -2,10 +2,18 @@ name: Build images on: push: - # `:dev` builds dropped 2026-05-26 — operator tests from `:latest` after - # merge-to-main, not from the dev branch image. Saves one full docker - # build per dev push. - branches: [main] + # `:dev` builds were dropped 2026-05-26 to save a docker build per dev + # push, on the reasoning that "operator tests from `:latest` after + # merge-to-main". Restored 2026-08-27: that is testing by shipping, and + # family rules 146/147 now name it directly — `main` IS production, and a + # channel that can only be refreshed by shipping is not a channel. The + # pressure to merge in order to try something does not come from + # carelessness; it comes from `:dev` being unable to carry the build. + # + # All three images build on dev, deliberately: a `:dev` web image paired + # with a stale `:dev` ml or agent is a worse trap than no dev channel at + # all, since the mismatch only shows up as a runtime failure. + branches: [main, dev] # Tag-push triggers an immutable per-version image build (e.g. # `:v26.05.26.5`) — gives a real rollback story alongside the floating # `:main` / `:latest`. Layer reuse keeps the registry-storage cost @@ -279,9 +287,11 @@ jobs: # rollback unit"). Rollback to any commit # becomes `docker pull …:c-` without a # release ceremony. - # anything else → safety net; shouldn't fire given the `on:` - # config above. Tag :dev to surface the - # unexpected run in the registry. + # refs/heads/dev → push to dev: publish :dev, the rolling test + # channel (family rule 146). Rolling means it may + # carry newer contents than the :c- of the + # same commit; it never writes :c- itself, + # because that is the rollback unit (rule 145). # POSIX-safe substring (the runner shell is dash/BusyBox sh, not # bash — `${var:0:7}` errors with "Bad substitution"; cut works # everywhere). Operator-flagged 2026-06-01 after first :c-