Modal function mounts (volumes, local dirs) are defined on the @app.function decorator, not the image. When a training function loads config files at runtime (e.g. voice profiles for writeprints baseline), the files must be mounted on the function that uses them, not just on other functions in the same app. A silent try/except around the file load masked the missing mount — the training ran but with the feature effectively disabled (aux loss always zero). The only clue was that total_loss equaled distill_loss when it shouldn't have.
When adding runtime file dependencies to a Modal function: (1) verify the mount exists on THAT function's decorator, not just on sibling functions in the same app; (2) never silently swallow FileNotFoundError/load failures for config that controls training behavior — log a warning at minimum; (3) validate the feature is active by checking the loss decomposition early: if total_loss == distill_loss when aux weight > 0, the aux signal isn't reaching the optimizer. In this case, adding .add_local_dir('data/profiles', '/profiles') to the SDPO function's image definition fixed it. The bench function already had it, but each @app.function has independent mounts.