Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
e542500
refactor: begin kernal-api filesystem capability migration
zackees Sep 13, 2026
a4ccb2c
refactor: move tree fingerprinting and mechanism tests into kernal-api
zackees Sep 13, 2026
5d3569d
refactor: delegate contained process lifecycle to kernal-api
zackees Sep 13, 2026
1fdb7e2
docs: track upstream process cleanup validation and hash migration
zackees Sep 13, 2026
b78952e
refactor: move SHA-256 mechanisms behind kernal-api
zackees Sep 13, 2026
5f14ec7
refactor: resolve user homes through kernal-api filesystem
zackees Sep 13, 2026
d4b7d1c
docs: record archive migration foundation and remaining gates
zackees Sep 13, 2026
2f303bc
docs: record ZIP link and real-archive validation progress
zackees Sep 13, 2026
0259c32
docs: record archive facade acceptance and review progress (refs #237)
zackees Sep 13, 2026
f4f8bd0
refactor: delegate archive extraction to kernal-api (refs #237)
zackees Sep 13, 2026
8a42749
docs: track rebased upstream archive PR and CI gates
zackees Sep 13, 2026
67059c9
docs: track full HTTP migration scope and initial facade evidence
zackees Sep 13, 2026
84c53ba
docs: record HTTP request progress and merged upstream capabilities
zackees Sep 13, 2026
be6175b
docs: record archive Windows readiness failure for follow-up
zackees Sep 13, 2026
8a3a6f8
docs: record archive marker fix and fresh validation
zackees Sep 13, 2026
9fdd9fe
docs: record HTTP streaming and Windows archive correction
zackees Sep 13, 2026
c9467c2
docs: record blocking HTTP adapter and isolation checks
zackees Sep 13, 2026
1814a87
docs: record archive merge and bounded HTTP redirects
zackees Sep 13, 2026
75165a5
docs: record HTTP cancellation and redirect validation
zackees Sep 13, 2026
6531600
feat: route archive downloads through kernel HTTP (refs #238)
zackees Sep 13, 2026
b2eb176
feat: migrate blocking HTTP callers to kernel (refs #238)
zackees Sep 13, 2026
de8e6c0
feat: migrate DWARF HTTP and remove production reqwest (refs #238)
zackees Sep 13, 2026
c5f6376
refactor: remove direct reqwest dependency via kernel HTTP tests
zackees Sep 13, 2026
de59cde
docs: record HTTP review fixes and validation (refs #238)
zackees Sep 13, 2026
e743f21
docs: record deterministic HTTP TLS validation (refs #238)
zackees Sep 13, 2026
2a5e800
build: adopt audited kernel HTTP parser (refs #238)
zackees Sep 13, 2026
09b1fcf
refactor: use kernel runtimes and basic timers (refs #239)
zackees Sep 13, 2026
ac1edb0
refactor: use kernel task ownership and event channels (refs #239)
zackees Sep 13, 2026
fbdc796
refactor: route bounded command channels through kernal-api
zackees Sep 13, 2026
ab0b3eb
refactor: use kernel timers and semaphore admission
zackees Sep 13, 2026
c4b783e
refactor: move broadcast and SSE stream delivery behind kernal-api
zackees Sep 13, 2026
f37008b
refactor(server): persist screenshots through bounded kernel file I/O
zackees Sep 13, 2026
f332ebd
test(server): capture HTTP route and browser header parity baseline
zackees Sep 13, 2026
1541aaf
refactor(server): adopt kernel HTTP routing and streaming
zackees Sep 13, 2026
7506db4
test(server): cover malformed-request browser header boundaries
zackees Sep 13, 2026
0c6bfa0
build: remove obsolete direct manifest dependencies
zackees Sep 13, 2026
4afcaf7
docs: record registry release gate and remaining capability gaps
zackees Sep 13, 2026
d068f93
refactor: generate test capability entropy through kernal-api
zackees Sep 13, 2026
a27f9a4
refactor: own temporary directories through kernal-api
zackees Sep 13, 2026
61993b4
refactor: score sketch suggestions through kernal-api
zackees Sep 13, 2026
85c8b8d
refactor: adopt kernel terminal input and styling (refs #229)
zackees Sep 13, 2026
b091c48
refactor: use kernel-owned interrupt waits (refs #229)
zackees Sep 13, 2026
fc79549
refactor: remove direct Tokio dependency (refs #243)
zackees Sep 13, 2026
a8c172f
refactor: use kernel compile-target facts instead of ctcb-core (refs …
zackees Sep 13, 2026
49ee138
docs: record remaining native viewer migration gaps (refs #229)
zackees Sep 13, 2026
6680188
docs: track bootstrap and interactive viewer lifetime gaps (refs #229)
zackees Sep 13, 2026
be51031
docs: track interactive viewer lifetime migration
zackees Sep 13, 2026
482381e
refactor(viewer): adopt kernal-api native hosting (refs #229)
zackees Sep 13, 2026
f3fe05d
chore: remove unused Python runtime requirements (refs #245)
zackees Sep 13, 2026
811142c
fix: relocate Emscripten config before toolchain publication (refs #246)
zackees Sep 13, 2026
0a9f06c
refactor: use kernel-owned POSIX argument parsing
zackees Sep 13, 2026
fb3808b
refactor(config): consume kernal-api TOML documents
zackees Sep 13, 2026
8f61d5e
refactor(source): consume kernal-api C++ analysis
zackees Sep 13, 2026
1f8113e
refactor(json): adopt kernel project and DWARF smoke documents
zackees Sep 13, 2026
a808d12
refactor(editor): use kernel JSON for configuration and tests
zackees Sep 13, 2026
42c6f53
refactor(source): use kernal-api JSON for source receipts
zackees Sep 13, 2026
1518ef4
refactor(debug): use kernal-api JSON for debugger manifests
zackees Sep 13, 2026
a067d76
refactor(server): use kernal-api JSON for HTTP schemas
zackees Sep 13, 2026
a6b817f
refactor(cache): use kernal-api JSON for artifact metadata
zackees Sep 13, 2026
158d43e
refactor(snapshot): use kernal-api JSON and isolate editor outputs
zackees Sep 13, 2026
55891c1
refactor(build): use kernal-api JSON for compiler flags cache
zackees Sep 13, 2026
e795210
refactor(build): move asset manifests to kernal-api JSON
zackees Sep 13, 2026
6d77228
refactor(install): use kernal-api JSON for toolchain state
zackees Sep 13, 2026
b904109
refactor(install): finish kernal-api JSON migration and remove Serde
zackees Sep 13, 2026
888232b
chore(kernel): enable command schema migration feature
zackees Sep 13, 2026
fea3d6a
refactor(cli): route management commands through kernal-api
zackees Sep 13, 2026
13afa60
refactor(cli): model primary grammar with kernal-api
zackees Sep 13, 2026
d244805
refactor(cli): map primary arguments through kernal-api
zackees Sep 13, 2026
dbe77d7
refactor(cli): remove direct clap dependency
zackees Sep 13, 2026
06a85e3
refactor(cli): route application errors through kernal-api
zackees Sep 13, 2026
ced1acb
chore: rebase kernal migration onto terminal mainline
zackees Sep 13, 2026
06f6961
refactor(terminal): use kernal websocket and pty sessions
zackees Sep 13, 2026
95ba653
fix(ci): resolve kernal migration override remotely
zackees Sep 13, 2026
318959d
fix(terminal): retain bounded acknowledgement flow
zackees Sep 13, 2026
8d3b9ed
chore: ingest kernal Windows portability fix
zackees Sep 13, 2026
59e5a91
test: ingest kernal PTY ownership coverage
zackees Sep 13, 2026
f57645b
chore: target kernal-api 0.1.1 release candidate
zackees Sep 13, 2026
7864204
chore: target kernal-api 0.1.2 release candidate
zackees Sep 13, 2026
242c53b
chore: ingest kernal Windows ACL fix
zackees Sep 13, 2026
c923119
chore: ingest kernal ACL test diagnostics
zackees Sep 13, 2026
59ae1e2
chore: advance kernal-api migration pin
zackees Sep 13, 2026
784b328
fix: advance kernal-api migration pin
zackees Sep 13, 2026
ea41521
fix: pin Windows-compilable kernal-api revision
zackees Sep 13, 2026
f38eae2
fix: pin merged kernal-api Windows fix
zackees Sep 13, 2026
eb5a51d
build: consume released kernal-api v0.1.3 and enforce sole dependency
zackees Sep 14, 2026
0ff5112
docs: record final kernal-api migration audit
zackees Sep 14, 2026
966c735
build: consume kernal-api v0.1.4 for WebKitGTK OffscreenCanvas WebGL
zackees Sep 15, 2026
dc5665c
fix(viewer): render on the main thread when OffscreenCanvas has no We…
zackees Sep 15, 2026
427d19f
build: consume kernal-api v0.1.5, which stops forcing worker WebGL
zackees Sep 15, 2026
02f94c1
Merge remote-tracking branch 'origin/main' into feat/kernal-api-migra…
zackees Sep 15, 2026
a919ed7
ci: cross-compiled macOS live test on pull requests
zackees Sep 15, 2026
cae9876
ci: install current Soldr for the macOS cross-build lane
zackees Sep 15, 2026
43568d8
ci: package the macOS wheel for the cross target
zackees Sep 15, 2026
e1c9580
test: locate the fastled CLI at runtime when run from a nextest archive
zackees Sep 15, 2026
80b7799
build: embed Windows executable resources through kernal-api v0.1.6
zackees Sep 15, 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
91 changes: 3 additions & 88 deletions .github/workflows/_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,96 +116,11 @@ jobs:
uv run --with "setuptools>=69" --with "wheel>=0.43" python setup.py bdist_wheel
fi

# This deliberately runs the packaged console script outside this
# checkout. It exercises the wheel's bundled Rust binary and frontend,
# rather than development fallbacks such as CARGO_MANIFEST_DIR.
# Installs the wheel into a fresh venv and runs the packaged console
# script outside this checkout, in the shipped viewer.
- name: Smoke test installed wheel in shipped viewer
if: inputs.wheel-smoke
run: |
set -euo pipefail
SMOKE_ROOT="$RUNNER_TEMP/fastled-wheel-smoke"
rm -rf "$SMOKE_ROOT"
mkdir -p "$SMOKE_ROOT/home" "$SMOKE_ROOT/sketch/data" "$SMOKE_ROOT/artifacts" "$SMOKE_ROOT/asset-origin"
uv venv "$SMOKE_ROOT/venv" --python "$UV_PYTHON"
uv pip install --python "$SMOKE_ROOT/venv/bin/python" dist/*.whl
test -x "$SMOKE_ROOT/venv/bin/uv"
BASE_PYTHON_DIR="$("$SMOKE_ROOT/venv/bin/python" -c 'from pathlib import Path; import sys; print(Path(sys.executable).resolve().parent)')"
test ! -e "$BASE_PYTHON_DIR/uv"
cp -R "$GITHUB_WORKSPACE/tests/fixtures/wasm_vfs/." "$SMOKE_ROOT/sketch/"
cp "$GITHUB_WORKSPACE/tests/fixtures/wasm_vfs_origin/probe.txt" "$SMOKE_ROOT/asset-origin/probe.txt"
cat > "$SMOKE_ROOT/sketch/data/probe.txt.lnk" <<'EOF'
http://127.0.0.1:18765/probe.txt
sha256=2da77f7c1452125633beeeb43f366350018643c799306b4d24d8610d98f02b55
size_bytes=15
storage=vfs
EOF
cat > "$SMOKE_ROOT/asset_server.py" <<'PY'
import http.server
import sys

class Handler(http.server.SimpleHTTPRequestHandler):
def end_headers(self):
self.send_header("Access-Control-Allow-Origin", "*")
self.send_header("Cross-Origin-Resource-Policy", "cross-origin")
super().end_headers()

def log_message(self, *_args):
pass

handler = lambda *args, **kwargs: Handler(*args, directory=sys.argv[1], **kwargs)
http.server.ThreadingHTTPServer(("127.0.0.1", 18765), handler).serve_forever()
PY
"$SMOKE_ROOT/venv/bin/python" "$SMOKE_ROOT/asset_server.py" "$SMOKE_ROOT/asset-origin" &
ASSET_SERVER_PID=$!
trap 'kill "$ASSET_SERVER_PID" 2>/dev/null || true' EXIT
for _attempt in {1..20}; do
if curl --fail --silent http://127.0.0.1:18765/probe.txt >/dev/null; then break; fi
sleep 0.25
done
curl --fail --silent http://127.0.0.1:18765/probe.txt >/dev/null

# The installed launcher must supply absolute wheel-venv uv, Python,
# and frontend paths to the Rust binary. Deliberately omit ambient
# uv, node, and bare python so this cannot accidentally pass by
# resolving a developer tool from the runner image.
cd "$SMOKE_ROOT"
env -i \
HOME="$SMOKE_ROOT/home" \
PATH="/usr/bin:/bin:/usr/sbin:/sbin" \
/bin/bash -ceu '
for tool in uv node python; do
if command -v "$tool" >/dev/null 2>&1; then
echo "unexpected ambient $tool on restricted PATH" >&2
exit 1
fi
done
'
env -i \
HOME="$SMOKE_ROOT/home" \
PATH="/usr/bin:/bin:/usr/sbin:/sbin" \
"$SMOKE_ROOT/venv/bin/fastled" "$SMOKE_ROOT/sketch" \
--check \
--test-wait-secs=2 \
--test-timeout-secs=240 \
--test-ready-timeout-secs=45 \
--test-screenshot="$SMOKE_ROOT/artifacts/screenmap.png" \
--test-log="$SMOKE_ROOT/artifacts/viewer.log"
grep -F "Asset 'data/probe.txt' sha256 verified" "$SMOKE_ROOT/artifacts/viewer.log"
grep -F "All 1 filesystem asset(s) loaded completely before setup()." "$SMOKE_ROOT/artifacts/viewer.log"
"$SMOKE_ROOT/venv/bin/python" - "$SMOKE_ROOT/artifacts/screenmap.png" <<'PY'
from pathlib import Path
import sys

image = Path(sys.argv[1]).read_bytes()
if image[:8] != b"\x89PNG\r\n\x1a\n":
raise SystemExit("viewer screenshot is not a PNG")
if image[12:16] != b"IHDR" or len(image) < 24:
raise SystemExit("viewer screenshot is missing its IHDR header")
width = int.from_bytes(image[16:20], "big")
height = int.from_bytes(image[20:24], "big")
if width <= 0 or height <= 0:
raise SystemExit(f"viewer screenshot has invalid dimensions: {width}x{height}")
PY
run: bash ci/smoke_installed_wheel.sh

- name: Upload installed wheel viewer screenshot
if: always() && inputs.wheel-smoke
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/macos-arm-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS ARM Build
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/macos-arm-integration-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS ARM Integration Test
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/macos-arm-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS ARM Lint
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
161 changes: 161 additions & 0 deletions .github/workflows/macos-arm-live-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
name: macOS ARM Live Test

# Apple Silicon coverage for pull requests without compiling on a Mac.
#
# `cross-build` produces everything on Linux through Soldr's cross toolchain
# (bundled LLVM plus the managed macOS SDK):
# - the release `fastled` binary,
# - the macOS wheel that bundles it,
# - a nextest archive of the workspace's Rust tests.
#
# `run-on-macos` holds the macos-15 runner only to execute them:
# - the Rust test archive,
# - the installed wheel's live render in the shipped WKWebView viewer,
# - a real Safari smoke test of the same compiled sketch.
#
# The native macOS build/lint/test workflows no longer run on pull requests;
# they still run on main pushes and manual dispatch.
# #251 tracks moving the execution into a docker-mac-x64 guest on Linux.

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
# superseded run instead of queuing behind it in the shared account-wide runner
# pool. Runs on main get a unique group, so they are never cancelled or coalesced.
concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.run_id || github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

env:
RUST_TARGET: aarch64-apple-darwin
TEST_ARCHIVE: fastled-macos-arm64-tests.tar.zst

jobs:
cross-build:
runs-on: ubuntu-latest
timeout-minutes: 45
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4

- uses: astral-sh/setup-uv@v5
with:
enable-cache: true
python-version: "3.11.9"

- name: Install Python
run: uv python install "$UV_PYTHON"

# Same pin as kernal-api's Apple cross lanes. It installs a current
# Soldr with `soldr build --target` and the managed macOS SDK; the
# v0.9.62 action used elsewhere here pins Soldr 0.7.51 (see #158),
# which has neither.
- uses: zackees/setup-soldr@bb28e96d2dc32c058242f56722297caf1efcbd90
env:
GITHUB_TOKEN: ${{ github.token }}
with:
cache-key-suffix: macos-arm-live-cross
cross-targets: aarch64-apple-darwin
toolchain-file: rust-toolchain.toml
prebuild-deps-flags: ""

# setup.py always rebuilds the bundled binary with
# `soldr cargo build --release --bin fastled [--target $FASTLED_RUST_TARGET]`.
# Build with exactly that command first so its rebuild is a no-op. The
# explicit target also keeps host build scripts on the host linker.
- name: Cross-build the release fastled binary
run: soldr cargo build --release --bin fastled --target "$RUST_TARGET"

- name: Package the macOS wheel
env:
FASTLED_RUST_TARGET: ${{ env.RUST_TARGET }}
run: |
uv run --with "setuptools>=69" --with "wheel>=0.43" python setup.py bdist_wheel --plat-name macosx_11_0_arm64
# The bundled binary must be an arm64 Mach-O, not a host binary.
test "$(od -A n -t x1 -N 8 src/fastled/bin/fastled | tr -d ' \n')" = "cffaedfe0c000001"
ls -l dist/

- name: Archive the Rust tests for macOS
run: soldr cargo nextest archive --workspace --target "$RUST_TARGET" --archive-file "$TEST_ARCHIVE"

- uses: actions/upload-artifact@v4
with:
name: macos-arm-live-inputs
path: |
dist/*.whl
${{ env.TEST_ARCHIVE }}
if-no-files-found: error
retention-days: 1

run-on-macos:
needs: cross-build
runs-on: macos-15
timeout-minutes: 40
defaults:
run:
shell: bash
env:
PYTHONIOENCODING: utf-8
steps:
# The checkout provides the test fixtures and smoke scripts, and the
# workspace the test archive is remapped onto. Nothing is compiled.
- uses: actions/checkout@v4

- uses: astral-sh/setup-uv@v5
with:
enable-cache: true
python-version: "3.11.9"

- name: Install Python
run: uv python install "$UV_PYTHON"

- uses: actions/download-artifact@v4
with:
name: macos-arm-live-inputs
path: macos-arm-live-inputs

- name: Install cargo-nextest
run: |
mkdir -p "$HOME/.cargo/bin"
curl -LsSf https://get.nexte.st/latest/mac | tar zxf - -C "$HOME/.cargo/bin"
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"

- name: Run the cross-built Rust tests
# The frontend path is compiled in from the Linux builder
# (CARGO_MANIFEST_DIR); FASTLED_FRONTEND_DIR points tests at this
# checkout instead, the same override the installed wheel uses.
env:
FASTLED_FRONTEND_DIR: ${{ github.workspace }}/src/fastled/frontend
run: >-
cargo-nextest nextest run
--archive-file "macos-arm-live-inputs/$TEST_ARCHIVE"
--workspace-remap .

# The render and Safari checks still run when a Rust test fails, so one
# cycle reports every macOS result.
- name: Enable Safari automation
if: ${{ !cancelled() }}
run: sudo safaridriver --enable

- name: Live viewer render and Safari smoke of the installed wheel
if: ${{ !cancelled() }}
env:
FASTLED_SAFARI_SMOKE: "1"
run: |
mkdir -p dist
cp macos-arm-live-inputs/dist/*.whl dist/
bash ci/smoke_installed_wheel.sh

- name: Upload screenshots, logs and Safari state
if: always()
uses: actions/upload-artifact@v4
with:
name: macos-arm-live-results
path: ${{ runner.temp }}/fastled-wheel-smoke/artifacts/
if-no-files-found: warn
3 changes: 2 additions & 1 deletion .github/workflows/macos-arm-unit-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS ARM Unit Test
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/macos-x86-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS x86 Build
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/macos-x86-integration-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS x86 Integration Test
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/macos-x86-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS x86 Lint
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/macos-x86-unit-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ name: macOS x86 Unit Test
on:
push:
branches: [main]
pull_request:
# Pull requests run macos-arm-live-test.yml instead: it cross-compiles on
# Linux and holds a macOS runner only to execute the result.
workflow_dispatch:

# One live run per workflow per ref: a new push to a branch or PR cancels the
Expand Down
Loading
Loading