Status: Accepted
Date: September 21, 2026
Answers: the former open-decisions.md’s is tier-1 staging
withdrawn, or is it still on the list?
Related: ADR-310 (which named the two tiers and called Tier 1
the one that waits on nothing), docs/history/staging-candidates.md
(the survey, and the rule it ends on), ADR-276 D1 (the precedent for
the shape: the absence is a decision rather than an omission),
ADR-010 (the staging this language actually shipped, and what made
it right), ADR-276 (a cost priced before the thing was built)
ADR-310 split staging in two. Tier 2 is a user-facing metaprogramming surface and waits on questions nobody has answered. Tier 1 is the compiler doing the staging itself — recognising a shape in the source and emitting a better one — and that record said it waits on nothing and is where the interesting applications live.
docs/history/staging-candidates.md is the survey of
every candidate anybody could find, with a measurement harness. Every
candidate it named is closed, and three against the survey’s own prediction:
match over string literals is already what rustc does, and no .nika
file writes one over text.String::with_capacity is worth 3.4 % on a static page and
0.0 % on a growing one.html::escape’s recommended table was 16 % worse than what it
replaced, because 4 KB of fat pointers is not a register.So Tier 1 is not unbuilt work. It is a direction examined, in writing, with a harness, and not taken.
It has no box on project_status_and_roadmap.md, the way loop left Part I
(ADR-276 D1): it is not counted in the language area, and what a
reader wondering where it went finds is this record.
A [ ] on a progress page is a promise. It says somebody intends to build
this, and every other [ ] on the page borrows credibility from the ones that
are honest. Keeping a box nobody intends to open makes the whole column worth
less, which is the cost that decided this and not the cost of the record.
This is staging-candidates.md’s own closing rule,
raised here from a notes page to a record: a staging decision enters the compiler
only together with a measured crossover; without one the complexity is certain
and the gain is not, and the complexity is paid twice — once in the language
surface and once in the generated code.
So the door is a measurement and not a mood. Anybody may reopen this, and
what they bring is a profile of a real workload showing where the time is, and a
threshold read off the numbers rather than off the shape of the problem. The
survey has two of its own counter-examples for the second half: until(a | b)
switches at three needles, and the crossover in
upstream/winnow-grammar-findings.md
§5 sat at three characters where six to eight had been assumed.
That record’s Tier 1 waits on nothing was true and is still true: nothing blocks it. What this record adds is that waiting on nothing is not the same as being worth doing, and no candidate yet has measured.
Tier 2 keeps its own status, which is unanswered questions rather than closed candidates. The two were always separate, and the survey’s last line stays the useful one: Tier 1 does not need Tier 2, and the applications people cite as the reason for Tier 2 are all in this list.
crates/nikaia/tests/measure.rs and the workloads in benches/ were built for
this item and are the reason it could be closed rather than argued about. They
are not tied to staging: what they measure is this compiler and the programs it
emits, and the next question about either is cheaper for their existing.
loop and is small — and there is not even a
word to un-reserve here.