The difference between a senior and a junior is how long it takes before you feel embarrassed of your code.
Once someone is no longer embarrassed by their code, but can explain it in terms of compromises necessary to get a project to completion on time and within budget, and what they wanted to do at the time but circumstances didn't allow — I'd say that person is ready for a team/tech lead position.