These gates exist because the rc23 / rc24 / rc25 cycle shipped fixes that passed the maintainer's headless tests but broke when peter-mcc exercised them through a browser. The lesson: a curl-based test surface is not the same as the user-facing test surface. Don't skip these.
A release candidate (-rcN) does not need every gate, but a tagged
non-RC release MUST pass all four below.
Goal: confirm the build still works on a board that has never seen this firmware before.
- Erase flash:
python -m platformio run -e esp32s3 --target erase - USB-flash this build:
python -m platformio run -e esp32s3 --target upload - Open serial monitor, watch for the boot banner + setup-mode AP.
- Phone connects to
WallboxGW-Setup, captive portal loads. - Submit Wi-Fi creds. Board reboots into STA mode and lands on the dashboard.
- No black screen at any point. No serial-monitor panics.
A failure here is always blocking — even if the rest of the gateway works, anyone with a brand-new board would never get past it. This is the rc23 regression class.
Goal: confirm the OTA upload path works the way a normal user invokes it (not the way the maintainer invokes it from curl).
- From
/info(logged in), click Firmware Update. - Choose a
.binfrom.pio/build/esp32s3/firmware.bin. - Click Upload Firmware. The progress bar must reach 100%.
- Status flips to "Update complete! Rebooting..." and the device comes back on the same Wi-Fi.
/infofooter shows the new version string.
If admission rejects (gateway just rebooted), the new auto-retry should kick in and complete on the second try without the user re-clicking. That's the rc24 regression class.
Goal: confirm no runtime wedge regressions. Run the gateway for
at least 10 minutes under normal conditions, then check
/api/health.
curl -s http://<gateway-ip>/api/health | python -m json.toolRequired:
"max_reentry": 1— anything > 1 means a re-entranthandleClient()call slipped through. Hard blocker."loop_max_ms": < 2000— anything ≥ 2000 ms is a wedge observation. Investigate before tagging."mqtt_reconnects": 0(from/api/diag/disconnects)"ble_reconnects": 0over the same window (steady BLE)"heap_free": > 80000— sub-80 KB suggests a leak.
Goal: confirm the new exposures we add for a release actually return values on a real charger, not just compile cleanly.
For each new BAPI method this release introduces, hit it via
/api/command with the read-only verb and confirm a structured
response. Don't push without seeing real data echoed back.
Only when all four gates are green:
- Bump
WB_VERSIONininclude/wb_version.h(or rely ongit describe --tags --dirtyfor an rc). git commit -am "Release vX.Y.Z"git tag -a vX.Y.Z -m "..."- Stage the binary + a release README in
releases/vX.Y.Z/. - Push the branch and tag together.
- Create the GitHub Release with the artifact attached.
Before any git push, run:
git diff origin/main..HEAD | grep -iE 'password|token|api_key|ssid|192\.168|botts|peter'If hits appear, redact before pushing. This list catches the values that have leaked in past sessions and would expose this maintainer's or testers' networks.