OSPFv3 is the same link-state machinery you already know — hellos, LSAs, areas, SPF — moved onto IPv6, which is exactly why it catches people out. The algorithm is familiar; the addresses it runs on are not the ones you typed. Adjacencies are sourced from the interface link-local address and routes are installed with a link-local next hop, so a table full of FE80:: entries is the protocol working correctly rather than a sign that something is half-configured.
These labs put that behaviour in front of you on real Cisco IOS. You'll enable ipv6 unicast-routing, the global switch that turns a router which merely holds IPv6 addresses into one that forwards them, bring a single-area adjacency up over link-local between two routers with an explicit router-id and per-interface activation, extend it across three and move the preferred path by changing interface cost, and run OSPFv3 beside OSPFv2 on the same dual-stacked links so the two control planes stay visibly separate. Verification uses show ipv6 ospf neighbor, show ipv6 ospf interface and show ipv6 route. Grading checks the adjacency and the path that results, not that the commands are present.