We spawn bAutoDestroy=true non-looping Niagara via UNiagaraFunctionLibrary::SpawnSystem*.
Oncompletion OnSystemComplete→DestroyComponent(); when this coincides with the EOF window, GC appears to
mark the component Unreachable mid-pass.
<br/>
In Update_GameThread (LevelTick.cpp), components are gathered into a raw TArray (GC-invisible), then after a reentrant op (FStaticMeshComponentBulkReregisterContext) the array is iterated WITHOUT re-validation. Also, IsValid() only tests the Garbage flag, not Unreachable.
<br/>
Q. For bAutoDestroy=true Niagara, is caller-side destroy-timing control (spawn with false, then
DestroyComponent() after polling IsComplete(), outside the EOF window) the sanctioned workaround?