# atomvm-cbor 0.3.1 validation report

Version 0.3.1 is a documentation-compatibility patch. It replaces README
Mermaid source blocks with deterministic static SVG charts so the same current
release comparison renders on GitHub and Hex.pm. Runtime code, public APIs,
benchmark values, supported runtimes, and validation thresholds are unchanged
from 0.3.0.

No host or attached-device benchmark was repeated for this patch. The tables
below are regenerated from the retained structured 0.3.0 evidence manifest,
copied byte-for-byte except for its 0.3.1 package-release identity. The original
full methodology and evidence narrative remains in the [0.3.0 validation
report](0.3.0.md).

## Evidence identity and targets

- Performance baseline: public `0.2.0`, commit
  `50cae38fc0d846e41fe61c9d5d80229c6cff91f2`.
- Measured candidate source: `0.3.0` runtime commit
  `06333306be6d0f83d9b0b257afdc29f82bcd22ea`.
- Published 0.3.0 release commit:
  `950b0374360c7f40cde97dadfddb5a0cd44e34e0`.
- 0.3.1 changes only versioned documentation and static chart assets; the
  benchmark and runtime source inputs are unchanged.

<!-- release-evidence:report-identities:start -->
| Board | Exact physical identity | CPU | Flash / PSRAM |
| :--- | :--- | ---: | :--- |
| ESP32-S3 N16R8 | QFN56 rev 0.2, MAC `1c:db:d4:5b:f5:d0`, native USB identifier `1C:DB:D4:5B:F5:D0` | 240 MHz | 16 MiB DIO flash / 8 MiB octal PSRAM, both 80 MHz |
| WaveShare N32R16V | ESP32-S3-DEV-KIT-N32R16V, MAC `90:e5:b1:d8:48:b0`, CH340 UART serial `5B61092782` | 240 MHz | 32 MiB OPI/DTR flash / 16 MiB octal PSRAM, both 80 MHz |
| RP2040 E462… | RP2040 B2, BOOTSEL serial `E0C9125B0D9B`, flash ID `E46254C5C32D122C` | 133 MHz | 16 MiB flash / 264 KiB SRAM |
<!-- release-evidence:report-identities:end -->

## Attached-device comparison: 0.2.0 to 0.3.0

Lower timings are better. Negative signed net averages mean faster overall;
positive signed net averages mean slower overall.

<!-- release-evidence:report-common:start -->
| Function | ESP32-S3 N16R8 0.2.0 µs | 0.3.0 µs | Change | WaveShare N32R16V 0.2.0 µs | 0.3.0 µs | Change | RP2040 E462… 0.2.0 µs | 0.3.0 µs | Change |
| :--- | ---: | ---: | :--- | ---: | ---: | :--- | ---: | ---: | :--- |
| `encode/1` | 8849.46 | 8844.02 | 0.06% faster | 3507.30 | 3508.00 | 0.02% slower | 4824.60 | 4791.26 | 0.69% faster |
| `decode/1` | 10063.52 | 10044.02 | 0.19% faster | 3931.22 | 3935.36 | 0.11% slower | 6082.16 | 6067.22 | 0.25% faster |
| `partial_decode/1` | 15575.38 | 15575.92 | 0.00% slower | 6325.48 | 6327.62 | 0.03% slower | 9261.06 | 9346.80 | 0.93% slower |
| `partial_decode/2` | 15737.26 | 15738.90 | 0.01% slower | 6373.28 | 6373.64 | 0.01% slower | 9275.70 | 9372.16 | 1.04% slower |
| `partial_deep_decode/1` | 12227.04 | 12219.28 | 0.06% faster | 4972.54 | 4985.38 | 0.26% slower | 7742.00 | 7786.84 | 0.58% slower |
| `partial_value_bytes/1` | 1017.20 | 1011.64 | 0.55% faster | 451.96 | 463.16 | 2.48% slower | 557.50 | 555.89 | 0.29% faster |
| `partial_contents/1` | 1260.14 | 1252.28 | 0.62% faster | 511.97 | 522.50 | 2.06% slower | 498.50 | 503.04 | 0.91% slower |
| `partial_skip/1` | 509.06 | 480.23 | 5.66% faster | 227.07 | 232.11 | 2.22% slower | 226.12 | 221.10 | 2.22% faster |
| `partial_type/1` | 510.14 | 479.82 | 5.94% faster | 226.62 | 231.48 | 2.14% slower | 226.05 | 221.50 | 2.01% faster |
| `partial_count/1` | 508.55 | 480.30 | 5.56% faster | 227.51 | 232.16 | 2.04% slower | 228.13 | 221.88 | 2.74% faster |
| `partial_tag/1` | 554.26 | 605.99 | 9.33% slower | 270.87 | 309.82 | 14.38% slower | 250.46 | 262.50 | 4.81% slower |
| `partial_size/1` | 568.37 | 618.16 | 8.76% slower | 285.07 | 323.83 | 13.60% slower | 263.27 | 270.00 | 2.56% slower |
| `partial_offset/1` | 508.95 | 479.53 | 5.78% faster | 227.21 | 231.56 | 1.91% slower | 225.49 | 223.25 | 0.99% faster |
| `partial_length/1` | 511.07 | 477.45 | 6.58% faster | 228.18 | 231.84 | 1.60% slower | 228.41 | 224.42 | 1.75% faster |

Comparable-workload totals:

| Scope | Faster rows | Slower rows | Net average change |
| :--- | ---: | ---: | ---: |
| ESP32-S3 N16R8 | 10 | 4 | -0.92% |
| WaveShare N32R16V | 0 | 14 | +3.06% |
| RP2040 E462… | 8 | 6 | -0.01% |
| All 42 board/workload results | 18 | 24 | +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.
<!-- release-evidence:report-common:end -->

## New 0.3.0 attached-device workloads

These APIs do not exist in 0.2.0, so the baseline and percentage are `N/A`.
Measured 0.3.0 candidate values remain present for every maintained target.

<!-- release-evidence:report-candidate-only:start -->
| Workload | 0.2.0 baseline | ESP32-S3 N16R8 0.3.0 median µs | WaveShare N32R16V 0.3.0 median µs | RP2040 E462… 0.3.0 median µs |
| :--- | :---: | ---: | ---: | ---: |
| `encode_with_size_nested` | N/A | 8553.46 | 3487.34 | 4817.44 |
| `encode_sequence_32` | N/A | 22377.74 | 8938.22 | 10792.68 |
| `sequence_fold_32` | N/A | 51161.94 | 20206.16 | 27620.30 |
| `validate_all_nested` | N/A | 20292.08 | 7699.96 | 9819.90 |
| `partial_map_fold` | N/A | 33097.00 | 12651.24 | 17685.38 |
| `partial_array_fold` | N/A | 29531.66 | 11219.80 | 15642.32 |
| `partial_select` | N/A | 36947.22 | 14595.60 | 20275.32 |
| `partial_map_find` | N/A | 36417.72 | 14349.28 | 19772.56 |
| `partial_array_nth` | N/A | 27372.00 | 10498.66 | 14340.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.1.json` (SHA-256 `bdec66e487ad59e2eec6a030b36072beafe3c67d1c1827d780ac986c444eaf9b`).
<!-- release-evidence:report-candidate-only:end -->

## Retained functional and bounded-soak evidence

Functional and soak evidence is distinct from performance evidence. All three
named targets retain their exact successful 40-round result and evidence
identity; no soak was rerun for this documentation-only patch.

<!-- release-evidence:report-soak:start -->
| Board | First/late heap maximum | First/late memory maximum | Rounds | Result |
| :--- | ---: | ---: | ---: | :--- |
| ESP32-S3 N16R8 | 63 / 63 words | 492 / 492 bytes | 40 | pass |
| WaveShare N32R16V | 63 / 63 words | 492 / 492 bytes | 40 | pass |
| RP2040 E462… | 63 / 63 words | 484 / 484 bytes | 40 | pass |

Evidence identities:

- ESP32-S3 N16R8: [Dell exact-tag supplemental functional/soak capture, 2026-08-23](https://github.com/Atelje-Vagabond/atomvm-cbor/pull/12), source `06333306be6d0f83d9b0b257afdc29f82bcd22ea`, `esp32-s3-n16r8-functional-soak-06333306be6d0f83d9b0b257afdc29f82bcd22ea.tar.gz` (SHA-256 `7e138061ae7dcf7452bfd5e2410731d300516a0c85d0356f051fc48212449ac7`).
- WaveShare N32R16V: [retained release-candidate run 32586422115, ESP job 97064781219](https://github.com/Atelje-Vagabond/atomvm-cbor/pull/12), source `12903636339edb1172167d3905907ff583ffd7d2`, `esp32-s3-hardware-results-12903636339edb1172167d3905907ff583ffd7d2.tar.gz` (SHA-256 `51203bb68c0fd89f9b9ff909e6fa97b96a906b0db74dfb5a16311cab49ed1572`).
- RP2040 E462…: [retained release-candidate run 32586422115, RP2040 job 97064781214](https://github.com/Atelje-Vagabond/atomvm-cbor/pull/12), source `12903636339edb1172167d3905907ff583ffd7d2`, `rp2040-hardware-results-12903636339edb1172167d3905907ff583ffd7d2.tar.gz` (SHA-256 `0bd6594e9012bc967985fcf7fdd35f7ea4e5a470c928f29e3866896a98fcb238`).
<!-- release-evidence:report-soak:end -->

## Reproduction and policy

The structured source for this report is
[`data/0.3.1.json`](data/0.3.1.json). It retains the exact 0.3.0 measurements;
only its package-release field is 0.3.1. Regenerate and verify the report and
SVG assets with:

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

Valid exact evidence is reused. Documentation regeneration is never a reason to
repeat host or physical-device benchmarks.
