I use warnings instead of TODO/FIXME, and found it useful. We tend to gloss over TODO/FIXME, even though editors highlight them.
Warnings, however, find their way to someone every time the code is executed. They're nagging enough that you eventually fix them. You can run the code with strict rules to raise an exception on warnings.
On comments: we've acquired a habit to cross-reference everything. In the code, commit message, issue, Slack. You'll often find a line, and comments around that start with "Rationale" or "Why:" with references to issues, commits, conversations, etc.