FireFLY Arduino 0.1.0 validation — 2026-10-16
===========================================
Host: macOS arm64. Arduino CLI 1.4.1. WCH:ch32v dependency 1.0.4.
Compiler: riscv-none-embed-gcc 8.2.0. USB stack revisions: see UPSTREAM.txt.

PASS: Installer download SHA-256 verification and install into isolated sketchbook.
PASS: Board recognition, both USB automatic and USB recovery menu configurations.
PASS: Installation using the user's saved Arduino IDE sketchbook configuration.
PASS: Installed-core compile results:
  EmptyUSB:  12,772 bytes flash / 2,996 bytes static RAM.
  USBSerial: 13,100 bytes flash / 2,996 bytes static RAM.
  PadBlink:  15,892 bytes flash / 3,036 bytes static RAM.
  Limits:    63,488 bytes flash / 20,480 bytes RAM.
PASS: EmptyUSB ELF includes USBFS_IRQHandler, SerialUSB, FireFLYUSB_begin,
      FireFLY_enterBootloader, tud_cdc_line_state_cb and USB descriptor callback.
PASS: Three mocked uploader tests: wait for enumeration, stop on flash failure,
      stop and suggest BOOT recovery when enumeration times out.
PASS: Arduino CLI recovery-upload recipe invoked a mock executable with the
      expected 'flash' command and built ELF. It did not flash physical hardware.
PASS: macOS uploader launches; no non-system dynamic-library dependency detected.

NOT TESTED ON HARDWARE: USB enumeration, serial data transfer, 1200-baud reset,
factory ROM flash/restart, GPIO/ADC timing and voltage behavior, battery supply,
touch sensing, or onboard LED protocol. BOOT recovery should be verified first.
A compiler pass does not validate physical USB or the board's mechanical connector.

Suggested first-board acceptance:
- Hold BOOT while plugging in; confirm ROM is detected; upload USBSerial.
- Confirm CDC port enumerates and returns serial data.
- Upload EmptyUSB through USB automatic; confirm CDC returns afterward.
- Repeat upload; power-cycle; repeat BOOT recovery.
- Check D0-D4 with a meter and external resistor/LED before attaching loads.

Host tests: python3 -m unittest discover -s tests -v
Reproduction: install.py, then compile examples with firefly:ch32:firefly.
