Skip to content

Commit 9f1687a

Browse files
tyethclaude
andcommitted
Record the current CI assets, and the cause of the missing 10.x-mpy
The firmware run this file recorded as failed has been superseded: the integration-pico2w-ble branch it was missing now exists on tyeth/hal_rpi_pico, and Build board (custom) produces both Pico 2 W (34467425010) and Pico W (34494018766) firmware. Take mpy-cross from the latter -- it is green, expires two days later, and is the same build as the firmware. Both compilers emit mpy v6.3, so no compiled output changes. The 'otherwise-red run' caveat is also gone: tests / zephyr is green again (tyeth/circuitpython#11). The custom bundle's missing 10.x-mpy turned out to be a build bug, not a dormant repo: its build.sh passes --package_folder_prefix wrapped in literal quotes, which startswith() then never matches, so both libraries fell back to autodetection and the bundle shipped only conftest. Fixed in good-enough-technology/CircuitPython_GoodEnough_Bundle#1; the 10.x-mpy reaches circup once that is merged and released. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 02a23c7 commit 9f1687a

3 files changed

Lines changed: 105 additions & 52 deletions

File tree

‎.github/workflows/build-bundle.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ on:
2626
mpy_cross_run:
2727
description: 'tyeth/circuitpython Actions run id that has an `mpy-cross` artifact'
2828
required: false
29-
default: '34253440312'
29+
default: '34494018766'
3030
type: string
3131
firmware_run:
3232
description: >-
@@ -43,7 +43,7 @@ permissions:
4343
contents: read
4444

4545
env:
46-
MPY_CROSS_RUN: ${{ inputs.mpy_cross_run || '34253440312' }}
46+
MPY_CROSS_RUN: ${{ inputs.mpy_cross_run || '34494018766' }}
4747
# Consumed by `gh` inside tools/build_bundle.sh and by the steps below.
4848
GH_TOKEN: ${{ secrets.CP_CI_TOKEN }}
4949

‎build_results.md‎

Lines changed: 101 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ CircuitPython will accept it and that every requested library exists.
1111

1212
| Tool | Version | Source |
1313
|---|---|---|
14-
| mpy-cross | `CircuitPython 10.3.0-alpha.4-73-gf1ae373ad0 on 2026-09-08; mpy-cross emitting mpy v6.3` (x86-64 Linux, dynamically linked) | `gh run download --repo tyeth/circuitpython 34253440312 --name mpy-cross` |
14+
| mpy-cross | `CircuitPython 10.3.0-alpha.4-73-gf1ae373ad0 on 2026-09-08; mpy-cross emitting mpy v6.3` (x86-64 Linux, dynamically linked) | `gh run download --repo tyeth/circuitpython 34494018766 --name mpy-cross` |
1515
| circup | 3.0.4 (in a venv) | PyPI |
1616
| Adafruit_CircuitPython_Bundle | 20260905, `10.x-mpy` platform | via circup |
1717
| CircuitPython_Community_Bundle | 20260826 | via circup (not actually needed) |
18-
| good-enough-technology/circuitpython_goodenough_bundle | 202311252150 — **no `10mpy` platform**, circup fell back to `.py` | via `circup bundle-add` (SEN5x only) |
18+
| good-enough-technology/circuitpython_goodenough_bundle | 202311252150 — **no `10.x-mpy` platform**, circup fell back to `.py`. Cause found and fixed, see below | via `circup bundle-add` (SEN5x only) |
1919

2020
The committed `boot_out.txt` files pin circup to CircuitPython
2121
10.3.0-alpha.4; circup notes 10.3.0 final is now released. The bundle
@@ -41,7 +41,8 @@ adafruit_bus_device==5.2.17 adafruit_pixelbuf==2.1.0 adafruit_register==1.12.1
4141

4242
SEN5x driver (`sensirion_i2c_sen5x` + `sensirion_i2c_driver`) resolved
4343
from the custom bundle **as source**: that bundle has no `10.x-mpy`
44-
build, so circup installed the `.py` trees. All 22 of those `.py` files
44+
build, so circup installed the `.py` trees. The reason is a bug in the
45+
bundle's own build, now fixed -- see *The missing 10.x-mpy* below. All 22 of those `.py` files
4546
compile with this mpy-cross (0 rejected). circup also warned
4647
`circuitpython_sensirion_i2c_driver is not a known CircuitPython library`
4748
— a dependency-metadata name mismatch inside the custom bundle; harmless,
@@ -71,6 +72,56 @@ empty package `__init__.py` placeholders plus `adafruit_ble/services/microbit.py
7172
Informational: the 5 files in `examples/` and 9 in `tools/` also pass
7273
mpy-cross, though `tools/` is host-side Python and not deployed.
7374

75+
## The missing 10.x-mpy in the good-enough bundle
76+
77+
The custom bundle's newest release is `202311252150` (November 2023) and
78+
carries only `8.x-mpy` and `9.x-mpy` platform zips, which is why circup
79+
falls back to installing the SEN5x driver as `.py`. Re-running its CI does
80+
produce a `10.x-mpy` -- `requirements.txt` is unpinned, so a fresh run
81+
picks up circuitpython-build-tools 1.20.1, which builds against mpy-cross
82+
10.0.0 -- but the first re-run came back green with an **empty** bundle:
83+
4 KB, containing `lib/conftest.py` and nothing else.
84+
85+
The cause is in the bundle repo's `build.sh` and `release.yml`. Both build
86+
the `--package_folder_prefix` list with a gawk that wraps it in **literal
87+
double quotes**. `circuitpython-build-bundles` splits that argument on
88+
`", "` and matches each entry with `str.startswith()`, so the entries
89+
arrive as `"sensirion_i2c_driver` and `sensirion_i2c_sen5x"` and match no
90+
folder. Both libraries then fall back to legacy autodetection, which finds
91+
only the top-level `conftest.py`.
92+
93+
Measured against the pinned submodules with build-tools 1.20.1:
94+
95+
| `--package_folder_prefix` | detection | `py` bundle |
96+
|---|---|---|
97+
| `"sensirion_i2c_driver, sensirion_i2c_sen5x"` (as CI passed it) | `is_package=False`, `module_name=conftest`, 1 file each | 4 KB |
98+
| `sensirion_i2c_driver, sensirion_i2c_sen5x` (quotes removed) | `is_package=True`, correct names, 20 + 33 files | 178.5 KB |
99+
100+
Because this bundle carries exactly two libraries, both entries in the
101+
list are the quoted ones, so every asset built since the tooling moved on
102+
would have been empty. Upstream `adafruit/CircuitPython_Community_Bundle`
103+
has the identical `build.sh`, but with hundreds of libraries only the
104+
first and last of the `ls -U` ordering are lost, which is why it goes
105+
unnoticed there.
106+
107+
Fixed in
108+
[good-enough-technology/CircuitPython_GoodEnough_Bundle#1](https://github.com/good-enough-technology/CircuitPython_GoodEnough_Bundle/pull/1):
109+
drop the literal quotes, and quote the expansion in `release.yml` (which
110+
expands the value unquoted -- the literal quotes were accidentally doing
111+
that job). Verified by run
112+
[34541266869](https://github.com/good-enough-technology/CircuitPython_GoodEnough_Bundle/actions/runs/34541266869),
113+
which produces `10.x-mpy`, `9.x-mpy` and `py` bundles all containing both
114+
drivers.
115+
116+
**Still outstanding:** circup reads GitHub *releases*, so the `10.x-mpy`
117+
only reaches this project once that PR is merged and a new release is
118+
published. Until then the SEN5x driver keeps installing as `.py`, which
119+
works -- all 22 files compile with this mpy-cross -- but costs flash and
120+
import time on the node. One known wart survives the fix: build-tools'
121+
`is_package` flag is sticky across files, so the drivers' `tests/` and
122+
`docs/` trees get swept into `lib/` as well (52.5 KB against 32 KB in
123+
2023). Harmless for circup, which installs per-module.
124+
74125
## What this does not cover
75126

76127
* No firmware was flashed and nothing ran on hardware. The runtime
@@ -95,8 +146,8 @@ BLE under `ports/zephyr-cp`. The whole prerequisite stack is still open:
95146
[tyeth/zephyr#2](https://github.com/tyeth/zephyr/pull/2)
96147
* [tyeth/hal_rpi_pico#1](https://github.com/tyeth/hal_rpi_pico/pull/1) and
97148
[tyeth/hal_rpi_pico#2](https://github.com/tyeth/hal_rpi_pico/pull/2) --
98-
**no single hal_rpi_pico branch builds working firmware; both commits
99-
must be cherry-picked onto one branch**
149+
neither PR branch alone builds working firmware; both commits have to sit
150+
on one branch, which is what `integration-pico2w-ble` now is
100151
* [tyeth/hal_infineon#1](https://github.com/tyeth/hal_infineon/pull/1)
101152

102153
Relevance to this repo: both examples target ESP32 Feathers and lean on
@@ -106,32 +157,43 @@ only for the BLE UART path (`collector/net_ble.py`, `node/net_ble.py`,
106157

107158
### CI assets on tyeth/circuitpython
108159

109-
Two separate Actions runs are involved. Only the first produced anything;
110-
its artifacts expire 90 days after the run (2026-12-07).
111-
112-
**1. mpy-cross -- run [34253440312](https://github.com/tyeth/circuitpython/actions/runs/34253440312)**
113-
(the normal `Build CI` workflow on `zephyr-pico2w-ble` @ `f4d3e598`).
114-
Provides only the `mpy-cross` artifacts: `mpy-cross`, `mpy-cross.static`,
115-
`mpy-cross.static-aarch64`, `mpy-cross.static-raspbian`,
116-
`mpy-cross.static.exe`, `mpy-cross-macos-arm64`. It does **not** build
117-
board firmware. The run's overall conclusion is **failure** (its
118-
`tests / zephyr` job fails), so these binaries come from an otherwise-red
119-
run. This is what `tools/build_bundle.sh` downloads by default.
120-
121-
**2. Pico 2 W firmware -- run [34258666665](https://github.com/tyeth/circuitpython/actions/runs/34258666665)**
122-
(the `Build board (custom)` workflow, `.github/workflows/build-board-custom.yml`,
123-
dispatched for board `raspberrypi_rpi_pico2_w_zephyr`, language `en_US`,
124-
version `latest`, on branch `ci/pico2w-ble-assets` @ `f9626482`).
125-
126-
**Outcome: failure, no artifact.** (An earlier revision of this file
127-
recorded the run as `queued`; it was picked up at ~18:11Z and failed.)
128-
The job died after 5m49s in the `Set up port` step (`west update`),
129-
before the build step ran, so the expected artifact
130-
`raspberrypi_rpi_pico2_w_zephyr-en_US-latest` (`firmware.uf2` +
131-
`firmware.elf`) was **not produced** and there is still no CI-built
132-
Pico 2 W firmware anywhere. The `.uf2` still has to be built locally
133-
with `make BOARD=raspberrypi_rpi_pico2_w_zephyr` in `ports/zephyr-cp`.
134-
The error:
160+
All three artefacts now come from `ci/pico2w-ble-assets`, and all three
161+
runs are green. Artifacts expire 90 days after their run.
162+
163+
**1. mpy-cross -- run [34494018766](https://github.com/tyeth/circuitpython/actions/runs/34494018766)**
164+
(`Build board (custom)` on `ci/pico2w-ble-assets` @ `7ba84d8`, dispatched
165+
for `raspberrypi_rpi_pico_w_zephyr`). **Success**; the `mpy-cross`
166+
artifact is 178 KB and expires 2026-12-09. This is what
167+
`tools/build_bundle.sh` downloads by default.
168+
169+
An earlier revision took mpy-cross from run
170+
[34253440312](https://github.com/tyeth/circuitpython/actions/runs/34253440312)
171+
(`Build CI` on `zephyr-pico2w-ble` @ `f4d3e59`), whose overall conclusion
172+
was **failure** because its `tests / zephyr` job failed. That job is green
173+
again (tyeth/circuitpython#11, closed -- fixed upstream), so the old caveat
174+
about "binaries from an otherwise-red run" no longer applies to it either.
175+
The newer run is preferred regardless: it is green, it expires two days
176+
later, and it is the same build that produces the Pico W firmware. Both
177+
compilers emit the same format -- `MPY_VERSION 6` / `MPY_SUB_VERSION 3`,
178+
i.e. mpy v6.3, which is the `10.x-mpy` bundle platform -- so switching the
179+
default changes no compiled output.
180+
181+
**2. Pico 2 W firmware -- run [34467425010](https://github.com/tyeth/circuitpython/actions/runs/34467425010)**
182+
(`Build board (custom)`, board `raspberrypi_rpi_pico2_w_zephyr`, language
183+
`en_US`, version `latest`, on `ci/pico2w-ble-assets` @ `1d80163`).
184+
**Success** in 15m20s. Artifact
185+
`raspberrypi_rpi_pico2_w_zephyr-en_US-latest`, 9.13 MB (`firmware.uf2` --
186+
drag onto the BOOTSEL drive -- plus `firmware.elf` for SWD/gdb), expires
187+
2026-12-09. There is now CI-built Pico 2 W firmware; building the `.uf2`
188+
locally with `make BOARD=raspberrypi_rpi_pico2_w_zephyr` is no longer the
189+
only route.
190+
191+
**3. Pico W firmware -- run 34494018766** (the same run as the mpy-cross
192+
above). Artifact `raspberrypi_rpi_pico_w_zephyr-en_US-latest`, 9.26 MB.
193+
194+
**What changed since the failure recorded here earlier.** Run
195+
[34258666665](https://github.com/tyeth/circuitpython/actions/runs/34258666665)
196+
died after 5m49s in `Set up port` (`west update`) with
135197

136198
```
137199
--- hal_rpi_pico: fetching, need revision integration-pico2w-ble
@@ -140,23 +202,14 @@ fatal: couldn't find remote ref integration-pico2w-ble
140202
ERROR: update failed for project hal_rpi_pico
141203
```
142204

143-
The CI-only west manifest (below) points `hal_rpi_pico` at
144-
`tyeth/hal_rpi_pico @ integration-pico2w-ble`, a branch that **does not
145-
exist** -- the fork only has the two PR head branches,
146-
`cyw43-shared-bus-ble` (#1) and `flash-ram-helpers-force-inline` (#2).
147-
This is the "both hal_rpi_pico commits must be cherry-picked onto one
148-
branch" prerequisite surfacing in CI: the integration branch was assumed
149-
but never pushed. The other two fork refs (`tyeth/zephyr` and
150-
`tyeth/hal_infineon` @ `cyw43-shared-bus-ble`) fetched fine, and the two
151-
workflow fixes on the branch were never reached, so they remain
152-
unexercised. To get the asset: push a branch to `tyeth/hal_rpi_pico`
153-
carrying both PR commits under the name the manifest expects (or change
154-
the manifest to a real branch name), then re-dispatch
155-
`Build board (custom)` on `ci/pico2w-ble-assets`.
156-
157-
Had it succeeded, the artifact would have been
158-
`raspberrypi_rpi_pico2_w_zephyr-en_US-latest`, containing `firmware.uf2`
159-
(drag onto the BOOTSEL drive) and `firmware.elf` (for SWD/gdb).
205+
because the CI-only west manifest points `hal_rpi_pico` at
206+
`tyeth/hal_rpi_pico @ integration-pico2w-ble` and that branch had never
207+
been pushed -- the "both hal_rpi_pico commits must be cherry-picked onto
208+
one branch" prerequisite surfacing in CI. **That branch now exists** on
209+
`tyeth/hal_rpi_pico`, alongside the PR heads `cyw43-shared-bus-ble` (#1)
210+
and `flash-ram-helpers-force-inline` (#2), and the builds above are the
211+
result. The workflow fixes carried on `ci/pico2w-ble-assets`, previously
212+
never reached, are now exercised.
160213

161214
`ci/pico2w-ble-assets` is a **CI-only branch**: it is `zephyr-pico2w-ble`
162215
(the PR #4 branch) plus one commit that does three things --

‎tools/build_bundle.sh‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
#
99
# Without MPY_CROSS, and with `gh` authenticated, it fetches the mpy-cross
1010
# artifact from a tyeth/circuitpython Actions run (MPY_CROSS_RUN, default
11-
# 34253440312 = the zephyr-pico2w-ble branch). circup is used from the venv
11+
# 34494018766 = the green ci/pico2w-ble-assets run). circup is used from the venv
1212
# at $VENV (default ./venv), created and populated if missing.
1313
set -u
1414
cd "$(dirname "$0")/.."
1515
BUILD=${BUILD_DIR:-build}
1616
VENV=${VENV:-venv}
17-
MPY_CROSS_RUN=${MPY_CROSS_RUN:-34253440312}
17+
MPY_CROSS_RUN=${MPY_CROSS_RUN:-34494018766}
1818

1919
if [ -z "${MPY_CROSS:-}" ]; then
2020
MPY_CROSS=$BUILD/mpy-cross/mpy-cross

0 commit comments

Comments
 (0)