ADR-237: A Described Call That Fails Is Propagated, and a Boundary the Backend Disagrees With Is Named

Status: Superseded by ADR-290 — its D1-D2 are D20-D21 there Date: September 27, 2026 Target Version: Nikaia 0.0.222 Answers: #194, the boundary translation for a hand-edited hash — ADR-100 D6, the only part of that record left Related: ADR-104 D1, D5 (a crate is described before it is called, and the description is reviewed), Part III C.1

1. Context

ADR-100 D6: where rustc says, at a call across a boundary, that a value is not a future or that a Result was not expected, the driver says the ledger of that package does not match its sources. The entry waited for a ledger the build cannot re-derive, because a path package’s ledger is rewritten by its own build in the same run. A described crate is one: its description is written once and edited by hand (ADR-104 D5).

Probing it found the defect under it. A described function that can fail — nikaia describe writes throws = ["?"] for one returning Result — was a place that can fail to the checker and a plain call to the emitter, which reads std’s ledger alone. So every described fallible call failed to compile: the crate’s Result reached the rest of the line, and rustc said so.

2. Decisions

D1 — The emitter reads the descriptions, for throws.

The described crates’ ledger reaches the emitter beside the program’s, and a call into one that the description says can fail gets its ?. It is read for that question only and not merged into std’s ledger: a described sync = false means may block, and a std entry’s means await it.

D2 — A boundary mismatch is said as a stale ledger or description.

A program never meets a Result or a future — both are this compiler’s lowering of throws and of a pause, written off a ledger. So where the backend says is not a future, the ? operator can only be applied to values that implement Try, or names a Result, the lowering believed a ledger the code below does not match. The build names the boundary: the one the line calls, else a described crate whose sources moved, else the only one the file calls.

The backend’s words are kept as a note: this is a translation, and whoever checks it needs what it was translated from. Where no boundary answers, the message is left as the backend said it: it is then this compiler’s defect.

3. What is left

A crate whose sources moved since it was described is refused before the build (NK2505, ADR-104 D5); D2 is for the case that check cannot see — a description edited to say something the crate does not do.

4. What is built

All of it, in 0.0.222: modules::Program::described, the emitter’s described and can_fail, diagnostics::a_stale_boundary and the primary label it reads, the report’s boundaries; project.rs’s a_described_call_that_can_fail_is_propagated and a_boundary_mismatch_names_the_description_to_redo, and the unit tests in diagnostics.

This site is open source. Improve this page.