22f66de638
Review feedback: publishing the map and its platform tag as two separate global assignments is not atomic. A reader landing between them sees the NEW map still carrying the OLD tag, and if that stale tag matches its own platform it accepts the map without rescanning — serving another platform's disabled-skill view, the leak #14536 closed. Guard the pair with a module lock. scan_skill_commands publishes both under it; get_skill_commands resolves its platform first, then reads the map and tag together under the same lock to make the freshness decision. Scanning stays outside the lock — it does file I/O and deferred imports, and concurrent scans are already independent after the local-map change. get_skill_commands now returns the scan's own completed map rather than re-reading the global, so a concurrent publish cannot swap the result between the decision and the return. Adds a regression test that holds the publish lock and asserts a reader cannot complete its lookup until it is released. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>