Skip to content

Ângulo standard across the brand, READMEs, site and docs; firmware version on the login page - #166

Merged
angeloINTJ merged 3 commits into
mainfrom
docs/angulo-aesthetic
Sep 25, 2026
Merged

angeloINTJ merged 3 commits into
mainfrom
docs/angulo-aesthetic

Conversation

@angeloINTJ

Copy link
Copy Markdown
Owner

Two commits.

1. The Ângulo standard for everything with a screen or a reader. ANGULO.md — the interface guide the device's web UI has followed since 2.4.6-beta — now covers the brand, the three READMEs, the docs site, the landing page and the Living documents, and AGENTS.md §7 makes it explicit for anyone building here: the eight rules, where each copy of the tokens lives and what is never edited by hand, the brand, the deviations found in the code, and what a machine checks.

  • Brand — tools/gen_logo.py reads every colour from docs/assets/angulo.css (a byte-for-byte copy of simut-rx/web/angulo.css) and draws the S of the display face on an acento disc: data/favicon.ico 835 → 731 B, wordmark light and dark, Powered-by badges without gradient, emoji or shadow, the social card. The device's login brand is the same outline.
  • READMEs ×3 — <picture> logo, badges in one colour and flat-square, a tagline that says what the product does, state in words instead of emoji, sentence-case headings. The all-contributors block is left as the bot writes it.
  • Site — a layout of our own replaces Cayman's gradient header on every Markdown page; the landing page moves to the tokens with a theme switch. Four wrong facts on it are fixed (Wi-Fi from the panel, asset names, "it is beta", a v2.3.2-beta colophon).
  • Docs — about 260 emoji out of the Living documents; Snapshot documents untouched.
  • tools/check_angulo.py in the gates job — mutation-tested, 19 of 19; 409 findings against the base, 0 here.

2. The firmware version on the login page. build_webui_gz.py stamps SIMUT_VERSION into the page at build time (it has no session to ask /api/perms), and the version is part of the generator's up-to-date stamp so a bump cannot ship the old number. SECURITY.md §8 records the exposure.

Measured (main 649d677 and this branch built side by side on 2026-09-24): used −88 B on release, test and asserts, −96 on test_https, 0 on alpha and air (the 4 KiB alignment pad absorbs it). Flash budgets unchanged, measured updated with a journal entry. All eight gates-job checks pass locally; the site was built with jekyll 3.10 and GitHub Pages' default plugins.

Hardware: being tested on the bench together with #165 before merge — results in a comment below.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Jq4auDQppGzmAx1gLKn1z3

Ângelo Moisés Alves and others added 2 commits September 24, 2026 23:51
…ndard

ANGULO.md, the interface guide the device's web UI has followed since
2.4.6-beta, now governs everything with a screen or a reader, and AGENTS.md
§7 says so explicitly: the eight rules in full, where every copy of the
tokens lives and what is never edited by hand, the brand, the deviations
found in the code today, and what a machine checks.

Brand. tools/gen_logo.py draws everything from the display face and reads
every colour from docs/assets/angulo.css, a byte-for-byte copy of
simut-rx/web/angulo.css: the S on an acento disc (data/favicon.ico 835 ->
731 B, the 16 px frame optically sized), the wordmark light and dark, the
Powered-by badges (no gradient, no emoji, no shadow) and the social card.
The device's login brand is the same outline, traced from Bricolage
Grotesque instead of Liberation Sans Bold.

READMEs x3: a <picture> logo, badges in one colour and flat-square (the
flat style draws a gradient), a tagline that says what the product does,
state in words instead of emoji, headings in sentence case. The
all-contributors block is left as the bot writes it.

Site. A layout of our own replaces Cayman's gradient header on every
Markdown page; the landing page moves to the tokens and gains a theme
switch on angulo:tema, the manual's key. Four facts on it were wrong and
are fixed from the README revised against the code on 2026-09-23: Wi-Fi is
not configured from the panel, the asset names, "it is beta", and a
colophon still naming v2.3.2-beta.

Docs. About 260 emoji out of the Living documents, the state written in
words. Snapshot documents are untouched: a record that gets edited stops
being evidence.

tools/check_angulo.py, in the gates job: the token copy pinned by sha256,
the site's CSS on tokens and the 4 px grid, the brand on token colours, no
emoji in the READMEs, on the site or in a Living document. Mutation-tested:
19 of 19 rules give exactly one finding when broken; 409 findings against
the main this branches from, 0 here.

Measured on 2026-09-24, main 649d677 and this branch built side by side:
'used' -168 B on release, test, test_https and asserts (Favicon::DATA
-104, LOGIN_PAGE_GZ -62, the other pages +-3 B around the new asset hash);
0 on alpha and air, where the bytes fall inside the 4 KiB alignment pad.
The flash budgets stay and 'measured' moves (tools/flash_budget.json). The
site was built with jekyll 3.10 and GitHub Pages' default plugins and
checked in both themes and at phone width. Not yet run on hardware.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jq4auDQppGzmAx1gLKn1z3
The login page has no session, so it cannot ask /api/perms, where the top
bar reads the version. build_webui_gz.py now reads SIMUT_VERSION from
src/SystemDefs_Limits.h, the one place it is defined, and stamps it over
@SIMUT_VERSION@ before minifying. The version is also part of the
generator's up-to-date stamp: without it, a release bump alone would find
WebUI_GZ.h current and ship the previous number. The pattern only accepts
[0-9A-Za-z.+-], because the value lands in the HTML as it is.

On the page it sits under the tagline in the Ângulo dado style (13/20,
monospace, tinta-2), since a version is an identifier.

SECURITY.md §8 says what this exposes: the page is public by design, so
anyone who reaches it learns which advisories apply -- the same number the
release image already announces to the LAN in its mDNS TXT record, and the
reason only the latest release is supported.

Measured: LOGIN_PAGE_GZ 6,585 -> 6,659 B; 'used' +80 B on release, test and
asserts, +72 on test_https, 0 on alpha and air (alignment pad). The
generated page carries <span class="ver">v2.7.2</span> and no token is
left in any page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jq4auDQppGzmAx1gLKn1z3
@github-actions github-actions Bot added documentation Improvements or additions to documentation ci Continuous integration and automation tools Build tools, scripts, and developer tooling security Security, authentication, and threat model code Firmware source changes (src/, WebUI.h) labels Sep 25, 2026
…a credential

tools/scan_secrets.sh step 3 matches `(pass|secret|token|api_key)[a-z_]* =
"<literal>"` case-insensitively, so `TOKENS = "docs/assets/angulo.css"` was
reported as a literal credential and failed the gates job on this PR. The
value is a file path, and the allowlist is for credentials published on
purpose, so the name changes instead: ANGULO_CSS and ANGULO_CSS_SHA256.

Both gates pass locally after the rename: check_angulo.py (77 documents)
and scan_secrets.sh (clean).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jq4auDQppGzmAx1gLKn1z3
@angeloINTJ

Copy link
Copy Markdown
Owner Author

Hardware test — together with #165

Tested as one release candidate: test/rc-integration at 48d5c6a, which merges this branch at 5eb5e81 and #165 at 26adf4a. Both pico_w_test and pico_w_release were built from it and flashed on the bench Pico W (TFT variant, five sensors). The only commit added since, c1d755e, renames a constant in tools/check_angulo.py and does not reach the firmware.

Login page (both images)

  • The version line reads v2.7.2 — SIMUT_VERSION substituted at build time, no @SIMUT_VERSION@ left in the served page.
  • The Bricolage wordmark (viewBox="0 0 2993 686") renders in the light and the dark theme.
  • /favicon.ico is byte-identical to data/favicon.ico (731 B).

Web UI

  • Chrome headless, signed in as admin: all 9 pages answer 200, with 0 console errors and 0 uncaught exceptions; .brand computes to letter-spacing: -0.36px (−0.02em at 18 px) on every page.
  • tools/web_test_suite.py on pico_w_test: restricted account 87 passed / 0 failed / 5 skipped; admin 67 / 0 / 1.

Device

  • All five sensors reading: 2× DS18B20, 2× DHT22 with humidity, BMP280 with pressure.
  • /api/screenshot returns a valid 320×240 BMP of the panel.
  • Side finding, no change needed: 13 flashes without the customary reload confirm (3 × air_test_suite.py --flash, 3 × pio run -t upload, 6 alternating between the published v2.7.2 and this candidate, 1 with the boot captured), and the BMP280 came up reading every time. The device's own log agrees: 19 of 19 post-flash boots since 2026-09-24 14:26 brought the BMx280 driver up on the first probe, with no sensor error recorded. The failure that reload worked around was fixed in a46b0de (2026-07-31).

CI: the first run failed the secret gate on TOKENS = "docs/assets/angulo.css" in tools/check_angulo.py — scan_secrets.sh step 3 reads any *token* = "<literal>" as a credential. Renamed to ANGULO_CSS in c1d755e rather than allowlisted, since the allowlist is for credentials published on purpose; 10/10 green since.

@angeloINTJ
angeloINTJ merged commit 32d5b36 into main Sep 25, 2026
10 checks passed
angeloINTJ pushed a commit that referenced this pull request Sep 25, 2026
SIMUT_VERSION 2.7.2 -> 2.7.3, and everything that names the current release
catches up: CHANGELOG (en, pt-BR), the three READMEs, both user manuals, the
docs index, the landing page in its three languages, and the product manual
(chapters 1, 3, 4, 5, 9, 13, 14 and 28, appendix C), regenerated.

v2.7.3 is #165 (Restart without saving on /config) and #166 (the Ângulo
standard; the firmware version on the login page). The manuals gain both:
the Restart section in chapter 5 and the user manuals' commit section, the
version line in chapter 13 and the authentication section.

Stale since v2.7.2, fixed here:
- the READMEs' "On main, not yet released" row still listed three things
  v2.7.2 shipped; it is gone, and the alpha LCD bullet that carried the same
  label is named for what it does;
- tools/build_manual.py had VERSION typed as "v2.7.1", so the product
  manual's cover and <meta> said v2.7.1 through the whole v2.7.2 release. It
  now reads SIMUT_VERSION from src/SystemDefs_Limits.h, as build_webui_gz.py
  already does;
- the pt-BR and es-ES READMEs counted 61 HTTP routes; check_authz.py counts
  62, as the English one says. All three said 408 host test cases; CI run
  36115353101 on main ran 410 (185+63+33+45+39+16+29).

Flash, all six built locally at this commit: used 998,220 release,
1,003,764 test, 1,011,388 test_https, 1,000,396 asserts, 963,476 alpha,
1,003,328 air. flash_budget.json 'measured' moves to these (#165 had not
moved it); budgets unchanged. Against the published v2.7.2 .bin: release
+168 B, alpha and air the same size to the byte. The images carry the new
version (WebUI_GZ.h stamp ver=2.7.3).

Gates run locally: scan_secrets, gen_logcodes --check, check_authz,
check_license, check_angulo, check_fsguard, check_air_consistency,
test_h5_day_merge; the product manual builds with 1,724 internal links and
none broken. Not flashed at this commit: the version bump is one digit, and
the published .uf2 is flashed on the bench after the release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jq4auDQppGzmAx1gLKn1z3
@angeloINTJ angeloINTJ mentioned this pull request Sep 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci Continuous integration and automation code Firmware source changes (src/, WebUI.h) documentation Improvements or additions to documentation security Security, authentication, and threat model tools Build tools, scripts, and developer tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant