Confusion about how to implement non-slip timing for trials with known end points

That probably just introduces unnecessary complexity. You can rely on the TR of the scanner being very precise. Similarly, PsychoPy can show stimuli very precisely for two second durations, subject to some caveats. The important thing is to test that your task duration matches the scanner run precisely. The only important TR signal to catch is the very first one. After that, if things are specified correctly, you should find that your task ends within a millisecond or two of the intended duration.

You just need to time all of this to satisfy yourself that it is working correctly. When it does, you’ll subjectively find that the final stimulus ends the moment the scanner noise noise stops.