This repository was archived by the owner on Nov 8, 2026. It is now read-only.
Repository navigation
Cancel superseded CI runs and bound Ubuntu mirror downloads #1130
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # M-series: fast validation of the Apple Silicon build wiring. Parses every | |
| # mkosi config (catches bad references/typos in mkosi.images/**) and syntax- | |
| # checks the layer's scripts. Does NOT build images — full arm64 builds run | |
| # via workflow_dispatch on Daily OS 9. | |
| name: Validate M-series wiring | |
| on: | |
| workflow_dispatch: | |
| pull_request: | |
| paths: | |
| - "rust/claude-pantheon-rs/**" | |
| - "Justfile" | |
| - "assemble-iso.sh" | |
| - "mkosi.conf" | |
| - "mkosi.images/**" | |
| - "mkosi.conf.d/**" | |
| - "mkosi.bump" | |
| - "repos/**" | |
| - "packages.arm64" | |
| - "transform/**" | |
| - "bin/**" | |
| - "mseries/**" | |
| - "docs/build-status.*" | |
| - "docs/capabilities.*" | |
| - "docs/local-build-status.html" | |
| - ".github/workflows/**" | |
| # New commits replace only checks for this workflow and PR. Publishing is not preempted. | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| jobs: | |
| teams-web: | |
| name: Teams desktop launcher contracts | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install desktop integration test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y python3-gi desktop-file-utils | |
| - name: Test without browsers, accounts or network | |
| run: | | |
| bash -n mseries/install-teams.sh | |
| python3 -B -m unittest discover -s mseries/teams-web -p 'test_*.py' -v | |
| speech-release: | |
| name: English F5 release contracts (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install private GTK test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y python3-gi gir1.2-gtk-4.0 gir1.2-ibus-1.0 gir1.2-atspi-2.0 dbus-x11 xvfb xauth | |
| - name: Verify source-only release, rollback and host checks | |
| run: | | |
| bash -n mseries/releases/v0.0.1/install.sh | |
| python3 -B -m unittest discover -s mseries/releases -p 'test_*.py' | |
| python3 -B mseries/releases/v0.0.1/test_preflight.py | |
| - name: Verify transcript-only UI without microphone or models | |
| run: | | |
| python3 -B mseries/dictation/speech-only-panel-smoke.py | |
| python3 -B mseries/dictation/speech-only-panel-smoke.py --default-review | |
| ui-scale: | |
| name: Size system ladder and Quick Settings text size (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install native GTK and private D-Bus test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y valac libgtk-4-dev libgranite-7-dev python3-gi gsettings-desktop-schemas libglib2.0-bin dbus-x11 xvfb xauth | |
| - name: Planner, dock token and size-lint unit tests | |
| run: python3 -m unittest discover -s mseries/ui-scale -p 'test_*.py' -v | |
| - name: RepoBar account and panel-preference tests (fake gh) | |
| run: python3 -B -m unittest discover -s mseries -p 'test_repobar_accounts.py' -v | |
| - name: No new hard-coded UI sizes (allowlist is the only exception) | |
| run: bash mseries/ui-scale/check-ui-sizes.sh --strict | |
| - name: Dock writers keep their shell syntax | |
| run: sh -n mseries/dock-policy/enable-permanent.sh | |
| - name: Compiled dock taskbar policy on isolated settings | |
| run: bash mseries/ui-scale/tests/test-taskbar-size.sh | |
| - name: Drive the text-size widget on a private display | |
| run: bash mseries/ui-scale/tests/test-text-scale.sh | |
| bluetooth: | |
| name: Quick Settings Bluetooth controls (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install native GTK and private D-Bus test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y valac libgtk-4-dev libgranite-7-dev python3-dbus python3-gi dbus-x11 xvfb xauth | |
| - name: Keep all Quick Settings builds on shared source preparation | |
| run: python3 mseries/quick-settings/tests/test-source-preparation.py | |
| - name: Exercise BlueZ controls without touching hardware | |
| run: bash mseries/quick-settings/tests/test-bluetooth.sh | |
| - name: Validate shared sliders and battery summary in both themes | |
| run: | | |
| python3 mseries/panel-ui-probes/run-probes.py --output "$RUNNER_TEMP/panel-ui" --theme light | |
| python3 mseries/panel-ui-probes/run-probes.py --output "$RUNNER_TEMP/panel-ui" --theme dark | |
| native-ui-responsiveness: | |
| name: Native UI asynchronous backends (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install private GTK fixture dependencies | |
| run: sudo apt-get update && sudo apt-get install -y python3-gi gir1.2-gtk-3.0 gir1.2-gtk-4.0 xvfb xauth dbus-x11 ffmpeg xdotool gir1.2-pango-1.0 python3-gi-cairo | |
| - name: Check responsiveness, error recovery and scale in both themes | |
| run: bash mseries/ui-audit/run-private-checks.sh "$RUNNER_TEMP/native-ui" | |
| - uses: actions/upload-artifact@v7 | |
| if: always() | |
| with: | |
| name: native-ui-responsiveness | |
| path: ${{ runner.temp }}/native-ui | |
| orchard: | |
| name: Orchard GTK output and lifecycle regressions (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install GTK and Granite test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y python3-gi gir1.2-gtk-4.0 gir1.2-granite-7.0 xvfb xauth dbus-x11 git meson ninja-build valac gcc pkg-config libgtk-4-dev libgranite-7-dev libgee-0.8-dev libjson-glib-dev libsoup-3.0-dev libsecret-1-dev | |
| - name: Test without a daemon or real guests | |
| run: | | |
| python3 -m py_compile mseries/orchard-incus/orchard_incus/*.py mseries/orchard-incus/tools/*.py | |
| xvfb-run -a env -u DBUS_SESSION_BUS_ADDRESS GSK_RENDERER=cairo GDK_BACKEND=x11 \ | |
| PYTHONWARNINGS=ignore::DeprecationWarning G_DEBUG=fatal-criticals \ | |
| python3 -m unittest discover -s mseries/orchard-incus/tests | |
| - name: Preserve screenshot originals across drag outcomes | |
| run: bash mseries/screenshot-shelf/test-retention.sh | |
| - name: Prepare native indicator API | |
| run: bash mseries/codexbar-wingpanel/probe/ci-build-deps.sh "$RUNNER_TEMP/orchard-prefix" >> "$GITHUB_ENV" | |
| - name: Build and test Orchard (machines, Incus, Podman) with the Wingpanel indicator | |
| run: | | |
| sudo apt-get install -y qemu-utils genisoimage curl | |
| meson setup "$RUNNER_TEMP/orchard-native" mseries/orchard -Dwingpanel=enabled | |
| meson compile -C "$RUNNER_TEMP/orchard-native" | |
| xvfb-run -a env GSK_RENDERER=cairo dbus-run-session -- meson test -C "$RUNNER_TEMP/orchard-native" --print-errorlogs | |
| work-mode: | |
| name: Windows Work Mode schedule and work-network rules (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install GSettings test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y python3-gi libglib2.0-bin gsettings-desktop-schemas iproute2 | |
| - name: Test with keyfile GSettings, a local IP service and no user services | |
| run: python3 -B mseries/work-mode/test_work_mode.py | |
| dock-startup: | |
| name: Dock startup and launcher regressions (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install native test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y git valac libglib2.0-dev | |
| - name: Verify activation, delayed Gala readiness and session stops | |
| run: | | |
| bash mseries/dock-tests/test-startup.sh | |
| bash mseries/dock-tests/test-running-apps.sh | |
| python3 mseries/dock-tests/test-launcher.py | |
| desktop-space: | |
| name: Native top-bar scale and notch GTK allocation (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install GTK test dependencies | |
| run: sudo apt-get update && sudo apt-get install -y git valac libgtk-4-dev libgranite-7-dev xvfb xauth build-essential python3-gi libglib2.0-bin | |
| - name: Test top-bar 130 percent measurement and allocation | |
| run: bash mseries/display-space/test-panel-scale.sh | |
| - name: Test production notch geometry and crowded panel allocation | |
| run: bash mseries/display-space/test-notch-layout.sh | |
| - name: Verify exact-kernel boot profile and rollback | |
| run: python3 -m unittest discover -s mseries/display-space -p 'test_*.py' | |
| orchard-app: | |
| name: Orchard app build, tests, metadata and Debian package (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install build dependencies | |
| run: sudo apt-get update && sudo apt-get install -y meson ninja-build valac gcc pkg-config libgtk-4-dev libgranite-7-dev libjson-glib-dev libsoup-3.0-dev libsecret-1-dev python3 appstream desktop-file-utils xvfb xauth dbus-x11 genisoimage curl qemu-utils | |
| - name: Build and run the tests (machines, QMP, clipboard, display, Incus, Podman, window) | |
| run: | | |
| meson setup build-orchard mseries/orchard -Dwingpanel=disabled | |
| meson compile -C build-orchard | |
| xvfb-run -a env GSK_RENDERER=cairo dbus-run-session -- meson test -C build-orchard --print-errorlogs | |
| - name: Check the version flag and desktop metadata | |
| run: | | |
| xvfb-run -a build-orchard/orchard --version | |
| desktop-file-validate mseries/orchard/data/com.github.techmore.orchard.desktop | |
| appstreamcli validate --no-net mseries/orchard/data/com.github.techmore.orchard.metainfo.xml | |
| - name: Build the Debian package | |
| run: | | |
| sudo apt-get install -y dpkg-dev | |
| ORCHARD_OUTPUT_DIR="$RUNNER_TEMP/orchard-deb" bash mseries/orchard/build-deb.sh | |
| # The dev branch protection still requires a status check with Machine Lab's old job name; this | |
| # alias satisfies it from the Orchard app job until the protection list names the new job. | |
| codexbar-wingpanel: | |
| name: CodexBar Wingpanel module, render and interaction probes (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install native build and headless test dependencies | |
| run: >- | |
| sudo apt-get update && sudo apt-get install -y git meson ninja-build valac gcc pkg-config | |
| libgtk-4-dev libjson-glib-dev libgee-0.8-dev libgranite-7-dev sassc gettext | |
| libadwaita-1-dev libx11-dev libwayland-dev libwayland-bin | |
| python3 python3-gi xvfb xauth dbus-x11 librsvg2-common xdotool ffmpeg | |
| - name: Provide Granite 7.7 and the pinned Wingpanel indicator API when the distro lacks them | |
| run: bash mseries/codexbar-wingpanel/probe/ci-build-deps.sh "$RUNNER_TEMP/prefix" >> "$GITHUB_ENV" | |
| - name: Build the module; run unit tests, generated-C guard, Switch/ingestion/token/Grok probes | |
| run: | | |
| meson setup "$RUNNER_TEMP/codexbar" mseries/codexbar-wingpanel | |
| ninja -C "$RUNNER_TEMP/codexbar" | |
| meson test -C "$RUNNER_TEMP/codexbar" --print-errorlogs | |
| bash mseries/dock-taskbar/test-build.sh | |
| - name: RepoBar resolved-account cache and private indicator race/error probes | |
| run: | | |
| meson setup "$RUNNER_TEMP/repobar" mseries/repobar-wingpanel | |
| meson compile -C "$RUNNER_TEMP/repobar" | |
| bash mseries/repobar-wingpanel/probe/test-account-cache.sh "$RUNNER_TEMP/repobar" | |
| calendar-agenda: | |
| name: Calendar Events/Tasks/Homeboard agenda on a private EDS (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install build and headless EDS test dependencies | |
| run: >- | |
| sudo apt-get update && sudo apt-get install -y git meson ninja-build valac gcc pkg-config gettext sassc | |
| libgtk-4-dev libgranite-7-dev libadwaita-1-dev libgee-0.8-dev libjson-glib-dev libecal2.0-dev libedataserver1.2-dev | |
| libical-dev evolution-data-server gsettings-desktop-schemas libglib2.0-bin python3 xvfb xauth dbus | |
| dbus-x11 librsvg2-common accountsservice | |
| - name: Add elementary's AccountsService extension (the clock reads its TimeFormat) | |
| run: | | |
| # elementary/default-settings, GPL-3.0; the same file elementary OS installs. | |
| url=https://raw.githubusercontent.com/elementary/default-settings/915d1a0b63865ce3f0d44a68318d55ef9ca90fe6/accountsservice/io.elementary.pantheon.AccountsService.xml | |
| sudo curl -fsSL "$url" -o /usr/share/dbus-1/interfaces/io.elementary.pantheon.AccountsService.xml | |
| sudo mkdir -p /usr/share/accountsservice/interfaces | |
| sudo ln -sf ../../dbus-1/interfaces/io.elementary.pantheon.AccountsService.xml /usr/share/accountsservice/interfaces/ | |
| sudo systemctl restart accounts-daemon | |
| - name: Build the pinned indicator with our patch and run every agenda group | |
| run: bash mseries/calendar/ci-test-agenda.sh "$RUNNER_TEMP/agenda" | |
| validate: | |
| name: mkosi summary + script checks (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v7 | |
| - name: Fetch the immutable capability audit source | |
| run: | | |
| audit_revision=$(python3 -c 'import json; print(json.load(open("docs/capabilities.json"))["source_revision"])') | |
| [[ "$audit_revision" =~ ^[0-9a-f]{40}$ ]] || exit 1 | |
| git fetch --no-tags --depth=1 origin "$audit_revision" | |
| - name: Install deps | |
| run: sudo apt-get update && sudo apt-get install just podman zstd bison flex device-tree-compiler mtools fdisk shellcheck dpkg-dev -y | |
| # The check list lives in mseries/validate.sh so the same command works on a | |
| # developer machine (`just check`); add new checks there, not here. | |
| - name: Syntax, shellcheck and unit checks (bash mseries/validate.sh) | |
| run: bash mseries/validate.sh | |
| # codeload.github.com rate-limits busy runners (HTTP 429 failed PR #290 after | |
| # two one-second retries). Keep the pinned tarball in the Actions cache and, | |
| # on a miss, retry for up to ~3 minutes before giving up. | |
| - name: Restore the pinned Fairydust source tarball | |
| id: fairydust-cache | |
| uses: actions/cache@v6 | |
| with: | |
| path: ${{ runner.temp }}/fairydust.tar.gz | |
| key: fairydust-source-ce9f2eba72c061a50b2d790450e90af3439d8c24 | |
| - name: Download the pinned Fairydust source tarball | |
| if: steps.fairydust-cache.outputs.cache-hit != 'true' | |
| run: | | |
| set -euo pipefail | |
| curl --fail --location --retry 6 --retry-delay 30 --retry-all-errors \ | |
| --proto '=https' --tlsv1.2 \ | |
| https://codeload.github.com/AsahiLinux/linux/tar.gz/ce9f2eba72c061a50b2d790450e90af3439d8c24 \ | |
| -o "$RUNNER_TEMP/fairydust.tar.gz" | |
| - name: Validate experimental dock patches offline | |
| run: | | |
| set -euo pipefail | |
| python3 mseries/fairydust/usb4/tools/validate-dock-patches.py --archive "$RUNNER_TEMP/fairydust.tar.gz" --output "$RUNNER_TEMP/dock-patch-validation" | |
| - name: mkosi config parse check (all images) | |
| run: | | |
| set -euo pipefail | |
| just mkosi summary | tee /tmp/mseries-mkosi-summary.txt | |
| python3 mseries/test-image-wiring.py --summary /tmp/mseries-mkosi-summary.txt | |
| hardware-support: | |
| name: Hardware diagnostics and recovery fixtures | |
| runs-on: ubuntu-26.04-arm | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Install offline test tools | |
| run: sudo apt-get update && sudo apt-get install -y mtools fdisk shellcheck python3-libarchive-c keyutils | |
| - name: Validate hardware ports without target hardware | |
| run: | | |
| set -euo pipefail | |
| python3 -m unittest discover -s mseries/aurora-sep -p 'test_touchid*.py' | |
| python3 -m unittest discover -s mseries/power -p 'test_diagnostics.py' | |
| python3 -B -m unittest discover -s mseries/power -p 'test_sensors.py' | |
| MSERIES_REQUIRE_ESP_TOOLS=1 python3 -m unittest discover -s mseries/hardware -p 'test_*.py' | |
| bash mseries/hardware/test-bluetooth.sh | |
| shellcheck -S warning mseries/install-hardware-support.sh mseries/hardware/bluetooth-resume-fix mseries/hardware/bluetooth-supported mseries/power/mseries-sleep-cost-hook | |
| bash -n mseries/enhance.sh mseries/stage-factory-enhancements.sh mseries/aurora-sep/install-touchid-gui.sh | |
| python3 mseries/test-image-wiring.py | |
| python3 mseries/video-decode/test-brave-factory.py | |
| python3 mseries/video-decode/test-youtube-launch.py | |
| python3 mseries/boot/test-prepare-uki-kernels.py | |
| python3 mseries/test-power-install.py | |
| python3 mseries/test-omdrop-installer.py | |
| python3 -m unittest discover -s mseries/omdrop-awdl/tests | |
| python3 -m unittest discover -s mseries/omdrop/tests | |
| claude-pantheon-rs: | |
| name: Claude (T3 client) build, tests, desktop metadata and .deb (arm64) | |
| runs-on: ubuntu-26.04-arm | |
| timeout-minutes: 45 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| # The crate pins gtk4 0.11 (v4_20) and granite-rs 3.3 (v7_8); Ubuntu's libgranite-7-dev is 7.8, enough | |
| # for the bindings, so no PPA is needed here (RUST-UPSTREAM-MAINTENANCE.md). The indicator needs the | |
| # wingpanel-9 API, which the daily PPA ships. | |
| - name: Add elementary daily PPA (wingpanel-9 for the indicator) | |
| run: | | |
| for attempt in 1 2 3 4 5; do | |
| if sudo add-apt-repository -y ppa:elementary-os/daily && sudo apt-get update; then exit 0; fi | |
| echo "attempt $attempt failed; retrying" >&2 | |
| sleep $((attempt * 20)) | |
| done | |
| echo "the elementary daily PPA is unreachable" >&2 | |
| exit 1 | |
| - name: Install build dependencies | |
| run: | | |
| for attempt in 1 2 3 4 5; do | |
| if sudo apt-get install -y --no-install-recommends -o Acquire::Retries=5 \ | |
| cargo rustc rustfmt rust-clippy pkg-config libgtk-4-dev libgranite-7-dev \ | |
| meson ninja-build valac libwingpanel-9-dev libjson-glib-dev libgee-0.8-dev \ | |
| libgtksourceview-5-dev libvte-2.91-gtk4-dev libwebkitgtk-6.0-dev \ | |
| librsvg2-bin dpkg-dev appstream desktop-file-utils xvfb xauth dbus-x11; then exit 0; fi | |
| echo "attempt $attempt failed; retrying" >&2 | |
| sudo apt-get update || true | |
| sleep $((attempt * 30)) | |
| done | |
| exit 1 | |
| - uses: actions/cache@v6 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| rust/target | |
| key: claude-pantheon-rs-${{ runner.arch }}-${{ hashFiles('rust/Cargo.lock') }} | |
| restore-keys: claude-pantheon-rs-${{ runner.arch }}- | |
| - name: Formatting and lints (cargo fmt --check, clippy -D warnings) | |
| run: | | |
| cd rust | |
| cargo fmt -p claude-pantheon-rs --check | |
| cargo clippy --release -p claude-pantheon-rs --all-targets -- -D warnings | |
| - name: Build and run the protocol and model tests (recorded frames) | |
| run: | | |
| cd rust | |
| cargo build --release -p claude-pantheon-rs | |
| cargo test --release -p claude-pantheon-rs --lib | |
| # Upstream moves daily; a drift here is a note to run scripts/refresh-contracts.sh, not a red build. | |
| - name: Contracts drift against pingdotgg/t3code main (advisory) | |
| continue-on-error: true | |
| run: | | |
| cd rust/claude-pantheon-rs | |
| if ! T3_CONTRACTS_REPO="$RUNNER_TEMP/t3code" ./scripts/refresh-contracts.sh --check; then | |
| echo "::warning title=T3 contracts drift::contracts/ no longer matches t3code main; run rust/claude-pantheon-rs/scripts/refresh-contracts.sh" | |
| exit 1 | |
| fi | |
| - name: Check the desktop entry and the AppStream metainfo | |
| run: | | |
| desktop-file-validate rust/claude-pantheon-rs/data/io.github.techmore.ClaudePantheonRs.desktop | |
| appstreamcli validate --no-net rust/claude-pantheon-rs/data/io.github.techmore.ClaudePantheonRs.metainfo.xml | |
| - name: Indicator probe (headless) | |
| run: | | |
| meson setup "$RUNNER_TEMP/indicator" rust/claude-pantheon-rs/wingpanel-indicator | |
| meson compile -C "$RUNNER_TEMP/indicator" | |
| xvfb-run -a env GSK_RENDERER=cairo dbus-run-session -- meson test -C "$RUNNER_TEMP/indicator" --print-errorlogs | |
| - name: Build the Debian package | |
| run: CLAUDE_PANTHEON_OUTPUT_DIR="$RUNNER_TEMP/cpr-deb" bash rust/claude-pantheon-rs/build-deb.sh | |
| - name: Upload the package | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: claude-pantheon-rs-deb-${{ github.run_id }} | |
| path: ${{ runner.temp }}/cpr-deb/*.deb | |
| retention-days: 14 |