Read the shared embedded contract and keep source/build, device and physical evidence separate.
Read ports, REPL and recovery. Record the exact
port/board, MicroPython revision and sys.implementation, sys.platform,
os.uname() when available. Host CPython syntax checking is not MicroPython
execution, and a Unix-port test does not establish MCU driver behavior.
Use a locked uv environment for mpremote; select an explicit serial device
or hardware serial identity. Check mpremote --help and avoid auto-connecting
an arbitrary first port. Commands may enter raw REPL, interrupt execution and
perform a soft reset; this matters when outputs are attached.
Reproduce the smallest script and full traceback without secrets. Distinguish
missing/frozen modules, unsupported CPython APIs, .mpy compatibility, heap
fragmentation and interrupt-context allocation. Use gc.mem_free() and
gc.mem_alloc() as observations, not a guarantee a contiguous allocation fits.
Use wrap-safe time.ticks_diff(); ticks_ms() is not an unbounded integer clock.
Interrupt code must follow port-specific allocation/exception constraints.
Device file writes, firmware erase/flash, boot.py/main.py replacement and
reset require the selected target and authorized device state. Back up user
files and preserve a recovery path before changing startup scripts. Unix-port
build/smoke validation and board commissioning are distinct outputs.
See platform coverage for the exact tested combination. A source procedure is not a claim that every target was tested.