The TC39 Stage Process
How a proposal advances through five stages (0-4) toward becoming a standardized ECMAScript feature, and the compatibility responsibility each stage implies.
Purpose
TC39 (Technical Committee 39) is the standards body that maintains ECMAScript. Every language
feature — from let to top-level await — passed through this same staged process before
shipping.
The stages
- Stage 0 (Strawperson): an idea, not yet a formal proposal.
- Stage 1 (Proposal): the problem is well-defined and a champion (a TC39 member) is assigned to drive it.
- Stage 2 (Draft): initial specification text exists; syntax and semantics are roughly settled but still expected to change.
- Stage 3 (Candidate): specification text is complete; engines implement it experimentally to surface real-world issues before finalizing.
- Stage 4 (Finished): ready for inclusion in the next yearly ECMAScript revision; requires at least two independent, conformant implementations.
Behavior notes
- Advancement requires committee consensus at each stage, not just the champion’s judgment — designed to catch problems before they become permanent.
- Once a feature reaches Stage 4 and ships, removing or incompatibly changing it becomes essentially impossible in practice — “don’t break the web” is a hard constraint the committee takes extremely seriously, even for features later considered a design mistake.
- A Stage 3 proposal can still change in response to implementation experience, though rarely in ways that break early adopters completely.
Common mistakes
- Treating a Stage 2 or 3 proposal as production-safe without a fallback plan.
- Assuming a proposal’s syntax is final before Stage 3 — Stage 1 and 2 proposals commonly change their concrete syntax while the underlying idea stays stable.
Runtime notes
A governance process, not a runtime behavior — applies to how the language itself evolves, not to any specific engine.