Repository navigation
Scene AI: a scene app that no node runs bounces back to the model - #559
Conversation
On the store's chess puzzle scene, "make button clicks toggle the solution" added apps.toggleSolution through patch_scene, with no node running it and the button chain untouched. The scene passed lint, reached the editor unchanged as far as the diagram goes, and the reply said "the button flow now runs a toggle node". The follow-up turn edited the panel's code and said the same. scene-lint now reports a scene-local app no node runs as an error, so delivery refuses it and tells the model to add the node and wire it in (or drop the app). Modify turns only bounce on new issues, so a stored scene that already carries an unused app does not block unrelated edits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ESP32 firmware sizeBuilt from 567da87 by this run; compared with the latest release v2026.10.15.
Breakdown by subsystem —
|
| Subsystem | This PR | v2026.10.15 | Δ |
|---|---|---|---|
| FrameOS core (Nim) | 479,344 | 477,042 | +2,302 (+0.5%) |
| QuickJS | 360,413 | 360,373 | +40 (+0.0%) |
| pixie | 304,418 | 304,354 | +64 (+0.0%) |
| Wi-Fi stack | 295,304 | 295,304 | ±0 |
| Nim stdlib | 251,555 | 251,436 | +119 (+0.0%) |
| FrameOS apps (Nim) | 190,448 | 190,356 | +92 (+0.0%) |
| ESP-IDF misc | 181,371 | 181,564 | -193 (-0.1%) |
| Embedded font | 146,362 | 146,362 | ±0 |
| String pool (attributed to efuse) | 135,840 | 136,134 | -294 (-0.2%) |
| fos_* firmware shell (C) | 133,174 | 132,233 | +941 (+0.7%) |
| mbedTLS + certificates | 132,439 | 132,439 | ±0 |
| lwIP / HTTP / WebSocket | 126,792 | 126,800 | -8 (-0.0%) |
| libc / libm / newlib | 116,263 | 116,263 | ±0 |
| Storage (SPIFFS / FatFS / SD / NVS) | 94,076 | 94,080 | -4 (-0.0%) |
| Nim packages (chrono, zippy, chroma, qrgen, ...) | 71,845 | 71,849 | -4 (-0.0%) |
| Display drivers (C) | 64,958 | 64,946 | +12 (+0.0%) |
| Crypto (monocypher) | 35,141 | 35,141 | ±0 |
| Total mapped flash | 3,119,743 | 3,116,676 | +3,067 (+0.1%) |
Inside each subsystem
FrameOS core (Nim) — 479,344
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
frameos/js_runtime |
116,841 | 115,444 | +1,397 (+1.2%) |
frameos/utils |
112,365 | 112,401 | -36 (-0.0%) |
frameos/interpreter.nim |
100,260 | 100,264 | -4 (-0.0%) |
embedded_main.nim |
19,252 | 19,252 | ±0 |
embedded_runtime.nim |
17,830 | 17,834 | -4 (-0.0%) |
lib/tz.nim |
16,722 | 16,722 | ±0 |
frameos_nim_glue.c.obj |
10,679 | 10,635 | +44 (+0.4%) |
frameos/planner.nim |
9,689 | 9,681 | +8 (+0.1%) |
frameos/event_loop.nim |
8,412 | 8,412 | ±0 |
frameos/types.nim |
7,909 | 7,909 | ±0 |
frameos/values.nim |
7,699 | 7,699 | ±0 |
frameos/single_scene_host.nim |
6,687 | 6,712 | -25 (-0.4%) |
frameos/apps.nim |
6,585 | 6,585 | ±0 |
frameos/spool.nim |
5,787 | 5,787 | ±0 |
frameos/input_state.nim |
4,947 | 3,766 | +1,181 (+31.4%) |
embedded_scene.nim |
4,945 | 4,945 | ±0 |
frameos/events_gen.nim |
3,948 | 3,948 | ±0 |
frameos/app_config.nim |
2,951 | 2,935 | +16 (+0.5%) |
frameos/reboot_reason.nim |
2,648 | 2,648 | ±0 |
frameos/node_config.nim |
2,618 | 2,618 | ±0 |
frameos/app_capabilities.nim |
2,489 | 2,489 | ±0 |
frameos/events.nim |
2,410 | 2,410 | ±0 |
fos_netguard.c.obj |
2,179 | 2,179 | ±0 |
frameos/refresh_interval.nim |
1,635 | 1,639 | -4 (-0.2%) |
frameos/runtime_diagnostics.nim |
767 | 767 | ±0 |
frameos/event_log.nim |
415 | 431 | -16 (-3.7%) |
fos_version.c.obj |
328 | 328 | ±0 |
frameos/cloud |
— | 255 | -255 (-100.0%) |
frameos/channels.nim |
152 | 152 | ±0 |
frameos/ids.nim |
137 | 137 | ±0 |
frameos/hal |
44 | 44 | ±0 |
frameos/retired_apps.nim |
14 | 14 | ±0 |
QuickJS — 360,413
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
quickjs.c.obj |
287,886 | 287,846 | +40 (+0.0%) |
libunicode.c.obj |
50,178 | 50,178 | ±0 |
libregexp.c.obj |
13,999 | 13,999 | ±0 |
dtoa.c.obj |
5,685 | 5,685 | ±0 |
cutils.c.obj |
2,141 | 2,141 | ±0 |
fos_qjs_glue.c.obj |
449 | 449 | ±0 |
fos_quickjs_tz.c.obj |
75 | 75 | ±0 |
pixie — 304,418
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
pixie/fontformats/opentype.nim |
55,460 | 55,460 | ±0 |
pixie/fileformats/webp.nim |
37,493 | 37,493 | ±0 |
pixie/fileformats/svg.nim |
36,983 | 36,983 | ±0 |
pixie/paths.nim |
32,875 | 32,875 | ±0 |
pixie/fileformats/jpeg.nim |
29,440 | 29,436 | +4 (+0.0%) |
pixie/fileformats/png.nim |
22,101 | 22,101 | ±0 |
pixie/images.nim |
15,779 | 15,779 | ±0 |
pixie/fonts.nim |
10,995 | 10,995 | ±0 |
pixie/paints.nim |
9,869 | 9,869 | ±0 |
pixie/fileformats/bmp.nim |
8,278 | 8,258 | +20 (+0.2%) |
pixie/common.nim |
7,417 | 7,413 | +4 (+0.1%) |
pixie/blends.nim |
6,516 | 6,516 | ±0 |
pixie/fileformats/gif.nim |
5,961 | 5,965 | -4 (-0.1%) |
pixie/inflatestream.nim |
5,233 | 5,233 | ±0 |
pixie.nim |
5,224 | 5,224 | ±0 |
pixie/fileformats/webp_vp8_tables.nim |
3,881 | 3,881 | ±0 |
pixie/fileformats/ppm.nim |
3,725 | 3,713 | +12 (+0.3%) |
pixie/contexts.nim |
3,058 | 3,054 | +4 (+0.1%) |
pixie/fileformats/qoi.nim |
2,726 | 2,702 | +24 (+0.9%) |
pixie/internal.nim |
754 | 754 | ±0 |
pixie/rgb565.nim |
385 | 385 | ±0 |
pixie/fontformats/svgfont.nim |
215 | 215 | ±0 |
pixie/decodebudget.nim |
50 | 50 | ±0 |
Wi-Fi stack — 295,304
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
libnet80211.a |
136,168 | 136,168 | ±0 |
libpp.a |
62,154 | 62,154 | ±0 |
libwpa_supplicant.a |
54,904 | 54,904 | ±0 |
libphy.a |
34,176 | 34,176 | ±0 |
libesp_wifi.a |
4,780 | 4,780 | ±0 |
libesp_phy.a |
2,541 | 2,541 | ±0 |
libesp_coex.a |
291 | 291 | ±0 |
libcore.a |
287 | 287 | ±0 |
libespnow.a |
3 | 3 | ±0 |
Nim stdlib — 251,555
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
pure/collections/tables.nim |
72,312 | 72,312 | ±0 |
system.nim |
48,485 | 48,457 | +28 (+0.1%) |
pure/unicode.nim |
17,405 | 17,405 | ±0 |
pure/times.nim |
16,888 | 16,888 | ±0 |
pure/json.nim |
13,726 | 13,722 | +4 (+0.0%) |
std/private/dragonbox.nim |
10,351 | 10,351 | ±0 |
pure/strutils.nim |
8,047 | 8,047 | ±0 |
pure/parsexml.nim |
6,003 | 6,011 | -8 (-0.1%) |
pure/algorithm.nim |
5,372 | 5,372 | ±0 |
pure/base64.nim |
5,290 | 5,290 | ±0 |
pure/hashes.nim |
4,181 | 4,181 | ±0 |
pure/xmlparser.nim |
3,555 | 3,555 | ±0 |
pure/parsejson.nim |
3,553 | 3,553 | ±0 |
std/formatfloat.nim |
3,504 | 3,504 | ±0 |
pure/uri.nim |
3,225 | 3,225 | ±0 |
pure/streams.nim |
2,820 | 2,820 | ±0 |
pure/strformat.nim |
2,546 | 2,546 | ±0 |
std/syncio.nim |
2,355 | 2,355 | ±0 |
pure/collections/sets.nim |
2,075 | 2,075 | ±0 |
pure/xmltree.nim |
2,047 | 2,047 | ±0 |
pure/lexbase.nim |
1,801 | 1,801 | ±0 |
pure/parseutils.nim |
1,750 | 1,750 | ±0 |
system/exceptions.nim |
1,598 | 1,598 | ±0 |
pure/strtabs.nim |
1,572 | 1,572 | ±0 |
pure/pathnorm.nim |
1,336 | 1,336 | ±0 |
pure/options.nim |
1,016 | 1,016 | ±0 |
std/private/ospaths2.nim |
994 | 994 | ±0 |
pure/collections/lists.nim |
979 | 979 | ±0 |
pure/math.nim |
841 | 841 | ±0 |
pure/collections/deques.nim |
822 | 822 | ±0 |
pure/random.nim |
696 | 696 | ±0 |
std/private/digitsutils.nim |
651 | 651 | ±0 |
std/oserrors.nim |
633 | 633 | ±0 |
std/private/osdirs.nim |
572 | 572 | ±0 |
system/dollars.nim |
529 | 529 | ±0 |
std/monotimes.nim |
501 | 406 | +95 (+23.4%) |
std/private/oscommon.nim |
329 | 329 | ±0 |
std/envvars.nim |
250 | 250 | ±0 |
std/private/decode_helpers.nim |
240 | 240 | ±0 |
std/private/ossymlinks.nim |
187 | 187 | ±0 |
pure/bitops.nim |
162 | 162 | ±0 |
pure/os.nim |
99 | 99 | ±0 |
std/private/osfiles.nim |
96 | 96 | ±0 |
std/assertions.nim |
87 | 87 | ±0 |
core/macros.nim |
65 | 65 | ±0 |
system/ctypes.nim |
9 | 9 | ±0 |
FrameOS apps (Nim) — 190,448
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
apps/data/icalJson |
50,737 | 50,733 | +4 (+0.0%) |
apps/render/calendar |
30,894 | 30,874 | +20 (+0.1%) |
apps/data/localImage |
10,432 | 10,432 | ±0 |
apps/render/split |
9,736 | 9,772 | -36 (-0.4%) |
apps/data/eventsToAgenda |
9,068 | 9,068 | ±0 |
apps/render/zoomPan |
8,676 | 8,648 | +28 (+0.3%) |
apps/apps.nim |
7,251 | 7,247 | +4 (+0.1%) |
apps/render/text |
5,491 | 5,455 | +36 (+0.7%) |
apps/data/xmlToJson |
5,428 | 5,428 | ±0 |
apps/render/svg |
5,244 | 5,192 | +52 (+1.0%) |
apps/render/image |
4,724 | 4,708 | +16 (+0.3%) |
apps/data/rotateImage |
3,465 | 3,465 | ±0 |
apps/logic/setAsState |
3,453 | 3,453 | ±0 |
apps/data/downloadImage |
3,317 | 3,325 | -8 (-0.2%) |
apps/render/gradient |
3,217 | 3,229 | -12 (-0.4%) |
apps/data/qr |
3,118 | 3,122 | -4 (-0.1%) |
apps/data/downloadUrl |
3,053 | 3,053 | ±0 |
apps/render/color |
2,840 | 2,824 | +16 (+0.6%) |
apps/data/newImage |
2,668 | 2,668 | ±0 |
apps/data/resizeImage |
2,558 | 2,558 | ±0 |
apps/data/log |
2,299 | 2,299 | ±0 |
apps/render/opacity |
2,288 | 2,296 | -8 (-0.3%) |
apps/data/prettyJson |
2,225 | 2,225 | ±0 |
apps/data/clock |
1,871 | 1,875 | -4 (-0.2%) |
apps/data/parseJson |
1,848 | 1,856 | -8 (-0.4%) |
apps/logic/nextSleepDuration |
1,663 | 1,663 | ±0 |
apps/logic/ifElse |
1,494 | 1,494 | ±0 |
apps/logic/breakIfRendering |
1,390 | 1,394 | -4 (-0.3%) |
ESP-IDF misc — 181,371
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
libesp_hw_support.a |
37,640 | 37,632 | +8 (+0.0%) |
libhal.a |
21,865 | 21,865 | ±0 |
libfreertos.a |
17,240 | 17,240 | ±0 |
libesp_system.a |
13,736 | 13,780 | -44 (-0.3%) |
libesp_driver_uart.a |
11,627 | 11,627 | ±0 |
libheap.a |
8,660 | 8,660 | ±0 |
libesp_driver_i2c.a |
8,062 | 8,062 | ±0 |
libesp_driver_spi.a |
7,756 | 7,756 | ±0 |
libconsole.a |
5,733 | 5,733 | ±0 |
libjson.a |
4,940 | 4,940 | ±0 |
libesp_driver_gpio.a |
3,878 | 3,878 | ±0 |
libbootloader_support.a |
3,813 | 3,813 | ±0 |
libxtensa.a |
3,691 | 3,691 | ±0 |
libesp_driver_usb_serial_jtag.a |
3,408 | 3,408 | ±0 |
libesp_ringbuf.a |
3,322 | 3,322 | ±0 |
libesp_event.a |
3,253 | 3,253 | ±0 |
libesp_driver_ledc.a |
3,054 | 3,054 | ±0 |
libesp_mm.a |
2,451 | 2,451 | ±0 |
libapp_update.a |
2,414 | 2,414 | ±0 |
libesp_timer.a |
2,337 | 2,337 | ±0 |
libesp_psram.a |
2,172 | 2,329 | -157 (-6.7%) |
libsoc.a |
2,316 | 2,316 | ±0 |
libesp_adc.a |
2,285 | 2,285 | ±0 |
libpthread.a |
1,397 | 1,397 | ±0 |
liblog.a |
1,375 | 1,375 | ±0 |
libesp_security.a |
1,050 | 1,050 | ±0 |
libesp_rom.a |
902 | 902 | ±0 |
libesp_app_format.a |
507 | 507 | ±0 |
libxt_hal.a |
437 | 437 | ±0 |
libesp_common.a |
26 | 26 | ±0 |
libesp_pm.a |
24 | 24 | ±0 |
Embedded font — 146,362
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
assets/fonts.nim |
146,362 | 146,362 | ±0 |
String pool (attributed to efuse) — 135,840
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
esp_efuse_utility.c.obj |
134,794 | 135,088 | -294 (-0.2%) |
esp_efuse_rtc_calib.c.obj |
566 | 566 | ±0 |
esp_efuse_table.c.obj |
268 | 268 | ±0 |
esp_efuse_api.c.obj |
151 | 151 | ±0 |
esp_efuse_startup.c.obj |
61 | 61 | ±0 |
fos_ firmware shell (C)* — 133,174
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
fos_http.c.obj |
22,185 | 22,185 | ±0 |
fos_cloud.c.obj |
19,185 | 19,258 | -73 (-0.4%) |
fos_console.c.obj |
13,950 | 13,950 | ±0 |
fos_client.c.obj |
12,350 | 12,266 | +84 (+0.7%) |
fos_settings.c.obj |
7,618 | 7,618 | ±0 |
fos_scenes.c.obj |
7,515 | 7,578 | -63 (-0.8%) |
fos_ota.c.obj |
5,467 | 5,467 | ±0 |
fos_cloud_contract.c.obj |
4,744 | 4,744 | ±0 |
fos_config.c.obj |
4,619 | 4,619 | ±0 |
fos_wifi.c.obj |
3,189 | 3,189 | ±0 |
fos_assets.c.obj |
3,124 | 3,124 | ±0 |
fos_buttons.c.obj |
2,772 | 2,493 | +279 (+11.2%) |
fos_sd_probe.c.obj |
2,753 | 2,753 | ±0 |
fos_schedule.c.obj |
2,602 | 2,602 | ±0 |
fos_assets_sd.c.obj |
2,484 | 2,484 | ±0 |
fos_events.c.obj |
2,320 | 2,320 | ±0 |
fos_status_screen.c.obj |
2,049 | 2,049 | ±0 |
main.c.obj |
1,703 | 1,699 | +4 (+0.2%) |
fos_config_parse.c.obj |
1,467 | 1,467 | ±0 |
fos_url_guard.c.obj |
1,397 | 1,397 | ±0 |
fos_tz.c.obj |
1,294 | 1,294 | ±0 |
fos_buzzer.c.obj |
1,162 | 901 | +261 (+29.0%) |
fos_battery.c.obj |
1,140 | 1,140 | ±0 |
fos_minisig.c.obj |
1,140 | 1,140 | ±0 |
fos_backend_http.c.obj |
1,072 | 1,072 | ±0 |
fos_commands.c.obj |
940 | 940 | ±0 |
fos_scene_state.c.obj |
650 | 650 | ±0 |
fos_framebuffer.c.obj |
483 | 483 | ±0 |
fos_button_timing.c.obj |
434 | — | +434 |
fos_board.c.obj |
334 | 334 | ±0 |
fos_assets_path.c.obj |
259 | 259 | ±0 |
fos_power.c.obj |
241 | 241 | ±0 |
fos_battery_filter.c.obj |
214 | 214 | ±0 |
fos_wake.c.obj |
199 | 184 | +15 (+8.2%) |
fos_json_guard.c.obj |
119 | 119 | ±0 |
mbedTLS + certificates — 132,439
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
libmbedcrypto.a |
71,295 | 71,291 | +4 (+0.0%) |
libmbedtls.a |
45,799 | 45,799 | ±0 |
libmbedx509.a |
7,088 | 7,092 | -4 (-0.1%) |
libesp-tls.a |
6,705 | 6,705 | ±0 |
libesp_https_server.a |
1,552 | 1,552 | ±0 |
lwIP / HTTP / WebSocket — 126,792
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
liblwip.a |
78,437 | 78,445 | -8 (-0.0%) |
libhttp_parser.a |
10,350 | 10,350 | ±0 |
libesp_http_server.a |
10,020 | 10,020 | ±0 |
libtcp_transport.a |
8,245 | 8,245 | ±0 |
libespressif__esp_websocket_client.a |
6,822 | 6,822 | ±0 |
libesp_http_client.a |
6,666 | 6,666 | ±0 |
libesp_netif.a |
6,252 | 6,252 | ±0 |
libc / libm / newlib — 116,263
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
libc.a |
76,471 | 76,471 | ±0 |
libm.a |
31,563 | 31,563 | ±0 |
libnewlib.a |
6,609 | 6,609 | ±0 |
libstdc++.a |
1,476 | 1,476 | ±0 |
libgcc.a |
98 | 98 | ±0 |
libcxx.a |
46 | 46 | ±0 |
Storage (SPIFFS / FatFS / SD / NVS) — 94,076
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
libspiffs.a |
20,380 | 20,380 | ±0 |
libfatfs.a |
20,133 | 20,133 | ±0 |
libspi_flash.a |
14,168 | 14,168 | ±0 |
libnvs_flash.a |
13,681 | 13,685 | -4 (-0.0%) |
libsdmmc.a |
13,013 | 13,013 | ±0 |
libvfs.a |
6,196 | 6,196 | ±0 |
libesp_driver_sdspi.a |
3,866 | 3,866 | ±0 |
libesp_partition.a |
1,956 | 1,956 | ±0 |
libesp_vfs_console.a |
678 | 678 | ±0 |
libnvs_sec_provider.a |
5 | 5 | ±0 |
Nim packages (chrono, zippy, chroma, qrgen, ...) — 71,845
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
QRgen 3.1.0 |
22,056 | 22,060 | -4 (-0.0%) |
chrono 0.3.1 |
15,586 | 15,586 | ±0 |
zippy 0.10.19 |
15,200 | 15,200 | ±0 |
chroma 1.0.0 |
14,714 | 14,714 | ±0 |
checksums 0.2.1 |
3,371 | 3,371 | ±0 |
flatty 0.3.4 |
533 | 533 | ±0 |
jsony 1.1.5 |
272 | 272 | ±0 |
bumpy 1.1.3 |
113 | 113 | ±0 |
Display drivers (C) — 64,958
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
(everything else) |
21,278 | 21,282 | -4 (-0.0%) |
frameos_panel_table.c.obj |
6,685 | 6,685 | ±0 |
EPD_13in3e.c.obj |
1,796 | 1,796 | ±0 |
EPD_3in7.c.obj |
1,564 | 1,564 | ±0 |
EPD_5in79.c.obj |
1,481 | 1,481 | ±0 |
DEV_Debug.c.obj |
1,325 | 1,317 | +8 (+0.6%) |
EPD_2in7.c.obj |
1,292 | 1,292 | ±0 |
EPD_4in2.c.obj |
1,262 | 1,262 | ±0 |
EPD_7in3e.c.obj |
1,208 | 1,208 | ±0 |
EPD_4in2_V2.c.obj |
1,184 | 1,184 | ±0 |
DEV_Config_esp.c.obj |
1,180 | 1,180 | ±0 |
EPD_4in26.c.obj |
1,123 | 1,123 | ±0 |
| 29 smaller rows | 23,580 | 23,572 | +8 (+0.0%) |
Crypto (monocypher) — 35,141
| Part | This PR | v2026.10.15 | Δ |
|---|---|---|---|
monocypher.c.obj |
31,916 | 31,916 | ±0 |
monocypher-ed25519.c.obj |
3,225 | 3,225 | ±0 |
Biggest movers (per object)
| Object | Δ | This PR | Baseline |
|---|---|---|---|
frameos/input_state.nim |
+4,947 | 4,947 | — |
pkgs/QRgen-3.1.0/QRgen/renderer.nim |
-3,780 | — | 3,780 |
frameos/js_runtime/app_runtime.nim |
+1,441 | 74,076 | 72,635 |
esp_efuse_utility.c.obj |
-294 | 134,794 | 135,088 |
fos_client.c.obj |
+84 | 12,350 | 12,266 |
fos_cloud.c.obj |
-73 | 19,185 | 19,258 |
fos_scenes.c.obj |
-63 | 7,515 | 7,578 |
frameos/js_runtime/runtime.nim |
-48 | 31,638 | 31,686 |
frameos_nim_glue.c.obj |
+44 | 10,679 | 10,635 |
quickjs.c.obj |
+40 | 287,886 | 287,846 |
apps/render/split/app_loader.nim |
-32 | 4,670 | 4,702 |
nim/lib/system.nim |
+28 | 48,485 | 48,457 |
frameos/single_scene_host.nim |
-25 | 6,687 | 6,712 |
pkgs/pixie-6.1.0/pixie/fileformats/bmp.nim |
+20 | 8,278 | 8,258 |
apps/render/calendar/app_loader.nim |
+20 | 7,077 | 7,057 |
Largest 30 objects
| Object | Subsystem | This PR | v2026.10.15 | Δ |
|---|---|---|---|---|
quickjs.c.obj |
QuickJS | 287,886 | 287,846 | +40 (+0.0%) |
assets/fonts.nim |
Embedded font | 146,362 | 146,362 | ±0 |
esp_efuse_utility.c.obj |
String pool (attributed to efuse) | 134,794 | 135,088 | -294 (-0.2%) |
frameos/interpreter.nim |
FrameOS core (Nim) | 100,260 | 100,264 | -4 (-0.0%) |
frameos/js_runtime/app_runtime.nim |
FrameOS core (Nim) | 74,076 | 72,635 | +1,441 (+2.0%) |
nim/lib/pure/collections/tables.nim |
Nim stdlib | 72,312 | 72,312 | ±0 |
pkgs/pixie-6.1.0/pixie/fontformats/opentype.nim |
pixie | 55,460 | 55,460 | ±0 |
libunicode.c.obj |
QuickJS | 50,178 | 50,178 | ±0 |
nim/lib/system.nim |
Nim stdlib | 48,485 | 48,457 | +28 (+0.1%) |
apps/data/icalJson/ical.nim |
FrameOS apps (Nim) | 45,020 | 45,016 | +4 (+0.0%) |
pkgs/pixie-6.1.0/pixie/fileformats/webp.nim |
pixie | 37,493 | 37,493 | ±0 |
pkgs/pixie-6.1.0/pixie/fileformats/svg.nim |
pixie | 36,983 | 36,983 | ±0 |
frameos/utils/image.nim |
FrameOS core (Nim) | 35,942 | 35,942 | ±0 |
pkgs/pixie-6.1.0/pixie/paths.nim |
pixie | 32,875 | 32,875 | ±0 |
monocypher.c.obj |
Crypto (monocypher) | 31,916 | 31,916 | ±0 |
frameos/js_runtime/runtime.nim |
FrameOS core (Nim) | 31,638 | 31,686 | -48 (-0.2%) |
pkgs/pixie-6.1.0/pixie/fileformats/jpeg.nim |
pixie | 29,440 | 29,436 | +4 (+0.0%) |
apps/render/calendar/app.nim |
FrameOS apps (Nim) | 23,817 | 23,817 | ±0 |
fos_http.c.obj |
fos_* firmware shell (C) | 22,185 | 22,185 | ±0 |
pkgs/pixie-6.1.0/pixie/fileformats/png.nim |
pixie | 22,101 | 22,101 | ±0 |
embedded_main.nim |
FrameOS core (Nim) | 19,252 | 19,252 | ±0 |
fos_cloud.c.obj |
fos_* firmware shell (C) | 19,185 | 19,258 | -73 (-0.4%) |
frameos/utils/status_screen.nim |
FrameOS core (Nim) | 17,939 | 17,943 | -4 (-0.0%) |
x509_crt_bundle.S.obj |
mbedTLS + certificates | 17,928 | 17,928 | ±0 |
embedded_runtime.nim |
FrameOS core (Nim) | 17,830 | 17,834 | -4 (-0.0%) |
nim/lib/pure/unicode.nim |
Nim stdlib | 17,405 | 17,405 | ±0 |
frameos/utils/asset_colors.nim |
FrameOS core (Nim) | 17,333 | 17,333 | ±0 |
nim/lib/pure/times.nim |
Nim stdlib | 16,888 | 16,888 | ±0 |
lib/tz.nim |
FrameOS core (Nim) | 16,722 | 16,722 | ±0 |
pkgs/pixie-6.1.0/pixie/images.nim |
pixie | 15,779 | 15,779 | ±0 |
Flash = .text + .rodata from the linker map via esp_idf_size; "Inside each subsystem" splits every bucket one level down (the Nim core by directory, apps by app, packages by package, ESP-IDF by archive) over all objects, not just the largest. "String pool (attributed to efuse)" is the linker's merged string-literal pool for the whole image, not efuse code — see docs/esp32-image-size.md.
Problem
On the store's chess puzzle scene, asking the AI to make the button toggle the solution changed nothing in the diagram, while the reply said "the button flow now runs a toggle node".
What the turns actually delivered (from
ai_chat_messages.payload.delivered):patch_sceneaddedapps.toggleSolutionwith no node running it. The button chain still went straight to the redraw.The editor applied both correctly. An app that no node runs is invisible in the diagram and never runs, and nothing rejected it.
Fix
scene-lint.tsnow reports a scene app that no node runs as an error. Delivery refuses the scene and tells the model to add an app node with that keyword and wire it in, or to remove the app.Edits to an existing scene only bounce on newly introduced problems, so a stored scene that already has an unused app doesn't block unrelated edits.
Checks
patch_scenedelivery tests. An app added alone is refused, an app delivered with its node goes through, and an existing unused app doesn't block other edits.🤖 Generated with Claude Code