Animation stops on screen though looped and won't fire Stopped:wait() event

EDIT II: Solved. When setting network ownership to player - the animations should be done from the client BUT if it is not the player you are animating it will not replicate from server to client and from client to server. Plus, the platform stand issue. Also -1 to roblox, API says without it “the animation would freeze” and it does, but no flag for animation.stopped raised + animation track says it is still playing.

EDIT: managed to make it work but not it’s only server side with platform stand. Platform stand is humanoid property, is it not replicated?

I have pets with animations in game.
Overall they work great, no animations issues.
Pets have a few animations, but to keep it simple, they have idle and dance.
I’m working on a feature of controlling the pet.
For this feature I made the human model invisible and welded the pet to it (usually the pet will follow the human with body movers but network ownership = server is too slow in this feature’s case). The animations are the same from before. They are looped and set to action priority in the animator (not from the script because no replication).
BUT only the idle animation works as intended. The happy animation completes 1 time and then stops. I tried unwelding, tried setting network ownership to server, tried removing collision, tried anchoring to place while the player moves free… Nothing. All animations except idle will complete 1 time then pause + the stopped event won’t fire and when I check GetPlayingAnimationTracks it still plays. The animation stops server+client so this is not a replication issue. I cannot figure it out.

script is as simple as:

local animator = player.Character:FindFirstChild("petPointer").Value.Humanoid.Animator
local AnimationTrack = animator:LoadAnimation(animationInstance)
repeat wait(0.1) until AnimationTrack.Length > 0
player.Character:FindFirstChild("petPointer").Value:FindFirstChild("AnimationTrackPointer").Value = AnimationTrack
AnimationTrack:Play()

It doesn’t matter which animation I load in animationInstance first. All but the idle act the same. It’s like it says it’s playing via GetPlayingAnimationTracks, the stopped event won’t fire, and yet it does not play. IDK how is that possible.