When Starlink sends back DHCPv6 replies, the source is a global IP (2605:....).
The firewall default 'Allow-DHCPv6' rule has 'Source address' set to fc00::.6. This blocks the Starlink DHCPv6 replies.
When the router first comes up, these replies must be getting through because at first it gets a good IP address and Prefix Delegation.
Presumably the firewall doesn't block the replies until it's fully up and running.
After some period of time (5 to 20 minutes or so) the router would try to renew. This would fail, but it would keep it's IP address, but the Prefix Delegation would disappear.
I just deleted the Source Address in the filter, so DHCPv6 replies can come from any source.
It took port mirroring and Wireshark to figure it out, but it's working great now.
I hope this helps other Starlink/OpenWrt users.