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

GateCommandResultNotes
Fast./gate.py fast --all-compositionsPassedContained in the audit gate below
Strict./pet.py verify allPassedThe required completion gate for every implementation PBI, run per composition
Audit./gate.py audit --all-compositionsPassedFinal 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.

CheckEvidenceResultNotes
GCC build/testIncluded in audit gatePassed10 CTest cases desktop-sdl, 7 headless
Clang build/testIncluded in audit gatePassedSame suites, second toolchain
ASanIncluded in strict or audit gatePassedBoth compositions
UBSanIncluded in strict or audit gatePassedBoth compositions
CppcheckIncluded in fast, strict, or audit gatePassed64 sources analysed
Clang-TidyIncluded in strict or audit gatePassedProject code only, both compositions
FormattingIncluded in fast, strict, or audit gatePassed96 files match the style
Public header self-containmentIncluded in strict or audit gatePassed22 headers desktop-sdl and 17 headless, GCC and Clang
Core boundary symbolsIncluded in strict or audit gatePassedGCC needs nothing external, Clang needs memcpy and memset in 2 objects each, and no Core compile line names a forbidden dependency
Include boundaryIncluded in fast, strict, or audit gatePassedboundaries.py, 12 boundaries hold over 209 scanned source files
Embedded boundaryIncluded in fast, strict, or audit gatePassedembedded.py, 11 project sources hold the boundary against the ESP-IDF compile database
Component pathsIncluded in fast, strict, or audit gatePassed3 declared components are present
Asset manifest and runtime layoutIncluded in fast, strict, or audit gatePassedassets.py, 1 asset set with 5 manifest references resolving under each build output
Runtime allocation probeIncluded in audit gatePassed0 allocations and 0 memory errors in both compositions
Allocation probe coverageIncluded in strict or audit gatePassedprobe.py, 9 public Core operations exercised, in every composition and toolchain pass
CoverageIncluded in audit gatePassedMeasures src only
ValgrindIncluded in audit gatePassedAllocation probe and test suite report 14 framework allocations and 0 errors per composition
Composition selectionpython3 tools/tests/test_compositions.py, contained in the gatePassed31 composition tests
Gate selectionpython3 tools/tests/test_gate.py, contained in the gatePassed36 gate tests, including board variant selection
Project command entrypointpython3 tools/tests/test_pet.py, contained in the gatePassed32 project command tests
Dependency overridespython3 tools/tests/test_dependencies.py, contained in the gatePassed7 dependency override tests
Verification policypython3 tools/tests/test_verification.py, contained in the gatePassed105 verification tests
ESP-IDF build proofidf.py set-target esp32 and idf.py buildPassedRecorded below, run outside the hosted gate
Support matrixpython3 tools/verify/matrix.pyPassedRelease-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".

ItemValue
Commandsidf.py set-target esp32 then idf.py build
FrameworkESP-IDF v6.0.2
Toolchainbundled Xtensa GCC 15.2.0, xtensa-esp32-elf-gcc
Targetesp32, derived from the classic T-Display variant
Resultconfigured, compiled, and linked pet_firmware.elf
Imagepet_firmware.bin at 0x1e120 bytes, 88% of the smallest app partition free
Boundarypython3 tools/verify/embedded.py --require holds over 11 project sources against that build
Deviceno 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

TargetLine coverageBranch coverageNotes
Pet Core100.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.

CommandResultKind
./apps/desktop/pet_desktop --steps 240 --step-ms 16Exit 0, name=Pixel activity=idle expression=neutral frames=240 canvas=320x240 assets=loaded images=5 on the real Wayland driverAutomated process
SDL_VIDEODRIVER=x11 ./apps/desktop/pet_desktop --steps 240 --step-ms 16Exit 0, same reported line on the real X11 driverAutomated process
pet_desktop observed by the maintainer on Wayland and X11The 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-CManual 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

EnvironmentStatusNotes
Linux GCCVerifiedBuilt and tested, GCC 15.3.0, plus the real-driver desktop runs
Linux ClangVerifiedBuilt and tested, Clang 22.1.8
Windows MSVCDesignedPresets 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 esp32Cross-compile verifiedConfigured, compiled, and linked through ESP-IDF v6.0.2. No hardware runtime claim, see LIM-012 and LIM-013
Embedded, any other board or targetDesignedNot implemented and not built

Verified toolchain

ToolVersion
CMake4.4.0
Ninja1.13.2
GCC15.3.0
Clang and clang-format22.1.8
Cppcheck2.21.0
Gcovr6.0
Valgrind3.27.1
GNU nm2.45.0
Python3.13.14
ESP-IDF6.0.2
Xtensa GCC15.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.cmake is 0.3.0, and pet_version_string returns it through the generated pet/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.