atomvm-cbor 0.3.0 validation report

View Source

This report records the host release gate, the controlled same-device 0.2.0 to 0.3.0 comparison collected on 2026-08-23, and the retained functional and bounded-soak evidence for the public 0.3.0 release.

Release identity

  • Baseline: public annotated tag 0.2.0, commit 50cae38fc0d846e41fe61c9d5d80229c6cff91f2.
  • Candidate: public annotated tag 0.3.0, commit 06333306be6d0f83d9b0b257afdc29f82bcd22ea.
  • Exact-tag release gate: run 32647464389, performance job 97214051323.
  • Performance artifact identity: 0.2.0-50cae38fc0d8--0.3.0-06333306be6d.

Provenance and methodology

Host

  • Dell hardware runner, Intel Pentium Silver J5005, Linux x86_64.
  • Erlang/OTP 29, one normal scheduler, one dirty CPU scheduler, and one dirty I/O scheduler in the workflow's digest-pinned Erlang container.
  • Five alternating fresh-VM baseline/candidate pairs. Each workload uses 31 samples after 1,000 warmups; the table reports the median of the five run-level medians and the median of the five run-level p95 values.
  • Lower latency is better. The fail-closed limit remains 5% for both median and p95 on workloads present in both releases.

Attached devices

  • Both releases were built from the exact public tags above.
  • AtomVM 0.6.6 source commit: ff993a80963298b532c1e573f883951ecaac9fef.
  • ESP32-S3 firmware used ESP-IDF v5.4.3. Both ESP32-S3 CPUs ran at 240 MHz; flash and PSRAM ran at 80 MHz.
  • RP2040 firmware used the AtomVM Pico SDK fork at 1d68df97567bcadb89eaf18d4caead0d45151cb8, with mbedTLS at a77287f8fa6b76f74984121fdafc8563147435c8 and TinyUSB at 86c416d4c0fb38432460b3e11b08b9de76941bf5. Its system clock was explicitly configured to 133 MHz with a 1596 MHz PLL VCO and 6/2 post dividers.
  • These are the manufacturers' supported upper CPU clock limits, not overclocks: the ESP32-S3 datasheet specifies up to 240 MHz and the RP2040 specification specifies up to 133 MHz.
  • The same benchmark source was used by both releases. Harness SHA-256: 9ff77b1a96b155ebf6006b9929b2054c3adf3a7b032a913a8f1b39d8bc0e82e6.
  • Pack SHA-256 identities:
    • 0.2.0: 017c7c63f812e470b863f8459b2b4c484eee892baf7fd4a19d60aee5d90a659a
    • 0.3.0: 1dc94835d9023d721b1c741d2ac78a2c866da7eda42e43bd5ae835f3173f10f1
  • Each device completed five paired captures. Order alternated baseline/candidate, candidate/baseline, baseline/candidate, candidate/baseline, baseline/candidate to reduce order and thermal bias.
  • Common and partial workloads use 50 timed iterations after warmup; descriptor accessors use 250 timed iterations after warmup. Values are microseconds per call.
  • All 30 captures contain one begin marker, 14 benchmark rows, and one end marker. None contains a watchdog, panic, abort, backtrace, out-of-memory, or OOM marker.

Raw serial captures, build logs, toolchain revisions, pack files, firmware, and hashes are retained in the operator evidence directory on the Dell hardware host. The exact clock inputs are committed under hardware/benchmark.

Host results

Workload0.2.0 median ns0.3.0 median nsChange0.2.0 p95 ns0.3.0 p95 nsChangeGate
scalar_decode3573521.40% faster3633571.65% fasterPASS
scalar_encode1591561.89% faster1641621.22% fasterPASS
string_decode_64108911202.85% slower110711392.89% slowerPASS
string_encode_648007901.25% faster8168031.59% fasterPASS
nested_decode270527511.70% slower273727952.12% slowerPASS
nested_encode629262620.48% faster633963160.36% fasterPASS
sequence_decode_32427042380.75% faster432743100.39% fasterPASS
partial_decode_nested322732721.39% slower327133191.47% slowerPASS
deterministic_map_encode926193500.96% slower933194331.09% slowerPASS
deterministic_map_decode500650470.82% slower507351000.53% slowerPASS
malformed_declared_array5064893.36% faster5155002.91% fasterPASS

Overall host regression gate: PASS. Every directly comparable median and p95 remained within the unchanged 5% limit.

New 0.3.0 host workloads

These APIs do not exist in 0.2.0. Their baseline is therefore N/A; no percentage change is invented.

Workload0.2.00.3.0 median ns0.3.0 p95 ns
encode_with_size_nestedN/A63596408
encode_sequence_32N/A62516328
sequence_fold_32N/A79668034
validate_all_nestedN/A31863217
partial_map_foldN/A51055183
partial_array_foldN/A41894233
partial_selectN/A62536309
partial_map_findN/A65456627
partial_array_nthN/A41394200

Attached-device results

Each row below compares the exact public tags on the same named physical device, firmware image, runtime, clock configuration, benchmark harness, and payload.

BoardExact physical identityCPUFlash / PSRAM
ESP32-S3 N16R8QFN56 rev 0.2, MAC 1c:db:d4:5b:f5:d0, native USB identifier 1C:DB:D4:5B:F5:D0240 MHz16 MiB DIO flash / 8 MiB octal PSRAM, both 80 MHz
WaveShare N32R16VESP32-S3-DEV-KIT-N32R16V, MAC 90:e5:b1:d8:48:b0, CH340 UART serial 5B61092782240 MHz32 MiB OPI/DTR flash / 16 MiB octal PSRAM, both 80 MHz
RP2040 E462…RP2040 B2, BOOTSEL serial E0C9125B0D9B, flash ID E46254C5C32D122C133 MHz16 MiB flash / 264 KiB SRAM
FunctionESP32-S3 N16R8 0.2.0 µs0.3.0 µsChangeWaveShare N32R16V 0.2.0 µs0.3.0 µsChangeRP2040 E462… 0.2.0 µs0.3.0 µsChange
encode/18849.468844.020.06% faster3507.303508.000.02% slower4824.604791.260.69% faster
decode/110063.5210044.020.19% faster3931.223935.360.11% slower6082.166067.220.25% faster
partial_decode/115575.3815575.920.00% slower6325.486327.620.03% slower9261.069346.800.93% slower
partial_decode/215737.2615738.900.01% slower6373.286373.640.01% slower9275.709372.161.04% slower
partial_deep_decode/112227.0412219.280.06% faster4972.544985.380.26% slower7742.007786.840.58% slower
partial_value_bytes/11017.201011.640.55% faster451.96463.162.48% slower557.50555.890.29% faster
partial_contents/11260.141252.280.62% faster511.97522.502.06% slower498.50503.040.91% slower
partial_skip/1509.06480.235.66% faster227.07232.112.22% slower226.12221.102.22% faster
partial_type/1510.14479.825.94% faster226.62231.482.14% slower226.05221.502.01% faster
partial_count/1508.55480.305.56% faster227.51232.162.04% slower228.13221.882.74% faster
partial_tag/1554.26605.999.33% slower270.87309.8214.38% slower250.46262.504.81% slower
partial_size/1568.37618.168.76% slower285.07323.8313.60% slower263.27270.002.56% slower
partial_offset/1508.95479.535.78% faster227.21231.561.91% slower225.49223.250.99% faster
partial_length/1511.07477.456.58% faster228.18231.841.60% slower228.41224.421.75% faster

Comparable-workload totals:

ScopeFaster rowsSlower rowsNet average change
ESP32-S3 N16R8104-0.92%
WaveShare N32R16V014+3.06%
RP2040 E462…86-0.01%
All 42 board/workload results1824+0.71%

The net average is the unweighted arithmetic mean of the signed per-row changes in this exact comparison matrix. Negative is faster; positive is slower. Current-only workloads with an N/A baseline are excluded.

New 0.3.0 attached-device workloads

These APIs do not exist in 0.2.0, so baseline and percentage remain N/A. Their absolute 0.3.0 results are measured separately on every target.

Workload0.2.0 baselineESP32-S3 N16R8 0.3.0 median µsWaveShare N32R16V 0.3.0 median µsRP2040 E462… 0.3.0 median µs
encode_with_size_nestedN/A8553.463487.344817.44
encode_sequence_32N/A22377.748938.2210792.68
sequence_fold_32N/A51161.9420206.1627620.30
validate_all_nestedN/A20292.087699.969819.90
partial_map_foldN/A33097.0012651.2417685.38
partial_array_foldN/A29531.6611219.8015642.32
partial_selectN/A36947.2214595.6020275.32
partial_map_findN/A36417.7214349.2819772.56
partial_array_nthN/A27372.0010498.6614340.08

Evidence identities:

  • Candidate-only harness SHA-256: 299fec5a1782c62e6afd03ab134b8a9711c4dff465cfdf3e054095aaa1234d65.
  • Candidate-only pack SHA-256: a92c4b93d3ce03f64529c18be63b9b42f1034fc55add0d108df6b51a14b21e59.
  • Evidence bundle: candidate-api-three-targets-06333306be6d0f83d9b0b257afdc29f82bcd22ea.tar.gz (SHA-256 16b762a265d73ea53a9f9491722093222b9df87c0cc62877636acbd21c35e90e), Dell operator evidence: results/candidate-api/.
  • ESP32-S3 N16R8: 5 captures, log-set SHA-256 8ebad927d7bce1e592a50425205e80bf50355dec469b1d13ac49557b21ed6ab4; Dell operator evidence: results/candidate-api/esp32-s3-n16r8-candidate-api-run[1-5].log.
  • WaveShare N32R16V: 5 captures, log-set SHA-256 f7d4255126b375f76ff872806b77af8d2c97c9c90c124d0ce8f15a5ebdd799a4; Dell operator evidence: results/candidate-api/waveshare-n32r16v-candidate-api-run[1-5].log.
  • RP2040 E462…: 5 captures, log-set SHA-256 789e570e4622f75e27da6497d88fc434cfa6ec0415095fdacb71a133f317ce9d; Dell operator evidence: results/candidate-api/rp2040-candidate-api-run[1-5].log.

Manifest: docs/benchmarks/data/0.3.0.json (SHA-256 d231f731225b34b86fee48db3221341333f17533f662596929bf899b9786bfa6).

Interpretation

  • Core encode/1 and decode/1 latency is effectively flat on all three devices; every change is below 1%.
  • The partial decode paths remain within 1.04%.
  • partial_tag/1 and partial_size/1 are reproducible target-specific regressions and are reported rather than hidden. Across five runs, partial_tag/1 moved from 553.46-556.57 to 604.18-606.70 µs on ESP32-S3 N16R8, from 270.78-271.37 to 309.77-309.83 µs on WaveShare, and from 249.88-250.56 to 261.84-262.64 µs on RP2040. partial_size/1 shows the same stable direction: 561.07-569.02 to 617.77-619.63 µs, 284.64-285.34 to 323.63-323.95 µs, and 262.84-263.87 to 269.59-270.51 µs respectively.
  • These accessor measurements are sub-millisecond operations and are not part of the host release threshold. The exact public-tag host gate passed all comparable workloads under the unchanged 5% median/p95 limit.
  • Absolute timings must not be compared across boards: flash mode, external memory, cache behavior, and the AtomVM port all affect throughput.

Retained functional and bounded-soak evidence

The existing 14-row exact-tag comparison was not replayed to regenerate this report. The separate candidate-only captures above measured only the nine 0.3.0 APIs that the common harness did not cover.

The retained 0.3.0 release-candidate hardware validation is run 32586422115 at commit 12903636339edb1172167d3905907ff583ffd7d2. It completed the AtomVM target suite, benchmark, and 40-round retained-growth soak on the WaveShare N32R16V and RP2040 without watchdog, panic, abort, backtrace, or out-of-memory markers. Because that retained run did not cover the separate ESP32-S3 N16R8, the missing functional suite and 40-round soak were captured on that exact device from public tag commit 06333306be6d0f83d9b0b257afdc29f82bcd22ea.

BoardFirst/late heap maximumFirst/late memory maximumRoundsResult
ESP32-S3 N16R863 / 63 words492 / 492 bytes40pass
WaveShare N32R16V63 / 63 words492 / 492 bytes40pass
RP2040 E462…63 / 63 words484 / 484 bytes40pass

Evidence identities:

The retained WaveShare archive uses the workflow's generic esp32-s3 platform name; its discovery log records UART serial 5B61092782, binding it to the WaveShare N32R16V. These are bounded measurements on named devices, not universal latency or leak-free guarantees.

The historical 160 MHz evidence, maximum-bound measurements, and capacity limits remain unchanged in the 0.2.0 report. They are not relabelled as 240 MHz evidence.

Build and evidence identities

ItemSHA-256
ESP32-S3 N16R8 clock configuration95352d7732c317d2ba10e27ab50a7f041c705cd5804ea19ce70b98a74901d6c1
WaveShare N32R16V clock configuration6ad001f7ceef09509656110088a4302af46f4eda5f1096411929b4b9a2942d43
RP2040 133 MHz CMake configuration2bb06526cd054769b4b65fae746c5c802ce31ce0596c20d2952e1cc00c99ba10
ESP32-S3 N16R8 bootloader321f9d9f435608c0fad3f4ebc55792375dda60bd9e8191f3916a070741efec5b
ESP32-S3 N16R8 AtomVM imagea034900e66ef6da9aa2fc18665f2cfa98eda60c84fb9e4214dd67864b73f9b0f
WaveShare N32R16V bootloadere56a7e655af7866af85fd28c4d6ef32e57184a6814b587368b6ec729bbeed77e
WaveShare N32R16V AtomVM image067fc155a8eb8691bb6a0086aa3f978089a37a82a7f48444a8f855498e9a553b
Shared ESP32 partition table607f264e82a8d7cd81e27377548ad036081a5e483b3ac020062a7186b1191378
RP2040 AtomVM UF298cbf02970d80f47b9bc229fffa99c8a8520ab032cef5794a6b8916e88a66269
RP2040 AtomVM binary8f4003e4bbf0af28bf8435e5ce37c3775e745222b3594f09d2c9dd5d21fa0c68

Reproduction policy

The canonical host comparison remains:

BENCHMARK_RUNS=5 BENCHMARK_NOISE_TOLERANCE_PERCENT=5 \
  bash scripts/benchmark-remediation.sh

Release evidence documentation is generated from the fail-closed structured manifest at docs/benchmarks/data/0.3.0.json:

python3 scripts/release-evidence.py --write
python3 scripts/release-evidence.py

The first command regenerates the checked blocks in this report, the release notes, and the README. The second is check-only and is also called by scripts/check-release-metadata.sh. It rejects a missing target, workload, five-run candidate-only result, evidence hash, or 40-round functional/soak row.

For hardware, use the committed board-specific clock configuration, exact public tag packs, AtomVM/toolchain revisions, paired order, warmup, and iteration counts recorded above. Do not compare captures made on different physical devices or silently substitute historical clock settings. Existing valid release evidence is processed into the report; benchmarks are not repeated merely to regenerate documentation.