So going down the rabbit hole of heat playing a role. I wanted to look over transmission oil cooling components - and while researching I found out that transmission thermostat tends to fail in a lot of E46s. So I ordered a replacement oil cooler thermostat and expansion tank (coolant reservoir). And it was a little overdue on regular oil / fluid maintenance.
After a lot of fighting I removed the expansion tank and the thermostat broke into pieces.
New vs old parts
As the thermostat broke - small pieces fell back into the coolant line, used the vacuum to pull out as much as I can 
New thermostat in place (sitting right on top of the transmission oil heat exchanger)
Replacement expansion tank
I had to jack the car up because there was hardly any access
After refilling coolant, I changed the oil. I usually use the suction tool for the E46, it tends to extract more than the traditional method.
Suction tool holds about 7.4 qts, I extracted about 6.5 (I knew it was running a little low - it's been leaking the oil filter housing gasket that I never had the time to get to).
Old vs the new filter.
It turned out pretty clean, I was rushing to get everything done and take it out for a test drive.
Took it out for a drive and it seemed to drive fine until it threw a code again. I guess the heat has already done the damage or maybe it was the time, torque converter is most likely gone.
Boom!! Haha I'll do a bit more digging.
Thank you!