#4468·FastLED

bloat gate: local ESP32-S3 Blink total_flash reads 4 KB higher than CI for the same commit

Author: zackeesCreated Sep 19, 2026Updated Sep 19, 2026

Observed

For master 01caa0a89f, uv run python tests/test_esp32s3_bloat_regression.py gives different totals:

total_flash (report.json) fbuild image flash: ELF size
CI (bloat regression run on master) 383,120 B → PASS 473,588 B 9.84 MB
local (NixOS, fbuild 2.5.24) 387,217 B → FAIL by 4,059 B 473,524 B 10.3 MB

The flash images agree to within 64 B, but the symbol-sum total the gate reads is 4 KB apart. A local run therefore can't reproduce the gate: it fails on a commit CI passes. Any local delta is only meaningful against another local build.

Ruled out

  • A stale build dir: removed .build/fbuild/esp32s3 and rebuilt; same 387,217.
  • The nm path: build_info_Blink.json's aliases.nm points at a stale ~/.fbuild/dev toolchain (20251107) while the compile uses ~/.fbuild/prod (20260121). That comes from _gnu_toolchain_bin_for_target in ci/compiler/build_config.py, which globs ~/.fbuild/*/… sorted, so dev wins over prod. It's a separate small bug worth fixing, but repointing it at the prod nm still gives 387,217, so it isn't the cause here.

Next steps

  • Upload .build/symbols/esp32s3/report.json as an artifact from the bloat workflow, so a local report can be diffed against CI's by symbol rather than guessed at.
  • Make _gnu_toolchain_bin_for_target prefer the toolchain the compile actually used (it is in the compile command's include paths).

Found while measuring #4455.

Generated with Claude Code