UV Unwrap - random faces chosen to be islands
The mesh had disconnected vertices. (For anybody who is interested, it looks like Ninja Ripper simply doesn't connect vertices that go along seams, which is why I was able to get a UV unwrap like the image above with no seams. However, it doesn't find seams perfectly, so you wind up with some faces not attached to anything in the UV editor).
I solved the problem by going to the edit layout, selecting the entire mesh, and using &quot;vertices-&gt;merge-&gt;merge by distance&quot; to bind all the loose vertices together. Then I manually recreated the seams where I knew they should go.