Thank you for your previous suggestions. I've been testing my NPC movement logic. I'm using TileMovement within a "walk" event group (controlled by a global boolean) to simulate random roaming, and it produces the desired orderly 16-pixel movement without passing through solids.
The "chase" event group, activated when the boolean is false , disables the 8 direction behavior, and uses the behavior you recommended for following the player. While this works perfectly in the example file you provided (with a single pathfinding call on load and a static player), I've observed significant issues in my project file when the player is controlled and the pathfinding is recalculated every 'n' seconds.
Specifically, in my file only, once the chase events are active, the NPCs end up with a fractional tile position (e.g., 8 pixels in one tile and 8 in another). This breaks the 16-pixel grid alignment and allows them to move through solids. In your file I also observed that the pathfinding + move to combination seems to create similar issues if I add 8 direction behavior to the player and make frequent calls for pathfinding (necessary to locate a moving player).
In both cases the behavior is a bit erratical and npcs can suddenly start overlapping solids. Crucially, this prevents them from returning to the correct TileMovement behavior when the boolean is set back to true since they don't move in 16 px increments and I suppose the game doesn't know how to handle this when the boolean is toggled, or I haven't provided a way for the game to remedy their location.
It appears the dynamic, repeated pathfinding updates while the player is moving are the primary cause of this instability and the inability to resume normal walking.
Which brings me back to my initial question. I don't need to just move within the grid, I need each movement to de done in 16 pixel increments with the NPC only being able to move again after each step is completely finished.
I know how to conceptualize this but I definitely do not know how to implement it.