After the scatter you don't have normals on those points.
Using the attribute expression will try to create normals for the points. But geometry in Houdini has no history. The points don't know they came from a sphere, so think they are just free floating points and get 0 normals. So “self” is 0, and you are just setting all the normals to a constant value. Thus the global behaviour.
For non-primitive sphere geometry, you could add normals before the scatter. The scatter should then properly copy over these normals onto the points and copystamp would work.
For a primitive sphere it is a bit trickier as it only has a single point. So you have to build the normals after the scatter. For a zero-centered sphere, however, it is rather easy as the normal is the position. So in your Attribute Expression just put @P
You may want the grid to be an XY grid, however, as the Z axis is oriented to the normal. Then add an up attribute to change how the grid is rotated around the normal.
Thanks. Detailed response very much appreciated! And it actually works! Just 2 questions
1- What would I use instead of @P if my sphere is not centered at origin? 2- Where, how would I add a ‘up’ attribute? I tried using an AttributeCreate SOP below the tile(grid) SOP with a custom variable simply named ‘up’.
1. It's generally why folk build things at the origin, and transform stuff to where it needs to be as a last step.
You could construct it after the fact; on the sphere store @P as another attribute, like with a rest sop or in a then when you construct the normal in a wrangle, subtract that rest position:
@N = @P - @rest;
2. Attrib create you'd need to build before the copy sop. An attrib create would do it, but you can do it in the same wrangle that you build @N: