This is what we expect though right?
Those symbols are runtime values you are lifting back to the type domain as NamedTuple keys (the classic case for type instability). I guess you are hoping constant propagation and escape analysis could work through the Dict/Pair constructors? In the Dict constructor :a and :b are copied to a keys vector, then they are read back out of it in the NamedTuple constructor.