But if its so complex with so many variables how does every other home/SOHO router do it easily with zero config ?
There MUST be ONE simple way to do this for SOHO / Home use.
The more "everyday feature" IPv6 gets, the more common knowledge there will be. Lets compare IPv4 and IPv6 standard configurations and not special cases:
IPv4: get IPv4 ADDRESS for router using DHCPv4 client, share internal IPs and network configuration using DHCPv4 server, filter, NAT filter internal traffic using FIREWALL
IPv6: get IPv6 PREFIX for router using DHCPv6 client, share (external) addresses from prefix using ND, filter traffic using FIREWALL (ALLOW/DENY), NATing is not mandatory.
Main things to replace in mind with IPv6:
a) first half of IPv6 address is network, second half is device
b) subnets of different sizes of aka prefixes are shared to clients. If ISP gives you /56, then you have 64-56=8 -> 2^8 subnets available for you for splitting.
c) public addresses for internal clients are OK, for firewall it's easier to ALLOW/DENY than to SRC-NAT(masquerade) or DST-NAT (portforward).
d) don't keep the static internal addresses mindset in IPv6, it's possible in IPv6, but not with Mikrotik, also there are clients (Android) that only support autoconfiguration, so you can't get rid of SLAAC.
e) it's client devices, not router, that decides how many addresses to use, how to use them and how often to change them. DNS for internal devices is currently harder part in Mikrotik
f) there are tons of IPv6 addresses for you in every prefix, so get and set different IPv6-address for every service in your router/device, so you can easily enable/disable them in FIREWALL
In ROSv6 you have to enable ipv6 module and reset configuration to get standard firewall rules, in ROSv7 IPv6 is built-in, so you already get standard firewall rules with reset configuration.
Simple example:
# get prefix from ISP and put into prefix pool. From prefix pool you can split it further to your needs using DHCPv6 server, but DHCPv6 server is not needed if you do not need to split prefix.
/ipv6 dhcp-client add add-default-route=yes interface=ether1 pool-name=ISPv6 request=prefix
# get subnet from pool and get set address from it to the bridge. In IPv6 network's min and max addresses are not reserved, so you may get prefix:: aka prefix::0 for the bridge
/ipv6 address add from-pool=ISPv6 interface=bridge advertise=yes
# enable Network Discovery to respond to clients' request
/ipv6 nd set [ find default=yes ]
/ipv6 nd prefix add interface=bridge