I know you (almost anyone) wouldn't, but there's nothing wrong with it.
Bistro-HD is nothing like conventional. Bistro was not setup asynchronously from the start and being based on and still for clickly lights, it was originally designed to restart entirely, check the cap, restore last mode, change modes, and then go into a wait loop at the right mode, polling voltage and temperature in the loop, not by interrupt.
But for bistro HD OTSM I don't get power off, I get a pin detection, that needs an interrupt, and it needs to go to sleep fast, but in the end the simplest way to interface without completely rewriting bistro (likely at bigger size) is to measure click time (when it should wake up from a sleep loop), "save" it (in some way) and restart, and that's what it does. And if it's restarting anyway, why bother returning from the first interrupt? The first pin change interrupt calls a subroutine(in unreleased version) that is the sleep loop and you can just think of that as no longer an interrupt but as the new "main" until the end of the code. Pin change interrupts now break from within that and return to that, until the right time to restart. I can detect a short click, medium click, long click powered restart and power-off restart all independently. The last one is detected by using a code section in the binary called .init3 that happens before main and is skipped on the powered restart.
At the C code level it's a bit of a hack sure, that would make people who like to do what they're taught cringe, but there's nothing really wrong with it. (If you're really observant you'll notice that it's an infinite loop that can cause a stack overflow, but that's avoided simply by resetting the stack pointer to make the restart really just like a restart, minus that init3 section). I'm careful to initialize variables deliberately, not automatically.
So to me, the interrupt is just a code path that runs from first pressing the switch until restarting the light. And once e-switch came along, I already waited to count time there, in a low power state, so why not just keep waiting after a long press, and that longer wait is called "off". I just added state indicators that progress in the loop from standown to either short press restart or medium press stand-down, to either medium press restart or long press stand-down, to off, to standby (button pressed from off) to on (button released). In the next release it's even understandable.
Could I have broken the code intro into some setup() routine, had the interrupt set a flag, unroll, set conditionals to bypass all the next strobes and slow temperature checks (admittedly temp and adc should just then also be made asyncrounous, so really now you're writing Narsil) on the way back through, got the end of the loop, checked the flag, re-called setup() to make new mode decisions, including adding a new off mode, continue on the next loop iteration. Well sure, possibly at the expense of slower OTSM power-off, and I considered which way to go, but that would have been much more code I think and not clearly in any way simpler. HD fits a pretty good amount of code in an attiny25.
On the other hand, at the moment, something doesn't work, on this one light at least. I'm not ready to just say, bah.. it's all a mistake. Bugs happen. This one is frustrating though. I may just have to buy another switch light to test :).