Skip to content

Firmware v2.9.0

bmcd 2.15.1, tpi 1.2.0, BMC-UI 3.9.0.

Firmware v2.9.0, 9 September 2026. Every item below is the repository's own changelog entry, taken apart; the whole entry is a click away under each one.

New

Contract tests for the promotion gate

(tests/gate.sh). The gate decides whether a freshly booted image is kept or rejected, and nothing checked it: a change that promoted everything would have been found by a flash, or not at all.

The whole entry

The harness sources S99postupdate, points its paths at scratch files, stubs curl, and asserts both the verdict and the reason for twelve cases — four of which must be rejections. It runs under dash and under busybox ash, the board's own shell.

A checks workflow that runs those tests and shellcheck on every push, in

under a minute, separately from the two-hour image build

It also mutates the gate twice and requires the suite to catch both: a suite that stays green when a rejection is removed is decorative.

Changed

  • bmcd 2.15.1, tpi 1.2.0, BMC-UI 3.9.0. Between them this release carries: a firmware catalogue that answers from cache and refreshes behind itself instead of blocking the page for sixteen seconds; park mode, so an uploaded image lands on the SD card and installing stays a separate choice; the hostname and the time servers as settings; configuration export and import before board B; the thermal zone's trip points, so the fan's step has a reason attached; a seven-tab interface reorganised around what a person is doing; and a command line that reaches all of it.
  • A release candidate no longer outranks its own release. (SQU-169).

    The whole entry

    is_newer in tpi-selfupdate used GNU sort -V alone, which puts v2.8.1-rc1 after v2.8.1 — so a board on the finished release was offered its own candidate as an upgrade, and --check would have exited 10 for ever. It now compares the numeric part first and only then the suffix, where carrying one loses to carrying none. v2.2.0-unstable-hive.12 is likewise work towards v2.2.0 rather than after it.

  • tests/version.sh covers that ordering — eighteen cases including the tenth minor release, which a lexical compare gets wrong — and CI mutates the function back to the old behaviour and requires the suite to notice.

  • tpi-selfupdate can be sourced with TPI_SELFUPDATE_LIB=1 to get its functions without running the update. That is what makes the above testable without a network or a board.
  • S99postupdate takes the path to curl from CURL_BIN rather than a literal, so the harness can exercise the -x check and the argument handling instead of bypassing them.

Every release of the firmware · the roadmap · follow by feed