Release v0.3.0 evidence
Release: v0.3.0
Status: Completed
Source reference: unreleased at the time of writing. No annotated tag or frozen branch exists
yet. Tagging v0.3.0 and creating release-v0.3.0 remain maintainer steps under
section 7 of the release process.
Verification date: 2026-08-01
Required gates
| Gate | Command | Result | Notes |
|---|---|---|---|
| Fast | ./gate.py fast --all-compositions | Passed | Contained in the audit gate below |
| Strict | ./pet.py verify all | Passed | The required completion gate for every implementation PBI, run per composition |
| Audit | ./gate.py audit --all-compositions | Passed | Final release gate, run from a clean tree over headless and desktop-sdl |
The audit gate begins with its own clean step, so the release result was produced from an empty
build tree rather than from an incrementally reused one. It was run once to collect the evidence
below and again after the project version was set to 0.3.0, so the recorded result belongs to the
tree that will be tagged.
Release checks
Every row was produced by ./gate.py audit --all-compositions unless noted.
| Check | Evidence | Result | Notes |
|---|---|---|---|
| GCC build/test | Included in audit gate | Passed | 10 CTest cases desktop-sdl, 7 headless |
| Clang build/test | Included in audit gate | Passed | Same suites, second toolchain |
| ASan | Included in strict or audit gate | Passed | Both compositions |
| UBSan | Included in strict or audit gate | Passed | Both compositions |
| Cppcheck | Included in fast, strict, or audit gate | Passed | 64 sources analysed |
| Clang-Tidy | Included in strict or audit gate | Passed | Project code only, both compositions |
| Formatting | Included in fast, strict, or audit gate | Passed | 96 files match the style |
| Public header self-containment | Included in strict or audit gate | Passed | 22 headers desktop-sdl and 17 headless, GCC and Clang |
| Core boundary symbols | Included in strict or audit gate | Passed | GCC needs nothing external, Clang needs memcpy and memset in 2 objects each, and no Core compile line names a forbidden dependency |
| Include boundary | Included in fast, strict, or audit gate | Passed | boundaries.py, 12 boundaries hold over 209 scanned source files |
| Embedded boundary | Included in fast, strict, or audit gate | Passed | embedded.py, 11 project sources hold the boundary against the ESP-IDF compile database |
| Component paths | Included in fast, strict, or audit gate | Passed | 3 declared components are present |
| Asset manifest and runtime layout | Included in fast, strict, or audit gate | Passed | assets.py, 1 asset set with 5 manifest references resolving under each build output |
| Runtime allocation probe | Included in audit gate | Passed | 0 allocations and 0 memory errors in both compositions |
| Allocation probe coverage | Included in strict or audit gate | Passed | probe.py, 9 public Core operations exercised, in every composition and toolchain pass |
| Coverage | Included in audit gate | Passed | Measures src only |
| Valgrind | Included in audit gate | Passed | Allocation probe and test suite report 14 framework allocations and 0 errors per composition |
| Composition selection | python3 tools/tests/test_compositions.py, contained in the gate | Passed | 31 composition tests |
| Gate selection | python3 tools/tests/test_gate.py, contained in the gate | Passed | 36 gate tests, including board variant selection |
| Project command entrypoint | python3 tools/tests/test_pet.py, contained in the gate | Passed | 32 project command tests |
| Dependency overrides | python3 tools/tests/test_dependencies.py, contained in the gate | Passed | 7 dependency override tests |
| Verification policy | python3 tools/tests/test_verification.py, contained in the gate | Passed | 105 verification tests |
| ESP-IDF build proof | idf.py set-target esp32 and idf.py build | Passed | Recorded below, run outside the hosted gate |
| Support matrix | python3 tools/verify/matrix.py | Passed | Release-time step rather than a gate step |
The five tool suites above run as gate steps and total 211 tests.
Embedded build evidence
Run from platforms/esp_idf after . "$HOME/.local/opt/espressif/export.sh".
| Item | Value |
|---|---|
| Commands | idf.py set-target esp32 then idf.py build |
| Framework | ESP-IDF v6.0.2 |
| Toolchain | bundled Xtensa GCC 15.2.0, xtensa-esp32-elf-gcc |
| Target | esp32, derived from the classic T-Display variant |
| Result | configured, compiled, and linked pet_firmware.elf |
| Image | pet_firmware.bin at 0x1e120 bytes, 88% of the smallest app partition free |
| Boundary | python3 tools/verify/embedded.py --require holds over 11 project sources against that build |
| Device | no board was flashed or run |
Pet Core and apps/firmware compile at C99 with no ESP-IDF include path and no ESP_PLATFORM
definition. pet_manifest, pet_assets, pet_presentation, and pet_layout are compiled and
archived for the target, which is build evidence rather than execution evidence.
Coverage
| Target | Line coverage | Branch coverage | Notes |
|---|---|---|---|
| Pet Core | 100.0% | 100.0% | 143/143 lines, 94/94 branches, measured over src in both compositions, from _reports/coverage |
The desktop app, the SDL frontend, the firmware app, and the shared components are exercised by
their own CTest suites rather than by the Core coverage figure, which measures src alone.
Desktop runtime evidence
Taken from build/linux-gcc-debug-desktop-sdl as the working directory.
| Command | Result | Kind |
|---|---|---|
./apps/desktop/pet_desktop --steps 240 --step-ms 16 | Exit 0, name=Pixel activity=idle expression=neutral frames=240 canvas=320x240 assets=loaded images=5 on the real Wayland driver | Automated process |
SDL_VIDEODRIVER=x11 ./apps/desktop/pet_desktop --steps 240 --step-ms 16 | Exit 0, same reported line on the real X11 driver | Automated process |
pet_desktop observed by the maintainer on Wayland and X11 | The window with the pet drawn in it, a visible greet response to the space key and the left mouse button, a greet settling from the happy expression into the attentive activity, and a clean exit through the window close button and Ctrl-C | Manual observation |
Visible rendering and synthesised interaction remain outside automated verification, which LIM-011
records, so the manual row is the only evidence for either and has to be repeated by hand for every
release. The two automated rows prove the process lifecycle, the asset load, and a clean exit on
both drivers, and nothing about what is drawn.
The observed greet is the first on-screen evidence for the dwell ordering that ADR-011 specifies
and PBI-082 implemented. LIM-010 was already closed on the Core and presentation tests, so this
confirms the rule rather than carrying it.
Support status
| Environment | Status | Notes |
|---|---|---|
| Linux GCC | Verified | Built and tested, GCC 15.3.0, plus the real-driver desktop runs |
| Linux Clang | Verified | Built and tested, Clang 22.1.8 |
| Windows MSVC | Designed | Presets provided but never executed. The symbol scan and the allocation check cannot run there at all, see LIM-001 and LIM-002 |
Embedded, classic T-Display for esp32 | Cross-compile verified | Configured, compiled, and linked through ESP-IDF v6.0.2. No hardware runtime claim, see LIM-012 and LIM-013 |
| Embedded, any other board or target | Designed | Not implemented and not built |
Verified toolchain
| Tool | Version |
|---|---|
| CMake | 4.4.0 |
| Ninja | 1.13.2 |
| GCC | 15.3.0 |
| Clang and clang-format | 22.1.8 |
| Cppcheck | 2.21.0 |
| Gcovr | 6.0 |
| Valgrind | 3.27.1 |
| GNU nm | 2.45.0 |
| Python | 3.13.14 |
| ESP-IDF | 6.0.2 |
| Xtensa GCC | 15.2.0 |
The verification host was Linux x86_64. tools/verify/matrix.py prints the hosted set from the
environment it runs in. The ESP-IDF and Xtensa rows come from the embedded build above.
Notes
- The project version in
cmake/pet_version.cmakeis0.3.0, andpet_version_stringreturns it through the generatedpet/version.h. - No check required for the release failed. The unavailable Windows checks and the absent hardware runtime evidence are recorded as not run rather than passing, and neither is required for this release.
- The full claim-to-evidence mapping is in section 10.5 of the version architecture.
- This evidence is valid for the commit that will be tagged
v0.3.0. If any source changes before tagging, the final required gate must run again against the exact commit to tag. - Future fixes require a new commit and a patch release tag, such as
v0.3.1.