283c4f058c
The static py-modules list in pyproject.toml drifted from the source tree each time the root layout changed. An installed wheel then raised ModuleNotFoundError on import: hermes_state_common, and every gateway or CLI start failed. The list missed hermes_state_holders, mini_swe_runner, and the 15 new hermes_state_* modules from this branch. setup.py now derives py_modules from the source tree at build time. setuptools package discovery sees only directories with an __init__.py, so root single-file modules need py_modules in every wheel build. setup() kwargs merge with pyproject.toml, and setup.py is the only legitimate wheel or sdist builder, so the derived list is the single source of truth. The nix build is the only wheel consumer. Its source filter keeps every root .py file, so the build sandbox derives the same set as the checkout. Editable installs do not read py_modules: build_editable never runs bdist_wheel. Verified: wheel and sdist built with HERMES_NIX_BUILD=1 carry all 38 root modules. The guard still blocks builds without the nix env var. The sealed uv2nix venv from nix build .#default imports hermes_state_holders, hermes_state_sessions, mini_swe_runner, and hermes_startup_watchdog. (cherry picked from commit e23d467b523d50ad088b89b578017996709589cf) Invariant test updated to pin the derived list (no static py-modules; every root module packaged code imports ships).