Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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-version no Cargo.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

  1. Manter rust-version = "1.85" na v0.x. É o piso de edition 2024, o limite inferior natural. Não baixar.

  2. 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 que rustup update instala: fricção sem benefício.

  3. 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”.

  4. Job msrv no 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.

  5. 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 msrv no CI é mais uma matriz para manter.

Alternatives considered

  • Manter rust-version = "1.95" (exato). Rejeitado: auto-fura o pé toda vez que rustup update instala 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.