Five articles ago, RockRecommender only knew how to train on synthetic data, even while already receiving real likes and dislikes. Today the pieces fit together: reading Mongo and deciding the source, comparing before promoting, running on its own on a schedule, and reloading without restarting.
Watching the cycle run at a small scale
To see this working without waiting for thousands of real interactions, the fastest way is to temporarily lower the comparison bar. A low SyntheticUserCount in Training's appsettings.json (5, for example) makes the synthetic generator produce just a few dozen interactions, a volume that a handful of test users, giving real feedback through the Api, can already beat:
curl -X POST http://localhost:5110/users -d '{"likedBands": ["Black Sabbath"]}' -H "Content-Type: application/json"
curl -X POST http://localhost:5110/users/{id}/feedback -d '{"songId": "...", "liked": true}' -H "Content-Type: application/json"
Running RockRecommender.Training after that, the console report shows the switch: the interactions section starts saying "real feedback" instead of "synthetic", the comparison evaluates the new model against whatever was already active, and the promotion section says whether it won. With no Api restart, the next next-song call already answers with the promoted model.
What was left out, on purpose
This series solved the problem that actually existed: training on real data once it's already good enough, without risking making production worse. It doesn't try to solve problems the project doesn't have yet: there's no manual way to roll back a promotion (the candidate just sits in a separate file until the next run overwrites it, there's no history of older versions), there's no dashboard tracking the runs, and there's no A/B testing between models. None of that is ruled out on principle, there's just no real problem today that asks for that complexity.
RockRecommender learned to close its own loop: using the feedback it collects on its own to get better, without forgetting to check whether it actually got better before switching.