desklock is a three-component repo and only the gateway had a Makefile, so make test meant "the gateway suite" or "no such target" depending on which directory you happened to be standing in. One root Makefile makes it mean the same thing everywhere (D-27), and gateway/Makefile is removed rather than delegated to, so there is one place to look. The firmware targets now source ~/esp-idf/export.sh themselves. Verified that idf.py does not resolve on PATH without it and does after — the same class of failure that has cost time on four other tools on this host, and the reason D-10 puts path resolution in the Makefile rather than in callers. They fail loudly with a hint when the toolchain is absent instead of reporting command not found. make test never reports green for the firmware. It has no suite, so it prints undetermined rather than skipping silently — a no-op target that exits 0 would claim a pass for something never run (D-26). Verified: make test runs the real 9-test gateway suite, make lint passes, the missing-toolchain guard fires, and make help lists every target. The firmware build itself was not run. Co-Authored-By: Claude <noreply@anthropic.com>