For a while I treated context.Context as boilerplate I'd add later. Get the thing working, then sprinkle in cancellation when it mattered. This is exactly backwards, and I learned it the slow way when a request needed a deadline and I discovered the call chain that handled it was six functions deep, none of which took a context.
The fix isn't hard, it's just everywhere. Adding ctx context.Context as the first parameter to one function means adding it to everything that calls it, and everything that calls them. What should have been a five-minute change became an afternoon of mechanical edits across half the package, all because the plumbing wasn't there when I needed to push something through it.
So now I thread ctx from the top whether I need it yet or not. The HTTP handler already has one, the database driver already wants one, and passing it down costs nothing until the day you need to cancel a slow query or carry a deadline. The whole value of context is that it's a channel for cancellation and deadlines that's already in place when the requirement arrives. Retrofit it and you're doing surgery. Lay it down early and it's just a parameter you mostly ignore, right up until the afternoon it saves you.