One simulator. Never two.
The code that decides whether a signal hit its target is the same code that resolves the public ledger and the same code that runs our backtests. There is no separate "reporting" version. This sounds obvious and almost nowhere is it true: the usual pattern is a live tracker and a research script that disagree quietly, and the one that flatters gets quoted.