ADR-006: Política de MSRV (Minimum Supported Rust Version)
Date: 2026-05-24 Status: Superseded by ADR-009 Author: Rômulo Febasi Supersedes: consolida e formaliza o que ADR-001 introduziu
Histórico: esta ADR fixava o piso em 1.85. Ao rodar a primeira CI real, deps transitivas (
darling 0.23,etcetera 0.11) provaram que o piso verdadeiro do ecossistema 2026 é 1.88. ADR-009 documenta a subida.
Context
Há confusão recorrente entre MSRV e versão de uso:
- MSRV (
rust-versionnoCargo.toml) é o piso: a versão mais antiga que ainda compila o projeto. - Versão de uso é a stable que o desenvolvedor de fato tem
instalada (
rustup show); cargo simplesmente usa essa, desde que seja ≥ MSRV.
Em maio de 2026 a stable corrente é 1.95.0. Synapse declara
rust-version = "1.85". Isso não significa “estamos usando Rust
antigo”: significa “compila a partir de 1.85”. Quem tem 1.95 compila
com 1.95 normalmente, com acesso a todas as APIs estabilizadas até essa
versão (desde que não sejam usadas no código).
A questão de política é: quando subir o MSRV, e por quê.
Decision
-
Manter
rust-version = "1.85"na v0.x. É o piso de edition 2024, o limite inferior natural. Não baixar. -
Não pinar no exato latest stable. Pin no
"1.95"em maio/2026 significa que em junho (1.96 sai) o projeto está travado uma versão atrás do querustup updateinstala: fricção sem benefício. -
Subir o MSRV é uma decisão consciente, registrada em ADR. O gatilho é necessidade real: uma API estabilizada acima de 1.85 que resolve um problema concreto. Não subir “porque há versão nova”.
-
Job
msrvno CI valida que o código ainda compila no piso declarado. Esse job é o único que protege contra “alguém usou um recurso pós-1.85 sem perceber”. Quebrou? Ou se reverte o uso, ou se sobe o MSRV com ADR. -
Quando subir. Cenários que justificam:
- API/feature de std/cargo necessária e sem fallback razoável.
- Pelo menos uma das deps críticas (clap, rmcp, rusqlite, serde, tokio) subiu MSRV acima do nosso, forçando.
- Marco de release maior (v1.0, v2.0): oportunidade de limpar.
Consequences
- + desenvolvedor com qualquer Rust ≥ 1.85 consegue compilar.
- + packagers conservadores (Debian, Homebrew formula clássica) permanecem viáveis sem fricção.
- + subir MSRV vira evento documentado, não acidente.
- − o código não pode usar livremente o que estabilizou pós-1.85 (let chains em mais posições, gen blocks, alguns combinators). Quando precisar, abrir ADR.
- − o job
msrvno CI é mais uma matriz para manter.
Alternatives considered
- Manter
rust-version = "1.95"(exato). Rejeitado: auto-fura o pé toda vez querustup updateinstala a próxima minor: pesquisa recente em GitHub mostra que isso é o anti-padrão #1 de MSRV em projetos pessoais. - MSRV rolling “stable - N” (estilo cargo/rust-analyzer). Bom para ferramentas oficiais com base massiva; overkill para um projeto novo. Volta a discussão se chegar v2.0.
- Omitir
rust-version. Significa “compila no que você tiver”, ambíguo, sem garantia, atrapalha pacote em distros que checam. - MSRV 1.90 ou 1.93. Discutido em conversa antes desta ADR; rejeitado em favor de 1.85 porque (a) nenhum recurso pós-1.85 é load-bearing no MVP e (b) 1.85 é o piso lógico (edition 2024). Subir é decisão de uma ADR futura quando houver demanda concreta.