A good and comprehensive state machine design (including events, and actions listings) is half the battle.
Think through all potential scenarios early on to capture edge cases and prevent avoidable bugs as things get more complicated.
Stay consistent with naming to avoid confusion down the line.
When writing the code for each state machine and service, start by using print statements to confirm the correct relational behavior between each service.
Remember to CLEAN AND BUILD before every PROGRAMMING! This might save your debugging time. Also, print compilation timestamp, which would be helpful in such condition.
Write code incrementally and test along the way.
Take advantage of git functionalities for concurrent development to streamline project development. Add KiCAD to your git ignore so it doesn't commit every time it saves.
If you want the timer display to be imperceptible, improve LED service (while we didn't, and the scrolling is noticeable).
Don't be scared to hot glue things when needed! It can be a lifesaver when trying to connect multiple wires together to reach long distances to prevent them from disconnecting. Hot glue pins to the breadboard once you're certain they're in the right spot.