firmware: add CV1 contributor checks that need no jig
Requested by David
What changed and why
Adds checks a CV1 contributor can run without a jig: host tests, key-free application compilation, offline artifact preflight, and startup replay. Also adds the OTA design docs. The owner-OTA research code goes in a separate held change. No firmware behavior changes: audio_packet_logic.c is a tested seam that is not linked until transport.c switches to it in a separate change.
Also documents a bench trap: the mainboard has no antenna part, so an opened board barely radiates and weak advertising from it is not a firmware fault.
Product invariants affected
- INV-CAP-1
Not changed in practice: the new lib/core seam is not linked into the firmware by this PR, so the capture path is unchanged. The change that links it needs its own BLE audio evidence.
How it was verified
All on head f322521, from a clean clone on the bench Mac, with no device access:
python3 omi/firmware/tools/cv1/contributor.py quick-host --output <new-file>passes.python3 -m unittest discover -p 'test_*.py'inomi/firmware/tools/cv1: 191 tests pass.source_reviewtests: 14 pass with the pinned NCS 2.9.0 source, and skip cleanly without it.contributor.py compile-onlyagainst pinned NCS 2.9.0:application_compile_onlypasses.
Not verified: none of this exercises hardware, BLE or a real OTA. No release claim is made.
Replaces #24353, whose first commit contained a telemetry fixture of unverifiable consent. Every Cubic finding is dispositioned in the PR comments. Findings on the research code move with it to its own held change.
Tests
The PR is mostly tests. omi/tests/host/audio_packet_logic_test.c covers the new seam.
UI evidence
UI-Evidence: none -- firmware tooling and docs only
🤖 Generated with Claude Code