I think there's not a single list of criteria that you can apply. Some points like a structured and logical approach to debugging have already been mentioned. For me, a good indicator of a senior developer is the ability to have an understanding of technologies beyond what's immediately necessary in the day-to-day work. As an example, a junior React developer will be able to follow a tutorial on Redux to build an app using flux as a paradigm, but would probably not be able to implement such a system himself/herself using the context mechanism and higher-order components (HOCs). Hence, when presented with a codebase that uses such HOCs and context to manage state he/she will quickly be lost if unexpected or hard-to-debug behavior occurs, unable to resolve the problem without the help of a senior developer.

The ability to have a good understanding of a large part of the abstraction hierarchy and, if necessary, leave the current level of abstraction is a good indicator of a senior developer, IMHO. Of course there will be more and less senior people, very few of us can go all the way down the abstraction rabbit hole (and it's usually not required).

So, another angle of this criterion is that a senior developer is able to work his/her way through a codebase without external help, solving problems on the way and obtaining necessary knowledge as required, whereas a junior developer frequently needs assistance from more senior developers to resolve unexpected problems.

Of course there are many other traits that I would attribute to a good senior developer, such as:

- Solid knowledge of fundamentals (HTML, JS, CSS). I've seen some junior developers get stuck implementing really simple designs because they lacked basic understanding of CSS and HTML.

- Understanding and taking into account the business problem that the software tries to solve. Senior developers understand - at least to a certain extent - that decisions they make when writing code affect the business outcome, and they will at least partially have this in mind when designing software. Junior developers on the other hand often love using all the exciting new technologies (which is understandable as they want to learn), but they don't see the bigger picture of the software in the context of the business.

- Ability to interpret, challenge and discuss requirements and assignments. Given an assigment e.g. from a designer or product owner, a senior developer will usually quickly recognize points that need clarification or modification and discuss those with the other stakeholders. He/she will also propose reasonable alternatives to requirements that would be hard to implement. Junior developers will often just try to implement everything you throw at them 1:1 without thinking too much about whether it makes sense. I've seen this e.g. when designers create layouts that are really hard to implement in CSS/HTML. A junior developer will spend days trying to implement the design, a senior developer will go to the designer and educate him/her on the issues of the design, trying to find a simpler solution that is easier to implement.

These are just my 2c, as I'm still learning myself how to recognize and hire good senior people.