Thanks @ben - I followed these steps from scratch and found the source of the problem:
It is an issue with Brave browser. If shields are UP for the test domain, it shows unstyled HTML and nothing works. You need to disable shields for your test domains then everything works fine.
WIth Brave shields up on example.test
Once shields are removed CSS is correct as you can see - I am applying tailwind bg-black and text-white to the body and it works.
I can also confirm that hot reloading works perfectly when I make further changes to app.css.
There is an error about @wordpress/dom-ready not being found when loading the admin side, and no styles load in admin, but I guess they are different problems.

