ADR-178: Tier-1 Staging Is Withdrawn, and What Would Reopen It Is a Measured Crossover

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)


1. Context

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:

So Tier 1 is not unbuilt work. It is a direction examined, in writing, with a harness, and not taken.

2. Decisions

D1 — Tier-1 staging is withdrawn. The absence is a decision and not an omission.

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.

D2 — What would reopen it is a candidate with a measured crossover, measured before the complexity is paid.

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.

D3 — ADR-310 is not reversed, and neither is Tier 2’s position.

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.

D4 — The harness stays.

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.

3. Consequences

4. What this does not decide

This site is open source. Improve this page.