How do Vivado and Vitis determine where stack and heap are located?
I found the answer. It's fairly straightforward.

The manual edit of the lscript.ld linker file caused Vitas (for some reason) to not like the board config - but in fact just ignoring it's complaints and carrying on was fine after a build/program cycle.

The better way to change the memory map for heap and stack though, is to right click the project and select "Generate linker script". Now you get a window to specify in which memory blocks stack, heap and so on live, and how big they are. This regenerates the lscript.ld file, and all is well.