Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
5e4cd40
bench(wildct): the second module load's record, amendment R4, nft_lim…
88plug Oct 29, 2026
d6aac0e
ci(canary): runtime and surface canary for engine and node images
Oct 29, 2026
0163539
ci(canary): a runtime engine whose probe wrote no result fails
Oct 29, 2026
e44eaa1
ci: run CI on bot PRs by dispatch; the gate accepts it and surfaces o…
88plug Oct 29, 2026
c2ffee0
bot-ci-dispatch: a run without a head branch counts as a human run; s…
88plug Oct 29, 2026
8fa9271
ci(canary): the node script runs, sglang abbreviations and patched ta…
88plug Oct 30, 2026
5be20ca
ci(canary): the node cluster is created as the launcher creates it wi…
88plug Oct 30, 2026
6ff6896
bench(h59): the H59-family runner, amendment R1; H57d amendment R2 (O…
88plug Oct 30, 2026
41270a1
sandbox: leave another installer's agent-sandbox alone; up --adopt re…
88plug Oct 30, 2026
5438b69
ci: alarm on red or missing automation, and harden the release
88plug Oct 29, 2026
2eb4fd1
watchdog: record a re-dispatch before it runs, and ignore forks
88plug Oct 30, 2026
5cd0e87
ci(canary): the node canary checks every pod, in every namespace, and…
88plug Oct 30, 2026
154665f
ci(canary): pull requests that change sglang_args run the canary
88plug Oct 30, 2026
b1192cb
ledger(F3): amendment R1, the locks and the run directory
88plug Oct 30, 2026
3b8d03b
ci(canary): the canary tests read the pinned versions from the tree
88plug Oct 30, 2026
26ecc9e
bench(wildct): the third module load, release 0.1.81 and smoke4, amen…
88plug Oct 30, 2026
e2b1580
Merge remote-tracking branch 'origin/main' into claude/sandbox-ownership
88plug Oct 30, 2026
345233b
Merge origin/main: ci.yml keeps both known-issues and canary-tests
88plug Oct 30, 2026
e32391b
Pin classes, pin-guard, scoped images-lock, tagged refs and tool pins…
88plug Oct 30, 2026
c77c22d
eat: tests for the guard's vLLM image by digest when deploy_guardrail…
88plug Oct 30, 2026
021b392
sandbox tests: the kubectl stub logs with printf; tag-only fixtures p…
88plug Oct 30, 2026
44e3391
eat: the guard's vLLM image by digest when deploy_guardrails is on
88plug Oct 30, 2026
8af6e5a
pins/classes: shared runners list the rows that reuse them
88plug Oct 30, 2026
68f0849
ledger(F3): amendment R2, what the secret scan counts
88plug Oct 30, 2026
460285e
ci(canary): the reference-form case's sed is not an unpinned image re…
88plug Oct 30, 2026
993605d
bench(h59): review fixes to amendment R1: CPU class, spares, interrup…
88plug Oct 30, 2026
d2857e7
chore(images): move the digests the registries re-pointed
88plug Oct 31, 2026
fa709bb
Merge origin/main into claude/h59-runner
88plug Nov 1, 2026
2f3cb53
ledger(H59): amendment R2, H59d's and H59w's load gate reads each arm…
88plug Nov 1, 2026
d6bd1f4
Merge origin/main into claude/fresh-alarm-release
88plug Nov 1, 2026
8401909
Merge origin/main into claude/fresh-bot-pr-ci
88plug Nov 1, 2026
5efce06
Merge origin/main into claude/fresh-pin-classes
88plug Nov 1, 2026
eb001d8
pins/classes: classify bench/h62 and list H62 on the eatflow lines it…
88plug Nov 1, 2026
da0a2e5
Merge #276 (autobump/image-digests) into the batch
88plug Nov 1, 2026
83faa0d
Merge #270 (claude/sandbox-ownership) into the batch
88plug Nov 1, 2026
13bdc49
Merge #275 (claude/eas-gapfill-g01-guard) into the batch
88plug Nov 1, 2026
0ee56e6
Merge #252 (claude/fresh-alarm-release) into the batch
88plug Nov 1, 2026
94b0b79
Merge #253 (claude/fresh-bot-pr-ci) into the batch
88plug Nov 1, 2026
4e4a302
Merge #258 (claude/fresh-canary) into the batch
88plug Nov 1, 2026
50deabe
Merge #265 (claude/fresh-pin-classes) into the batch
88plug Nov 1, 2026
532f1a0
batch: watchdog listens to Canary and Bot sweep; release variant loop…
88plug Nov 1, 2026
c38510d
Merge #268 (claude/h59-runner) into the batch
88plug Nov 1, 2026
6f87086
Merge #254 (claude/wildct-prep) into the batch
88plug Nov 1, 2026
3f9ca80
Merge #273 (claude/eas-functional-prereg) into the batch
88plug Nov 1, 2026
42f7d6a
batch: the release variant loop reads release-tags with while read (S…
88plug Nov 1, 2026
7ea6072
batch: watchdog test routes Canary and Bot sweep; H59 runner compares…
88plug Nov 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .github/workflows/aur-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@ on:
required: true
type: string

permissions:
contents: read

jobs:
deploy:
name: Publish k3d-gpu to AUR
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand All @@ -30,12 +34,29 @@ jobs:
echo "version=$REF" >> "$GITHUB_OUTPUT"
fi

# Releases build in parallel (one build-and-push queue per version), so an
# older release can reach this deploy after a newer one: AUR never moves back.
# When the AUR RPC cannot be read the deploy goes ahead.
- name: AUR already newer?
id: aur
env:
VER: ${{ steps.ver.outputs.version }}
run: |
cur=$(curl -fsSg --retry 3 --max-time 30 'https://aur.archlinux.org/rpc/v5/info?arg[]=k3d-gpu' \
| jq -r '.results[0].Version // empty' | cut -d- -f1) || cur=
if [ -n "$cur" ] && [ "$cur" != "$VER" ] && [ "$(printf '%s\n%s\n' "$cur" "$VER" | sort -V | tail -1)" = "$cur" ]; then
echo "AUR has k3d-gpu $cur, newer than $VER; leaving it"
echo "skip=true" >> "$GITHUB_OUTPUT"
fi

- name: Update PKGBUILD
if: steps.aur.outputs.skip != 'true'
run: |
sed -i "s/^pkgver=.*/pkgver=${{ steps.ver.outputs.version }}/" packaging/aur/PKGBUILD
sed -i "s/^pkgrel=.*/pkgrel=1/" packaging/aur/PKGBUILD

- name: Publish to AUR
if: steps.aur.outputs.skip != 'true'
uses: KSXGitHub/github-actions-deploy-aur@084b0d9b15415bf9cdb65d44dad1efe37a354050 # v4.2.0
with:
pkgname: k3d-gpu
Expand Down
45 changes: 38 additions & 7 deletions .github/workflows/auto-release.yml
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
name: Auto-release AUR

# Auto-tag a release on changes to packaging/, scripts/, share/ or the Dockerfile,
# and when build-and-push.yml's nightly check bumps upstream pins (dispatch).
# Auto-tag a release when a commit on main changes a path hack/release-paths lists
# (what the packages, the formula and the image ship: packaging/, scripts/,
# share/, the Dockerfile, console/, images.lock and the shipped bench/ and oracle/
# files), and when build-and-push.yml's nightly check bumps upstream pins
# (dispatch). The push paths: below repeat hack/release-paths (GitHub reads no
# file there); tests/ci_wiring_test.sh checks they are equal.
# Tag format: aur-vX.Y.Z. The launcher at that tag defaults to node image
# cryptoandcoffee/k3d-gpu:X.Y.Z, so after tagging this dispatches build-and-push.yml
# with release=X.Y.Z; that run publishes the image and then dispatches aur-deploy.yml.
# Dispatches bypass the GITHUB_TOKEN downstream-trigger limit.
#
# A dispatch's mode: force (the default) always releases; changed releases only
# when a commit above the last tag changed a shipped path (release_cas.sh runs as
# for a push), so a merge that a GITHUB_TOKEN push did not announce can still cut
# its release, and a dispatch with nothing shipped cuts none.
#
# hack/release_cas.sh releases from a fresh origin/main and pushes main and the
# tag in one atomic push (--atomic), retrying when another writer moved main or
# took the tag. On those lock and non-fast-forward races GitHub rejected both
# refs together in a branch-ref spike (not yet seen on a live release push); for
# other rejection classes a release commit can land
# without its tag, and the next run tags it in place. A push run whose commits
# an earlier run already released exits with no tag. The
# concurrency group only queues runs; correctness does not depend on it. Push and
# dispatch runs queue separately, so a pending forced dispatch is never replaced
# by a push run that finds nothing to release.
# concurrency group only queues runs; correctness does not depend on it. Push
# runs and each dispatch mode queue separately, so a pending forced dispatch is
# never replaced by a run that finds nothing to release.

on:
push:
Expand All @@ -26,7 +35,28 @@ on:
- 'scripts/**'
- 'share/**'
- 'Dockerfile'
- 'console/**'
- 'images.lock'
- 'bench/vs.py'
- 'bench/llm_load.py'
- 'bench/energy.sh'
- 'bench/agent_trace.py'
- 'bench/agent_trace_gen.py'
- 'bench/apb/apb.py'
- 'bench/apb/capacity.py'
- 'bench/competitors.lock'
- 'oracle/bundle.py'
- 'oracle/project.py'
- 'oracle/validate.py'
- 'oracle/share.py'
- 'oracle/schema/bundle-v1.json'
workflow_dispatch:
inputs:
mode:
description: 'force: always release; changed: release only when a shipped path changed since the last tag'
type: choice
options: [force, changed]
default: force

permissions:
contents: write
Expand All @@ -36,8 +66,9 @@ jobs:
release:
if: "github.actor != '88plug-bot' && !contains(github.event.head_commit.message, '[skip release]')"
runs-on: ubuntu-latest
timeout-minutes: 15
concurrency:
group: auto-release-${{ github.event_name }}
group: auto-release-${{ github.event_name }}-${{ inputs.mode || 'push' }}
cancel-in-progress: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -48,7 +79,7 @@ jobs:
- name: Release (atomic push of main and the tag)
id: rel
env:
EVENT: ${{ github.event_name }}
EVENT: ${{ github.event_name == 'workflow_dispatch' && inputs.mode == 'changed' && 'push' || github.event_name }}
run: |
git config user.name "88plug-bot"
git config user.email "andrew@88plug.com"
Expand Down
41 changes: 41 additions & 0 deletions .github/workflows/bot-sweep.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Bot sweep

# Hourly upkeep of the bot's PRs (branches autobump/*, opened by github-actions[bot]
# with GITHUB_TOKEN, so their own pull_request runs wait for approval).
#
# ci-fill: hack/bot-ci-dispatch runs ci.yml by workflow_dispatch on each bot PR
# branch with no run at its head, and re-runs a first-attempt failure
# once, one bot run in flight at a time and none while a human PR's CI
# is queued. It fills in what the nightly deferred.

on:
schedule:
- cron: '13 * * * *'
workflow_dispatch:

permissions: {}

concurrency:
group: bot-sweep
cancel-in-progress: false

jobs:
ci-fill:
name: CI on bot PRs
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
actions: write
contents: read
pull-requests: read
steps:
- name: Checkout main
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: main
persist-credentials: false

- name: Dispatch CI on bot PRs that have none at their head
env:
GH_TOKEN: ${{ github.token }}
run: hack/bot-ci-dispatch
Loading
Loading