# TODO P4.2: unit tests for the DeviceController license guard (plan §4.2, # docs/pending/license-gating-plan.md). Two cases: # 1. license_lookup=lambda s: "" + fake _last_wafer_info → readMemoryAsync() # emits readResult {"error": ...} and spawns no thread. # 2. lookup returning "02" → proceeds to _read_worker (mock DeviceService). # THINKING: guard is a trust boundary (plan §2.1); these fail if someone # reorders the busy/license checks or renames the "serialNumber" key. # Depends on P1.2 + P2.1 being implemented.