Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
07e931b46This 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