Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
name: Core knows no features
# Source contracts and native regressions on every firmware change:
#
# check_boundaries.py — the core/feature boundary, mechanically. The rule
# ("the core names no feature") lived in comments and was violated three
# times before it grew teeth; on its first run the checker also found a
# fourth (the sketch comparing a pattern name against the show scheduler's
# "Black"). Prose does not hold; a failing build does.
#
# check_sources.py — mangled string literals and raw control bytes, the
# patch-script damage that compiles into garbage or reports its error
# thirty lines from the cause.
#
# check_math.py — the accuracy of core_math.h, core_color.h and core_noise.h,
# pinned as bands. abi/pf_module.h includes those three files into every .pfm,
# so they are the published pattern SDK, and until this check nothing here ran
# a number through any of them: their behaviour was asserted only in
# doc-comments, two of which were wrong about their own function. A row that
# moves in EITHER direction fails, because a change to these headers changes
# what every pattern built afterwards renders — and reaches only newly built
# modules, since an installed .pfm carries its own compiled copy.
#
# The blit, thumbnail mailbox, network recovery and ELF bounds also run on a
# host C++ compiler with ASan/UBSan. The four-composition Xtensa compile stays
# local (`firmware/bundles/build.sh all`) and remains required for core edits.
on:
pull_request:
paths:
- "firmware/patternflow/**"
- "firmware/bundles/**"
- "firmware/modules/**"
- "firmware/toolchain/**"
- "web/src/lib/presets/**"
- "web/public/packs/basics.zip"
# The version lives in six files; check_versions.py reads these three too.
- "web/public/flash/**"
- "web/src/app/editions/editions-data.ts"
- "AGENTS.md"
- ".github/workflows/firmware-checks.yml"
push:
branches: [main]
paths:
- "firmware/patternflow/**"
- "firmware/bundles/**"
- "firmware/modules/**"
- "firmware/toolchain/**"
- "web/public/packs/basics.zip"
- "web/public/flash/**"
- "web/src/app/editions/editions-data.ts"
- "AGENTS.md"
concurrency:
group: firmware-checks-${{ github.ref }}
cancel-in-progress: true
permissions: {}
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: The core names no feature
run: python firmware/toolchain/check_boundaries.py
- name: The module ABI does not move silently
run: python firmware/toolchain/check_abi_freeze.py
- name: Module ELF bounds and shipped patterns
run: python firmware/toolchain/check_module_elf.py --sanitize
- name: HUB75 colour planes and control bits
run: python firmware/toolchain/check_blit.py --sanitize
- name: Panel plane weights and monotone response
run: python firmware/toolchain/check_oe.py --sanitize
- name: Pattern SDK maths, colour and noise still measure the same
run: python firmware/toolchain/check_math.py --sanitize
- name: Thumbnail mailbox ownership and invalidation
run: python firmware/toolchain/check_thumbs.py --sanitize
- name: Wi-Fi and name-service recovery
run: python firmware/toolchain/check_network.py --sanitize
- name: Runtime admission and frame-boundary lifecycle
run: python firmware/toolchain/check_runtime.py --sanitize
- name: HTTP backpressure and bounded send attempts
run: python firmware/toolchain/check_send.py --sanitize
- name: MIDI event ownership and remote-input echo suppression
run: python firmware/toolchain/check_midi.py --sanitize
- name: No mangled literals or raw control bytes
run: python firmware/toolchain/check_sources.py
- name: Web and firmware presets are still twins
run: python firmware/toolchain/check_presets.py
- name: The six places a version lives agree
run: python firmware/toolchain/check_versions.py
07e931b46This file is pinned to the selected release. Download the original to open it in your design tool.