Junior — work under supervision
A junior ships real code, but inside guardrails. Someone breaks the work into tickets, reviews every PR, and catches the edge cases you didn't see yet. You're learning the codebase and the craft; mistakes are expected and cheap because someone is watching the blast radius.
Middle — own features end to end
A middle engineer takes a fuzzy feature and lands it without hand-holding: design, implementation, tests, rollout. You review other people's code and your judgement on small tradeoffs is trusted. You still escalate the big architectural calls — but day-to-day, you're autonomous.
Senior — own systems and outcomes
A senior makes the systemic calls: which tradeoff, which failure mode you can live with, what to cut. You're the one paged at 3am who actually fixes the incident, and the one who mentors so the team doesn't repeat it. The job stops being "write this code" and becomes "make this part of the system reliably someone's problem to no longer worry about."