OK guys, I finally found what the issue is, or at least kind of where it's coming from.
As some of you (and myself) suspected, my hot end is not reaching the reported temperature. I previously blamed the low readings on my IR thermometer on not being able to point the laser directly at the hotend, but it seems it was reporting accurate readings (around 95C when klipper reports 200C).
Now, here's where things get a little weird. At this point, I've used multiple thermistors, but swapped in a new one anyways. My board also has a pin for a second extruder thermistor, so I plugged it in to that one and changed the pin in my printer.cfg. No change.
I tried switching the bed and hot end thermistors on the board and in printer.cfg, no change.
I changed the thermistor "sensor type" from "EPCOS 100K B57560G104F" (same as the bed) to "Generic 3950", no change.
I found an article about tuning your pullup_resistance value. My cfg file did not have this value specified, so I added a line and started with the default of 4700, which made no difference (I'm assuming this value is loaded from the sensor type by default?). I toyed with the values until my thermometer read ~220C when setting the printer to that temp. However, to achieve this I had to adjust the pullup_resistance from 4700 to 13k+ (far beyond what should be needed) which makes klipper report 6C at room temp (print bed reports 27C). Unsurprisingly, I can hand-feed all the filament I want, but the temp reading is only now only accurate at 220C rather than only being accurate at room temp.
The thermistor, I feel, can be removed from the suspect list, as multiple thermistors exhibit identical properties.
I also feel the motherboard can be removed as well; there are three pins for thermistors, all three show accurate readings for the bed but identically inaccurate readings for the nozzle.
This only leaves software/ firmware, which I find incredibly odd for three reasons. For one, the printer was not even shut off in between "working" and "not working"; I successfully completed a print, and without shutting down, updating any configs, changing any settings etc., I swapped out the nozzle, and the printer hasn't worked since. Second, both the bed and nozzle thermistor are configured exactly the same, so if the nozzle is not set up properly the bed should be wrong too. Finally, Klipper is really straightforward and it's easy to configure things that commonly need configuring, it doesn't seem right that a configuration got changed and I'm completely incapable of finding what happened and fixing it.
As a Temporary Fix^TM^, I'm inclined to get a nice reliable probe thermometer, calibrate a pullup resistance value for common print temps, then updating my cfg whenever I want to change temps more than ~5c. This is obviously not even close to an ideal solution, but I don't know what else to try. Everyone else I've seen with this issue has resolved it either through hardware replacement or fixing settings, and I've tried all I can with both.
I'm using a 3950. Funny thing, all my previous thermistors were also 3950s, but Klipper has always been set to the EPCOS 100k sensor. Looking them up, there should only be a couple degrees difference between the two, and changing between the sensor types didn't do anything for me, so I don't think it's that.
It's a robin nano 2.1 mobo, not sure what you mean by "what hotend" it's a Frankenstein of various heat blocks, heat breaks, etc. not an all-in-one or anything like that. It's been rebuilt probably a half dozen times during the duration of this issue; I've confirmed the issue has nothing to do with any of the physical components of the printer (ie stepper motors/drivers, loose connections etc).
Well the reason I asked about the hotend was because of you're using the little glass bead version of the thermistor, and the hotend has the hole to feed through, I had an issue on an old Frankenstein ender where it wasn't touching the metal inside correctly... As it heated up, it would kind of move the thermistor away from the metal. I solved this by putting a DIY metal shroud on it that held it in the middle while touching the hotend all around. I also used thermal paste to make sure there was no gaps.
I see; though, a thermistor not making good contact with the heat block would imply the heat block is hotter than reported, not the other way around.
This glass thermistors are a nightmare. I kept accidentally ripping the leads off mine. During this whole debacle, I treated myself to a fancy thermistor that is built into the end of an M3 bolt - it screws in to the hole meant for the grub screw that normally keeps the glass ones in place.