Skip to content

chore(https-test): the license page of pico_w_test_https is served from LittleFS, for 4,300 B of room - #288

Merged
angeloINTJ merged 2 commits into
mainfrom
chore/https-test-image-room
Oct 22, 2026
Merged

angeloINTJ merged 2 commits into
mainfrom
chore/https-test-image-room

Conversation

@angeloINTJ

@angeloINTJ angeloINTJ commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

Why

pico_w_test_https is the bench image with the full console and the TLS server. It had 44 B of real flash left: its last LOAD ended at 0x100FEFD4, and the FLASH region ends at 0x100FF000 (readelf -l, main 4f14159).

The next stage of the UI-driver work (feat/ui-drivers, S10b-2) grows the product images by about 160 B, so this image would no longer link. The maintainer chose option (a): move one more of its pages to LittleFS, the way ALARMS_PAGE, FILE_PAGE and TEL_PAGE already are.

Which page

tools/build_webui_gz.py sets the rule: the page must be big, rarely opened, and not needed to bring the device up. The candidates, measured in this env on 2026-10-22 (gzipped):

Page gz Verdict
DASH_PAGE 6,237 B the most opened page
NET_PAGE 4,304 B may be what puts a new device on Wi-Fi (the failure CFG_PAGE had in July)
LICENSE_PAGE 4,260 B chosen
USR_PAGE 3,140 B smaller

Measured

All nine images were built from scratch on 4f14159 plus this change, and again after merging main a8ccf4c (#285, #286) into the branch, against main built from scratch: the same numbers.

before after
pico_w_test_https flash used 1,032,404 B 1,028,148 B (−4,256)
pico_w_test_https .bin 1,044,436 B 1,040,180 B
last LOAD end / room in the region 0x100FEFD4 / 44 B 0x100FDF34 / 4,300 B
  • The other eight images are byte for byte main's (4f14159, then a8ccf4c), compared by sha256.
  • The budget (tools/flash_budget.json) comes down to the new size. The image is ota_exempt, so it records no "bin".
  • Gates that pass: check_flash_budget.py on all nine and --table, gen_features.py --check, check_features.py, test_build_custom.py, and a local run of the gates job (47 of 47).

Deploy step

An HTTPS suite now needs data/web/license.html.gz in /web/, beside the other three (POST /api/upload). Without it, /license answers "Page asset missing", and tools/web_test_suite.py reports that. The manifest's comment says so.

Not verified on hardware

There is no Pico W on the bench today (the target is a Pico 2 W). When one is back, the check is:

  1. Flash this image.
  2. Upload the four .gz files.
  3. Run web_test_suite.py over HTTPS. /license must load from the file.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LyLm7Q1o7kCHngE63BnoTx

…om LittleFS, for 4,300 B of room

pico_w_test_https (the bench image with the full console and the TLS server) had
44 B of real flash left: its last LOAD ended at 0x100FEFD4 against the FLASH
region's end at 0x100FF000 (readelf -l, main 4f14159). The next stage of the
UI-driver work (feat/ui-drivers, S10b-2) grows the product images about 160 B, so
it would not link. The maintainer chose option (a) of three: move one more page of
this image to LittleFS, as ALARMS_PAGE, FILE_PAGE and TEL_PAGE already are.

Which page: tools/build_webui_gz.py's rule is big AND rarely opened AND not needed
to bring the device up. Measured in this env on 2026-10-22, gzipped: DASH_PAGE
6,237 B is the most opened page; NET_PAGE 4,304 B may be the page that puts a new
device on Wi-Fi (the failure CFG_PAGE had in July); USR_PAGE 3,140 B; LICENSE_PAGE
4,260 B. LICENSE_PAGE.

Measured, all nine built from scratch on 4f14159 plus this change:
- pico_w_test_https: flash used 1,032,404 -> 1,028,148 B (-4,256), .bin 1,044,436
  -> 1,040,180 B; the last LOAD ends at 0x100FDF34, 4,300 B of room. Its budget
  comes down to the new size (tools/flash_budget.json; ota_exempt, no "bin").
- The other eight are byte for byte main's (sha256 against the base build of #287).
- check_flash_budget.py on all nine and --table, gen_features.py --check,
  check_features.py, test_build_custom.py, and the local run of the gates job
  (47 of 47) pass.

The deploy step grows with it: an HTTPS suite needs data/web/license.html.gz in
/web/ beside the other three (POST /api/upload), or /license answers "Page asset
missing", which tools/web_test_suite.py reports. The manifest's comment says so.

Not verified on hardware: no Pico W is on the bench today (the target is a Pico 2 W).
The check for when one is: flash this image, upload the four .gz, and run
web_test_suite.py over HTTPS: /license must load from the file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LyLm7Q1o7kCHngE63BnoTx
@github-actions github-actions Bot added the tools Build tools, scripts, and developer tooling label Oct 22, 2026
#286 also appended to tools/flash_budget.json's measured_on and measured_at_commit, so
the two appends conflicted. Resolved from main's file plus this branch's edits: the
pico_w_test_https budget at 1,028,148 B and this change's entries after main's, now
naming a8ccf4c as the base.

Measured again on the merged tree, all nine from scratch, against main a8ccf4c built
from scratch: pico_w_test_https alone differs (used 1,028,148 B against 1,032,404, .bin
1,040,180 against 1,044,436, the last LOAD ending at 0x100FDF34: 4,300 B of room); the
other eight are byte for byte main's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LyLm7Q1o7kCHngE63BnoTx
@angeloINTJ
angeloINTJ merged commit 2075b84 into main Oct 22, 2026
13 checks passed
angeloINTJ pushed a commit that referenced this pull request Oct 23, 2026
Takes main from 25e169d to 2075b84: #285 (tools: the savings floor measures past the BTstack bank's fill, with a new tools/test_measure_savings.py), #286 (src: the console and syslog name the event again outside English on alpha and wire: LogManager.cpp and .h, DisplayManager_Alpha.cpp, AppManager_Boot.cpp), #287 (docs: the bench of 2026-10-22, TRL( ), OTA and the packs) and #288 (the licence page of pico_w_test_https is served from LittleFS, which also merged #285 and #286 into its own branch).
There is no conflict in src/: the branch also changed src/AppManager_Boot.cpp since 25e169d, and git merges it as text. The five conflicts are three texts and two measurements; the measurements are measured again on the merged tree, never merged as text.

Conflicts, one line each:
- CLAUDE.md: main's rewritten end of "Language packs" (TRL( ) is a ledger the device never reads), then the branch's bullet "The Ângulo's texts".
- tools/README.md: every row kept: the branch's three UI-gate rows, main's measure_savings.py row and new test_measure_savings.py row (#285), then the branch's four rows main had left as they were; test_build_custom.py keeps the branch's 72 hostile profiles (the script prints 72 on the merged tree; main's 54 is the old count).
- tools/check_lang_packs.py: one message, "a missing @WEBDICT/@angulo entry silently leaves that one line in English. (@TRL is a ledger the device never reads.)"; tools/test_lang_gate.py passes (52 of 52).
- docs/analysis/PLANO_STABLE.md section 3.1: the eleven OTA rows written from the re-measured records (check_flash_budget.py --table passes: 11 images, 1 exempt); only the pico_wire row moves.
- tools/flash_budget.json: budget = measured and the .bin of all eleven images from a build from scratch of the merged tree (list below); measured_on and measured_at_commit keep the branch's text, then main's sentences (#286, #288), then one for this merge.
The READMEs need nothing: check_readme_numbers.py passes on the merged tree (750 cases in 11 suites, release 97.9 % of the slot, 170 event codes, 62 routes (52 gated, 10 public), in all three READMEs).
CLAUDE.md and tools/README.md: the "scripts" figure follows tools/README.md's row count (198 at ecb527e, 199 with #285's test_measure_savings.py row).

Flash used and .bin, ecb527e -> this merge, both built from scratch with the default core (ecb527e reproduces every record of its flash_budget.json, its eleven sha256 equal S10c B6-b's, and the 948 pt-BR frames of the six host screen groups are unchanged on the merge):
- pico_w_release: 1,022,900 -> 1,022,900 B used (+0), 1,034,932 -> 1,034,932 .bin (+0)
- pico_w_test: 1,027,348 -> 1,027,348 B used (+0), 1,039,380 -> 1,039,380 .bin (+0)
- pico_w_test_https: 1,032,412 -> 1,028,148 B used (-4264), 1,044,444 -> 1,040,180 .bin (-4264)
- pico_w_asserts: 1,025,204 -> 1,025,204 B used (+0), 1,037,236 -> 1,037,236 .bin (+0)
- pico_w_alpha: 976,236 -> 976,228 B used (-8), 990,380 -> 990,380 .bin (+0)
- pico_w_air: 1,019,480 -> 1,019,480 B used (+0), 1,035,340 -> 1,035,340 .bin (+0)
- pico2_w_release: 998,928 -> 998,928 B used (+0), 998,952 -> 998,952 .bin (+0)
- pico_wire: 592,268 -> 592,260 B used (-8), 604,304 -> 604,296 .bin (-8)
- pico_wiretft: 774,596 -> 774,596 B used (+0), 786,632 -> 786,632 .bin (+0)
- pico_wiretft_angulo: 814,716 -> 814,716 B used (+0), 826,752 -> 826,752 .bin (+0)
- pico2_w_angulo: 1,035,608 -> 1,035,608 B used (+0), 1,035,632 -> 1,035,632 .bin (+0)

Main's own change (#285 to #288), built the same way on its own trees, 25e169d -> 2075b84:
- pico_w_release: 1,022,908 -> 1,022,908 B used (+0), 1,034,940 -> 1,034,940 .bin (+0)
- pico_w_test: 1,027,348 -> 1,027,348 B used (+0), 1,039,380 -> 1,039,380 .bin (+0)
- pico_w_test_https: 1,032,404 -> 1,028,148 B used (-4256), 1,044,436 -> 1,040,180 .bin (-4256)
- pico_w_asserts: 1,025,212 -> 1,025,212 B used (+0), 1,037,244 -> 1,037,244 .bin (+0)
- pico_w_alpha: 976,236 -> 976,228 B used (-8), 990,380 -> 990,380 .bin (+0)
- pico_w_air: 1,019,480 -> 1,019,480 B used (+0), 1,035,340 -> 1,035,340 .bin (+0)
- pico2_w_release: 999,016 -> 999,016 B used (+0), 999,040 -> 999,040 .bin (+0)
- pico_wire: 592,308 -> 592,300 B used (-8), 604,344 -> 604,336 .bin (-8)
- pico_wiretft: 774,612 -> 774,612 B used (+0), 786,648 -> 786,648 .bin (+0)
The merge's delta equals main's on 8 of the nine images; it differs on pico_w_test_https.
Host only: nothing of this merge has run on a board.

Proof, host only (stages/sync5_c1 of the UI-drivers scratchpad):
- Main's four PRs change 29 files and the merge changes the same 29 against ecb527e; every patch is identical to main's except the two measured files, check_lang_packs.py's resolved message and the one-line scripts figure of CLAUDE.md and tools/README.md. Main's 5 hunks in src/ (#286: AppManager_Boot.cpp, DisplayManager_Alpha.cpp x2, LogManager.cpp, LogManager.h) are each in the merge once; #288 touches neither src/ nor WebUI.h.
- check_flash_budget.py passes for the eleven images, --table passes (11 images, 1 exempt), test_flash_budget.py 19 ok. Against ecb527e only pico_w_alpha, pico_wire and pico_w_test_https change; the other eight are byte-identical (sha256).
- ci_gates_local.py --raso (depth-1 clone): 63 of 63 steps passed; 1 skipped (own env, CI only)
- tools/elf_funcoes.py and reloc_only.py, ecb527e against the merge: pico_w_alpha and pico_wire change DisplayManager::trlLookup( ) and logcodeLookup( ) (#286; REAL, 3 -> 2 instructions); pico_w_test_https changes WebManager::handleLicense( ) (#288; REAL, 9 -> 6), drops WebUI_GZ::LICENSE_PAGE_GZ, gains "/web/license.html.gz", and 12 callers move literal words only; nothing in the other six products or the two Angulo images changes. Main's own pairs (25e169d -> 2075b84) give the same lists but for three items, all decoded with objdump: SensorManager::SensorManager( ) (UNPROVEN on the merge side only: its 4-byte constant 0xFFFFFFFF is equal, and the table beside it points at the same SoundManager::MEL_* arrays, 8 B further on in both pairs), and the text fragments 'd;' and 'jT6' (printable bytes inside the removed licence blob, 4,267 B on ecb527e and 4,260 B on 25e169d).
- pico_w_test_https: the last LOAD ends at 0x100fdf34, 4,300 B before 0x100FF000 (ecb527e: 0x100fefdc, 36 B; main 2075b84: 0x100fdf34).
- The Angulo: its two ELFs change no function or datum; 948 of 948 pt-BR host frames of the six groups equal ecb527e's; test_idiomas (121 checks), test_textos (105), test_temas (174 cases) and check_ui_texts pass.
- pico_wire and pico_w_test_https rebuilt from scratch on this commit's tree give the reference sha256.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LyLm7Q1o7kCHngE63BnoTx
angeloINTJ pushed a commit that referenced this pull request Oct 23, 2026
…(S10c, stage D)

Section 4.4 of docs/analysis/UI_DRIVERS.md still said that pico_w_test_https had 36 B, and that every step had to hold it within them.
The sync of 2026-10-23 (262962f) brought main's #288, which serves that image's licence page from LittleFS. The image's last flash LOAD
now ends at 0x100FDF34, 4,300 B before the FLASH region's end at 0x100FF000 (`readelf -lW` on the merged image; it ended at 0x100FEFDC
on ecb527e). The review of the sync found the stale line; the merge does not touch this file.

The image shrank by 4,264 B where main's own shrank by 4,256 B. Seven of the 8 B are the licence blob it drops, `LICENSE_PAGE_GZ`:
4,267 B on the branch and 4,260 B on main (`nm -S`), each followed by the next symbol with no padding. The eighth is not decoded.

Documentation only. No image changes, and check_angulo.py exits 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LyLm7Q1o7kCHngE63BnoTx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

tools Build tools, scripts, and developer tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant