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

Rullst v12 release program

Reabertura da auditoria em 2026-09-05: o relatório CLIFIX.md e novas regressões identificaram lacunas na experiência gerada, no estado do ORM durante troca de DLL e em limites de segurança. A RC permanece NO-GO. Os percentuais e a conclusão de teto abaixo são a fotografia anterior, pendente de reavaliação; não representam a prontidão atual. A auditoria de release registra a revisão de todas as crates, com triagem leve de IoT, e as correções/gates restantes.

Status em 4 de setembro de 2026: programa de trabalho auditável, não anúncio de lançamento. A decisão atual é NO-GO para 12.0.0 estável e preparação de uma 12.0.0-rc.1 somente depois dos gates P0 abaixo.

Este documento transforma a ambição da versão 12 em tarefas verificáveis. Ele deve ser atualizado na mesma alteração que conclui uma tarefa. A especificação continua sendo a fonte normativa; o capability ledger registra o limite das capacidades, o hardening status registra evidências de validação e o roadmap preserva a visão de longo prazo. O comparativo técnico separa diferenciais já comprovados das prioridades competitivas sugeridas para a RC e a v13.

Como marcar o programa

  • [x] concluído: há código ou documento, teste proporcional ao risco e uma afirmação pública compatível com a evidência;
  • [~] parcial: existe uma base útil, mas a condição restante está escrita ao lado e ainda não deve ser anunciada como pronta;
  • [ ] pendente: não foi implementado ou ainda não foi verificado;
  • [!] bloqueador de release: a RC ou a estável não pode avançar enquanto o item estiver aberto.

Uma execução local verde prova apenas o commit e o ambiente executados. Ela não substitui CI multi-OS, ambientes reais de provedores, homologação, auditoria externa ou experiência de usuários independentes.

Fotografia de progresso

Em 2026-09-04, este documento contém 204 itens: 77 concluídos, 64 parciais e 63 abertos. A contagem estrita é 37,7%; atribuindo metade do peso aos parciais, o avanço mecânico é 53,4%. O inventário também inclui o programa Omni web-first/platform-enhanced, publicação irreversível, observação pós-RC e gates da versão estável que só podem ser fechados depois; por isso essa contagem não é a prontidão da RC. Depois de elevar o gate para A em todas as crates exceto IoT/B e esclarecer que 90 é piso, não alvo, a auditoria separou o piso da campanha de teto local. A estimativa de prontidão de engenharia/operacional da RC é agora cerca de 91,8%: 8,2% permanece. Essa estimativa inclui elevar cada crate ao melhor teto v12 local responsável, congelar e repetir os gates no SHA exato. A versão, a inspeção dos 16 pacotes e o consumidor externo passaram no commit limpo 27e81152; a revisão documental e a repetição no futuro SHA final da RC continuam abertas. Ela não inclui operar a RC por semanas, homologar provedores/fisco, testar hardware/lojas ou cumprir gates exclusivos da versão estável.

Essa estimativa não esconde os contadores objetivos: há 28 linhas marcadas [!] (oito parciais e vinte abertas), embora várias sejam repetições do mesmo gate em sua seção detalhada e no resumo da versão estável. No scorecard, Core, ORM, Security, Connect, Auth, Mail, Messaging, AI, Capital, Nexus, as duas crates de macros, cargo-rullst, Studio e a facade rullst já estão em A, e IoT satisfaz a exceção B. A lacuna até os pisos aprovados é agora zero e a campanha de tetos locais está completa; isso não substitui os gates do SHA candidato. A tabela de qualidade registra cada distância sem tratá-la como quantidade de tarefas. A campanha não parou no piso: os tetos locais das 15 crates ativas somados ao IoT/B aceito totalizam 1.509/1.600, exatamente os 1.509 pontos agora apoiados por evidência versionada. Assim, a campanha de teto local chegou a 100% e zero pontos de planejamento permanecem. A pontuação de um SHA ainda depende de todos os gates aplicáveis ficarem verdes e não é sinônimo dos 8,2% de prontidão operacional restantes.

O gate geral de cobertura foi alcançado no candidato sem testes artificiais. Com o trabalho restante agora delimitado, a previsão responsável é 1–2 dias de trabalho efetivo para concluir auditoria documental/semântica e eventuais correções, mais 1–3 dias de relógio para matrizes pesadas e repetição final. É uma faixa, não uma promessa: falhas nos testes pesados, dependências/advisories ou lacunas descobertas na auditoria podem ampliá-la. O piso A/IoT-B já foi alcançado no teto auditado, mas ainda precisa ser confirmado pelo conjunto de gates do SHA exato.

A estimativa de 91,8% usa uma régua explícita de planejamento, distinta do scorecard:

Frente da RCPesoEstado estimadoContribuiçãoEvidência/pendência dominante
Campanha de qualidade até os tetos locais55%100%55,0%1.509/1.509 pontos apoiados por evidência; o SHA exato ainda depende dos gates
Gates repetidos no SHA final20%85%17,0%Tríade local, cobertura e 22/22 workflows automáticos aplicáveis passaram em 27e81152, inclusive a suíte all-feature em Linux/macOS/Windows; os testes pesados manuais e a repetição no SHA final permanecem
Versões, pacotes e documentação da prerelease15%95%14,25%Os 16 manifests, preflight, .crate, auditoria de conteúdo, consumidor externo e seis blueprints instalados passaram no commit limpo 27e81152; falta concluir a revisão semântica e repeti-la no SHA final
Evidência hospedada, controles externos e aprovação10%55%5,5%Codecov, Scorecard e alertas hospedados foram verificados; faltam DAST final, demais matrizes manuais, crates.io, revisão humana e decisão GO/NO-GO
Total100%91,75% ≈ 91,8%8,2% operacional permanece

Os percentuais de estado das três últimas frentes são estimativas conservadoras e serão substituídos por 100% apenas quando a evidência do SHA candidato existir. Isso evita somar como pronto um workflow meramente configurado.

As porcentagens são uma fotografia manual, não uma métrica de segurança. Devem ser recalculadas quando itens mudarem de estado e nunca substituem a decisão GO/NO-GO.

1. Decisão de release

O fluxo permanente de integração é branch curta → main → tag. Durante o programa v12, main contém o trabalho ativo e a branch congelada v5 preserva o último baseline legado. A presença de código numa branch não o transforma em release: somente um pacote do crates.io e sua tag imutável correspondente são artefatos oficiais. Os critérios de desenvolvimento, prontidão e release estão separados no RELEASE_GUIDE.md.

  • Tratar v12 como um programa de estabilização, e não como uma lista de superlativos.
  • Manter a estável em NO-GO enquanto os gates obrigatórios estiverem abertos.
  • [~] Congelar novas funcionalidades antes da RC. Até que o novo gate de notas seja alcançado, somente capacidades delimitadas que fechem uma lacuna auditada de qualidade podem entrar; depois disso, aceitar apenas correções, testes, documentação e mudanças indispensáveis à release.
  • [!] Fazer uma revisão final deste checklist e registrar a decisão GO/NO-GO com data, commit e responsáveis.

A RC vai para o crates.io?

Sim. A proposta é publicar 12.0.0-rc.1 no crates.io, e não apenas criar uma tag privada. Uma prerelease é pública e permanente: ela pode ser yanked, mas o mesmo número de versão nunca pode ser substituído. Usuários precisam optar explicitamente por ela, por exemplo:

[dependencies]
rullst = "12.0.0-rc.1"
  • Sincronizar todos os pacotes publicáveis e requisitos internos em 12.0.0-rc.1 numa alteração exclusiva de preparação da release. Os 16 manifests publicáveis, a facade, o CLI e o lockfile já formam um único trem de versão; o preflight de metadata com --locked passou localmente.
  • [~] [!] Gerar, inspecionar e testar os pacotes exatos antes de qualquer upload irreversível. No commit limpo 27e81152, os 16 .crate registraram o mesmo SHA sem dirty state, passaram a auditoria de conteúdo, compilaram num consumidor externo all-feature e forneceram o CLI que gerou e compilou os seis blueprints. Falta repetir a prova sobre o futuro commit aprovado da tag.
  • Criar a tag v12.0.0-rc.1 somente no commit aprovado.
  • Publicar na ordem topológica documentada em AGENTS.md.
  • Verificar indexação, documentação e instalação usando apenas crates.io.
  • Corrigir os problemas encontrados em rc.2, rc.3, etc.; nunca republicar o mesmo número.
  • Publicar 12.0.0 somente após uma janela real de uso da RC.

Referências oficiais: Publishing on crates.io e SemVer no Cargo.

2. Congelamento, versões e migração

  • Os 16 pacotes publicáveis do workspace usam atualmente 12.0.0-rc.1 nos manifests locais.
  • [~] [!] cargo metadata --locked confirmou 16 pacotes publicáveis em 12.0.0-rc.1, com dependências internas declarando path e requisito da mesma prerelease. O preflight topológico e a auditoria dos arquivos passaram no commit limpo 27e81152; falta repetir a prova no SHA hospedado aprovado da prerelease.
  • Centralizar a ordem topológica em .github/release-order.json e validá-la contra o conjunto publicável, a versão da tag, os requisitos internos e o DAG antes de empacotar; o preflight positivo e a rejeição de versão divergente passaram localmente.
  • [!] Manter o worktree da release limpo e associar toda evidência ao SHA da tag.
  • Curar o changelog de v12 por impacto ao usuário: o topo agora resume migração/compatibilidade, fronteiras de segurança, contratos de IA e observabilidade, enquanto o inventário técnico detalhado permanece preservado e explicitamente separado para rastreabilidade.
  • Criar guias de migração v5 → v12, v6 → v12 e dependências da era v11 → v12, preservando a evidência de que somente v5 tem tag entre essas baselines. O caminho também transformou cargo rullst upgrade numa transação assistida extensível: planejamento humano/JSON sem escrita, descoberta exata do workspace, edição TOML que preserva comentários e reconhece aliases, catálogo versionado de riscos v5, alvo preso à major da CLI, snapshot de manifests/lock/fontes, cargo fix/cargo check, rollback automático e restauração persistida após interrupção. Testes process-level cobrem plano, JSON, sucesso e falha com rollback. O comando não altera banco, segredo, autorização ou fronteiras de produção; esses gates continuam manuais e documentados no tutorial de upgrade assistido.
  • Publicar a matriz de features da crate guarda-chuva e das outras 14 crates, incluindo defaults, aliases, integrações opcionais, seleção estrita de banco e limites dos simuladores.
  • Documentar política de MSRV, depreciação, compatibilidade e suporte de patch/minor em compatibility-policy.md, incluindo limites de prerelease, janela suportada e exceção fail-closed para segurança.

3. CI reproduzível no commit exato

Evidência local atual no commit candidato limpo 27e81152, reexecutada em 2026-09-04 — útil para desenvolvimento, mas ainda não substitui os mesmos gates na futura tag:

  • cargo test --workspace --all-features verde, incluindo testes de integração, dez projetos gerados e doc-tests.

  • cargo clippy --workspace --all-features -- -D warnings verde, exatamente conforme a tríade normativa de AGENTS.md. O gate hospedado acrescenta --all-targets e também passou no mesmo candidato.

  • cargo fmt --all -- --check e git diff --check verdes.

  • [!] cargo fmt --all -- --check verde na tag.

  • [!] cargo clippy --workspace --all-targets --all-features -- -D warnings verde na tag.

  • [!] cargo test --workspace --all-features verde na tag.

  • [!] CI principal verde em Linux, macOS e Windows no mesmo commit.

  • [~] Testes reais de SQLite, PostgreSQL e MySQL, com isolamento e evidência da execução: as três matrizes exclusivas de rullst-orm passaram localmente em 2026-08-28, com PostgreSQL e MySQL em Testcontainers Docker. Isso prova o CRUD ORM delimitado nesse host, não o workspace/Academy inteiro nem o SHA da tag.

  • [~] Matrizes --no-default-features, features mínimas, combinações críticas e MSRV verdes: .github/check-feature-boundaries.sh passou localmente em 2026-08-29 compilando as 16 crates publicáveis sem defaults, 32 fronteiras isoladas de adapters/facade e executando os testes de Core sem defaults. Além disso, cargo +1.96.0 check --workspace --all-features passou localmente no worktree atual. O gate é reutilizado pela CI principal e pela release; as matrizes estritas de banco e o job MSRV já existem, mas todos ainda precisam ficar verdes no SHA final da RC.

  • Doc tests, Wasm/no_std, E2E, benchmarks, fuzzing delimitado, Miri, Kani, sanitizers e os gates Omni verdes para seus alvos declarados. A nova geração desktop executou localmente de ponta a ponta, incluindo npm e ícones, em 2026-08-30. O host não possui pkg-config/GLib, então o shell emitido também passou cargo check num contêiner Rust 1.96/Debian com os pré-requisitos oficiais do Tauri. Desktop Linux/macOS/Windows, Android aarch64 APK e iOS simulator passaram nos workflows hospedados do commit 755fbd61933bed04369e0eb5de50b11275db5e3d; o item agregado continua aberto pelos demais gates nomeados e porque compilação não prova aparelho/loja. No candidato intermediário 45fbdbe7, Miri, Kani e os sanitizers passaram; a campanha de fuzzing revelou três harnesses desatualizados e um panic real de fronteira UTF-8 no redator de URLs de banco. Os quatro achados foram corrigidos localmente, o caso Unicode virou regressão unitária e seed de corpus, e os alvos de parser ORM, redator e sanitizer passaram 100.000 execuções cada com libFuzzer/AddressSanitizer em 2026-09-05. A campanha completa ainda precisa passar novamente no SHA final, portanto o item permanece aberto. Para reduzir o ciclo de correção sem reduzir o gate, o workflow agora compila os 40 alvos em dez preflights antes das campanhas longas e separa um diagnóstico estrito de cinco minutos para exatamente um alvo; o resumo recusa explicitamente esse diagnóstico como evidência de RC. Mutations também aceita um único arquivo Rust de produção para feedback de correção, sem substituir a campanha completa. A tentativa de dezesseis shards usava a superfície default-feature, deixou testes opcionais fora da classificação e projetou 11–17 horas nos grupos mais lentos. O workflow agora exige --all-features e reparte o mesmo inventário medido de 14.380 mutantes em 80 shards de no máximo aproximadamente 180 candidatos. Antes de iniciar essa matriz, um --list --json barato exige a lista exata e única; o agregado final precisa corresponder aos mesmos nomes, além de classificar todos eles uma única vez. Isso é configuração validada, não resultado da campanha final. No SHA 36411ea1, 39 dos 40 alvos completaram integralmente 5h30; somente fuzz_parser encontrou uma terceira árvore válida que fazia a obtenção incondicional de Field::span() renderizar um tipo patológico por mais de dez segundos. Todos os diagnósticos do parser atingíveis por campos e tipos agora usam identificadores delimitados, o terceiro caso foi preservado no corpus e o reprodutor ASan exato caiu de cerca de 12,1 segundos para aproximadamente 30 milissegundos localmente. Uma nova campanha ASan local de cinco minutos completou 1.740.804 execuções sem achados. O diagnóstico hospedado 34495340300 completou mais 1.541.970 execuções em 301 segundos no commit de código corrigido 40c1b083, também sem achados. O resultado ainda não fecha este item: a campanha completa dos 40 alvos precisa passar no SHA candidato congelado.

  • Auditar os dez doctests antes marcados ignore: nove agora compilam como testes ou no_run; o único ignore restante é o exemplo da crate proc-macro, justificado para evitar dependência circular e coberto pelo teste de integração da facade. Um doctest ignorado não é contado como exemplo compilado.

  • Criar um harness Cargo-aware para os 52 tutoriais públicos: o módulo rullst/src/book_doctests.rs, habilitado somente por cfg(doctest), lê os Markdown originais em vez de manter cópias. Em 2026-09-05, cargo test --workspace --all-features identificou 106 blocos Rust, compilou/executou 88, registrou 18 fragmentos deliberadamente contextuais e terminou com zero falhas. Como o CI e a release já executam cargo test --workspace --all-features, a mesma verificação é bloqueante nesses gates; o SHA remoto ainda precisa repetir a evidência.

  • Estender o mesmo harness aos 27 guias públicos não tutoriais que contêm Rust. Em 2026-09-05, rustdoc reconheceu 203 exemplos no livro: 177 compilados/executados e 26 fragmentos ignore com contexto declarado, zero falha. O recorte não tutorial corresponde a 97 exemplos, 89 compilados/executados e oito contextuais. Um teste de inventário descobre os arquivos Markdown na raiz e em docs/src/crates, impedindo que um novo guia com Rust fique fora do gate silenciosamente. A evidência remota ainda deve ser repetida no SHA congelado da RC.

  • Auditoria, licenças, fontes, dependências duplicadas, typos e SemVer sem falhas ou com exceções datadas, justificadas e com prazo.

  • Reexecutar no candidato todos os workflows que falharam ou ficaram sem evidência no commit-base; o nome de um workflow não conta como prova.

3.1 Programa Omni web-first, platform-enhanced

O web app é a experiência canônica e universal. Domínio, identidade, autorização, dados, realtime e segurança continuam sob autoridade do servidor. Omni empacota essa experiência e poderá acrescentar capacidades do dispositivo sem duplicar a regra de negócio nem confiar no cliente. Isso serve aplicativos ricos — colaboração, comunidade, mensagens ou educação no estilo Duolingo — mas não promete gerar o produto, conteúdo ou UX final com um clique. Para jogos, Rullst pode fornecer backend/web/contas/realtime; não substitui um motor gráfico.

  • Tornar o contrato web-first/platform-enhanced normativo no SST e manter segurança/autorização no servidor.
  • Derivar nome/versão do host, aceitar overrides validados e exigir identificador reverse-DNS application-owned no Android/iOS.
  • Remover placeholders publicáveis do caminho mobile e gerar JSON/CSP sem interpolação textual insegura.
  • Negar navegação fora da origem exata no runtime nativo e não expor IPC privilegiado à página remota.
  • Gerar bootstrap local acessível com estado inicial offline/retry, sem chamá-lo falsamente de sincronização offline.
  • Fazer o backend desktop localhost falhar fechado em porta pré-ocupada, child exit ou timeout e encerrar somente o processo que iniciou.
  • Workflow desktop Linux/macOS/Windows passou no SHA 755fbd61933bed04369e0eb5de50b11275db5e3d; ele verifica o crate gerado, não installers assinados nem uma sessão GUI/WebView.
  • Workflow Android aarch64 compilou um APK debug no mesmo SHA; isso não equivale a aparelho, assinatura ou Play testing.
  • Gate iOS compilou o simulador com identidade application-owned no mesmo SHA; ele continua sem evidência de aparelho, signing ou App Store.
  • Implementar opener/deep-link OAuth com allowlists, state/nonce e callback single-use sem alargar a navegação para qualquer HTTPS.
  • Definir perfis opt-in de push, biometria e armazenamento Keychain/Keystore com permissões mínimas, negativos de replay/cross-account e fallback web.
  • Criar contrato tipado/versionado cliente-servidor compartilhável por web, shells e futuros frontends ricos sem tornar o cliente autoridade: rullst::client_contract define rullst.client v1, negociação positiva, envelopes privados tipados, IDs/chaves/códigos delimitados, tempo do servidor, JSON máximo de 2 MiB e rejeição de campos/versões desconhecidos; testes negativos e wasm32-unknown-unknown passam. O contrato não carrega role/tenant/autorização nem oferece idempotência durável ou sync offline.
  • [~] Implementar perfil offline real: a feature nativa opt-in offline-sync agora fornece estado v1 ligado à conta, snapshots autenticados AES-256-GCM, fila FIFO idempotente, revisões/cursor do servidor, aplicação atômica, conflitos sem client-wins implícito, full resync, quotas, recovery e erasure lógico. Um coordinator por dispatch estático limita batches/páginas, exige timeout por request, interrompe retry sem progresso e rejeita cursor travado sobre transport autenticado da aplicação. Ainda faltam adapters Keychain/Keystore e persistência atômica por plataforma, browser/IndexedDB, HTTP concreto, retry/background, migrações concretas futuras, UX da aplicação e testes de processo/aparelho; portanto o shell não é anunciado como offline-first.
  • [~] Criar um aplicativo de referência vertical rico — educação é um bom candidato — que prove mídia/áudio, progresso, gamificação e realtime E2E sem alegar que conteúdo/pedagogia são gerados pelo framework. O Academy gerado agora materializa a fatia web: modelo e migration distinguem vídeo/áudio, player SSR exige HTTPS ou origem local, vídeo exige WebVTT, toda aula exige transcrição/idioma delimitados e o teste executado prova escaping, nonce, ausência de autoplay e rejeições. Isso se integra ao progresso, avaliação/score, leaderboard, conquista, automação e realtime já testados no mesmo projeto. Ainda não é uma aplicação E2E rica: faltam playback/browser, conteúdo e pedagogia, fala/microfone, UX integrada, dispositivos e operação externa.
  • Definir budgets e testes de startup, memória, tamanho, acessibilidade, rede ruim/reconexão e vazamento de segredos por plataforma.
  • Executar contratos em aparelhos Android/iOS reais e registrar versões de SO/WebView, limitações e evidência reproduzível.
  • Preparar assinatura, manifests de privacidade, beta tracks e checklist de submissão; aprovação das lojas permanece externa.
  • Implementar atualização desktop assinada, rollback e política de canais antes de anunciar atualização automática do aplicativo.

4. Cobertura e qualidade dos testes

O número observado anteriormente foi aproximadamente 83%, mas não explicava seu escopo. A baseline oficial inicial, publicada pelo Codecov para o SHA 04006e82 em 2026-09-01, era:

  • 79,37% (54.937/69.212) no agregado público de produção, incluindo CLI e proc-macros, mantido visível como indicador informativo;
  • 84,40% (42.334/50.161) nas bibliotecas do framework selecionadas pelo status bloqueante da RC;
  • 100% no patch do checkpoint, acima do gate de 90%.

O checkpoint completo usado por esta auditoria, publicado para o SHA 28e2cea9 em 2026-09-03, é:

  • 84,97% (68.228/80.289) no agregado público de produção, incluindo CLI e proc-macros; esse agregado passa a ter gate próprio de 90%;
  • 91,26% no componente público framework_libraries, acima do gate de 90%;
  • 95,28% no componente rullst-auth, 93,09% em rullst-security, 62,93% no CLI e 91,28% nas proc-macros informativas.

O checkpoint predecessor completo mais recente, também publicado em 2026-09-03, avançou para 85,16% (70.026/82.227) no repositório inteiro e 91,32% (55.945/61.265) em framework_libraries; Auth ficou em 95,28%, Security em 92,51% e o CLI em 62,93%. O workflow de cobertura concluiu com sucesso, mas esse sucesso prova a geração e o upload do relatório, não o atendimento automático do status de projeto em 90%.

O lote candidato 704b6d4d acrescenta testes de processo com assertivas sobre scaffolds de controller/middleware/worker/LiveView/gRPC, inspeção, OpenAPI/SDK, empacotamento, deploy offline, diagnósticos, auditoria, Foundry, Omni, mail, chat, Academy, banco, migração automática com diferença real de schema e ejeção com backup. Codecov mediu 90,0337% (74.032/82.227) no repositório inteiro: 27 linhas cobertas acima do menor inteiro que satisfaz o corte exato de 90%. O componente framework_libraries ficou em 91,2952% (55.932/61.265), Auth em 95,28%, Security em 92,51%, CLI em 85,48% e proc-macros em 91,29%.

A comparação prévia por arquivo e linha havia encontrado 4.053 linhas de produção antes não cobertas e projetado 90,0908% mantendo o denominador do predecessor. O resultado oficial confirmou o gate, mas com o colapso LCOV em 74.032 hits, razão para nunca publicar a projeção como resultado. O artefato bruto retido pelo workflow registra 88,9181% (76.659/86.213) no resumo JSON do LLVM; o importador LCOV do Codecov registra as linhas únicas usadas pelos status públicos. As duas representações e seus denominadores são preservados, sem mistura ou média. O resultado precisa ser repetido no SHA congelado da RC; este checkpoint não autoriza antecipar a tag.

O candidato de release 27e81152 repetiu e ampliou o gate em 2026-09-04. O relatório oficial do Codecov registra 90,06% (74.219/82.408) no repositório inteiro e 91,33% (56.119/61.446) em framework_libraries; Auth ficou em 95,35%, Security em 92,54%, CLI em 85,48% e proc-macros em 91,29%. O patch medido ficou em 100%. O resumo bruto LLVM do mesmo artefato usa outra deduplicação de linhas e registrou 88,95% (76.858/86.401); ele não substitui nem é combinado com o modelo LCOV oficial usado pelos status públicos.

O primeiro recorte focado posterior a essa baseline elevou localmente rullst-messaging de 85,64% (1.962/2.291) para 90,22% (2.067/2.291). As novas regressões exercitam gramáticas e limites públicos, leases expirados em ACK/retry/dead-letter, teto de tentativas, retenção e inscrições duráveis, indisponibilidade do arquivo e corrupção individual de envelope, fingerprint, timestamp, tentativa, dead letter e versão do schema. Isso é evidência local do crate, não altera retroativamente o agregado oficial nem substitui o relatório do próximo SHA no Codecov.

O segundo recorte focado elevou localmente rullst-studio de 64,11% (1.926/3.004) para 90,28% (2.899/3.211). O relatório mescla os perfis SQLite, PostgreSQL, MySQL e MariaDB e exercita descoberta de schema, relações, dashboard, paginação, busca HTMX, mutações tipadas, feature flags, migrations e estados inválidos ou ausentes. Os testes revelaram e corrigiram descarte de links reais no dashboard, classificação incorreta de TINYINT(1) como inteiro, alias incompatível no diagrama ER do MySQL/MariaDB e chave primária TEXT inválida para feature flags nesses backends. Como no recorte anterior, esse é um resultado local que só se torna baseline oficial depois do upload do SHA.

Esses números são evidência de planejamento, não da futura tag. Line coverage não comprova adequadamente um gerador executado como processo nem o diagnóstico de uma proc-macro: cargo-rullst deve ser bloqueado por scaffolds gerados e compilados; macros, por testes compile-pass/compile-fail. Isso não autoriza ocultar sua cobertura — os componentes continuam publicados no Codecov como informativos. A meta deve ser perseguida por risco e em etapas, sem testes que apenas executem linhas sem validar comportamento.

O relatório total inclui o código de produção de todas as crates do workspace. O novo status bloqueante geral inclui toda a produção do workspace. O status separado framework_libraries seleciona as bibliotecas runtime e exclui somente cargo-rullst e as duas crates de proc-macros, que também mantêm gates funcionais próprios. Exemplos, benchmarks, documentação, artefatos gerados, fixtures auxiliares e arquivos de teste separados não entram no denominador. Testes inline ainda podem aparecer no mapeamento LLVM do mesmo arquivo de produção; o número oficial será o relatório final do Codecov no SHA da RC. O repositório usa um único codecov.yml; a CI autentica o upload pelo OIDC efêmero do GitHub, envia cobertura de linhas estável e produz semanalmente um artefato experimental de branches com Rust nightly. Enquanto a instrumentação de branches do Rust for instável, essa métrica é observacional e não bloqueia sozinha a release.

  • [~] [!] Produzir relatório de cobertura válido e vinculado ao SHA da RC. O candidato 27e81152 é válido, público e passa os três gates; falta repetir a evidência no SHA congelado da RC.
  • [~] [!] Configurar ≥90% de line coverage no agregado completo e nas bibliotecas do framework para RC e estável, sem tolerância. O componente de bibliotecas alcançou 91,33% e o agregado 90,06% no candidato 27e81152; a configuração declara ambos os gates. Falta repeti-los no SHA congelado da RC.
  • Configurar ≥90% de patch coverage como status obrigatório; o candidato 27e81152 alcançou 100%, e falta reproduzi-lo no SHA da RC.
  • Configurar componentes Codecov separados para framework_libraries, rullst-auth, rullst-security, CLI e proc-macros. As bibliotecas, Auth e Security bloqueiam a release em ≥90% de linhas; CLI e macros permanecem públicos e informativos porque seus gates principais são scaffolds e testes compile-pass/compile-fail.
  • [~] Baseline oficial crítica acima da meta: rullst-auth 95,35% e rullst-security 92,54% no SHA 27e81152. Falta comprovar os mesmos componentes no SHA da RC.
  • [~] Medir branch coverage e fazê-la crescer: a coleta semanal/manual em nightly e a retenção dos relatórios estão configuradas; falta estabelecer a primeira baseline válida e uma política de não regressão compatível com a estabilidade da instrumentação.
  • [~] [!] Garantir que nenhum caminho crítico fique com 0% de cobertura. O recorte local agora cobre resolução fail-closed e persistência da APP_KEY, cookie Secure em produção, coordenadas WebAuthn ausentes, Origin WebSocket malformada, continuidade/tamper da audit chain, envelopes Vault inválidos e corpos RASP com encoding, UTF-8 ou tamanho não inspecionável. Ainda falta o inventário completo por threat model e a comprovação no SHA da RC.
  • [~] [!] Derivar dos threat models e testar todos os casos negativos aplicáveis às fronteiras críticas de autenticação, autorização, parsing, criptografia, webhooks, tenancy, SQL e filesystem. O gate .github/check-threat-model-release-minimum.sh liga TM-12.10 a 67 linhas de evidência, 55 abuse-case IDs e 59 execuções de teste exatas em treze crates, cobrindo Core, ORM, Auth, Nexus, Studio, tenancy, Capital, AI, Mail, IoT, deploy e Academy, inclusive identificadores SQL dinâmicos e acesso a arquivos, e falha se um filtro passar a executar zero testes. O mínimo TM-12.10 completo passou localmente em 2026-09-03, inclusive o CAS concorrente e a recuperação do token store de Connect, o negativo de adulteração/rotação do journal SIEM e a compilação dos projetos gerados. A repetição integral no SHA hospedado da RC e os demais casos ainda não inventariados continuam abertos.
  • [~] Cobrir ORM raw/migrations/pool, Core Redis/DB por feature/dylib, Mail facade/attachments, handlers de Nexus/Studio e Security schema/rate/RBAC/headers/timing/vault. A anotação #[orm(encrypted)] agora cobre String/Option<String> de ponta a ponta: insert/read/update parcial, rotação por keyring, contexto autenticado de tabela/coluna, tamper, nullable, pluck_string não-null e recusa de consultas incompatíveis com ciphertext aleatório. O FieldEncryptor emite o envelope normativo RULLST:v2 e ainda lê o prefixo de desenvolvimento ENC:v2; permanecem as demais superfícies listadas e a evidência do SHA final.
  • [~] Cobrir timeouts, cancelamento, erros de provedores e políticas de tools em rullst-ai: os seis transports live agora aplicam deadline configurável de 30 segundos por padrão, ProviderCapabilities fixa o contrato e servidores loopback provam o timeout e o formato compatível (AI-06). O novo caminho OpenAI-compatible prova streaming delimitado e cancelamento explícito durante espera/leitura. Ainda faltam os protocolos diferentes, circuit breaker, concorrência e a matriz de erros reais dos provedores.
  • [~] Cobrir a CLI por execução end-to-end e macros por testes de compilação e diagnósticos, mesmo quando instrumentos tradicionais não medirem bem esses processos. Os testes process-level de academy:doctor provam saída JSON, exit status fail-closed e o caminho completo evidenciado sem certificação; os macros mantêm trybuild. A matriz E2E dos demais comandos públicos continua aberta.
  • Manter componentes informativos separados para CLI e proc-macros, sem misturá-los ao status bloqueante das bibliotecas nem omiti-los do relatório.
  • Manter a matriz estrutural das 18 formas públicas da v12 e a compilação de projetos gerados como gate separado: ela mede validade dos artefatos, não line coverage. A matriz anterior de 270 combinações incluía labels de frontend e ORM que não possuíam paridade entre blueprints e foi substituída junto com esses seletores.
  • Auditar “Hadouken code” em produção por profundidade e complexidade cognitiva. O único alerta acima do limite foi rullst-orm-macros::parser::parse (30/25): o parser foi separado em estados de atributos de modelo/campo, os arquivos resultantes ficaram abaixo de 500 linhas e o alvo de produção passou Clippy estrito com -W clippy::cognitive-complexity. A nova matriz também expôs e corrigiu a desserialização Redis que exigia Default e ocultava cache ausente/malformado.
  • Tornar a gramática de rullst-orm-macros fail-closed: atributos agora usam syn::Attribute::parse_nested_meta; opções desconhecidas, duplicadas, órfãs ou incompatíveis falham em compilação. A derive valida identificadores, id persistido, alvos de tenant/soft-delete/embedding e invariantes de relações antes do codegen. Vinte e quatro fixtures trybuild, a suíte focada da proc-macro e as matrizes rullst-orm --all-features passaram localmente; compatibilidade de compilador/ecossistema além da matriz continua externa.

A meta não deve ser alcançada por testes sem assertivas úteis em funções triviais. A ordem é: caminhos negativos do threat model, fronteiras críticas, erros/cancelamento e, por fim, lacunas legítimas do restante do workspace.

5. Empacotamento e docs.rs

  • RUSTDOCFLAGS="-D warnings" cargo doc --workspace --all-features --no-deps -j 2 passou em 2026-08-29; os doc tests também passaram no último cargo test --workspace --all-features. O mesmo gate continua obrigatório na tag pelo bloco de CI acima.
  • [~] [!] Os 16 .crate de 12.0.0-rc.1 foram gerados e auditados localmente no commit limpo 27e81152; todos registraram esse SHA e dirty=false. O consumidor extraído compilou todos os recursos, instalou o CLI empacotado e compilou Blank, LMS, SaaS, Blog, Portfolio e ERP. O ensaio integral passou com jobs limitados, inclusive a construção nativa do DuckDB. Falta repetir o gate sobre o futuro commit aprovado da RC.
  • [~] A primeira inspeção dos 15 arquivos .crate então existentes revelou licenças ausentes em 13 pacotes e um arquivo .env.test_autofix indevido na crate guarda-chuva. As licenças foram padronizadas, inclusive em rullst-messaging; o .env* foi excluído do pacote e o workflow agora bloqueia quantidade/nome/tamanho inesperados, caminhos inseguros, padrões de segredo, estado SQLite de runtime, conteúdo obrigatório ausente e licença divergente. O gate local passou nos 16 arquivos 12.0.0-rc.1 de 27e81152; falta repeti-lo nos artefatos do futuro commit aprovado da RC.
  • O gate .github/test-packaged-distribution.sh extrai os 16 .crate em diretório temporário, compila offline um consumidor que referencia todos os pacotes e recusa dependências geradas por path antes de aplicar patches que apontam exclusivamente para o conteúdo extraído dos arquivos empacotados.
  • O mesmo gate instala cargo-rullst a partir de seu .crate, usa o binário instalado para gerar Blank, LMS, SaaS, Blog, Portfolio e ERP de forma não-interativa e executa cargo check --offline --all-targets em cada projeto. As dependências internas geradas agora herdam CARGO_PKG_VERSION, inclusive prereleases, em vez de fixar auxiliares em 12.0.0.
  • Confirmar a construção de todas as páginas no docs.rs.
  • [~] Remover, atualizar ou isolar dependências opcionais obsoletas: a dependência Leptos sem uso foi eliminada, proc-macro-error3 foi atualizado e o lockfile substituiu o wnaf 0.14.0 yanked por 0.14.1. cargo audit passou localmente com somente a exceção já governada; falta reproduzir Cargo Audit/Cargo Deny e registrar a evidência no SHA final.

6. Bootstrap e publicação no crates.io

  • [~] O workflow de release empacota antes do upload e publica na ordem topológica. Falta provar o bootstrap das crates ainda não registradas e o fluxo completo numa tag candidata.
  • O validador de tag aceita versões estáveis e prereleases SemVer, incluindo v12.0.0-rc.1.
  • [~] [!] O gate .github/check-crates-ownership.sh consulta o crates.io na verificação e novamente imediatamente antes do upload, exige venelouis nos nomes registrados e só aceita 404 para a allowlist revisada. Em 2026-08-29, seis nomes estavam registrados para o proprietário esperado e nove retornaram 404 dentro da allowlist de bootstrap; falta reexecutar e preservar a evidência no SHA final da RC.
  • [~] [!] O job publish, protegido pelo ambiente GitHub crates-io, usa OIDC nos crates registrados e seleciona CRATES_IO_BOOTSTRAP_TOKEN somente nos nomes classificados como inéditos. O runbook limita o token a publish-new e exige Trusted Publishing, revogação e remoção do secret/allowlist após o bootstrap; faltam configurar os controles externos e executar/revogar a credencial na primeira RC real.
  • [~] O workflow agora aguarda indexação e compara o checksum retornado pelo crates.io após cada publicação; falta observar o mecanismo numa RC real.
  • Documentar recuperação de publicação parcial: inventário/checksum por crate, retomada apenas do prefixo ausente, uso obrigatório de nova prerelease para bytes alterados, yank, comprometimento de credencial e comunicação.
  • [~] O job de publicação baixa os artefatos atestados, valida seus checksums, reproduz os 16 .crate a partir da tag e exige igualdade byte a byte antes do upload; depois confirma o checksum do registry. Falta a evidência de uma execução real e a proveniência continua limitada pelas fronteiras declaradas do GitHub Actions/crates.io.

7. Programa de segurança v12+

O objetivo não é apagar as ambições antigas. É convertê-las em contratos menores, testáveis e honestos. Controles criptográficos e afirmações de conformidade só recebem [x] após revisão especializada proporcional ao risco.

Baseline obrigatório

  • Definir um production preset canônico: o contrato público tipado ProductionPreset::middleware_order() e a arquitetura documentam e testam a ordem externa→interna de proxy, limite de corpo, request ID, tracing, headers, CORS, WAF/RASP, CSRF, sessão, autenticação, tenant, autorização, rate limit e handler. Camadas de identidade continuam explicitamente pertencendo à aplicação, pois o framework não pode inventar sua política de domínio.
  • Tornar readiness e shutdown um contrato executável do Core: ApplicationLifecycle registra no máximo 32 componentes imutáveis, mantém fases monotônicas, nega novas requisições antes de ready, sob dependência indisponível ou durante drain, e aguarda de forma limitada as requisições já aceitas. Server marca ready depois do bind, começa drain antes da espera do Axum, encerra como stopped e aceita um future de supervisor em run_with_shutdown. /ready revela somente fase/contagens; os testes CORE-01/02 cobrem startup, indisponibilidade, lock corrompido, timeout, corrida de admissão e listener real. Probes, auth de domínio, consenso entre réplicas, propagação do load balancer e deadline operacional continuam no host/deployment.
  • Criar threat models versionados para autenticação, Nexus, Studio, tenancy, webhooks/pagamentos, AI/tools, atualização IoT, deploy e Academy: TM-12.10 define ativos, fronteiras, abuse-case IDs, controles, evidências e riscos residuais. A revisão independente do candidato exato continua no gate final.
  • O scanner IDOR agora exige classificação adjacente public|owner|role|admin, recusa mutação classificada como pública e exige um guard reconhecido nas demais. O gate também recusa anotações sem justificativa e ausência de arquivos Rust. Sete negativos unitários, o inventário de rotas parametrizadas do workspace, os seis blueprints e as 18 variantes da matriz estrutural pública da v12 passaram. As mutações do ERP, antes públicas, agora reutilizam NexusAuthPolicy::protect_router; testes HTTP provam a fronteira administrativa (200 local, 403 remoto/sem peer) e ownership real (200 owner, 403 cross-owner, 200 moderator, 401 sem identidade). O ERP materializado passa cargo check --offline --all-targets. Isolamento multi-tenant completo continua no item específico abaixo e a prova deve ser repetida sobre o SHA da RC.
  • Nexus falha fechado sem política explícita; o atalho local exige build de debug, peer loopback verificado e ConnectInfo.
  • Nexus aceita tenant text opt-in por model, propaga o TenantContext confiável por toda rota built-in e recusa contexto ausente/input protegido. O audit opt-in obrigatório compartilha a transação da mutação e falha fechado; a documentação preserva que o storage é o mesmo banco, mutável e sem registro de tentativas negadas ou chave auto-gerada uniforme.
  • Fazer revisão independente da política de acesso do Nexus e dos fluxos CRUD/batch/AI.
  • [~] Implementar rate limit distribuído, idempotência durável e audit trail append-only para deploys com múltiplas instâncias. A feature rullst-security/redis-rate-limit fornece contador fixed-window atômico em Lua, namespace validado, chaves de cliente hasheadas, TTL/retry e erros tipados; o modo vazio/mock_* é explicitamente local e require_distributed() o rejeita em startup de produção. Um contrato opt-in passou localmente contra Redis real e roda em CI/release com duas instâncias independentes do limiter e imagem fixada por digest. Faltam cluster/failover, idempotência compartilhada e sink de auditoria durável.
  • [~] Consolidar headers seguros, CSP nonce, CORS e CSRF numa baseline testada em navegador e proxy reais. Core agora expõe uma composição canônica única e o Server a utiliza: a configuração validada é instalada antes dos middlewares, e a ordem externa→interna é headers → CORS → WAF → CSRF → PII opcional → handler. A allowlist CORS aceita apenas origins HTTP(S) exatas, rejeita wildcard/path/query/credenciais/duplicatas, limita métodos/headers e habilita credenciais somente por opt-in sobre a lista explícita. O teste HTTP in-process prova nonce CSP igual ao renderer, cookie CSRF Secure/SameSite, POST negado/aceito, preflight permitido e origin estrangeira sem grant. Ainda faltam browser E2E e proxy/TLS reais, além das camadas de sessão/auth/tenant que permanecem contrato da aplicação.
  • [~] Ampliar DAST representativo para os artefatos que o CLI realmente entrega. O workflow manual agora compila em release e migra um REST API e o LMS completo recém-gerados; alertas WARN/FAIL bloqueiam e nenhuma regra é ignorada. O showcase do blog é separado e informativo porque sua CSP relaxada e assets externos são um limite deliberado e documentado. A execução local de 2026-09-01 encontrou e corrigiu exposição de diagnóstico SQL no status do blank/API e acrescentou Cache-Control: no-store somente quando o handler não definiu política própria. Depois das correções, REST cobriu 3 URLs com 65 regras em PASS, 5 INFO, 0 WARN e 0 FAIL; LMS cobriu 25 URLs com 63 regras em PASS, 7 INFO, 0 WARN e 0 FAIL. Falta repetir a execução hospedada no SHA congelado da RC; três superfícies não provam todos os blueprints, papéis autenticados, browsers, proxies ou deployments. A passagem informativa do blog encontrou formulários sem o campo CSRF: o middleware Core passou a expor o mesmo token validado aos handlers, o blog passou a renderizar e testar esse valor, e a nova varredura já não reportou o alerta 10202. Com a triagem registrada sem nenhuma regra IGNORE, essa superfície cobriu 28 URLs com 61 regras em PASS, 7 INFO, 2 WARN deliberadamente visíveis para dependências CDN sem SRI e 0 FAIL. A auditoria de scaffolds estendeu o mesmo contrato aos POSTs/HTMX dos blueprints Blank e ERP; LMS, SaaS e Nexus já possuíam integração equivalente, enquanto Studio conserva sua fronteira debug-only de loopback e mesma origem.

Autenticação e criptografia

  • Concluir WebAuthn/passkeys com biblioteca auditada, casos normativos e conformance suite; a fundação atual não deve ser anunciada como conformidade completa.
  • [~] Implementar política JWT de aplicação, rotação/revogação, TOTP com recovery codes e gerenciamento de sessões/dispositivos. rullst-auth/jwt agora fornece claims versionadas obrigatórias, issuer/audience, TTL/scopes limitados, chaves fortes com rotação por kid e contrato estático de revogação por token/versão de sessão; o modo de produção rejeita o store de memória local. A feature sqlite acrescenta revogação JTI/versão de sessão compartilhada entre processos locais, quota/configuração persistidas, verify_async e inventário/rename/revogação de passkeys com CAS de counter. Reinício, replay, concorrência entre duas instâncias e quotas possuem testes. rullst-security também gera recovery codes de 80 bits subject-bound, guarda apenas verificadores HMAC com salt e remove o verificador consumido. Ainda faltam refresh tokens, consumo transacional persistido de recovery codes, challenge WebAuthn compartilhado, replicação multi-host e conformance normativa.
  • Integrar KMS/HSM e rotação de chaves apenas por adapters reais e testes de falha; simuladores permanecem claramente experimentais.
  • Pesquisar PQC apenas para um protocolo e threat model concretos, usando primitivas auditadas; não criar criptografia própria.

Runtime, pagamentos, dados e SOC

  • Ampliar WAF/RASP/DLP com parsers corretos, limites explícitos, falsos positivos medidos e testes de bypass; nunca prometer cobertura total OWASP.
  • Tornar entrega SIEM externa observável e com retry/dead-letter antes de chamá-la de integração operacional. A fundação local agora tem contrato LiveSecurityEvent v1 congelado, um DurableSiemSpool compatível unsigned e um AuthenticatedSiemSpool single-process que encadeia HMAC, sequência, chave ativa/histórica, predecessor e payload sob quotas e sync_data. Restart, forgery, substituição/ausência de chave, reorder, remoção interna e mudança externa falham fechados. Checkpoint confiável contra whole-tail rollback, transporte, compaction, retenção, retry, confirmação e dead-letter continuam deliberadamente em aberto.
  • [~] Levar a NFS-e Nacional até um contrato pronto para homologação em uma campanha fiscal dedicada. O marco local agora fixa por SHA-256 os pacotes oficiais de produção v1.01-20260209 e produção restrita v1.01-20260727, modela uma DPS ordinária delimitada sem float, valida CPF/CNPJ/IBGE/limites, carrega apenas fontes XSD oficiais verificadas por hash em catálogo fechado em memória e valida a DPS gerada. Depois do hash, o perfil de produção recebe uma única normalização explícita: remove os anchors .NET ^...$ do padrão conhecido de série, pois eles seriam literais na gramática regex XSD. O certificado PKCS#12 fica em containers redigidos e zeroizados quando pertencentes ao Rullst; o signer produz XMLDSig envelopada RSA-SHA256 com C14N inclusiva 1.0 sobre infDPS/@Id, passa verificação criptográfica local e o XML assinado passa o XSD oficial fornecido. A mesma credencial constrói identidade/cliente mTLS rustls limitado a HTTPS, sem redirects e com timeouts. O codec offline agora valida a XMLDSig incorporada da DPS, gera deterministicamente o objeto JSON dpsXmlGZipB64 e distingue autorização HTTP 201 de rejeições 400/403/500 com limites estritos. Uma autorização só emerge quando ambiente, DPS submetida, chave de 50 dígitos, infNFSe/@Id e XMLDSig incorporada concordam; JSON/XML/Base64/GZip malformado, campos desconhecidos, tamper e expansão acima de 4 MiB falham fechados. Ainda faltam vínculo certificado-emissor e cadeia ICP-Brasil completos, idempotência/auditoria duráveis, fixtures oficiais retidas, teste com A1 real na produção restrita e revisão independente. Homologation e Production continuam Unsupported e sem I/O até essas evidências; parâmetros do contribuinte/município são dependências externas e nunca podem ser simulados como autorização.
  • Manter Alipay RSA2 em Unsupported até assinatura/verificação interoperável e contract tests oficiais.
  • Testar isolamento multi-tenant, SQL parametrizado, migrations, backups e restauração contra bancos reais.
  • Obter uma auditoria de segurança externa e publicar escopo, versão, achados corrigidos e limitações — não um selo absoluto.

AI segura e útil

  • [~] Versionar evals de prompt injection, PII, jailbreak, tool selection, alucinação e regressão por provedor/modelo. O corpus rullst-ai-guardrails-v1 fixa casos determinísticos de injection, jailbreak e PII, é validado por schema/IDs/categorias e roda contra os seis transports offline no CI e na release. AdaptiveAiEvaluator<P> acrescenta estratégias multi-turn por dispatch estático, feedback bounded, deadline/cancelamento, estados pass/fail/inconclusive e relatório JSON sem prompt/response/error raw; o teste usa a saída de um turno para construir o seguinte. Corpora mantidos de tool selection, groundedness/alucinação e política de output, assim como execução/revisão contra cada modelo live exato, continuam responsabilidade operacional e não são alegados por um fixture offline.
  • Criar uma matriz de capacidades por provedor para streaming, JSON/schema, vision, embeddings, tools, timeouts, retries e cancelamento. ProviderCapabilities, AiProvider::capabilities() e AiClient::capabilities() tornam o contrato verificável em código; testes fixam as seis implementações, as capacidades declaradas do adapter compatível e a restrição de schema por modelo no DeepSeek.
  • Implementar streaming/cancelamento no primeiro protocolo delimitado: StreamingAiClient<P> mantém dispatch estático, guarda o input e impõe limites independentes de chunks/bytes; o adapter OpenAI-compatible só anuncia SSE após opt-in explícito, exige text/event-stream/[DONE] e disputa o sinal AiCancellation contra request e cada leitura. Testes loopback cobrem fragmentação LF/CRLF, content type, truncamento, overflow e cancelamento em voo. Protocolos diferentes e calls não-streaming continuam corretamente abertos, e cancelar localmente não prova cancelamento/billing upstream.
  • Implementar export remoto autenticado de auditoria AI sem prometer um SIEM: AuditDeliveryClient limita o envelope JSON, assina seus bytes exatos com HMAC-SHA256/key ID/timestamp, preserva um event ID em retries transitórios delimitados, aceita apenas ACK fechado vinculado ao evento e disputa cancelamento contra request, response e espera. Cloud exige HTTPS; HTTP(S) local exige IP literal de loopback; credenciais vazias/mock_* são offline. O caller minimiza o evento e o receiver valida freshness/deduplicação e opera autorização, persistência, retenção e chaves; não há outbox/SIEM distribuído implícito.
  • Exigir autorização explícita, schema, allowlist, limites e audit trail em chamadas de tools: ToolRegistry::execute agora requer política e contexto do principal, valida JSON fechado e limitado, consome budget e falha fechado sem audit sink. Operações destrutivas/financeiras exigem aprovação de uso único vinculada ao payload exato; identidade e auditoria durável continuam contratos da aplicação, documentados em Guarded Local AI Tools.
  • [~] Bloquear SSRF e exfiltração em fetchers/RAG/conectores com egress policy, resolução segura e limites de conteúdo. EgressPolicy::strict() exige HTTPS, allowlist exata de host (vazia por padrão), porta permitida, host não local/metadata e resolução inteira para IPs públicos. EgressFetcher resolve sob deadline, fixa todas as respostas num client sem proxy/redirect automático, verifica o peer conectado, revalida cada redirect e limita tamanho declarado e chunks em streaming. Testes negam DNS privado/misto antes do transporte e cobrem formatos IPv4/IPv6, redirect privado, allowlist e overflow. O fetcher é opt-in; AiClient::prompt_with_image_url agora o exige explicitamente para imagens remotas e ainda valida assinatura/MIME, enquanto arquivos locais exigem raiz canônica allowlisted. Ele não envolve transports de provider, RAG ou clientes arbitrários; autorização tenant-aware do destino, decodificação segura e contrato live de sucesso/redirect continuam abertos.
  • Separar filtros heurísticos de garantias: GuardrailReport agora expõe passed_heuristics, mantém is_safe somente como alias depreciado e a integração de IA declara que filtros, schema e similaridade não tornam prompt, resposta, tool ou decisão confiável por definição.

Supply chain

  • Workflows usam actions pinadas por SHA e a release gera SBOM/evidência delimitada.
  • Provar o pipeline completo de provenance e Trusted Publishing na RC.
  • Definir SLA por severidade para advisories e política de exceções com owner, controle compensatório e expiração; dois ignores obsoletos foram removidos dos workflows junto com suas dependências.
  • Manter fuzzing, Kani, Miri, sanitizers e mutation testing com alvos e resultados descritos precisamente; nenhum deles prova segurança universal. As matrizes agora distinguem diagnóstico rápido, achado informativo e falha de infraestrutura/baseline, mas ainda faltam os resultados do SHA final.

8. Experiência local: Nexus e Studio em um clique

A conveniência deve existir sem transformar uma configuração esquecida em uma porta administrativa de produção.

  • Criar NexusAuthPolicy::local_development_or_basic_from_env(): desenvolvimento usa loopback verificado; release exige credenciais válidas do ambiente.
  • Reutilizar LocalNexusAccess, que recusa peers não-loopback e requests sem ConnectInfo.
  • Ligar o helper nos blueprints Blog, Portfolio, LMS, ERP e SaaS.
  • Iniciar o Studio standalone em 127.0.0.1:5555 apenas em builds de debug geradas pelos blueprints; Studio::into_router exige agora a capability explícita LocalStudioAccess, recusa builds release e cada request sem peer loopback verificado por ConnectInfo. A capability também valida Host local, exige Origin de mesma origem nos métodos mutáveis e rejeita mutações sem Origin, cobrindo o limite local contra DNS rebinding e CSRF.
  • Remover estados operacionais fabricados do Studio: AI sem transporte conectado fica indisponível; segurança não deduz guardas ativos ou alcance de provider por variáveis de ambiente; receita só exibe métricas fornecidas pela aplicação; filas propagam operação não suportada; e as ações HTTP legadas de migration/seed retornam 501 porque o servidor standalone não recebe um registry executável.
  • Tornar purge_failed_jobs o nome canônico da operação da fila e fazer os defaults de listagem/retry/purge falharem com Unsupported, em vez de retornarem sucesso vazio. O alias legado purge_completed_jobs permanece depreciado apenas para compatibilidade de fonte.
  • Fixar o asset CDN do Scalar, escapar a URL OpenAPI, tornar seu fallback status-only e recusar documento ausente/malformado com 503; corrigir build:client para falhar fechado quando o toolchain Wasm falta, mesclar cdylib via TOML estruturado, respeitar lib.name, localizar apenas um artefato real e gerar um hidratador separado que aguarda a inicialização do wasm-bindgen.
  • Exibir botões claros para Studio local e Nexus nos dashboards aplicáveis.
  • Atualizar examples/blog: Studio standalone local, Nexus de um clique em debug e sem credenciais fictícias obrigatórias no setup. A auditoria do showcase também adicionou CPU real do processo no Windows, atualização dos KPIs por /api/radar, corrigiu a dupla contagem de prompts e removeu selos HMAC positivos quando a fonte contém somente eventos locais não assinados. Os seis botões do sandbox de segurança e o /wp-admin agora têm regressão que prova a execução das primitivas locais instrumentadas; a interface deixou de transformar uma detecção em falso 403, chamada de provider, garantia universal de timing ou nota de scanner.
  • Remover da interface do Studio a sugestão incorreta de que STUDIO_PASSWORD já fornecia autenticação embutida.
  • Remover os aliases legados /tools/*; todas as páginas do Studio usam as rotas limpas /studio/* exigidas pela especificação.
  • Acrescentar ingestão distribuída sem abrir o painel remotamente: cada produtor recebe um router push-only separado, vinculado ao seu nome e chave, que aceita lotes v1 sem atributos sob 128 KiB/128 spans, autentica corpo/source/timestamp/nonce por HMAC-SHA256, rejeita replay atomicamente e alimenta um store in-process limitado e idempotente. O viewer local sinaliza operações SQL de 100 ms e três labels repetidos por trace como heurísticas, sem receber SQL, bindings, headers, bodies ou erros. TLS, rotação da chave, relógio, autorização do produtor e durabilidade continuam responsabilidades da aplicação/operação.
  • Concluir o inspetor de cache no limite seguro: Core fornece snapshots metadata-only de no máximo 200 entradas para Memory/Redis, com contrato Redis live pinado; Studio exibe no máximo 100 fingerprints HMAC process-local, tamanho e TTL, nunca valor ou chave lógica, e permite somente invalidação individual atrás da marker local verificada. flush all não é exposto e drivers custom falham explicitamente sem opt-in.
  • Padronizar novos .env, Kubernetes e Foundry em RULLST_ENV, corrigir a precedência do template de billing e manter APP_ENV apenas como alias legado testado para aplicações existentes.
  • Tornar o Foundry fail-closed nas etapas de build, provisionamento, upload, configuração e health check: TOML e identificadores são validados, segredos seguem por stdin, curl, systemd e Caddy precisam estar previamente instalados, a configuração candidata é validada e os arquivos da aplicação ficam isolados em /opt/rullst/<app>. O sucesso local não é apresentado como prova de DNS/TLS público. A versão atual substitui o Caddyfile global e ainda exige root ou sudo não interativo; não promete migrations, checksum remoto, rollback automático nem zero downtime.
  • Rodar a matriz estrutural das 18 formas públicas da v12, materializar os seis blueprints públicos em diretórios temporários e compilar os projetos representativos SaaS e Blank/hot. A antiga matriz de 270 variantes permanece apenas como evidência histórica da fase anterior à simplificação.
  • [~] [!] Os gates lentos materializam dez casos que cobrem os seis blueprints, Active Record, SSR html!/HTMX, API, banco e hot reload. Seis executam cargo check --offline --all-targets; o LMS executa cargo test --offline --all-targets, inclusive o negativo owner/cross-user embutido no scaffold, e os perfis LMS separados auth, auth,learning e auth,learning,assessment também passam seus testes gerados. O último prova apresentação sem gabarito, owner boundary, correção autoritativa, replay, conflito de idempotência e limite de tentativas em SQLite, sem materializar gamificação, automação, outbox ou notificações. O middleware JWT injetado usa a mesma major 11 do workspace, permitindo a resolução offline num runner limpo; relatórios de upgrade e chaves de storage também preservam / canônico no Windows. Todos passaram localmente em 2026-08-29, mas ainda falta CI verde no SHA final da RC.
  • [~] Um dos dez projetos gerados passa cargo check --release; testes release focados provam que Nexus nunca escolhe a política sem credenciais e que Studio recusa sua capability local. O job generated-release-access está configurado; falta a evidência de CI no SHA final e um E2E do processo gerado sem variáveis.
  • Criar E2E de navegador para os dois botões e para a rejeição de peer externo.
  • Medir tempo até a primeira página, primeiro CRUD e primeiro diagnóstico de erro com usuários novos.

9. Correção responsável do changelog

O changelog é registro histórico; apagar silenciosamente alegações extraordinárias seria tão ruim quanto mantê-las como fatos atuais. A correção adotada é preservar a alegação original e acrescentar imediatamente o escopo auditado:

- **Alegação original de desenvolvimento:** descrição histórica.
  - **Escopo auditado na v12:** o que o código e os testes realmente sustentam.
  - **Ambição restante:** o que falta e se vale implementar.
  - **Evidência:** teste, workflow, issue ou documento vinculado à versão/commit.
  • Adicionar no topo de v12 um aviso de que o inventário não é certificação nem evidência congelada de testes.
  • Corrigir ao lado, sem apagar, as alegações de latência zero, Alipay RSA2, Kani universal e imunidade a DoS por fuzzing.
  • Todas as afirmações históricas de 100% test pass rate agora trazem ao lado que são alegações de execução histórica cujo commit/artefato exato não foi retido nessa entrada; não são tratadas como cobertura nem prova da RC.
  • [~] As entradas atuais de SECURITY.md, headers, DLP, RASP, compliance, Kani, SLSA e inventário TLS foram delimitadas sem apagar os controles; ainda falta concluir a mesma revisão de linguagem absoluta em toda a documentação histórica.
  • [~] As páginas canônicas de Capital e IoT agora distinguem adapters/helpers implementados, mocks offline, homologação e hardware/boot/transporte pendentes. A auditoria item a item de SIEM, OpenAPI/SDK, deploy, replicação e de cada método/fee/provedor continua aberta.
  • Manter correções também nas seções de versões já lançadas; o cabeçalho de v12 não deve reescrever silenciosamente a história.
  • Ligar cada claim de segurança de v12 a código, teste e limite conhecido no ledger canônico de alegações e evidências; o documento também declara que uma afirmação ausente não é garantia da release.

9.1. Preservação da documentação original

  • Identificar por histórico Git o snapshot imediatamente anterior à criação de gpt.md: 96222fbd31bec3d20bc50db68c41bb85ca595779.
  • Criar um índice de preservação com o snapshot exato, as famílias de ambições recuperadas, estado atual, opinião e destino canônico.
  • Manter as ideias nos roadmaps e manter spec/tutoriais copiáveis limitados ao comportamento atual.
  • Excluir tutoriais antigos da reconstrução por decisão do mantenedor; eles permanecem apenas em sua versão atual e segura.
  • Classificar individualmente as 190 alegações históricas deduplicadas dos roadmaps; os quadros auditados abaixo prevalecem sobre [x] antigos e medem classificação, não implementação integral.
  • Revisar toda remoção futura de conteúdo contra o snapshot e registrar no índice quando houver valor de visão ou de decisão.

10. Prova operacional

  • Publicar a RC e criar uma aplicação de referência que dependa apenas de crates.io.
  • Operar deploy, migration, backup, restore, rotação de segredo e rollback num ambiente semelhante à produção.
  • Executar testes de carga reproduzíveis e publicar hardware, configuração, dataset, percentis e limites; evitar “o mais rápido” sem comparação válida.
  • Ter usuários externos construindo aplicações sem acesso ao monorepo e registrar problemas de onboarding.
  • Ter ao menos um ciclo de RC com correções observadas em uso real.
  • Definir manutenção, triagem de vulnerabilidades, resposta a incidentes e suporte para a linha v12.

11. Gates para 12.0.0 estável

A versão estável só recebe GO quando todos estes itens estiverem fechados:

  • [!] Trifecta local e CI multi-OS verdes no mesmo SHA.
  • [!] Pacotes e aplicação crates-only reproduzidos.
  • [!] Sem advisory crítico/alto sem exceção governada e sem segredo no pacote.
  • [!] Baseline de produção e threat models revisados.
  • [!] ZAP hospedado verde no SHA da RC para REST API e LMS gerados, com os relatórios do showcase informativo revisados e sem transformar achados reais em exclusões.
  • [!] Scorecard no SHA da RC com A (90) ou mais em todas as crates, salvo a exceção aprovada de B (80) ou mais para rullst-iot. A+ só pode ser publicado quando a evidência objetiva alcançar 97. No estado atual, Core tem 96/A, ORM tem 96/A, ORM Macros, Auth, Mail e Nexus têm 95/A, Macros tem 94/A, Messaging e Security têm 96/A, Connect e AI têm 95/A, a facade rullst tem 90/A, e IoT tem 83/B. Capital alcançou seu teto local de 93/A com o ledger relacional de webhook, o contrato compartilhado de egress/falhas dos gateways e o journal fiscal local autenticado. cargo-rullst alcançou seu teto local de 95/A com a matriz estrutural pública, oito aplicações geradas executando testes e construindo os routers hot selecionados, perfis pelo binário público e fixtures transacionais de upgrade v5/v6/v11 com rollback, retenção/restauração e rejeição de symlink. Studio alcançou seu teto local de 94/A com ingestão de traces push-only autenticada/replay-bound, profiler de labels limitado, inspeção metadata-only de cache Memory/Redis e invalidação individual opaca. ORM alcançou seu teto local de 96/A com snapshots documentais autenticados e limitados, verificação fail-closed de inventário e ensaio live bidirecional MongoDB → SurrealDB → MongoDB, sem prometer snapshot online, PITR ou operação gerenciada. Security alcançou seu teto local de 96/A com journal SIEM local opcional HMAC-chained, rotação explícita por chave ativa/histórica e negativos exatos de forgery, substituição de chave, reorder, remoção interna e restart, sem prometer checkpoint externo, entrega/ack remotos, SOC ou certificação. Assim, todos os pisos atuais estão atendidos. Esses valores são tetos atuais, não metas finais: a campanha v12 pretende alcançar os tetos locais provisionais documentados no scorecard (93–96/A nas 15 crates ativas); IoT permanece na exceção aceita de 83/B, sem fabricar os pontos que dependem de hardware, homologação, operação live ou auditoria externa. O gate permanece aberto até haver implementação real e o artefato do SHA candidato comprovar todos os gates condicionantes.
  • [!] Na estável, line coverage das bibliotecas do framework ≥90%, patch coverage ≥90%, componentes Auth e Security ≥90%, cobertura total do código de produção publicada sem omissões, nenhum caminho crítico com 0% e baseline de branches publicada. 95% permanece meta de excelência, não gate artificial.
  • [!] Changelog, spec, capability ledger, README e exemplos concordam sobre o que existe e o que não existe.
  • [!] Concluir a auditoria documental da RC: o mdbook build já passa e o scan Lychee repository-wide verificou 1.228 referências, 695 únicas, com 769 válidas, 459 exclusões offline intencionais e zero erro em 2026-09-01. O workflow documentation.yml torna o build e os links/anchors locais bloqueantes, mantendo o scan externo periódico/manual como evidência informativa. Os 52 tutoriais contêm exatamente 106 exemplos Rust: o harness Cargo-aware compilou/executou 88 e os 18 ignore restantes declaram a dependência contextual (módulo/arquivo gerado, adapter da aplicação ou dependência circular), sem serem contados como exemplos compilados. O livro completo contém 203 exemplos reconhecidos pelo rustdoc — incluindo três blocos indentados no spec.md que a contagem anterior de fences omitia — e o mesmo gate compilou/executou 177, classificou 26 como contextuais e terminou sem falhas. No recorte fora dos tutoriais, são 97 exemplos: 89 verificados e oito contextuais. Repetir a evidência no SHA congelado e validar também comandos, versões, caminhos e toda alegação semântica contra spec.md e as APIs reais.
  • [!] RC operada por tempo suficiente e sem bloqueadores conhecidos.
  • [!] Plano de publicação parcial, rollback operacional e resposta a incidentes ensaiados.
  • [!] Aprovação humana final registrada.

12. Rullst Academy: fronteira externa futura

O plano do produto separado está em Rullst Academy product programme. Esta seção preserva o inventário de capacidades reutilizáveis do framework; não transforma conteúdo, sandbox, operação ou UX da aplicação em escopo implícito da crate rullst.

O objetivo vertical de longo prazo é permitir que uma equipe pequena construa um LMS excelente, divertido e seguro sem remontar autenticação, progresso, ranking, automações e operação a partir de primitivas desconectadas. Este inventário não amplia a v12 nem cria trabalho de Academy neste repositório: o produto será desenvolvido em outro repositório e outra conversa. Nenhum item desta seção bloqueia a RC ou a estável; quando o projeto externo existir, seu link poderá ser acrescentado à documentação do framework.

Os estados abaixo são um registro arquivado do que já existe e do que caberá ao futuro produto externo. Caixas abertas nesta seção não são tarefas do workspace, não entram no percentual de prontidão da v12 e não devem ser implementadas aqui.

“Superar Laravel” significa vencer uma aplicação de referência equivalente em tempo até o primeiro fluxo seguro, clareza de código, consumo de recursos, falhas fechadas, cobertura adversarial e facilidade de operação. Não significa declarar superioridade universal nem comparar benchmarks, hardware ou escopos diferentes. Recursos verticais devem permanecer em módulos opcionais ou numa aplicação de referência; somente abstrações comprovadamente reutilizáveis devem entrar no Core.

Produto de referência e fronteira arquitetural

  • [~] O blueprint LMS gera as fundações de currículo, identidade, matrícula, progresso, avaliação, atividade, conquista, leaderboard e automação, além de catálogo público, cadastro/login, matrícula idempotente, entitlement de aula, progresso monotônico com histórico/correção auditada, player protegido com variantes de vídeo/áudio, legenda WebVTT obrigatória no vídeo, transcrição e idioma delimitados, e administração Nexus. O projeto materializado passa cargo test --offline --all-targets, inclusive owner/cross-user. O starter agora possui uma fronteira escolar persistida e testada nas mutações críticas, ainda deliberadamente incompleta nos demais subsistemas; os arquivos WebVTT de demonstração são locais, mas a mídia seed continua remota apenas para desenvolvimento e exige política CSP explícita. O quiz single-choice já é avaliado no servidor, inclusive com início/expiração e ordem aleatória persistidos quando temporizado. O worker possui loop supervisionado, shutdown explícito e métricas locais; conclusão é derivada do snapshot fixado e emite certificado público revogável; tarefas textuais e rubricas persistidas já têm submissão/feedback autenticados e limites do servidor. Jogos, canais externos, billing, UI de autoria e tenancy transversal não são fluxos completos.
  • Manter a aplicação oficial Rullst Academy em repositório separado, dependente somente dos pacotes publicados e sem paths do monorepo, e operá-la como consumidor real durante a RC/estável. O checkout, os artefatos e a matriz E2E da Academy não pertencem ao workspace nem aos pacotes do framework; o monorepo conserva apenas contratos reutilizáveis, scaffolds pequenos e testes de compatibilidade proporcionais.
  • [~] Manter o blueprint LMS pequeno e rápido, permitindo selecionar módulos opcionais (auth, learning, assessment, gamification, automation, realtime, billing) em vez de incorporar um produto monolítico ao Core. O CLI aceita agora --lms-modules auth, --lms-modules auth,learning ou --lms-modules auth,learning,assessment com o blueprint LMS. O primeiro gera uma fronteira de identidade com menos de 15 arquivos — usuário, sessão, login/registro, CSRF/headers, middleware e Nexus — sem modelos de curso/matrícula. O segundo gera um perfil foundation real com menos de 30 arquivos: autenticação, catálogo, matrícula, player protegido e progresso monotônico/idempotente, sem arquivos de quiz, conquista, automação ou notificação. O terceiro fica abaixo de 40 arquivos e acrescenta somente quiz, questão, opção, tentativa/resposta, endpoints owner-only e correção transacional autoritativa com regras versionadas, chave idempotente e teto de tentativas; ele não inclui score, leaderboard, conquista, outbox, automação ou notificação. Cada seleção fica registrada em rullst-lms-modules.json e os três projetos materializados passam cargo test --offline --all-targets. O starter completo continua sendo o default. Gamification, automation, realtime e billing ainda não estão desacoplados em combinações independentes; combinações não suportadas e hot reload desses perfis falham explicitamente em vez de incluir módulos silenciosamente.
  • [~] Versionar uma jornada de aceitação completa: professor publica, aluno se registra e matricula, autorização protege conteúdo, progresso é salvo, uma avaliação gera pontuação idempotente, ranking muda, conquista dispara automação e notificação, e o administrador audita o fluxo. O teste SQLite materializado já cobre publicação versionada e pin de matrícula, além do slice score → leaderboard → outbox → claim → regra rederivada → conquista transacional → redelivery idempotente → ACK, poison retry/dead-letter e correção administrativa. O mesmo teste cobre avaliação autoritativa e sua projeção transacional em ScoreEvent, leaderboard e outbox, conquista e notificação in-app entregue. O mesmo fluxo deriva conclusão apenas depois dos requisitos da versão fixada, emite certificado opaco sem PII pública, prova replay e entrega os envelopes de conclusão/revogação pelo worker. Uma continuação cobre tarefa textual → submissão owner-only → avaliação humana limitada pela rubrica persistida → feedback/notas por critério → outbox, com prazo, replay, adulteração de pontos e fronteira HTTP. A autoria agora possui handlers autenticados para draft, envio a revisão, revisão/agendamento e rollback administrativo auditado, sempre usando ator e relógio do servidor. O rollback publica uma nova revisão a partir de um snapshot histórico sem mover matrículas existentes. Registro, autoria visual no Nexus e player/quiz no navegador ainda não formam uma única jornada E2E.
  • Publicar, fora do monorepo do framework, uma implementação Laravel de referência com o mesmo domínio, dataset, frontend, banco, cache, hardware e testes para comparar DX, latência, throughput, memória, segurança e operação sem cherry-picking. Nenhuma das duas aplicações de benchmark integra o pacote ou o gate cotidiano da RC.

Domínio de aprendizagem e autoria

  • [~] Modelar organização/escola, tenant, usuário, instrutor, aluno, curso, módulo, aula, turma/coorte, matrícula e entitlement com migrations reversíveis, constraints e políticas de ownership explícitas. O starter agora gera School, membership com janela/default, vínculo único curso→escola, coorte, membership de coorte e entitlement temporal, com índices de unicidade/consulta e down migration. O middleware resolve X-School-ID somente como seletor contra memberships persistidas, vincula o tenant ao UserContext e falha fechado em membership ausente/ambígua; papéis são persistidos e consultados por escola. Curso aberto ou entitlement ativo controla matrícula. Ainda faltam provisionamento/invites, políticas de responsável, constraints FK portáveis, ciclo de entitlement pago e a aplicação Academy separada.
  • [~] Implementar progresso transacional e idempotente por aula/atividade, com retomada, percentual, histórico, correções administrativas auditadas e concorrência testada. O starter usa chave explícita de idempotência, upsert monotônico por banco, histórico append-only, correção exclusiva de admin e evento lesson_completed no mesmo commit. O teste materializado cobre replay, regressão ignorada, conclusão e correção; faltam atividade além de aula e contenção contra os três bancos reais.
  • [~] Implementar pré-requisitos, liberação gradual, datas, expiração, certificados verificáveis e conclusão derivada de regras versionadas. O starter agora exige exatamente uma política ativa versionada por aula, aplica liberação/expiração pelo relógio do servidor e valida progresso do pré-requisito no mesmo curso. Política ausente, duplicada, inconsistente ou cross-course falha fechada; o teste materializado cobre bloqueio, liberação, janela e conflito. Versões publicadas são snapshots imutáveis e matrículas criadas pelo serviço fixam a versão corrente. A conclusão agora lê uma regra v1 fechada do snapshot fixado, exige todo progresso persistido e grava evidência/certificado/outbox atomicamente; replay reutiliza o mesmo certificado. Verificação por chave opaca não expõe o aluno, e revogação exige admin, motivo, relógio do servidor e chave idempotente. O teste cobre incompletude, cross-user, replay, verificação, revogação conflitante e entrega. Ainda faltam servir todo conteúdo pelo snapshot, regras mais ricas e contenção nos três bancos reais.
  • [~] Implementar questionários, banco de questões, tentativas, limites de tempo, embaralhamento, rubricas, tarefas, submissões e feedback sem confiar em resultados calculados apenas no navegador. O starter persiste quiz, questões, opções, tentativas e respostas; autoriza o aluno matriculado, calcula a nota pela chave do servidor, limita tentativas, vincula replay a quiz/aluno/ruleset e grava tentativa, respostas, ScoreEvent, atualização do leaderboard, score_recorded e quiz_graded no mesmo commit. O teste rejeita cross-user e opção inexistente e comprova as contagens/replay da projeção. Quizzes temporizados exigem início persistido no relógio do servidor; replay não estende o prazo, tentativa iniciada consome o limite, e submissão ausente ou expirada falha fechada. O início temporizado persiste uma ordem de questões/opções derivada de seed aleatório do servidor e vinculada ao ruleset; replay devolve a mesma ordem e alteração silenciosa de IDs falha no grading. Rotas autenticadas de início e submissão derivam quiz/aluno da path/sessão e nunca aceitam pontos do cliente. O starter também persiste tarefas, critérios de rubrica, submissões, avaliações e notas por critério. A submissão exige o owner matriculado, prazo/tentativas do servidor e chave idempotente; a avaliação exige evaluator/instructor/admin distinto do aluno, cobre exatamente os critérios persistidos, rejeita pontos acima do máximo, guarda feedback e vincula replay ao request canônico. Submissão e avaliação emitem outbox na mesma transação. Correções administrativas são append-only: preservam a nota original, revalidam a mesma rubrica, registram before/after, motivo, ator, relógio, request canônico e outbox, e effective_grade retorna a correção mais recente. O teste materializado cobre prazo, cross-user, replay/conflito, nota impossível, negação de evaluator na correção, HTTP e evidência rubricada. Ainda faltam anexos, autoria visual, UI e contenção multi-banco.
  • [~] Implementar rascunho, revisão, publicação, agendamento e versionamento de conteúdo sem alterar silenciosamente a experiência de alunos já matriculados. O starter fornece snapshots CourseVersion append-only, transições draft → review → scheduled/published, revisor admin distinto do autor, arquivamento atômico da versão anterior, course_published transacional e pin imutável da versão na matrícula. O teste prova pin antes/depois da publicação e entrega FIFO dos eventos. Handlers autenticados expõem draft, submissão e revisão/agendamento, derivando ator e relógio no servidor, e o teste materializado percorre essa fronteira até published. Um loop supervisionado agora ativa versões vencidas em lotes limitados sob lease compartilhada, renova/libera o token exato, preserva o revisor independente, emite o ator da ativação e expõe shutdown e contadores locais. O teste SQLite prova espera sob contenção, ativação no relógio do servidor e replay sem nova publicação. Rollback administrativo exige motivo e chave idempotente, cria uma nova revisão imutável a partir de uma versão histórica, arquiva a versão corrente e grava auditoria/outbox na mesma transação. Replay exato não duplica; pins já existentes permanecem na versão anterior e novas matrículas recebem a revisão restaurada. O teste cobre negação de instrutor, conflito de chave, fronteira HTTP e evidência durável. Ainda faltam autoria visual no Nexus, snapshot relacional completo de módulos/aulas/avaliações, métricas exportadas/alertas e contenção nos bancos reais.
  • [~] Entregar busca, filtros, navegação por teclado, contraste, legendas, transcrições, localização e critérios WCAG testados na aplicação de referência. Os perfis LMS completo, auth,learning e auth,learning,assessment agora geram catálogo SSR com busca de título e categoria parametrizadas pelo ORM, entrada limitada, ordenação e limite de resultados. O shell remove fontes/scripts/imagens externas, consome o CspNonce da baseline, não usa estilos inline ou HTMX remoto e inclui skip link, landmarks, foco visível, layout responsivo, contraste explícito e redução de movimento; aula e autenticação também recebem o nonce, e o player não inicia mídia automaticamente. O modelo de aula distingue vídeo/áudio; o renderer aceita somente HTTPS ou path absoluto same-origin, exige track WebVTT em vídeos e uma transcrição delimitada para ambos. A regressão materializada cobre filtro, valor com formato de SQL injection, limite, escaping de HTML, identidade do nonce, vídeo/áudio e rejeição de source, idioma, legenda ou transcrição inválidos. Ainda faltam busca textual avançada, localização do catálogo, revisão humana da qualidade de legendas/transcrições, testes automatizados WCAG/browser/teclado e a aplicação de referência externa operada com usuários reais.
  • [~] Implementar mídia remota real com S3/R2, uploads multipart limitados, allowlist de tipos, URLs assinadas, CDN e processamento assíncrono. Core agora fornece o contrato reutilizável de admissão/quarentena com limite rígido, allowlist, assinatura real versus MIME/extensão, chave aleatória por tenant, digest SHA-256 e liberação somente após verdict limpo. Ainda não existem streaming multipart, driver S3/R2, URL assinada, CDN, transcode ou pipeline assíncrono; o storage local continua apropriado apenas para desenvolvimento e instalações simples.

Jogos, gamificação e ranking confiável

  • [~] Definir um contrato de atividades/jogos com estado, versão, tentativa, regras, resultado e evidência de conclusão; começar por quizzes e minigames assíncronos antes de prometer multiplayer de baixa latência. O scaffold gera ActivityAttempt/ActivityResult v1 para quiz, exercício e jogo, vinculando owner, activity, attempt, ruleset, ordem temporal, estado limitado, score e digest SHA-256 de evidência. evaluate_activity usa dispatch estático e não recebe pontos do cliente: um ActivityEvaluator confiável transforma apenas a submissão em outcome e o contrato constrói o resultado. O primeiro SingleChoiceEvaluator cobre exercício correto/incorreto; o MatchingEvaluator exige uma permutação completa de até oito pares, normaliza sua ordem e calcula pontuação parcial a partir do mapa do servidor; e o TypedAnswerEvaluator compara um conjunto fechado após trim/lowercase Unicode opcional, limita a entrada a 512 bytes sem controles e persiste somente um digest SHA-256 ligado à política. Ele não promete NFC, tolerância de acento ou fuzzy matching. A regressão materializada prova owner, kind, JSON, relógio, limites e rejeições. No starter completo, record_activity_result aceita somente o resultado validado opaco, rederiva curso, kind, máximo, ruleset, temporada e digest da atividade persistida e grava ScoreEvent v2, leaderboard e score_recorded na mesma transação. A mesma transação agora conserva a tentativa/resultados delimitados e exige replay exato, revalidando sob lock a configuração exata usada pelo avaliador. POST /activities/{id}/attempts aceita apenas chave idempotente/opção e POST /activities/{id}/attempts/matching apenas a chave e IDs dos pares; ambos se somam a /activities/{id}/attempts/typed, que recebe texto delimitado sem retê-lo em claro. Todos derivam aluno/activity do contexto/path e mantêm respostas, pontos, ruleset, digest e relógio no servidor. A regressão rejeita ator, digest, IDs duplicados ou retry divergente e prova owner/cross-user no boundary HTTP. O estado retido continua sujeito à política de privacidade da aplicação. O avaliador de quiz persistido permanece separado; ainda faltam listening e jogos.
  • Tornar explícita a fronteira do cliente para jogos: o scaffold gera ActivityClientManifest, cujo default ssr_htmx não aceita bundle e cujo opt-in canvas_wasm exige paths same-origin, artefato .wasm, SHA-256 canônico e tamanho máximo de 16 MiB. Ambos continuam subordinados à validação autoritativa do resultado no servidor; nenhum bundle pesado é dependência do LMS padrão.
  • [~] Criar ScoreEvent autenticado, versionado e idempotente, com origem, tentativa, regra, pontos, timestamp e chave de deduplicação. O scaffold deriva o ator de UserContext, autoriza owner/admin, valida schema, origem, IDs, chaves e limites server-side, grava o evento append-only e atualiza a fonte de verdade do leaderboard na mesma transação. O avaliador autoritativo de quiz agora cria um ScoreEvent v2 por tentativa e a mesma projeção transacional, sem aceitar pontos do cliente. O exercício single-choice também chega a essa projeção somente por um ValidatedActivityResult não construível pelo chamador; a ponte revalida a política persistida e vincula o digest canônico. Índices únicos tornam replay exato de evento/tentativa no-op e um retry com outra opção/pareamento falha fechado. Os endpoints autoritativos de quiz, single-choice, matching e typed answer já existem; ainda faltam endpoint/recomputadores para jogo/listening e testes de concorrência contra os três bancos reais.
  • [~] Fornecer revisão espaçada durável sem transformar heurística em alegação pedagógica. Atividades podem habilitar a política versionada rullst-box-v1: na entrada de um score autoritativo novo, a mesma transação trava e valida política/estado, calcula uma transição determinística de aprovação ou lapso e grava o próximo vencimento. Replay exato retorna antes da transição e não avança a agenda. GET /reviews/due deriva usuário e tempo no servidor, limita a fila a 50 e revalida escola, escopo do curso e matrícula ativa. A regressão SQLite materializada cobre single-choice, matching, typed, persistência, ordenação futura, replay e cross-user. Ainda faltam UX visual, migração/experimentação de algoritmos, integração completa ao ciclo de privacidade, listening/speech e contenção PostgreSQL/MySQL; não alegamos compatibilidade FSRS/SM-2, eficácia ou personalização por IA.
  • [~] Implementar leaderboard com fonte de verdade no banco, temporadas, escopos, desempate determinístico, correção auditada e cache Redis opcional reconstruível. O scaffold atualiza a tabela autoritativa somente quando um ScoreEvent novo entra na transação e consulta curso/temporada com limite 100 e ordem total score DESC, updated_at ASC, user_id ASC. Uma projeção local reconstruível usa TenantCache, valida o escopo do payload e é invalidada depois de score, quiz e correção; o banco continua autoritativo. Correções exigem admin, motivo e ruleset, têm chave idempotente e gravam ator/before/after na mesma transação. Mutações de score/correção e a leitura do ranking validam o school scope autenticado, com negação materializada para escola estrangeira; ainda faltam Redis distribuído/failover e testes nos bancos reais.
  • [~] Implementar XP, níveis, badges, conquistas, streaks, desafios e recompensas por regras versionadas, evitando incentivos manipuláveis ou inacessíveis. O starter agora aplica award_achievement a partir de uma regra v1 e de um outbox claimado, com unicidade learner/achievement, ator/evento registrados e execução idempotente na mesma transação. XP acumulado, níveis, streaks, desafios, recompensas, acessibilidade e políticas antifarming continuam abertos.
  • [~] Criar testes de replay, concorrência, adulteração, relógio, pontuação impossível, automação duplicada e abuso de múltiplas contas antes de anunciar ranking competitivo ou premiação. As regressões geradas já cobrem replay de score/correção/outbox, owner cross-user, schema futuro, pontuação impossível, chaves idempotentes, perda de ACK/redelivery sem conquista duplicada e poison-event dead-letter. Ainda faltam contenção real nos três bancos, relógio adversarial e cenários de farming/múltiplas contas.
  • Tratar multiplayer em tempo real como capability separada: autenticação de canal, servidor autoritativo, presença distribuída, reconexão, ordenação, backpressure e testes de carga são obrigatórios antes de suporte público.

Automações, eventos e notificações

  • [~] Core já possui scheduler e filas SQLite/Redis com leases, retry e dead-letter, e Mail oferece entrega em background. Falta uni-los numa jornada de domínio LMS com semântica operacional documentada; o starter fornece iteração DB claim→plan→execute→ACK/fail e um loop supervisionado com shutdown, métricas locais e entrega in-app com projeção realtime local tenant-scoped. A publicação agendada também possui loop supervisionado próprio, com lote limitado e liderança por lease exata. Integração com Mail/push, realtime distribuído e telemetria operacional permanece aberta.
  • [~] Criar eventos de domínio e transactional outbox para que conclusão, pontuação, conquista, matrícula e publicação não sejam perdidas entre o commit do banco e a fila; handlers devem assumir entrega ao menos uma vez. A gravação de ScoreEvent agora inclui um score_recorded v2 estrito no academy_outbox dentro da mesma transação; chave única impede duplicação no replay, seu digest liga a evidência à política persistida e Nexus expõe o estado somente leitura. Progresso concluído também grava lesson_completed transacionalmente. O serviço gerado usa lease limitado, vincula ACK/falha à claim exata, agenda backoff limitado, recupera claim expirada, rejeita token obsoleto, incrementa tentativas e move para dead_letter no limite; o teste SQLite materializado cobre esses estados. Matrícula, conquista, publicação, rollback editorial, submissão/avaliação/correção de tarefa, conclusão e revogação de certificado também emitem eventos no mesmo commit, e o worker valida/entrega esses envelopes versionados, inclusive lesson_completed. Cada evento carrega school_id; eventos derivados, regras, execuções e conquistas preservam o escopo, e uma regra fixture de outra escola não reage ao evento. Faltam transporte externo, eventos de alterações editoriais intermediárias e telemetria durável.
  • [~] Criar regras de automação trigger/condition/action com schema, versão, dry-run, limites, idempotência, autorização, audit trail e aprovação humana para ações destrutivas ou financeiras. O starter agora transforma o outbox score_recorded v2 e regras v1 estritas em planos puros, ordenados e com execution_key determinística, aceitando somente award_achievement e falhando em campos, versões, scores ou ações desconhecidas. Um threshold global válido acima do máximo de uma atividade agora produz zero ações, sem envenenar o evento. O executor exige a claim exata, busca somente regras da escola do evento, rederiva o plano atual e grava execução/conquista no mesmo school_id; redelivery vira no-op. Ainda faltam transporte, backoff/reaper de claims, auditoria externa e envelopes de autorização/aprovação para novas ações. Lease, backoff e recuperação de claim abandonada pertencem ao outbox. O loop supervisionado usa configuração validada, tokens de claim únicos, shutdown aguardável, aborto seguro no drop e contadores locais; ainda faltam exportação de métricas/alertas, transporte e prova de contenção multi-instância nos três bancos.
  • [~] Unificar notificações in-app/database, realtime, e-mail e push sob um contrato por usuário/tenant, com preferências, localização, opt-out, retry e estado de leitura. O starter emite achievement_awarded no mesmo commit da conquista e o worker cria uma notificação in-app idempotente a partir da claim exata, com chave de localização, locale/preferência, estado unread/suppressed/read e leitura owner/admin. Rotas autenticadas oferecem listagem filtrada/paginada, leitura idempotente e preferência/locale/opt-out, sempre derivando o sujeito da sessão. Tabelas, consultas e preferências levam school_id; o teste materializado prova que o mesmo usuário em duas escolas não observa a notificação alheia e mantém preferências independentes. Uma assinatura autenticada usa TenantRealtime; após o commit de uma notificação nova e não suprimida, o processo publica um envelope limitado na sala do tenant/usuário, e a jornada materializada valida o recebimento. O banco continua fonte de verdade; o broadcast é uma projeção best-effort local. O evento de conquista usa um catálogo fechado/versionado com renderização em português, espanhol e inglês, fallback determinístico para inglês e texto projetado tanto na listagem quanto no realtime; payload ou chave desconhecida falha explicitamente. Ainda faltam catálogos para os demais eventos, transporte realtime distribuído/replay, Mail, push e operação.
  • [~] Impedir execução duplicada do scheduler em múltiplas instâncias por lock distribuído/lease, e expor atraso, falha, retry e dead-letter no Studio. O starter agora fornece lease compartilhada no banco com chave/holder/token, expiração, renovação e liberação compare-and-set; o teste bloqueia concorrente, rejeita token obsoleto e permite takeover somente após expirar. O snapshot é consultável/Nexus readonly. O scheduler de publicação usa essa lease em cada ciclo, renova antes de toda mutação, falha fechado se perder liderança, limita lote e oferece shutdown aguardável, abort seguro e contadores locais; o teste materializado prova standby sob contenção, ativação única e replay vazio. Ainda faltam Studio, métricas/alertas exportados e contenção PostgreSQL/MySQL.

Segurança nativa específica para educação e jogos

  • [~] Rullst já oferece sessões criptografadas, RBAC/ownership, CSRF, headers, WAF/RASP/DLP, Login Jail, guardas de AI e telemetria versionada. Isso é uma fundação de defesa em profundidade, não prova a segurança do domínio LMS.
  • Criar threat model versionado para aluno, professor, moderador, escola, conteúdo, avaliação, ranking, automação, pagamento e administração: o TM-ACADEMY-1 em TM-12.10 registra 12 abuse cases, evidência atual, mínimos negativos e riscos residuais sem promover fundações a garantias de produto.
  • [~] Exigir entitlement e ownership em toda rota de curso, aula, tentativa, progresso, submissão, certificado e mídia. O starter protege matrícula, player, progresso, início e submissão de quiz com identidade de sessão, enrollment ativo e RbacGuard; quiz/aluno são derivados da path/sessão e o teste materializado nega contexto cross-user. A rota de conclusão deriva o sujeito da sessão e da matrícula/version pin, a verificação pública aceita somente chave opaca e não serializa identidade do aluno, e revogação exige admin. A fronteira escolar persistida agora abrange matrícula, aula/progresso, score/correção, submissão/avaliação, conclusão/revogação, autoria/rollback, scheduler e papéis; o teste materializado nega um admin de outra escola na fronteira HTTP e nos serviços antes de efeitos. Ainda faltam mídia real e a enumeração independente de toda rota da aplicação separada.
  • [~] Provar isolamento multi-tenant também no banco, cache, filas, realtime, arquivos, buscas, métricas, exports e Nexus; prefixos sem testes de não-interferência não constituem isolamento. O scaffold agora prova em SQLite que escola vem de membership autenticada, seleção arbitrária/ambígua falha, IDs de curso/aula não atravessam a escola, entitlement é school-scoped e um admin estrangeiro não causa efeitos em matrícula, autoria, rollback, avaliação, score, certificado, scheduler ou revogação de papel. A prova é Outbox, regras/execuções de automação, conquistas derivadas e notificações agora preservam school_id, inclusive para o mesmo usuário em duas escolas e com uma regra estrangeira habilitada. A prova continua deliberadamente parcial: Core possui wrappers de storage, cache, realtime e presence imutavelmente ligados a TenantContext, com provas da mesma chave/canal entre dois tenants, sem flush global no wrapper de cache e com nomes/payload realtime limitados. O leaderboard Academy usa agora esse cache tenant-scoped como projeção reconstruível, valida o payload e invalida após score, quiz e correção; a regressão materializada prova cache/invalidations. Anexos/mídia, demais caches, autorização de salas além da assinatura de notificação owner/admin e realtime distribuído, cache distribuído, bucket remoto, busca, métricas, exports, Nexus e PostgreSQL/MySQL continuam sem claim integral.
  • [~] Criar papéis e separação de deveres para owner da escola, administrador, instrutor, avaliador, moderador, suporte, responsável e aluno, com elevação temporária auditada e nenhuma mutação autônoma por AI. O starter agora gera assignments duráveis para os oito papéis, registra grantor, motivo e janela, exige expiração para suporte, reserva grants de owner/admin ao owner da escola sem autoelevação, vincula replay à requisição exata e reconstrói no middleware apenas papéis ativos. Endpoints autenticados vinculam o alvo à path e oferecem grant/revoke; revogação usa chave própria, compare-and-set e preserva ator, motivo e instante, com replay exato como no-op. O teste materializado cobre o ciclo HTTP, expiração, revogação, replay conflitante e nega que admin conceda ou revogue papel privilegiado. Assignments e consultas agora carregam school_id, e revogação de outra escola retorna not-found. Ainda faltam cerimônia de step-up, trilha externa compartilhada e ferramentas AI limitadas por esse contexto.
  • [~] Proteger uploads e conteúdo ativo com tamanho/tipo reais, nome de arquivo, parsing isolado, quarentena e adapter de malware scanning. O contrato UploadPolicy valida tenant/nome/tamanho, compara MIME e extensão com assinaturas reconhecidas, rejeita texto ativo, gera chave de quarentena aleatória e tenant-scoped, vincula SHA-256 e falha fechado sem verdict limpo do UploadScanner; o scanner offline é explicitamente apenas um mock determinístico. Ainda faltam streaming multipart, persistência/movimentação remota, parsers/transcoding em sandbox, scanner de produção e políticas profundas separadas para SVG, HTML, mídia, arquivos compactados e documentos.
  • [~] Implementar privacidade por design para menores e adultos: o scaffold agora persiste age_band em vez de data de nascimento, política de retenção versionada e school-scoped, consentimento de responsável por finalidade com revogação e pedidos idempotentes de exportação/exclusão. Uma varredura administrativa limitada e school-scoped marca políticas vencidas por CAS e agenda pedidos duráveis/idempotentes de exclusão, sem apagar dados silenciosamente. O protocolo de fulfillment school-scoped fornece claim com lease, recuperação de abandono, token exato, retry atrasado, limite/dead-letter e finalização vinculada a ator e digest SHA-256 do resultado. Um executor supervisionado de dispatch estático aplica timeout menor que a lease, shutdown explícito e métricas locais sobre um adapter de fulfillment pertencente ao produto; o mock determinístico é explicitamente apenas protocolo e nunca exporta, exclui ou anonimiza dados. A regressão SQLite falha fechado para menor sem consentimento/depois da revogação, nega responsável de outra escola, prova não interferência da varredura/worker entre escolas, replay sem duplicação, lease expirada, token obsoleto, retry e dead-letter; claims abandonadas no teto rígido de dez tentativas são movidas por CAS para dead-letter em vez de serem recuperadas indefinidamente, e também percorre sucesso supervisionado e falha de adapter até dead-letter. Ainda faltam implementar no produto o adapter que executa export/delete/anonymize em todas as tabelas, comprovar identidade do responsável, observabilidade sem PII e revisão legal do produto/deploy; conformidade nunca será inferida apenas do framework.
  • [~] Implementar rate limit/abuse control distribuído por identidade e origem, revogação de sessão/dispositivo, MFA com recovery codes e trilha durável para ações administrativas e alterações de nota/pontuação. O adapter Redis atômico aceita chaves derivadas de identidade/origem sem armazená-las em claro, e as correções de score do starter são append-only; o contrato live prova duas instâncias do limiter contra Redis real. Ainda faltam a composição HTTP Academy, revogação/dispositivos, persistência transacional dos recovery codes, cluster/failover e auditoria durável compartilhada.
  • Publicar um ProductionPreset::academy() fail-closed e um diagnóstico CLI que reporte PASS, FAIL, SKIPPED ou NOT_EVALUATED para as fronteiras verificáveis, sem emitir certificação ou nota de segurança fabricada. O preset tipado rejeita requisitos ausentes/duplicados/não aprovados; cargo rullst academy:doctor normaliza as 12 fronteiras, exige evidência declarada não vazia para PASS, suporta JSON e termina com erro enquanto o contrato não estiver integralmente satisfeito, sempre com certification: false.
  • Submeter a aplicação Academy e suas integrações críticas a revisão externa, corrigir achados e publicar versão, escopo, metodologia e limitações antes de usar alegações comparativas de segurança.

DX, operação e prova de superioridade vertical

  • Adicionar scaffolds coerentes para curso/módulo/aula, matrícula, quiz, atividade, conquista, leaderboard, automação, conclusão e certificado. Os modelos, migrations, constraints/índices, registros Nexus e repositories opcionais são gerados; o projeto LMS materializado passa cargo test --offline --all-targets, com pontuação derivada somente leitura no admin. Fluxos verticais completos e a prova sobre pacotes publicados permanecem itens separados deste programa.
  • Evoluir Nexus para autoria educacional: ordenação de módulos/aulas, preview, revisão, publicação, coortes, matrículas, rubricas, moderação e visão de progresso, sempre com políticas de campo/ação no servidor.
  • [~] Fornecer fixtures offline determinísticas e um seed Academy divertido que exercite toda a jornada sem credenciais externas nem dados apresentados como produção real. As migrations agora semeiam módulo, quiz, o jogo offline Borrow Checker Rescue, conquista e regra de automação com JSON versionado, sem a função datetime() específica de SQLite. Ainda faltam usuário/sessão, tentativas, pontuação/entrega e mídia local para uma jornada E2E completa.
  • Criar E2E de navegador para aluno, professor e administrador, incluindo acessibilidade, perda de conexão, retries, concorrência e todos os casos negativos definidos pelo threat model.
  • Operar a referência com PostgreSQL/MySQL/SQLite conforme suporte declarado, Redis opcional, backup/restore, migrations, rotação de segredo, deploy e rollback ensaiados; publicar limites e combinações realmente verificadas.
  • Medir tempo até primeiro curso seguro, primeiro quiz, primeiro ranking e primeiro diagnóstico com usuários novos, além de benchmarks reproduzíveis e perfis de CPU/memória; resultados devem incluir falhas e custo operacional.
  • Documentar uma trilha única “zero ao LMS em produção”, receitas de extensão, escape hatches Axum/Tokio e migrações SemVer, mantendo exemplos compilados e links válidos como gates de release.

O que significa “10/10”

Nota 10 não significa ter todos os recursos imagináveis. Significa ser excepcional dentro de uma fronteira declarada:

  • Segurança: defaults fortes, limites explícitos, threat models, testes adversariais e revisão externa.
  • IA: integração útil com autorização, evals, observabilidade e controle humano.
  • Experiência: primeiro sucesso rápido, erros acionáveis, blueprints que compilam e uma rota clara de desenvolvimento para produção.
  • Release: artefatos reproduzíveis, proveniência, SemVer e documentação honesta.
  • Confiança real: aplicações independentes operadas, atualizadas e recuperadas com sucesso.
  • Validação externa futura: uma Academy independente poderá demonstrar a jornada segura de aluno, professor e administrador usando somente APIs e pacotes públicos, sem se tornar condição de qualidade ou lançamento da v12.

O caminho mais curto para tornar o Rullst extraordinário agora não é acrescentar mais uma promessa: é tornar cada fronteira já escolhida previsível, comprovável e agradável de usar.

Auditoria dos roadmaps anteriores ao gpt.md

Esta seção registra a classificação solicitada para todos os roadmaps que existiam imediatamente antes da criação de gpt.md. Ela impede que uma caixa histórica marcada como concluída volte a ser interpretada como prova de uma capacidade end-to-end ou como obrigação de acrescentar escopo à v12 RC.

Corte histórico, método e regra de decisão

  • O gpt.md foi criado no commit ecf3ecb6; a fotografia imediatamente anterior e imutável é 96222fbd, de 24 de agosto de 2026.
  • Nessa fotografia existiam 12 arquivos chamados ROADMAP.md ou roadmap.md: um roadmap mestre, uma cópia divergente no mdBook e dez roadmaps de crates.
  • Usando o ROADMAP.md da raiz como cópia canônica, havia 226 caixas [x] e 88 caixas abertas. Várias caixas agregavam muitas capacidades diferentes; a contagem não representa 226 implementações comprovadas.
  • Das 226 linhas marcadas, 36 são repetições textualmente idênticas dentro do roadmap do ORM. A auditoria preserva as 226 linhas históricas para não apagar o registro, mas usa também 190 alegações exatas deduplicadas para que uma cópia documental não conte duas vezes como engenharia entregue.
  • A classificação abaixo foi feita contra código, testes e a SST atuais. Um nome de módulo, trait, scaffold, mock ou teste unitário isolado não basta para promover a alegação inteira a implementada.
  • A evidência e os limites de maior risco permanecem no capability ledger; a preservação do texto original e os links para a fotografia histórica estão em Preservação da documentação anterior ao gpt.md.

As decisões de release usadas nesta seção são:

  • v12 obrigatória: superfície que a v12 pretende suportar sem o rótulo experimental. Precisa de implementação delimitada, teste negativo, docs honestas e todos os gates da release.
  • v12 experimental: fundação útil que pode permanecer apenas atrás de uma feature, simulador ou aviso explícito, desabilitada por padrão quando houver risco. Não bloqueia a RC e não recebe promessa de produção.
  • v13+: trabalho valioso, porém grande, dependente de novo contrato, infraestrutura, hardware, provedor ou mudança arquitetural. Não deve ampliar o escopo da v12 RC.
  • não recomendar/prometer: a redação absoluta ou a automação autônoma não é um contrato tecnicamente honesto. Quando existir um núcleo útil, ele deve ser substituído por uma meta menor, mensurável e revisável.

Inventário documental anterior ao gpt.md

Roadmap histórico[x]Alegações exatas únicasAbertosLeitura auditada atual
ROADMAP.md242411Tracker mestre; cada milestone M1–M32 é reclassificado abaixo.
docs/src/roadmap.md259Era uma segunda cópia divergente; hoje apenas incorpora o roadmap mestre. Não é contado novamente nos totais.
rullst-ai/ROADMAP.md773Cliente/providers e guardrails têm fundações reais; várias garantias end-to-end eram mais amplas que o código.
rullst-auth/ROADMAP.md223RBAC/Gates têm base real; a maturidade de sessões, JWT, TOTP e WebAuthn precisa ser avaliada separadamente.
rullst-capital/ROADMAP.md13133Billing possui adapters e mocks delimitados; cobertura uniforme e NFS-e live não estavam concluídas.
rullst-connect/ROADMAP.md23230OAuth/OIDC era substancial; conveniências avançadas e mensageria não eram todas implementadas apesar de não haver caixa aberta.
rullst-iot/ROADMAP.md15159Frames/helpers existiam; transporte, hardware e OTA end-to-end eram simulados ou ausentes.
rullst-mail/ROADMAP.md181833Transports e pipeline tinham base real; deliverability/IA/observabilidade avançadas continuavam roadmap.
rullst-nexus/ROADMAP.md442CRUD existia, mas a fronteira administrativa histórica precisava ser tornada fail-closed.
rullst-orm/ROADMAP.md81457Era o documento mais supermarcado; 36 linhas eram repetições textuais e várias capacidades eram apenas helpers/fundações.
rullst-security/ROADMAP.md323215Controles úteis existiam, porém “zero”, “A+”, certificação, SIEM live e inteligência autônoma não estavam provados.
rullst-studio/ROADMAP.md772Algumas telas existiam; telemetria hardcoded e integrações ausentes não podiam ser chamadas de live.

Reclassificação integral do roadmap mestre M1–M32

Quando um milestone histórico misturava uma base real com uma visão futura, a decisão é deliberadamente dividida. Isso é mais preciso que trocar apenas [x] por [ ].

IDEstado verificável atualDecisão para a v12 RC e depois dela
M1 CLI e generatorsParcial. Comandos e os blueprints principais existem e a distribuição empacotada compila os seis starters; isso não prova toda combinação de flags e generators.v12 obrigatória para a matriz principal e regressões de segurança; cauda combinatória fica para v13+.
M2 linkers/build sub-100 msParcial e dependente do ambiente. Configurações de linker/build existem; tempo universal não é comprovável.Otimização e benchmark são contínuos; não prometer “sub-100 ms” sem máquina, cenário e resultado reproduzível.
M3 escape hatches/features/zero lock-inParcial. Axum/Tower, Core runtime-only e features granulares são reais; migração sem custo universal não é.Fronteiras e testes de features são v12 obrigatória; não prometer zero lock-in absoluto.
M4 make:resource e IgnitionImplementado em escopo delimitado. Scaffold e console local existem.v12 obrigatória no escopo documentado; qualquer autofix autônomo é experimental e exige preview/rollback.
M5 docs/OpenAPI/SDK TypeScriptParcial. mdBook e generators existem; inferência AST não é um contrato completo de API.Documentação copiável é v12 obrigatória; SDK heurístico é v12 experimental; schema tipado canônico fica para v13+.
M6 Active Record/Repository/seeders/TursoParcial. O ORM SQLx continua sendo a superfície relacional ampla. Turso/libSQL agora possui perfil primary delimitado para o starter blank/API: #[derive(Orm)] #[orm(backend = "turso")], CRUD/query tipados, migrations reversíveis com drift detection, generators e provas local/remota. Relações, hooks, auto-diff/seeds, demais blueprints e replica sync transparente não têm paridade.ORM SQLx suportado, adapters explícitos e o perfil Turso-primary delimitado são v12 obrigatória. Paridade Turso adicional e replicação vendor-specific permanecem trabalho posterior, sem bloquear a RC nem serem inferidas do derive comum.
M7 edge/Wasm/dados distribuídos/upgrade autônomoParcial. Runtime portátil tem base e cargo rullst upgrade hoje é transacional e assistido; replicação distribuída e operação autônoma continuam ausentes.Upgrade assistido e com rollback é v12 obrigatória; edge é experimental; replicação é v13+; atualização sem aprovação é não recomendada.
M8 modelagem por intenção/índices auto-otimizadosNão implementado end-to-end.Um advisor read-only pode ser v13+; DDL autônomo em produção é não recomendado.
M9 auth/OAuth/TOTP/passkeys/WebAuthnParcial. Sessões, RBAC/OAuth, JWT opt-in, TOTP/recovery e cerimônias WebAuthn possuem fundações de maturidade diferente. SQLite agora fornece revogação JWT e lifecycle/CAS bounded de passkeys compartilhados localmente; conformance WebAuthn completa não foi provada.Sessão/RBAC e contratos estáveis são v12 obrigatória; WebAuthn permanece experimental/parcial até conformance. Challenge compartilhado, inventário completo de cookie/refresh sessions e fluxos de produto ficam em v13+.
M10 Mail/DTO/rate limit/ShieldParcial. Transports, validação e controles locais existem; invariantes distribuídas e cobertura uniforme não.Superfície declarada é v12 obrigatória; adapters/controles sem backend real são experimentais ou v13+.
M11 Nexus/Omni/billing/entitlementsParcial. Nexus fail-closed e billing delimitado são reais. Omni gera deterministicamente um shell web-first com Tauri pinado, identidade/URL validadas, CSP por origem, navegação nativa exact-origin, ausência de IPC remoto, ícones reais, lifecycle desktop fail-closed e bootstrap inicial offline/retry. Gates desktop Linux/macOS/Windows, Android APK e iOS simulator passaram em 755fbd61933bed04369e0eb5de50b11275db5e3d. O perfil opt-in offline-sync acrescenta estado/conflito/resync criptográfico delimitado, mas ainda sem platform store/secure key/network orchestration; nada disso prova aparelho, assinatura, privacidade, offline-first ou publicação. Cobertura uniforme e entitlements declarativos completos não existem.Segurança de Nexus e billing anunciado são v12 obrigatória; o shell Omni delimitado permanece experimental na v12. Capacidades platform-enhanced entram somente conforme o programa 3.1 obtiver contratos e evidência; device/store e entitlements amplos não podem ser prometidos por calendário.
M12 suíte de segurança autônomaParcial. Há controles reais e testados, mas não cobertura OWASP universal, zero leakage, reputação externa, SIEM durável ou certificação.Controles delimitados e defaults são v12 obrigatória; sinks/estado distribuído ficam em v13+; absolutos e certificação automática são não recomendados.
M13 PQC e sandbox WasmNão implementado. Simuladores não são criptografia de produção.v13+ pesquisa, somente com protocolo e primitives auditadas; criptografia caseira é não recomendada.
M14 HTMX/Leptos/DioxusParcial. SSR/HTMX é real; adapters são wrappers, não integrações E2E completas.SSR/HTMX é v12 obrigatória; adapters ficam experimentais até testes de interoperabilidade; “zero bundle” universal é não recomendado.
M15 queues/cache/scheduler/Docker/mensageriaParcial. Memory/SQLite/Redis de Core, cache, scheduler e scaffold Docker existem. A crate separada rullst-messaging acrescenta envelope v1 delimitado, idempotência por tópico, grupos, leases de ACK descartáveis, retry/DLQ, purge explícito, relógio injetável, broker determinístico, codec canônico de envelope, trace context allowlisted e persistência SQLite local de schema fixo. SQLite pode escolher imutavelmente plaintext ou proteção AES-256-GCM de headers/payload, com AAD por linha e keyring de rotação; restart, raw-state, chave errada, tamper, row-swap, symlink e disputa entre instâncias têm provas. O codec não é transporte; replicação/failover e RabbitMQ/Kafka/Redis Streams/NATS/Pulsar/clouds não existem.Os backends declarados e a fundação local durável de mensageria são v12 obrigatória; brokers remotos ficam após a fundação, com matriz de restart/falhas própria.
M16 Wasm islands/client_componentParcial no pilar amplo. #[server_function] agora possui transporte delimitado integral: RpcResult<T>, envelope rullst.client v1, argumentos/resultados Serde owned, rota Axum explícita correspondente, caller Wasm, 256 KiB, correlação, erros redigidos, diagnósticos, CSRF de produção e matrizes native/Wasm/scaffold. Hydration de islands, browser E2E real, reconnect e ABI estável continuam incompletos.O transporte RPC delimitado é v12 implementado; islands/hydration permanecem experimentais, e interoperabilidade ampla fica em v13+.
M17 realtime/storage/media/package registryParcial. WebSocket/SSE e storage local delimitado existem; S3/R2, media pipeline e registry de produção não.Fundações locais são v12 obrigatória; drivers remotos/media são v13+ em crates opcionais.
M18 LiveView-style UIParcial. Loop de componente existe; auth, reconnect, backpressure, diffs e browser E2E estão incompletos.v12 experimental, não bloqueia RC; contrato estável fica para v13+.
M19 Radar/tools/spans/PrometheusImplementado em escopo delimitado. Telemetria local/export surfaces existem e fontes ausentes permanecem indisponíveis.v12 obrigatória dentro do contrato local; waterfall distribuída é item separado de v13+.
M20 event streaming/ledger imutávelNão implementado. HMAC audit chain local não é ledger distribuído.v13+ pesquisa, depois de definir persistência, consistência e recovery; não é escopo da RC.
M21 Omni/mobile hypermediaParcial com empacotamento seguro, wire contract v1 e fundação offline delimitados. O shell web-first passou seus gates de compilação; rullst.client v1 fornece envelopes tipados/bounded compartilháveis com Wasm; offline-sync nativo fornece estado account-bound, fila idempotente, revisão/cursor, conflito/resync/recovery/erasure lógico, snapshots AES-256-GCM e coordinator foreground bounded/timeout/cursor-checked sobre transport estático. Ainda não existem adapter Keychain/Keystore/persistência/browser, HTTP/retry/background concreto, opener/deep-link, push/biometria, cliente educacional de referência ou validação de loja/aparelho.O programa experimental começou na v12 com fronteiras e protocolos reais. Offline só será chamado completo após adapters, integração e testes de referência; universalidade sem evidência permanece não recomendada e a cauda segue para v13.
M22 Agentic DevOpsParcial apenas como recomendações/telemetria.Advisor/dry-run pode ser v12 experimental; mutação autônoma de infraestrutura é não recomendada e qualquer evolução fica em v13+.
M23 core polimórfico/auto-healingParcial apenas como diagnóstico.Sugestões read-only podem ser v12 experimental; mutação automática de código/schema é não recomendada e pertence a v13+ se ganhar aprovação e rollback.
M24 IoT/no_std/OTAParcial. Frames e codecs bounded MQTT-PUBLISH/CoAP-request no_std, gate Ed25519 e contrato de store com CAS monotônico/durável são reais; implementação física do counter, download, flash, boot, HSM/PQC e transports não.Fundação delimitada pode permanecer v12 experimental/bounded; integrações reais são v13+ e dependem de hardware.
M25 Embassy asyncNão implementado.v13+, depois de estabilizar traits de hardware e transporte.
M26 deploy PaaS/VPSParcial. Scaffolding/guias existem; credenciais, DNS, migrations, health e rollback continuam operacionais.v12 experimental/assistido; “one click” e zero downtime universais são não recomendados.
M27 Kubernetes/probesImplementado no escopo de scaffold.v12 obrigatória para geração e validação; não constitui certificação de produção.
M28 DI/Inject<T>Implementado como fundação typed.v12 obrigatória no escopo atual; “zero cost” só pode ser uma conclusão de benchmark.
M29 Scalar/OpenAPIParcial. UI/router/generator existem; fidelidade de schema não é completa.v12 experimental se descrito como scaffold; contrato tipado completo fica em v13+.
M30 gRPC/TonicParcial. make:grpc gera um ponto de partida; não existe uma crate rullst-grpc suportada com matriz completa.Generator fica v12 experimental; superfície first-class é v13+.
M31 aerospace/autônomos/defesaNão implementado.Não incorporar ao Core nem à v12/v13 web. Somente um programa independente safety-critical com equipe, hardware, normas e governança.
M32 Axum/Tower e diagnósticos de macroImplementado em escopo delimitado.v12 obrigatória, com testes contínuos de compatibilidade.

Classificação dos dez roadmaps detalhados por crate

Esta tabela fecha as alegações que os milestones compostos não enumeravam individualmente. O status sempre se refere ao contrato inteiro da frase histórica, não apenas à existência de um arquivo com nome parecido.

CrateImplementado e obrigatório para o escopo estável da v12Experimental/parcial na v12Manter para v13+Não recomendar como promessa
AICliente guardado; providers OpenAI/Gemini/Anthropic/DeepSeek/Ollama e adapter OpenAI-compatible local/cloud declarado; mocks determinísticos; PII e corpus de regressão; política de egress opt-in; RAG tenant-aware auditado; streaming SSE/cancelamento explícito no protocolo compatível delimitado; export de auditoria HMAC; runner adaptativo multi-turn bounded com relatório sem conteúdo raw.Vector/tools locais, memória SQL e schema output dentro dos limites documentados; receiver/outbox de auditoria, corpora de domínio e execução/revisão live pertencem ao host.Protocolos streaming não compatíveis, tool loop nativo autorizado e adapters RAG first-party para vector DB externo.Firewall “invulnerável”, ausência total de leakage, resultado offline tratado como certificação de modelo live, SIEM distribuído implícito ou suporte a qualquer API arbitrária.
AuthArgon2 não bloqueante, sessões versionadas/expiráveis, RBAC/Gates, política JWT opt-in e estado SQLite bounded para revogação JWT e lifecycle/CAS de passkeys compartilhado por processos locais.WebAuthn custom até conformance; challenges continuam process-local; recovery codes não possuem workflow transacional completo da aplicação.Magic links, refresh/session UX, challenge store/replicação multi-host e adoção/conformance WebAuthn completa.Chamar a fundação de FIDO2/WebAuthn universal, confundir SQLite local com distribuição multi-host ou assumir ownership de device.
CapitalAdapters/métodos realmente suportados, mocks explícitos, assinatura/freshness de webhooks, analytics documentada, cupons/trial provider-specific delimitados, quota Team/Workspace idempotente com store SQL transacional em quatro protocolos e preparação NFS-e local delimitada com DPS/XSD/XMLDSig/mTLS, codec de resposta e journal HMAC de comando/recovery.NFS-e sem transmissão/homologação oficial; journal local não substitui request/outbox/reconciliação multi-writer; membership/tier e migrations da quota permanecem do host.Idempotência distribuída de webhooks, Alipay RSA2, proration/tax completos e conclusão do programa separado de homologação NFS-e live.Paridade implícita entre gateways, taxas estáticas, “custo zero”, validade local tratada como autorização ou resposta mock indistinguível de autorização fiscal.
ConnectOAuth2/OIDC/social login, PKCE/state, discovery/JWKS, mocks, retries e construção fail-closed no escopo testado.Conveniências/provider helpers cuja redação antiga excedia o contrato.SAML, SCIM, DPoP, JWE, mTLS, risk ML e mensageria em uma futura crate coerente.Misturar OAuth e brokers no mesmo limite ou prometer identidade “enterprise-grade” sem conformance.
IoTFundação delimitada: frames/telemetria no_std, codecs bounded MQTT 5 PUBLISH/CoAP request, verificação Ed25519 do manifest OTA e contrato CAS para store de counter persistente.Simuladores deterministicamente rotulados e store fornecido pela plataforma; não representam hardware validado.Transports e session state MQTT/CoAP/Sparkplug, implementação hardware-backed do counter, flash/boot/rollback, hardware, HSM e PQC auditados.Certificação industrial, HSM/PQC “simulados” ou OTA end-to-end sem device tests.
MailTransports suportados, pipeline de segurança/deliverability, fila/worker, tracking tokens, mocks offline, inspeção bounded opt-in, suppression process-local/SQLite compartilhado-local e observações terminais minimizadas.Scheduling/failover seguem os adapters testados; scanner local não é antivírus/CDR e SQLite não é replicação multi-host.Webhooks autenticados de bounce/complaint, scanner produtivo, CSS inlining, inbound MIME, DKIM/DMARC/S-MIME, Mail Radar e gateways adicionais com contract suite.Deliverability universal, inbox garantido, zero-panic absoluto ou conformidade automática por possuir um transport.
NexusConstrução fail-closed, auth/role/field policy server-side, CRUD/search/sort/paginação e batch limitado.Assistente AI somente dentro da política e autorização do host.Dashboards customizados e visual SQL builder com preview, limites e auditoria.Admin aberto por padrão ou AI com mutação autônoma de produção.
ORMPools SQLx, binds, Active Record/repository/query/schema, transactions, migrations, relações/scopes, soft delete, audit/privacy e encrypted fields no escopo testado; perfil Turso-primary blank/API; adapters delimitados para MongoDB, DuckDB e SurrealDB; pgvector tipado/parametrizado em PostgreSQL; Qdrant dense-cosine e Redis Hash/Set/Sorted Set com matrizes live pinadas.Turso não tem paridade SQLx em relações/hooks/auto-diff/seeds ou demais blueprints; GQL SurrealDB é read-only e bounded; Scout HTTP tem Meilisearch live pinado e Elastic/Algolia por fixtures de protocolo, sem durabilidade automática; Qdrant/Redis não provam cluster, failover ou autorização da aplicação.RAG completo, Qdrant named/sparse/multivectors e filtros arbitrários, Redis Lists/Streams como datastore, graph mutation/traversal completa, Wasm drivers, replication vendor-specific e migrations/index advisor.API universal que esconda semânticas incompatíveis, auto-DDL/auto-migration autônoma, replicação “transparente” genérica ou PQC caseiro.
SecurityHoneypot/sanitizer/CSP, RBAC, HMAC chain, RASP/DLP limitados, AES-GCM, headers, login guard, TOTP, CSWSH, schema/log guards, SRI, evento v1 e ferramentas CLI orientadas a evidência.Redis rate limit exige prova operacional externa; WebAuthn, recovery workflow e sinks duráveis permanecem parciais.KMS/rotation, audit/SIEM durável, adaptive WAF, SQL firewall, containment/eBPF e Wasm sandbox após threat model.“A+ garantido”, zero leakage/latency/unsafe, cobertura OWASP total, certificação automática ou PQC próprio.
StudioBrowser SQLx read/filter e mutação primitiva single-row atrás da capability local verificada, ER relacional, ambiente/config tipado redigido, histórico SQLite opt-in, invalidação in-process de flags e telemetria local real com estados Unavailable.OpenAPI fornecido pelo host, Redis/custom queue inspection e logger sem corpos/headers.N+1 profiler, Cache/Redis inspector e waterfall OTel distribuída.Capturar secrets por padrão, inventar métricas, chamar estado desconectado de live ou afirmar zero overhead universal em release.

Decisão final de escopo da v12 RC

Esta auditoria não presume que um antigo [x] esteja implementado. Ela o transforma em entrada obrigatória da campanha, mas o resultado possível pode ser integral, parcial, ausente, dependência externa/hardware ou não recomendada. Para a RC, a ordem correta é:

  1. deduplicar e classificar cada alegação, mantendo as 226 linhas originais rastreáveis;
  2. implementar e testar por risco e valor toda parcela localmente executável que pertença a uma fronteira coerente do framework;
  3. manter fundações incompletas atrás de limites experimentais explícitos, sem apresentá-las como garantias estáveis;
  4. registrar providers, certificação, hardware e operações externas como tais, usando mocks somente quando forem determinísticos e inequivocamente rotulados;
  5. congelar a superfície somente depois da campanha executável e manter verdes os gates, pacotes, upgrades e blueprints; rejeitar absolutos de marketing e automação autônoma sem preview, aprovação, auditoria e rollback.

Em resumo: a documentação histórica realmente dava a entender que muito mais estava concluído. A campanha solicitada passa por todas as 190 alegações deduplicadas e tenta fechar o máximo tecnicamente honesto e localmente executável. Isso não autoriza fabricar integrações live, certificação, hardware ou garantias absolutas: tais parcelas precisam ser classificadas com sua dependência externa e mantidas fora da superfície estável até existir evidência. Cada ampliação da v12 continua subordinada aos mesmos gates e limites públicos.

Painel rastreável da campanha de implementação

Este painel mede o esforço solicitado para transformar em contratos reais as capacidades que apareciam marcadas como concluídas antes de gpt.md. Ele não é uma porcentagem de “todo software imaginável” nem uma previsão de prazo.

Camada de macroentregas — estado em 2026-09-01

O denominador provisório contém as 24 macroentregas historicamente marcadas [x] no roadmap mestre mais o lote Polyglot acrescentado durante esta auditoria:

RéguaFórmula atualImplementadoFaltaInterpretação
Estrita6 integralmente encerradas / 2524%76%Parcial continua contando como não concluído.
Maturidade ponderada(6 integrais + 19 parciais × 0,5) / 2562%38%Indicador de engenharia; não converte parcial em promessa estável.

Um item só muda para integral quando código, testes relevantes, documentação e gates aplicáveis estiverem fechados. O lote de persistência tornou-se a sexta macroentrega integral depois das matrizes live, testes completos, Clippy estrito, formato, fronteiras de features e mdBook passarem em 29 de agosto de 2026. Essa é evidência do worktree local; os mesmos gates ainda precisam passar no futuro SHA imutável da RC.

Na régua das 190 alegações históricas exatas, o fechamento dos dois scaffolds fiscais/dunning, da ponte autenticada/failover tipado e do scheduling durável de Mail, do proxy explícito de Connect, da invalidação imediata de feature flags/histórico opt-in de jobs do Studio e do RAG tenant-aware auditado mais o lifecycle state/PKCE/nonce de sessão do Connect, os adapters canônicos de webhook Axum/Actix do Capital, o scaffold de billing SQLx/Turso, o handle delimitado de subscription/grace period, a mutação relacional delimitada do Studio, a política JSON Schema/OpenAPI explícita do Security e a memória de chat SQL tenant-aware/CAS do AI e o Sentinel determinístico/PoW delimitado do Security, o harness Criterion equivalente Rullst/Diesel/SeaORM, o Mock IdP OIDC local assinado, os widgets semânticos Nexus validados e a cobrança imediata segura/delimitada do Billable, o billing medido tipado/delimitado e as quotas compartilhadas concorrentes/duráveis do Capital e os contratos delimitados de cupons/trial, o refresh OAuth concorrente delimitado e o transporte AWS SES v2 nativo assinado pelo SDK oficial e o contrato bounded de attachments/CID comum aos transports nomeados levam o inventário a 102 integrais, 86 parciais e 2 ausentes. O fechamento delimitado de ORM-31 — ator/tenant obrigatório, revisão restaurável e recusas transacionais — leva o inventário a 103 integrais, 85 parciais e 2 ausentes. O fechamento de IOT-03 como codecs bounded MQTT 5 PUBLISH e CoAP request, sem alegar transporte, levou a régua a 104/84/2. O fechamento de AI-05 com entradas explícitas de bytes, arquivo allowlisted e URL sob egress policy levou a régua a 105/83/2. O fechamento delimitado de ORM-41 — codecs derivados, ENUM nativa nos perfis suportados, constraint SQLite, recusa fail-closed de PostgreSQL via SQLx Any e matrizes live — leva o estado atual a 106 integrais, 82 parciais e 2 ausentes: 55,8% estrito ou 77,4% ponderado. Essa régua inclui as 24 macroalegações históricas e as 166 alegações dos roadmaps de crates, portanto não deve ser somada à camada de 25 macroentregas acima. Dependências externas, hardware, certificações e absolutos tecnicamente não recomendáveis continuam parciais/ausentes em vez de receber crédito artificial.

Horizonte ampliado — backlog canônico até a v13

Esta é uma segunda pergunta, separada da campanha das 190 alegações antigas: quanto falta se também mantivermos no programa todo milestone canônico ainda sem [x] e planejado até a v13?

O denominador é o tracker M1–M39 do ROADMAP.md, recalculado em 4 de setembro de 2026. Entram hardening v12, manutenção corretiva 12.0.x, o próximo ciclo SemVer, trabalho contínuo, v13 e pesquisa v13. M31 não entra, pois o próprio roadmap destina aeroespacial/autônomos/defesa a um programa futuro separado, com outra governança. As caixas dos roadmaps detalhados de crates não são somadas: elas repetem ou decompõem esses milestones e produziriam dupla contagem.

Estado canônicoMilestonesParcela do horizonte de 38
[x] integral em escopo delimitado513,2%
[~] fundação útil, ainda incompleta2463,2%
[ ] ainda não implementado923,7%
Total programado até v1338100%
  • Na régua estrita, 33/38 ainda não estão fechados: faltam 86,8%.
  • Na régua de maturidade ponderada, (5 + 24 × 0,5) / 38 resulta em 44,7% implementado e 55,3% faltando. Esses 55,3 pontos equivalentes são os nove itens ainda vazios (23,7 pontos) mais a metade não concluída dos 24 parciais (31,6 pontos).

Portanto, a resposta operacional para o horizonte ampliado é aproximadamente 55,3% de engenharia restante, sem esconder que 86,8% dos milestones ainda não têm fechamento integral. Isso não é prazo: contas de provedores, hardware, lojas, homologação fiscal, auditorias independentes e criptografia de pesquisa exigem evidência externa. Também não se soma esta porcentagem aos 22,9% restantes da campanha histórica nem aos cerca de 30% da preparação da RC, pois os três denominadores se sobrepõem fortemente.

Lote concluído localmente: fundação de mensageria por contrato

rullst-messaging passa a ser a fronteira separada de OAuth/OIDC para eventos brokered. O escopo v12 implementado é propositalmente delimitado: envelope rullst.messaging.v1, nomes/headers/payloads/batches/retenção limitados, publicação idempotente por tópico com conflito fail-closed, fan-out entre grupos, consumidores concorrentes, leases de ACK expiráveis e de uso único, retry com teto de tentativas, dead-letter, purge terminal explícito, tempo injetável e broker em memória. O adapter opt-in SQLite persiste publicação, inscrição, claim, ACK/retry/DLQ, idempotência e purge sob transações de escrita serializadas. Testes provam restart com lease expirado, duas instâncias concorrentes, configuração imutável por namespace e corrupção fail-closed seguida de reparo. O lote também congela um codec binário canônico v1 para o envelope com fixture de digest determinística, rejeição de versão desconhecida, truncamento, oversize, ordem não canônica e namespace incorreto. traceparent W3C v00 e um subconjunto conservador de tracestate podem atravessar somente esses dois headers; baggage, sampling e exportação continuam sob responsabilidade do host.

O perfil SQLite padrão continua plaintext; o perfil explícito encrypted usa AES-256-GCM com nonce aleatório e prende namespace, tópico, sequência, ID, evento/content-type, timestamp e key-id na AAD. Ele protege valores de headers e payload, prova raw-state/restart/tamper/row-swap/rotação/symlink e exige chaves anteriores enquanto houver registros que as referenciam. Metadados de rota, idempotência e delivery continuam visíveis; custody, backups protegidos, rollback e migração de perfil são do host.

O perfil opt-in orm-outbox liga um stream relacional exato a um tópico por static dispatch. Ele valida o claim JSON, publica usando event_key como idempotência e só então reconhece o lease ORM. A regressão interrompe após o primeiro publish, recupera o claim expirado e prova replay com o mesmo ID e uma única mensagem. Isso não transforma commit, publish e ACK numa transação distribuída atômica; supervisão, cleanup, autorização e idempotência no destino permanecem da aplicação.

Isso melhora M15, mas não o fecha: a entrega continua at least once, e autorização/tenant, backup, retenção e idempotência do efeito externo pertencem ao host. O codec de envelope não é um transporte, não preserva sozinho a chave de publicação nem mapeia ACKs de provedor. Replicação/failover, Kafka, RabbitMQ, Redis Streams, NATS/JetStream, SQS/SNS, Google Pub/Sub, Pulsar e suas matrizes live continuam abertos. A porcentagem do horizonte não muda porque M15 permanece [~], agora com evidência mais forte.

Camada detalhada

As 226 marcações históricas canônicas permanecem preservadas e suas 190 alegações exatas deduplicadas estão 100% classificadas abaixo como integral, parcial, ausente, dependência externa/hardware ou não recomendada, com arquivo/teste de evidência quando aplicável. A leitura mantém dois denominadores:

  1. visão histórica total, preservando tudo que foi prometido;
  2. engenharia executável localmente, que orienta implementação e exclui apenas certificação, hardware, contas/credenciais e mudanças de estado externas que este repositório não pode honestamente fabricar.

Lote concluído localmente: matriz de persistência

Implementação, matrizes live e gates completos foram concluídos no worktree atual:

  • contratos separados para SQLite, PostgreSQL, MySQL e MariaDB;
  • Turso/libSQL remoto pelo protocolo oficial Hrana HTTP v3, com parâmetros, batch transacional atômico, deadline, redirects recusados, resposta e resultados limitados, migrations reversíveis com detecção de drift e fallback persistente de SQL real; a matriz live também prova rollback após falha intermediária;
  • perfil Turso-primary blank/API com #[derive(Orm)], CRUD/query tipados, make:model, make:migration, migrate/status/rollback e provas local/remota;
  • MongoDB documental, DuckDB analítico e SurrealDB documental/grafo por APIs de capacidade explícitas;
  • inventário documental estável e recuperação portátil MongoDB/SurrealDB em envelope AES-256-GCM versionado, ligado a aplicação/coleção/key ID, com scan duplo, limites de páginas/documentos/plaintext, restauração idempotente sem overwrite e ensaio live MongoDB → SurrealDB → MongoDB; writers devem ser pausados e schema/backup gerenciado continuam externos;
  • assistente cargo rullst new dividido entre banco relacional principal e integrações opcionais, inclusive flags determinísticas; a seleção interativa agora explicita zero ou mais add-ons, omite capacidades já escolhidas e não oferece Turso-primary aos blueprints ainda específicos de SQLx;
  • CLI pré-release compilado do source checkout conserva esse mesmo checkout versionado como origem de dependências quando invocado fora do repositório; falhas da migração inicial preservam o scaffold e exibem status/comando de repetição, em vez de esconder o diagnóstico atrás de um aviso genérico;
  • matrizes live em containers onde existe servidor redistribuível adequado, seguidas pelos gates completos de teste, Clippy, formato, docs, fronteiras de features, empacotamento e inspeção do conteúdo/licença dos pacotes.

Evidência local de fechamento:

  • cargo test --workspace --all-features passou, incluindo testes unitários, integração, projetos gerados e doctests;
  • cargo clippy --workspace --all-features -- -D warnings passou sem avisos;
  • cargo fmt --all -- --check e git diff --check passaram;
  • .github/check-feature-boundaries.sh passou para todos os pacotes mínimos e features isoladas declaradas, e mdbook build docs construiu o livro;
  • PostgreSQL, MySQL, MariaDB, MongoDB, SurrealDB 3.2.4 e Turso/libSQL passaram suas matrizes com containers reais e com RULLST_REQUIRE_TESTCONTAINERS=true. No CI/release, falha de inicialização agora é fatal; somente execuções locais sem essa variável podem pular Docker;
  • os 16 arquivos .crate de 12.0.0 foram gerados localmente sem upload e passaram .github/audit-packages.sh 12.0.0: nomes e quantidade exatos, caminhos seguros, Cargo.toml/LICENSE/README/src presentes, licença idêntica à raiz, nenhum padrão de segredo e nenhum pacote acima de 10 MiB. Esse resultado não substitui o empacotamento verificável no SHA limpo da RC.

Apoio de MariaDB não significa um driver Rust distinto: ele usa corretamente o protocolo MySQL do SQLx, mas só é anunciado depois de passar um contrato live em imagem MariaDB. Turso/libSQL também é relacional e pode ser a única fonte de dados no perfil primary delimitado; o derive comum exige #[orm(backend = "turso")] para não trocar o driver implicitamente. MongoDB, DuckDB e SurrealDB não fingem implementar a mesma semântica do Active Record relacional.

Fechamento delimitado do M6: Turso como primary

cargo rullst new --database turso agora gera um blank/API que compila, usa TursoOrm, executa migrations checksummed/reversíveis e não conserva um DATABASE_URL SQLx fictício. A matriz cobre o fallback persistente offline e o contrato tipado no servidor libSQL oficial; os generators posteriores mantêm o backend. --turso continua corretamente aditivo quando existe outro primary. Os demais blueprints ainda são SQLx-specific e rejeitam a seleção, em vez de simular paridade. Replica sync transparente também permanece fora do contrato.

Inventário item a item — rullst-ai histórico

Com o roadmap mestre já individualizado acima, esta primeira tabela detalhada levou o inventário exato a 31 alegações; as tabelas Auth, Capital, Connect, IoT, Mail, Nexus, Studio, Security e ORM seguintes elevam o total a 190/190 alegações classificadas individualmente (24 do mestre, 7 de AI, 2 de Auth, 13 de Capital, 23 de Connect, 15 de IoT, 18 de Mail, 4 de Nexus, 7 de Studio, 32 de Security e 45 de ORM), isto é, 100% do inventário deduplicado. Esse número mede conclusão da auditoria, não implementação integral: no ORM, por exemplo, 25 itens têm contrato integral delimitado, 19 são parciais e um está ausente. “Integral” continua significando somente o limite descrito na evidência; não herda os absolutos da frase antiga.

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
AI-01Wrappers assíncronos OpenAI, Anthropic e Gemini com JSON tipadoIntegral no escopo delimitadorullst-ai/src/ai/providers/, client.rs e as suites offline exercitam os providers nomeados, DeepSeek, Ollama e o adapter OpenAI-compatible. Este último separa loopback sem autenticação de cloud HTTPS/Bearer, limita respostas/imagens e exige declaração explícita de capacidades opcionais. Protocolos diferentes continuam extensíveis por AiProvider; JSON parseável e JSON Schema nativo permanecem capacidades distintas e reportadas.
AI-02#[ai_embedding] sincroniza embedding automaticamente em todo save/update e em backgroundParcialrullst-orm-macros/src/models/ai_ops.rs oferece save_with_embedding, explicitamente aguardado. Não há hook automático/outbox durável; executar rede silenciosamente em todo save não será prometido sem política de falha e consistência.
AI-03RAG “in-a-box” consulta cosine distance, monta contexto e responde numa chamadaIntegral no escopo orquestrado delimitadoRagPipeline::answer agora faz embedding guardado, retrieval por trait estática, orçamento Unicode por documento/total, geração guardada, fontes e auditoria minimizada em uma operação com TenantContext; recusa tags cross-tenant, contexto injetado e retrieval vazio. InMemoryRagRetriever prova cosseno e partição local. DurableRagAuditTrail e DurableToolAuditTrail acrescentam arquivos locais versionados, sincronizados e delimitados com provas de reinício/corrupção/quota/concorrência. O opt-in AuditDeliveryClient acrescenta export HMAC autenticado, event ID estável, retry/cancelamento e ACK vinculado, sem prometer writer multiprocesso, outbox durável, receiver/SIEM, rotação ou operação de chaves. Autorização no datastore, adapters first-party pgvector/Qdrant, ingestão/remoção durável, política de output e evals live continuam explícitos.
AI-04Chat Memory embutida persiste automaticamente a conversa em SQLIntegral no escopo SQL explicitamente configuradoStatefulChat<M> usa dispatch estático, TenantContext, ID delimitado e histórico par; após a geração guardada, ChatMemory::append_exchange persiste user/assistant atomicamente. O adapter opt-in SQLx usa revisão monotônica par e compare-and-swap transacional em SQLite/PostgreSQL/MySQL/MariaDB, recusando writers stale entre pools/processos sem repetir automaticamente a chamada cobrável. O store local é bounded e determinístico; o scaffold continua cobrindo Turso/modelos customizados. Texto raw, ownership dentro do tenant, retenção/erasure, audit do provider, backups, migrations e UX de retry são da aplicação.
AI-05Abstração vision aceita arquivo local, URL ou bytes em todos os modelos anunciadosIntegral no contrato de fonte/provider declarado e delimitadoprompt_with_image preserva bytes admitidos pela aplicação; prompt_with_image_file exige LocalImagePolicy com raiz canônica exata e teto de até 10 MiB; prompt_with_image_url exige EgressFetcher HTTPS deny-by-default com allowlist, DNS pinning, peer/redirect, deadline e limite de stream. Os novos caminhos verificam capability e guardam o texto antes do I/O, reconhecem JPEG SOI, assinatura PNG completa, RIFF-WebP e GIF87a/89a e vinculam Content-Type remoto quando presente. Escape, excesso, formato/MIME e dispatch prematuro têm regressões. “Todos os modelos” significa somente transport/configuração que declara vision; modelo upstream, autorização da origem, confiança contra rename race local e segurança do decoder continuam externos e falham tipadamente quando não suportados.
AI-06Fallback troca providers e garante 100% de uptimeParcial; absoluto não recomendadoFallbackProvider e AiClient::auto fazem fallback ordenado e possuem testes. Nenhuma biblioteca pode garantir disponibilidade quando todos os providers, rede ou host falham.
AI-07make:chat-session gera modelos e migrations prontosIntegral no escopo delimitadocargo-rullst/src/generators/chat.rs gera SQLx/Turso-primary, migration reversível, módulos registrados, erros propagados, histórico limitado e recusa colisões. chat_scaffold_cli.rs materializa, roda Clippy, migra e persiste uma conversa mock nos dois backends.

O fechamento de AI-07 também corrigiu uma caixa que antes era apenas nominal: o generator antigo usava tipo de chave e métodos incompatíveis com o ORM, chamava utilitários inexistentes, não criava migrations e descartava os dois erros de persistência. A classificação acima usa o novo contrato executado, não a mera existência anterior do subcomando.

O fechamento delimitado de AI-05 move uma alegação de parcial para integral sem fingir descoberta universal de modelos: os três formatos de origem agora existem, mas capability declarada e aceitação real do modelo continuam coisas distintas. A régua global correspondente é 105/83/2, ou 55,3% estrito e 77,1% ponderado.

Inventário item a item — rullst-auth histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
AUTH-01RBAC com roles e #[require_role("Admin")] em rotasIntegral no escopo delimitadorullst-auth/src/rbac.rs nega ausência de identidade com 401 e role insuficiente com 403. A facade agora exporta #[rullst::require_role], valida role/handler/binding user em compilação e preserva a assinatura; rullst/tests/rbac_macro.rs prova negação e autorização inclusive com Extension(user). Persistência e atribuição de roles pertencem à aplicação.
AUTH-02Policies declarativas como PostPolicy::can_edit(&user, &post)Integral no escopo delimitadorullst-auth/src/policy.rs fornece Policy<User, Resource> por struct nomeada, default-deny, com owner/admin e negativas testadas. Gate<Resource> permanece apenas como compatibilidade. Carregar o recurso e estabelecer tenant/ownership continuam obrigações do controller/repository.

Hardening posterior ao snapshot, fora do denominador histórico de 190 alegações: a feature sqlite agora habilita SqliteJwtRevocationStore, com JTI expirável, versão monotônica por subject, quota/configuração persistida, transações BEGIN IMMEDIATE e verify_async; e SqlitePasskeyStore, com cadastro/listagem/rename/revogação, reinício e CAS do signature counter após cerimônia ES256 válida. Testes exercitam duas instâncias no mesmo arquivo, concorrência, replay, quota e corrupção/configuração. Esse contrato é integral somente no escopo SQLite local delimitado: challenge state permanece process-local; identidade/ownership, cifragem/permissões/backup do arquivo, replicação multi-host, refresh workflow e conformance WebAuthn continuam externos.

Inventário item a item — rullst-capital histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
CAP-01Stripe e LemonSqueezy sob uma trait uniformeIntegral no escopo delimitadoBillingProvider, StripeProvider e LemonSqueezyProvider compartilham o contrato e mocks determinísticos. Cada operação ainda precisa respeitar a matriz do provider; a trait não implica paridade live.
CAP-02#[derive(Billable)] fornece charge e subscribe instantaneamenteIntegral no contrato seguro delimitado; atalho inseguro refutadoO derive exportado como rullst::Billable valida estruturalmente email: String, preserva generics e herda checkout/subscription e charge_with/charge. Cobrança exige minor units inteiros limitados, moeda, customer e payment method tokenizados e chave de idempotência; Stripe Payment Intents encaminha a chave, confirma off-session e vincula resposta a valor/moeda/status. O mock determinístico tem status Mock distinto e não bem-sucedido; Debug é redigido. Outros adapters falham UnsupportedOperation; mandate/SCA, idempotência durável, reconciliação, entitlement e sandbox live continuam explícitos. O antigo charge(amount) não será restaurado porque inventaria dados financeiros obrigatórios.
CAP-03Middleware Actix/Axum valida e decodifica webhooks Stripe/LemonSqueezyIntegral no escopo delimitadoAxum e Actix Web chamam o mesmo verificador canônico antes do handler, limitam o corpo a 2 MiB, preservam os bytes assinados, inserem WebhookEvent, recusam configuração vazia/mock em produção e aplicam freshness/replay. O store local agora falha fechado no teto sem expulsar prova ativa; webhook-sql compartilha claims limitados de payload ou ID semântico em SQLite/PostgreSQL/MySQL/MariaDB, com restart, concorrência, drift, capacity e matrizes live. O claim de evento pode usar a mesma transação relacional da mutação de domínio. Como o middleware reivindica o payload antes do dispatch, ele não promete exactly-once; efeitos externos ainda exigem outbox, consumidor idempotente e reconciliação.
CAP-04Gera HTML/PDF e envia a fatura automaticamente após pagamentoParcial; fundação pós-pagamento delimitada implementadaInvoice valida limites, casas decimais e soma exata em minor units antes do HTML; invoice-pdf gera PDF A4 paginado/limitado com fonte embutida ou TTF/OTF verificada. PaidInvoice aceita somente recibo final Succeeded com e-mail/valor/moeda exatos e deriva chave estável. rullst-mail/capital-invoice anexa o PDF, passa pelo pre-flight e envia pela facade ou driver estático. O host ainda precisa acoplar o webhook/reconciliação, reivindicar a chave atomicamente em outbox durável e lidar com entrega at-least-once/paridade do provider; por isso a alegação automática histórica continua parcial.
CAP-05Grace period, cancelamento e pausa por subscription handleIntegral no escopo delimitadoSubscriptionHandle<P> valida/redige o ID e expõe cancel()/pause(); subscription_with(&provider) preserva dispatch estático e subscription() mantém compatibilidade com o provider global. GracePeriod valida janela half-open de até 366 dias, e o derive reconhece o par opcional start/end ou falha em compilação se incompleto. Persistência, relógio confiável, autorização/entitlement, scheduling e semântica live de cada provider não são automáticos.
CAP-06Reporte de uso para billing medido em Stripe/LemonSqueezyIntegral no contrato provider-specific delimitadoMeteredBillingProvider usa dispatch estático e um request associado por provider, evitando inventar identidade uniforme. StripeMeterEvent implementa o Meter Events atual com customer/event/value/timestamp/identifier, encaminha o identifier também como Idempotency-Key e vincula todos os campos do response. LemonSqueezyUsageRecord envia o JSON:API atual com relationship de subscription item e ação increment/set, vinculando item/quantidade/ação no retorno. Ambos limitam resposta a 1 MiB, redigem Debug, têm mock determinístico não-live e fixtures HTTP exatas/negativas. Stripe expõe a deduplicação rolling do provider; como Lemon não recebe a chave da aplicação, o receipt exige outbox durável antes do envio. Conta sandbox/live, retry/reconciliação, agregação configurada, outbox concreta e entitlement continuam limites explícitos, não lacunas ocultas da API. O método uniforme legado falha fechado em live em vez de adivinhar esses campos.
CAP-07Link direto ao portal do cliente nos dois providersIntegral no escopo delimitadobilling_portal_url delega ao provider e possui testes determinísticos para Stripe/LemonSqueezy. O host deve autenticar e vincular a identidade antes da chamada.
CAP-08make:billing gera página completa usando providers ativosIntegral no escopo delimitadomake:billing --model gera e registra modelos, migration reversível, pricing, checkout/portal autenticados com allowlist explícita de planos em produção e webhook obrigatório para o provider selecionado entre Stripe/LemonSqueezy. O contrato materializado passa Clippy, migra, persiste, recusa mutação cross-owner e colisões tanto em SQLite/SQLx quanto em Turso-primary. Ele não implica a matriz dos outros adapters, montagem automática de rotas, reconciliação/idempotência distribuída ou provider sandbox live.
CAP-09Entitlement por tier com can_accessIntegral no escopo delimitadoBillable::can_access é um comparador fail-closed, exercitado por testes. Hierarquia de planos e catálogo de features pertencem à aplicação.
CAP-10Uma Team/Workspace compartilha assinatura e limitesIntegral no escopo autenticado delimitadoO modelo Team/Workspace continua sendo o Billable que possui assinatura/tier. BillingSubject::from_tenant deriva a identidade compartilhada do TenantContext já autenticado, e todos os membros autorizados reservam no mesmo contador por subject/feature. Testes provam isolamento entre workspaces e limite compartilhado sob concorrência. Estabelecer membership e reconciliar o tier a partir de webhooks continuam fronteiras explícitas de autenticação/aplicação.
CAP-11Quota consulta o banco e bloqueia criação automaticamenteIntegral no substituto seguro delimitadoBillable::quota_request deriva o limite do dono da assinatura; QuotaGate::execute reserva antes de chamar a criação, não executa em over-limit/replay e libera em falha ordinária. O store local é determinístico e quota-sql usa claim idempotente mais update condicional atômico em SQLite/PostgreSQL/MySQL/MariaDB; fixtures concorrentes nos quatro protocolos param exatamente no limite. Para atomicidade com a tabela de domínio, reserve_with_transaction recebe a mesma transação do insert. O framework não intercepta writes arbitrários fora dessa fronteira, não inventa membership/tier e não fornece adapter Turso/NoSQL automaticamente.
CAP-12Valida e aplica cupons por API nativaIntegral no escopo provider-specific delimitadoCouponCode limita e redige o identificador. Stripe envia o contrato atual discounts[0][coupon], pede expansão e só aceita resposta vinculada à assinatura e ao coupon solicitados. Lemon Squeezy documenta discount code para checkout, não aplicação posterior na assinatura; ele e adapters sem contrato revisado retornam UnsupportedOperation no live em vez de falso sucesso. Mocks vazios/mock_* permanecem no-op offline explícito, e aceitação por conta real continua evidência externa.
CAP-13Estende trial facilmente por códigoIntegral no escopo provider-specific delimitadoBillable/SubscriptionHandle::extend_trial(15) agora significa 15 dias inteiros, limitado a 1–730; extend_trial_days_at fixa o relógio para retries determinísticos e set_trial_end preserva a operação absoluta explícita. Stripe envia trial_end; Lemon Squeezy envia PATCH JSON:API com trial_ends_at; ambos limitam e vinculam a resposta à assinatura/expiração. Adapters live não revisados falham explicitamente. Autorização, persistência do tempo do comando, concorrência, efeitos no ciclo de cobrança e reconciliação por webhook pertencem ao host.

O lote Capital também fechou cinco lacunas locais sem ampliar artificialmente o contrato: o derive genérico passou a compilar pela fachada pública, o renderer de fatura passou a escapar ID, e-mail, descrição e moeda, e Axum/Actix passaram a compartilhar a mesma fronteira de webhook testada. O scaffold de billing agora seleciona SQLx/Turso-primary, ativa features exatas, preserva arquivos e nega conflito de ownership antes de vincular customer. O ledger relacional opt-in agora cobre idempotência compartilhada limitada de webhook sem armazenar payload/ID em claro. Orquestração automática por webhook, exactly-once entre sistemas, reconciliação e operações live sem contract test continuam explicitamente fora da classificação integral; PDF e a ponte de entrega pós-pagamento já existem no limite descrito em CAP-04. O grace period agora é um valor tipado/derivável, não uma alegação de persistência ou automação do provider.

O hardening posterior dos gateways unificou todos os métodos HTTP live revisados numa única fronteira: pool compartilhado, timeouts finitos de conexão e request, redirects e proxy ambiente desabilitados, JSON limitado a 1 MiB e URL de checkout absoluta/HTTPS/sem credenciais ou fragmento. Request inválido, falha de transporte, status HTTP, rate limit com Retry-After numérico limitado, corpo excessivo, JSON inválido e resposta semanticamente incompatível agora produzem ProviderFailure redigido com classe permanente/transiente/rate-limited. Fixtures reais cobrem redirect, desconexão, 429, 4xx, 5xx, oversize, JSON e vazamento negativo de segredos. O framework não faz retry automático de mutação financeira; idempotência encaminhada pelo provider, backoff e reconciliação continuam obrigatórios no host. Essa evidência elevou Capital de 89/B para 92/A.

O cluster fiscal local subsequente passou a exigir e expor o tpAmb dentro da DPS assinada, impedindo reinterpretação entre homologação e produção. O FiscalCommandJournal registra antes de qualquer transporte do host um comando opaco e depois exatamente um resultado autorizado/rejeitado já vinculado pelo parser. A cadeia HMAC nomeada, os limites de 4.096 eventos/16 MiB, replay exato, conflito de chave, reinício, recuperação de pendentes, symlink, adulteração, writer concorrente, quota e checkpoint externo têm regressões executáveis; XML, chave de acesso, mensagens, corpo e certificado não entram no arquivo. Isso alcança honestamente o teto Capital de 93/A, a sétima das 15 crates ativas a fechar sua meta local. Transporte, retry, request/outbox autoritativo, reconciliação multi-writer, confiança ICP-Brasil e homologação SEFIN continuam fora da alegação.

O avanço de CAP-04 não alterou sozinho os totais anteriores: a alegação histórica inclui orquestração automática após qualquer pagamento, enquanto o contrato entregue exige recibo final explícito e deixa o claim durável/exactly-once fora da biblioteca. A classificação só sobe para integral se essa lacuna for fechada sem inventar garantias de transporte.

CAP-06, em contraste, descrevia a API de reporte nos dois providers. O contrato provider-specific, os parsers vinculados e as fixtures de protocolo fecharam esse escopo delimitado sem transformar fixture em aceitação por conta live nem fornecer a outbox da aplicação. CAP-10/CAP-11 agora acrescentam uma identidade de billing compartilhada, uma reserva idempotente que bloqueia o callback antes do over-limit e um store SQL transacional exercitado em quatro protocolos. Isso atualizou o inventário para 97/91/2, 51,1% estrito e 75,0% ponderado; membership, tier/reconciliação, migrations e writes que não usam a fronteira continuam deliberadamente pertencendo ao host. CAP-12/CAP-13 acrescentam valores delimitados, protocolos e binding de resposta para cupons/trial, levando o total a 99/89/2, 52,1% estrito e 75,5% ponderado, sem inventar paridade entre gateways ou aceitação por conta live. CONNECT-10 adiciona o coordenador process-local de refresh com binding de identidade e troca de estado pós-validação, atualizando a régua para 100/88/2, 52,6% estrito e 75,8% ponderado; persistência cifrada e coordenação distribuída continuam fronteiras explícitas. MAIL-06 substitui o antigo falso caminho bearer direto por SES v2 nativo opt-in no SDK oficial, SigV4, credenciais temporárias ou provider/config do chamador e paridade local de payload/attachments/RFC 8058, levando a régua a 101/87/2, 53,2% estrito e 76,1% ponderado. O contract loopback prova protocolo e assinatura; conta AWS live, identidade, sandbox, quotas, reputação e entrega continuam evidência externa. MAIL-08 acrescenta limites comuns antes do encoding, metadata inequívoca, Content-ID único e referenciado, Debug sem bytes e a árvore MIME SMTP mixed/alternative/related, levando o total a 102/86/2, 53,7% estrito e 76,3% ponderado. O contrato histórico “zero-copy” é refutado: os bytes são owned e os transports copiam/Base64-encodam conforme o protocolo; limites de provider e inspeção do conteúdo opaco continuam fora. ORM-31 fecha depois o contrato histórico delimitado de revisões auditáveis e leva o total a 103/85/2, 54,2% estrito e 76,6% ponderado. Isso não transforma auditoria relacional em backup, histórico bulk ou export durável.

Inventário item a item — rullst-connect histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
CONNECT-01Macro define_provider! reduz boilerplateIntegral no escopo delimitadomacros.rs gera configuração validada, scopes, state, PKCE, transporte injetável e modo de credencial; os providers padrão e testes do macro usam a mesma superfície.
CONNECT-02Extractor nativo AuthCallback para Axum e ActixIntegral no escopo delimitadoextractors.rs implementa os dois traits atrás das features correspondentes, preserva code/state/error reais e possui negativas para parsing e estado.
CONNECT-03Revogação remota de token nos providers suportadosParcial; seis adapters delimitadosA API distingue access/refresh token, limita e valida o valor antes da rede e redige credenciais/payloads de HttpRequest/HttpResponse::Debug. Google aceita ambos sem hint; Discord e Apple enviam o hint; GitHub aceita access; Auth0 e Cognito aceitam refresh conforme seus protocolos. Fixtures capturam método, endpoint percent-encoded, auth e form/JSON, além de erro redigido/offline. Facebook, LinkedIn, Microsoft, X e OIDC genérico continuam unsupported; sucesso idempotente é aceitação do protocolo e não encerra a sessão/persistência local, portanto a alegação universal permanece parcial.
CONNECT-04MockProvider para testes de aplicaçõesIntegral no escopo delimitadoproviders/mock.rs fornece fluxo determinístico e testes; credenciais vazias/mock_* também selecionam transporte offline sem rede.
CONNECT-05Validação OIDC automática para Google/Apple sem HTTP adicionalParcialGoogle, Apple e OIDC custom validam assinatura e claims por JWKS. A frase “sem chamada HTTP adicional” era incorreta: chaves precisam ser obtidas e atualizadas, embora o cache reduza chamadas.
CONNECT-06URL estrita, zero panics e PKCE em todos os providersParcial; absoluto não recomendadoValidação HTTPS/loopback, geração/verificação PKCE, state e propagação do verifier existem com negativas. Ausência universal de panics e integração correta do host não podem ser inferidas dessa fundação.
CONNECT-07Transporte agnóstico por HttpClientIntegral no escopo delimitadoclient::HttpClient, request/response types e with_http_client permitem transporte injetado; o adapter é responsável por TLS, proxy, redirects e demais políticas.
CONNECT-08Integração pronta com rullst-orm, SQLx e DieselParcialIntoDatabaseUser<T> é apenas o contrato que a aplicação implementa. Connect não depende desses ORMs nem fornece upsert, transação, tenant ou schema.
CONNECT-09Proxy corporativo configurável nativamenteIntegral no contrato HTTP(S) delimitadoReqwestClient::try_with_proxy e try_with_proxy_basic_auth instalam um proxy explícito para todo o tráfego e desativam a descoberta ambiente do sistema. URL credentials/path/query/fragment e schemes não HTTP(S) são recusados; autenticação remota exige HTTPS (HTTP só em loopback), o password fica em SecretString durante a construção e erros não o ecoam. Um servidor proxy local prova request-target absoluto e Proxy-Authorization. PAC/WPAD, SOCKS, proxy mTLS e certificação de rede corporativa continuam fora.
CONNECT-10Refresh automático quando access token expiraIntegral no escopo process-local, com persistência shared-local opcional delimitadaRefreshableTokenState exige access/refresh token, identidade do usuário no provider, relógio confiável e lifetime positivo/limitado. AutoRefreshingSession<P> detecta a janela de expiração, impede chamadas sobrepostas e faz quem aguardava reutilizar o primeiro refresh válido; mantém o token anterior quando o provider não rotaciona, adota rotação válida e só substitui estado após vincular a mesma identidade e validar token/lifetime. EncryptedTokenSnapshot preserva a geração em envelope AES-256-GCM versionado, delimitado e redigido, autenticando key_id, provider e conta local confiável. A feature sqlite acrescenta quota persistida, transações BEGIN IMMEDIATE, CAS de sucessor exato e delete condicional; restart, duas instâncias, stale writer, chave/tamper/corrupção, quota/config, symlink, API pública e facade têm regressões. Autorização, custódia/rotação de chave, lease em torno da chamada remota, reconciliação de uma rotação perdedora, retry/backoff, diretório/backup, multi-host, replay da operação original e reautenticação continuam no host. Providers sem refresh continuam falhando explicitamente.
CONNECT-11Avatar universal sempre em resolução ótimaParcial; garantia não recomendadaParsers normalizam campos conhecidos e alguns providers ajustam URL/tamanho. Vários IdPs não entregam avatar e uma resolução “ótima” não é propriedade controlável pela crate.
CONNECT-12Integrações nativas Leptos e DioxusParcialAuthCallback é um DTO deserializável e a feature Leptos não puxa runtime; não existem extractors/runtime adapters E2E específicos para Leptos/Dioxus.
CONNECT-13Fluxos HTTP reais exercitados por mock serverIntegral no escopo delimitadotests/integration_tests.rs e suites de providers usam Wiremock para sucesso, erro HTTP, token/perfil incompleto e falha de parsing sem credenciais live.
CONNECT-14Retry exponencial para rate limitIntegral no escopo delimitadoA feature retry usa reqwest-retry, limita tentativas configuradas e possui testes Wiremock de retry, headers, auth e corpos. Não substitui orçamento global ou coordenação distribuída.
CONNECT-15Erros de provider normalizadosIntegral no escopo delimitadoResponseWrapper::error_for_status converte status/payload em ProviderApiError { code, message }, limita mensagem e possui matriz de testes. Payloads proprietários ainda podem cair no fallback tipado.
CONNECT-16UniversalProfile estritamente normalizadoIntegral no escopo delimitadoConnectUser::universal_profile() agora retorna somente id/name/email/email_verified/avatar. A projeção é serializável e não inclui tokens, raw payload ou expiração; Serde de ConnectUser também omite access/refresh tokens.
CONNECT-17AuthSession salva e valida state/nonce automaticamenteIntegral no contrato Axum/tower-sessions delimitadobegin_oauth_session gera state + PKCE e begin_oidc_session adiciona nonce; ambos guardam verifier/nonce por dez minutos no servidor e recusam destino não HTTPS/loopback, credenciais/fragment e parâmetros gerenciados conflitantes. O extractor remove e salva imediatamente o único desafio ativo antes da comparação constant-time e entrega ExchangeParams exatos. Regressões cobrem round-trip, replay sequencial, expiry, mismatch, missing state, substituição, URL hostil e redaction. O host ainda configura store durável, cookie Secure/HttpOnly/SameSite, TLS, redirect registrado, linking/recovery idempotente e conformance live; iniciar outro login na mesma sessão invalida o anterior. A trait genérica de store não oferece compare-and-delete distribuído entre requests que já carregaram o mesmo registro; esse cenário exige adapter atômico da aplicação.
CONNECT-18Geração nativa do client secret Apple a partir de .p8Integral no escopo delimitadoO adapter gera JWT ES256 curto com team/key/client IDs, rejeita chave inválida e possui testes de header/claims; o .p8 deve chegar como PEM protegido pela aplicação.
CONNECT-19Mock IdP local simula perfeitamente OAuth/OIDCIntegral como fixture local delimitado; “perfeitamente” refutadoO router Axum valida issuer/callback HTTP loopback e um cliente exato, limita grants/tokens process-local a 64, consome authorization code expirável uma vez, verifica PKCE S256, propaga nonce, assina ID token EdDSA, publica discovery/JWKS e protege userinfo com bearer emitido. Um teste loopback percorre o OidcProvider real e rejeita replay/PKCE inválido. Chave/credenciais são fixtures públicas; não há UI/consent, refresh/device/federação, durabilidade, rotação, exposição pública ou conformance OIDC.
CONNECT-20Spans detalhados para exchange e profile fetchIntegral no escopo delimitadoO transporte comum instrumenta método/URL/status e OIDC instrumenta operações sem registrar form/token. A aplicação ainda escolhe subscriber, redaction, sampling e export.
CONNECT-21OIDC discovery em uma chamadaIntegral no escopo delimitadoOidcProvider::discover valida issuer exato e endpoints HTTPS/mesmo loopback, injeta cliente em testes e recusa metadata divergente/incompleta.
CONNECT-22Device Authorization Flow RFC 8628Integral no escopo delimitadoGitHub implementa request/poll, interval/erros e possui testes Wiremock; a trait retorna unsupported nos demais providers. Isso não implica certificação universal de Smart TVs.
CONNECT-23Validação criptográfica JWKS de ID tokenIntegral no escopo delimitadoGoogle, Apple e OIDC custom restringem algoritmos assimétricos, validam issuer/audience/exp/nonce e usam cache isolado com refresh por kid e stale conhecido limitado.

Os fechamentos de CONNECT-16 e CONNECT-19 corrigiram duas contradições: o primeiro impede que a projeção normalizada reexponha credenciais; o segundo substitui o antigo token opaco por um fluxo OIDC criptograficamente verificável, mas rejeita a palavra “perfeitamente” e permanece estritamente local. Antes, SecretString escondia tokens em Debug, mas serializadores custom voltavam a expor as credenciais em JSON. A serialização agora omite ambos os tokens e a projeção pública exclui também payload bruto e metadados de credencial.

Inventário item a item — rullst-iot histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
IOT-01Modelos e serializers operam em no_stdIntegral no escopo delimitadorullst-iot usa #![no_std] sem a feature std; o gate de fronteiras e os workflows embedded compilam a superfície declarada. Compilar um target não equivale a executar em placa ou QEMU.
IOT-02SensorTelemetry unifica métricas de sensoresIntegral no escopo delimitadoO tipo serializável contém device, métrica, valor e timestamp e possui testes locais. Unidade, qualidade, calibração e schema de transporte permanecem responsabilidades do protocolo/aplicação.
IOT-03Helpers de payload MQTT e CoAPIntegral no escopo de codificação delimitadoMqttPublish emite um PUBLISH MQTT 5 bounded com tópico validado, Remaining Length mínimo, invariantes QoS/packet ID e properties vazias. CoapRequest emite GET/POST/PUT/DELETE RFC 7252 bounded com token, URI-Path/Content-Format ordenados e payload marker correto. Vetores, limites, robustez determinística, API externa e builds no_std são testados. Não há socket, TLS/DTLS, CONNECT, ack/retry, broker/LwM2M ou teste de interoperabilidade; esses transports continuam separados.
IOT-04cargo rullst make:iot <DeviceName> gera arquivos de nodeIntegral no escopo delimitadoO generator agora valida identificadores, recusa traversal/colisão, exige um projeto Rullst, habilita a feature iot, registra os módulos e gera código pela fachada rullst::iot. O teste process-level materializa um projeto, executa Clippy offline e prova as recusas. Ele gera telemetria local, não transporte ou firmware.
IOT-05Helpers GPIO e I2C nativos/cross-platformParcialGpioPin representa estado em memória e I2cHelper constrói bytes de frame. Não acessam registradores, HAL, barramento ou hardware e não constituem drivers nativos.
IOT-06Driver Modbus RTU/TCP completoParcialModbusFrame monta uma requisição RTU e CRC-16. Não há serial/TCP, parser de resposta, timeout, framing MBAP, retries nem contract tests com PLC.
IOT-07Servidor BLE GATT de telemetriaParcialGattService e GattCharacteristic são estruturas de dados. Não há servidor, advertising, radio stack, conexão, segurança ou integração de plataforma.
IOT-08Micro-LLM e engine de anomalia no dispositivoParcialAnomalyDetector é um classificador estatístico por limiar e agora falha fechado para floats/configuração não finitos. Não executa LLM, treino, inferência de modelo ou detecção adaptativa.
IOT-09Micro-dashboard embeddedIntegral no escopo delimitadoIotDashboard renderiza um card HTML local, escapa labels não confiáveis e o identifica como SNAPSHOT; testes cobrem XSS. Não inicia servidor, HTMX runtime, stream live nem mede footprint em microcontrolador.
IOT-10Mesh P2P self-healing sobre ESP-NOW/Thread/ZigbeeParcialMeshTopology é um registro em memória que recomenda o node online com maior RSSI. Não roteia pacotes, detecta falha, repara topologia nem integra os transports nomeados.
IOT-11OTA Ed25519 delta, dual-bank e rollback end-to-endParcialO gate verifica manifest assinado, target, versão, hash, tamanho e counter e só então expõe a partição inativa. O contrato no_std de store carrega estado persistente e exige CAS monotônico/durável antes do commit; regressões públicas cobrem reinício/replay, retry, corrupção e writer obsoleto. Uma implementação hardware-backed, download, delta patch, flash/read-back, bootloader, power-loss recovery e device tests não existem.
IOT-12Bindings HSM para ATECC608A/TPM/STSAFEAusente; depende de hardwareA feature experimental expõe somente bytes determinísticos de SimulatedHsmDevice. Não há binding, key custody, operação criptográfica protegida ou placa testada; a fixture não conta como progresso de hardware.
IOT-13ML-KEM/Kyber compacto para edgeAusente; pesquisa/auditoria externaSimulatedPqcFixture não implementa criptografia. Um protocolo concreto e uma implementação auditada com vetores oficiais são pré-requisitos; PQC caseiro não é recomendado.
IOT-14Power governor controla deep sleep/wake/solarParcial; depende de hardwarePowerGovernor calcula uma recomendação pura a partir de voltagens informadas. Não controla sleep, interrupções, charging, harvester ou PMIC.
IOT-15Digital Twin bidirecional em tempo real com Studio/NexusParcialDigitalTwin mantém readings locais e produz JSON com erro tipado/fallback seguro; não possui transport, actuator command, conflito/ordenação, persistência ou integração Studio/Nexus.

O lote IoT removeu três falsos sinais locais sem fabricar integrações externas: nomes perigosos não escapam mais do projeto pelo generator, labels de telemetria não entram cruas no HTML e um snapshot não é rotulado como dispositivo online. Drivers, redes, flash, HSM e PQC permanecem deliberadamente fora do resultado integral até existirem implementação e provas proporcionais em hardware real.

Inventário item a item — rullst-mail histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
MAIL-01Trait uniforme para Log, SMTP, Resend e SendGridIntegral no escopo delimitadoMailDriver é o contrato comum e os drivers nomeados o implementam, com SMTP atrás de feature. A uniformidade do método send não implica paridade de scheduling, respostas de provider, aceitação ou inbox delivery.
MAIL-02Builder fluente zero-cost para recipients, subject, HTML e textoIntegral no escopo delimitadoMessage possui os builders e testes de composição. É uma estrutura owned que clona/aloca onde necessário; “zero-cost” não é usado como promessa de benchmark.
MAIL-03Kani/property tests eliminam todos os panics de formataçãoParcial; absoluto não recomendadoExiste um harness Kani pequeno e testes/fuzzing delimitados. Eles não cobrem todo driver, dependência, input, generator ou aplicação e não provam ausência universal de panic.
MAIL-04Dispatch assíncrono automático pela Queue com retryIntegral no escopo delimitadoMail::init_queue, envelope versionado e register_mail_handler fazem dispatch não bloqueante e propagam falha ao worker, que possui retry/dead-letter configurável. A aplicação ainda precisa iniciar/operar a fila; a semântica é ao menos uma vez.
MAIL-05Circuit breaker/failover distingue 5xx/rate limit e alerta telemetriaIntegral no contrato in-process delimitadoMailError classifica permanente/transiente/rate-limit; REST mapeia transporte, HTTP 5xx, 429 e 4xx, limita/redige body e captura Retry-After delta até um dia; SMTP separa resposta 4xx de 5xx. FailoverDriver só conta/encaminha transiente ou rate-limit, recusa fallback para config/validation/4xx permanente, guarda count/timestamp no mesmo lock poison-aware e emite eventos tracing de baixa cardinalidade sem body. Testes provam 400 sem fallback, 503/429 com fallback/counter/rate metadata e lock envenenado sem entrega primária. Estado/coordenação distribuída, orçamento global e operação do subscriber/alerta continuam deployment.
MAIL-06Drivers HTTP nativos Postmark e AWS SESIntegral no contrato de protocolo delimitadoPostmark usa sua API live. Com aws-ses, AwsSesDriver usa o SDK AWS oficial para SES v2 Simple e SigV4 regional, aceita credencial temporária/provider rotativo/config oficial do chamador, serializa HTML/texto, attachments/CID e RFC 8058, recusa limites de fields/estimativa encoded acima de 40 MiB, preserva Retry-After limitado e vincula sucesso a MessageId; fixture loopback prova path, escopo ses/aws4_request, session token, payload e erro tipado/redigido. O construtor legado só faz mock ou proxy bearer explícito e nunca envia uma requisição AWS sem assinatura. Conta live, identidade/domínio verificado, sandbox, IAM, quota, reputação, suppression/bounce e inbox delivery não são alegados.
MAIL-07send_at/send_in dão scheduling preciso via queue/providersIntegral no escopo temporal delimitadoQueue::dispatch_at e Mail::enqueue persistem até 366 dias em SQLite/Redis, não liberam antes do milissegundo devido e removem o timestamp apenas após o claim; overflow falha na pre-flight. O Redis passa contrato live checksum-pinned no CI/release. Sem queue, Resend/SendGrid recebem o timestamp nativo; caminhos reais SMTP/Postmark/Log/SES recusam futuro, enquanto fixtures offline podem preservá-lo para assertions. “Preciso” significa nunca antes do due time dentro desse contrato: execução ocorre no primeiro poll posterior, é ao menos uma vez e não garante aceitação/exatamente-uma-vez no provider.
MAIL-08Attachments/CID zero-copy em Resend, SendGrid e PostmarkIntegral no contrato owned e bounded; “zero-copy” refutadoA pre-flight comum limita 32 itens, 20 MiB por item e 25 MiB raw agregados; valida basename, MIME parameter-free, CID ASCII único e sua referência no HTML; e omite bytes de Debug. Resend, SendGrid, Postmark, SES nativo e SMTP consomem esse modelo, com SMTP exercitando MIME mixed/alternative/related, disposition, Content-ID e Base64. Os bytes são owned/copiados e o encoding aloca. O guard opt-in reconhece formatos bounded e bloqueia magic executável, type spoofing, PDF/SVG ativo, secrets e links inseguros; não é antivírus, sandbox, archive recursion ou CDR, e limites/aceitação do provider podem ser menores.
MAIL-09Preflight verifica deliverability e 150+ domínios descartáveisParcialO pipeline executa sintaxe local bounded e uma lista estática ampla antes do envio. Não consulta DNS/MX, reputação, mailbox, bounce ou provider e não garante deliverability.
MAIL-10HTML gera plain-text fallback automaticamenteIntegral no escopo delimitadoMessage::html chama deterministically strip_html_to_plain_text quando texto explícito não existe; testes cobrem tags, entidades e fallback. Não é um parser HTML/MIME normativo.
MAIL-11DLP intercepta secrets em subject/HTML/textoIntegral no escopo delimitadoO pipeline obrigatório aplica redaction aos padrões documentados e testes cobrem AWS keys, credenciais, bearer e PEM. É heurístico e não promete ausência total de vazamento.
MAIL-12Interceptor universal de phishing/homographParcialHelpers rejeitam schemes selecionados e mistura Latin/Cyrillic/Greek em URLs reconhecidas. A extração não é um parser completo de HTML/URL/IDNA e pode ter falsos positivos/negativos.
MAIL-13RFC 8058 obrigatório e compliance Google/YahooParcialDrivers suportados emitem List-Unsubscribe e List-Unsubscribe-Post quando a aplicação fornece URL HTTP(S). Sem configuração não há header; política de lista, endpoint e compliance pertencem ao produto/deploy.
MAIL-14Tracking zero-cookie preserva privacidade/LGPD/GDPRParcial; compliance não recomendadoTokens v2 são purpose-bound, HMAC-verificados em constant time, expiráveis e opcionalmente one-shot em memória. HMAC não cifra: email e target URL continuam base64-readable; consentimento, minimização, IP/logs, retenção e store distribuído são externos.
MAIL-15MailTrap/MemoryDriver com assertions fluentesIntegral no escopo delimitadoO driver em memória captura mensagens offline e as assertions cobrem destinatário, subject, body, attachments, CID, scheduling e unsubscribe. Estado global exige isolamento de teste pelo host.
MAIL-16MailFactory oferece cinco fixtures transacionaisIntegral no escopo delimitadoAs cinco factories existem e agora escapam valores dinâmicos em HTML, com regressão adversarial. São dados de teste/preview, não workflows de autenticação, billing ou segurança.
MAIL-17Resolver seleciona automaticamente credenciais pelo TenantContextIntegral no contrato context-bound delimitadoregister_for_context/send_for_context recebem diretamente o TenantContext derivado de membership autenticado, selecionam o driver in-process sem identidade task-local/global, recusam IDs inválidos e falham fechado se o registro estiver indisponível. A regressão usa dois contextos e dois drivers para provar não interferência. Persistência/encriptação/rotação de credenciais e sincronização entre processos continuam responsabilidades da aplicação/deployment.
MAIL-18make:mail gera Welcome/Reset/OTP/Invoice/NFS-e/DunningIntegral no escopo delimitadoWelcome, Reset, OTP, Invoice e Custom, mais os comandos exatos make:mail-invoice [Name] e make:mail-dunning [Name], validam identifiers, recusam traversal/colisão, habilitam as features necessárias, registram módulos e escapam HTML. O fiscal consome FiscalResponse, recusa proveniência contraditória e imprime OfflineMock como [PREVIEW — NOT AUTHORIZED]; o dunning expõe estágios D+1/D+3/D+7 sem inferir agenda ou estado. Um projeto materializado passa Clippy, executa os sete templates, recusa link perigoso e prova preservação em colisão. Autorização fiscal, due state, scheduling, entitlement e política continuam externos.

O hardening Mail fechou o generator que antes parecia pronto mas emitia imports ausentes e templates vulneráveis a markup injection. Os dois comandos que só existiam na documentação agora também são código materializado, com proveniência fiscal e dunning explícitos. O caminho enganoso que tentava falar com AWS sem SigV4 foi removido e o caminho nativo opt-in agora delega assinatura, transporte e credenciais ao SDK AWS oficial. Isso melhora a segurança local sem promover mocks, bearer proxy, fixture SigV4, HMAC ou heurísticas a conta live, deliverability, privacidade legal, autorização fiscal ou inbox delivery. O fechamento delimitado de MAIL-08 adiciona uma fronteira comum antes do transporte e corrige a árvore MIME SMTP sem renomear cópias como zero-copy. A validação base de metadata não se transforma sozinha em inspeção do arquivo nem em prova de aceitação por contas live.

O lote de teto local posterior adicionou três controles opt-in sem ampliar essas promessas: AttachmentInspectionGuard executa um inspector estático antes do transport; SuppressionGuard consulta estado manual/hard-bounce/spam complaint process-local ou SQLite compartilhado-local, com replay exato, quotas imutáveis, restart e concorrência de duas instâncias; e ObservedMailDriver emite somente provider/outcome/latência/contagem e flags de scheduling/tenant. Eventos do provider ainda precisam ser autenticados antes de entrar no store, o scanner local continua heurístico e operação distribuída/inbox delivery continuam externas. Essas evidências elevam rullst-mail ao teto local 95/A, não a certificação nem a uma garantia de entrega.

Inventário item a item — rullst-nexus histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
NEXUS-01#[derive(Nexus)] gera Create/Edit/Delete para qualquer structIntegral no escopo delimitadoA derive gera NexusModel para structs com campos nomeados, permite table/label/icon/PK/widgets e tenant text explícitos e possui prova de compilação pela fachada rullst. O host ainda registra o model e fornece schema SQLx, auth, membership e privilégios; tuple structs/enums não são aceitos.
NEXUS-02Data tables com paginação, busca e sorting server-sideIntegral no escopo delimitadobuild_table_query limita a 15 linhas, usa offset saturating, binds para busca e allowlist de colunas/direção. Para models tenant-scoped, list/search/edit/create/update/delete/batch incluem o TenantContext confiável e falham sem ele; o teste HTTP SQLite nega leitura/mutação cross-tenant e input que tenta escolher o tenant. Contagem total, cursor pagination, otimização de índice, identity/membership e models globais permanecem fora.
NEXUS-03Boolean vira toggle, Enum dropdown e texto textarea automaticamenteIntegral no contrato de metadata explícita delimitado; automação absoluta refutadaBoolean é inferido e renderizado como checkbox; Enum e Textarea são declarados na derive e renderizados como select/textarea. try_build() limita e valida modelos, fields, PK, labels, relações e opções; POST/PUT limitam pares e bytes, recusam campo desconhecido/protegido, duplicata não Boolean, enum fora da allowlist e valor semântico inválido antes do SQL bindado. Testes cobrem macro, HTML e negativos HTTP. Variantes de enum externo e intenção multiline não podem ser inferidas com segurança só pelo tipo do field, portanto permanecem metadata explícita em vez de “mágica”.
NEXUS-04Batch actions para Delete All/DeactivateIntegral no escopo delimitadoO handler aceita somente IDs selecionados, limita 1.000, parametriza valores, recusa verbos desconhecidos e executa delete/deactivate em SQLite no teste de integração. Deactivate só aparece para Boolean gravável is_active/active; quando audit é obrigatório, scope, mutação e registro minimizado pertencem à mesma transação. Não é update arbitrário nem audit trail append-only/tamper-evident.

O lote Nexus também fechou uma divergência de segurança: labels, nomes de tabela/campo e ícones registrados são escapados ou estritamente normalizados nas telas CRUD, sidebar, dashboard e fallback do assistente; falhas SQL não são devolvidas ao navegador. O tenant opt-in protege todas as rotas built-in e o audit obrigatório registra actor/tenant/table/action/key opcional/count/outcome/ correlation/time/version ou desfaz a mutação. Isso não transforma metadata em identity/membership, não autoriza models globais/custom routes e não torna a tabela do mesmo banco append-only, tamper-evident ou separada.

Inventário item a item — rullst-studio histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
STUDIO-01Data Browser permite view/filter/edit/delete sem SQLIntegral no escopo relacional local delimitadoO browser lê/busca/pagina e, somente após o middleware debug-loopback/same-origin instalar sua marker não forjável, atualiza valor primitivo não-PK ou exclui exatamente uma linha por PK completa. Tabela/coluna/PK vêm do schema allowlisted, valores são tipados/bindados, corpo/campos são limitados, tipos proprietários ficam read-only e delete exige DELETE <table>. SQLite, PostgreSQL, MySQL e MariaDB passam contratos executáveis. Tenant/RBAC da aplicação, audit trail, rollback e administração compartilhada/produção não são inferidos.
STUDIO-02Swagger/OpenAPI é auto-gerado e interativoParcialutoipa-swagger-ui fornece a interface interativa quando o host chama Studio::with_openapi. Studio não infere um documento completo a partir de rotas Axum arbitrárias.
STUDIO-03Logger intercepta requests, payloads, headers e tempo em tempo realParcial; captura total não recomendada por padrãoMiddleware e SSE expõem método, URI, status e latência; markup não confiável é escapado. Corpos e headers não são capturados porque podem conter auth, sessão, pagamento e PII. A aplicação ainda precisa posicionar o middleware no tráfego que deseja observar.
STUDIO-04Monitor mostra jobs pendentes, falhos e concluídosIntegral no contrato SQLite opt-in delimitadoUma Queue fornecida expõe até 50 registros reais, contagens pending/processing/failed/completed, retry/purge de falhas e purge de sucessos. SQLite apaga sucesso por padrão ou sqlite_with_completed_history retém explicitamente 1–100.000, muda status e poda na mesma transação; regressão atravessa driver, facade e HTTP Studio. Payload continua armazenado, logo acesso/retenção são política do host. Redis/custom inspection continua capability-specific e não fabrica snapshot.
STUDIO-05ER diagram é gerado automaticamente do schemaIntegral no escopo SQLx relacional delimitadoMetadata SQLite, PostgreSQL, MySQL e MariaDB é consultada com valores bindados; PK/FK/tipos alimentam Mermaid com identifiers normalizados, securityLevel: strict e estado indisponível explícito. Turso-primary e stores polyglot não fingem ser um schema SQLx relacional.
STUDIO-06Feature Flags Manager gerencia flags em tempo real via DbFeatureDriverIntegral no escopo in-process delimitadoA UI lê a mesma tabela rullst_feature_flags e alterna atomicamente a linha nomeada com valor bindado; depois de exatamente uma linha atualizada, avança um epoch constante que invalida imediatamente todas as instâncias DbFeatureDriver já aquecidas no processo. A regressão aquece por 60 s, alterna via HTTP e observa o novo valor sem esperar. Outros processos e writers diretos continuam no TTL sem pub/sub da aplicação; criar/editar rollout/variants não é parte da alegação delimitada.
STUDIO-07Environment & Config Viewer inspeciona configuração com segurançaIntegral no escopo delimitadoValores de ambiente usam redaction deny-by-default; somente uma allowlist pública aparece. A projeção do RullstConfig global mostra environment/port/driver e contagens/políticas não secretas, omitindo URLs, paths, cookies, tokens e credenciais.

Os dois itens que estavam abertos no roadmap histórico foram implementados depois desta classificação sem reescrever o snapshot: o profiler SQL usa somente labels redigidos de spans v1 autenticados e chama repetição de possível N+1; o inspetor Memory/Redis é metadata-only, mascara a chave por HMAC e não fornece conteúdo nem flush global. Esses limites são parte da capacidade v12 atual, não prova de diagnóstico perfeito ou administração remota segura.

O hardening Studio corrigiu ainda um falso positivo de teste: a antiga consulta SELECT * podia falhar ao mapear BOOLEAN do SQLite via SQLx Any e o erro era silenciosamente convertido em tabela vazia com HTTP 200. A projeção agora faz casts explícitos, propaga a falha e o teste exige os registros reais. A busca de metadata do ER deixou de interpolar nomes em SQL e a fronteira Mermaid deixou de aceitar identifiers brutos ou securityLevel: loose. A nova escrita local não reutiliza o router bruto como autoridade: sem a marker privada produzida pelo access middleware, o handler retorna 403 antes de consultar o banco.

Inventário item a item — rullst-security histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
SEC-01Honey instala traps e banimento DashMap com latência zeroParcial; absoluto não recomendadoHoneypotState usa rotas exatas, TTL/cardinalidade limitados e identidade do socket, com concorrência testada. Nenhum middleware pode prometer latência literalmente zero.
SEC-02Sanitizer cobre HTML/SVG e CSP nonce/anti-clickjackingIntegral no escopo delimitadoammonia preserva apenas o subconjunto HTML permitido e remove conteúdo/atributos inseguros; CspSecurityLayer gera nonce por request e os headers compartilham a mesma extensão. Isso não torna SVG arbitrário seguro.
SEC-03RBAC/ownership impede IDOR/BOLAIntegral como primitive explícitaRbacGuard, UserContext e authorize_owner_or_role cobrem role, owner e tenant em testes negativos. O host ainda deve instalar o guard antes de cada operação e filtrar queries pelo tenant.
SEC-04Audit log HMAC encadeado é tamper-proof e verificável offlineIntegral como cadeia tamper-evident delimitadaEncoding versionado/domain-separated, chave mínima, sequence/predecessor e HMAC são verificados. Durabilidade, exclusão, rollback do storage e âncora externa dependem do AuditLogger; “tamper-proof” absoluto foi removido.
SEC-05cargo rullst audit --ai encontra secrets/CVEs e produz recomendações AIParcialO comando executa heurísticas bounded e cargo audit quando disponível, falha diante de findings/check solicitado incompleto e oferece recomendações determinísticas. Exceções explícitas e estritamente validadas usam --audit-ignore; o resultado preserva os IDs como NO FINDINGS OUTSIDE EXCEPTIONS, nunca como ausência de findings. O nome legado --ai não chama um modelo nem substitui análise humana ou governança de exceções.
SEC-06Radar mostra vetores, reputação IP e incidentes AI liveParcialStudio/Nexus usam LiveSecurityEvent v1 e snapshots locais limitados, sem dados inventados. Reputação externa, feed versionado, persistência e investigação SOC não existem.
SEC-07Sentinel AI autônomo classifica ataques e emite Proof-of-WorkParcial; autonomia/AI não recomendadas sem evidênciaThreatClassifier classifica deterministicamente credential stuffing, API scraping e automação distribuída a partir de agregados confiáveis e thresholds transparentes. ProofOfWorkGate emite tokens HMAC aleatórios, subject-bound, expirantes, limitados e one-shot no processo, com corrida/replay/tamper testados. Não coleta tráfego, não usa IA, não atribui botnet, não bloqueia automaticamente e não fornece replay distribuído, acessibilidade ou garantia anti-DDoS.
SEC-08RASP bloqueia SQLi/XSS/traversal/SSRF/RCE/JNDI com latência zeroParcialURI, headers e corpos textuais/JSON bounded são inspecionados antes do handler e falham fechados quando um corpo declarado não pode ser examinado. Regras por substring não são parser completo e “zero latency” não é prometido.
SEC-09Vault impede heap dumps e oferece AES/ChaCha transparente no ORMParcialVaultSecret zeroiza seu buffer no drop e FieldEncryptor fornece AES-256-GCM versionado com AAD/keyring; o ORM possui encrypted fields nesse limite. Cópias/heap capture não podem ser impedidos e ChaCha20-Poly1305 não existe.
SEC-10Headers OWASP garantem nota A+Parcial por causa da garantia externaHSTS, CSP nonce, Permissions-Policy, COOP, COEP, CORP, XFO e nosniff são aplicados/testados. A nota depende de todas as respostas, conteúdo, TLS, proxy e configuração do deployment.
SEC-11Login tarpit 0–5 s e jail temporárioIntegral no escopo in-memory delimitadoLoginGuard limita identidades, expira estado, aplica progressão e jail; record_login_failure_and_wait executa o sleep para evitar que handlers apenas ignorem a duração. Estado distribuído continua externo.
SEC-12DLP de resposta garante zero vazamentoParcial; absoluto não recomendadoO middleware bounded mascara padrões documentados de PEM, AWS e URLs de banco em respostas textuais. Binários, encoding, padrões desconhecidos, streams maiores e outros sinks ficam fora.
SEC-13TOTP RFC 6238 com validator e QRIntegral no escopo delimitadoSecrets têm 160 bits gerados pelo RNG do SO, códigos são comparados em constant time e inputs fracos falham fechados; build_mfa_qr_svg gera QR SVG real e limitado a partir do URI de enrollment. Recovery/transação da aplicação é separado.
SEC-14Fingerprint liga sessão a JA3/JA4 e subnet automaticamenteParcialtry_generate_fingerprint exige chave de 32 bytes, IP válido, observações bounded e normaliza IPv4 /24/IPv6 /64. A biblioteca não coleta TLS/JA3/JA4 nem invalida a sessão do host automaticamente.
SEC-15Traps dinâmicos alimentam Threat RadarIntegral no escopo local delimitadoRegistro estrito recusa query/fragment/traversal/controles, limita 1.024 traps e o middleware emite evento local ao detectar path exato. Feed/SOC externo não é implícito.
SEC-16Schema Guard valida JSON/OpenAPI, pollution, overflow e bombsIntegral no escopo de body JSON explicitamente montadoO transporte exige media type JSON exato e recusa sintaxe inválida, duplicate keys recursivas, corpo acima de 2 MiB e profundidade acima de 32. JsonSchemaPolicy compila um schema 2020-12 ou um componente explícito de OpenAPI 3.1 com limites de bytes/nós/profundidade, somente refs locais, resolução externa desabilitada e regex linear; o middleware preserva o corpo válido e retorna 415/400/422 sem ecoar valores. Auth, ownership, regras de domínio e parâmetros query/header/form continuam contratos separados.
SEC-17Log redactor suprime secrets antes de todo tracingParcialBearer repetido, assignments query/JSON, PEM, AWS e DSNs são redigidos e testados. redact_secrets precisa ser chamado ou integrado ao formatter pelo host; depender da crate não instala filtro global.
SEC-18CSWSH valida Origin, CSRF ticket e cifra framesParcialA política normaliza e compara Origin/Host/porta ou allowlist explícita, recusando origens enganosas e missing origin por padrão. Ticket CSRF e criptografia application-level de frames não existem; TLS continua obrigatório.
SEC-19SRI calcula SHA-384 e injeta tags automaticamenteIntegral no escopo explícito delimitadoHelpers geram tags escapadas a partir de bytes ou arquivos locais de até 64 MiB. O host escolhe assets e inclui as tags; não há descoberta/rewrite global do pipeline.
SEC-20SIEM transmite para Datadog/Splunk/Elastic/Slack/SyslogParcialCEF possui escaping contra field/line injection e DurableSiemSpool preserva o formato local unsigned. O novo AuthenticatedSiemSpool encadeia sequência, key_id, predecessor e payload exato com HMAC-SHA256, mantém um ativo mais sete históricos em memória zeroizing e falha fechado para forgery, chave errada/ausente, reorder, remoção interna, quota, symlink e alteração externa. Continua single-process; rollback de uma cauda inteira exige checkpoint confiável separado, e não há transport, compaction, retry, ack, backpressure, dead-letter ou adapter dos providers nomeados.
SEC-21CLI IDOR/BOLA verifica ownership em rotas parametrizadasParcialO scanner exige classificação adjacente com motivo e evidência reconhecida de owner/role/admin, inclusive Axum multiline, e retorna exit não zero. É heurística source-level, não data-flow/AST completo nem prova de query ownership.
SEC-22Cargo Geiger garante 100% memory-safe/zero unsafeParcial; absoluto não recomendadoO auditor faz scan bounded da source e --geiger exige ferramenta presente e exit bem-sucedido. Dependências/FFI e branches não executados impedem garantia universal; unsafe justificado exige política explícita.
SEC-23Fuzzing contínuo prova zero panicParcial; absoluto não recomendadoHá targets cargo-fuzz e loops determinísticos para RASP/DLP/sanitizers. Evidência pertence ao corpus, tempo, build e SHA executados, não a todas as entradas/dependências.
SEC-24Compliance exporter avalia OWASP/SOC2/HIPAA/ISOParcial; certificação não recomendadaO report lista resultados, erros e NOT CHECKED, e declara controles não avaliados. Certificação e controles organizacionais/operacionais exigem escopo, evidência externa e assessor autorizado.
SEC-25Timing guard elimina user enumerationParcial; absoluto não recomendadoPadding mínimo, jitter e synthetic work reduzem diferenças grosseiras. Scheduler, rede, cache, CPU e análise estatística continuam fora; handlers devem proteger todos os caminhos equivalentes.
SEC-26Firewall LLM bloqueia jailbreak, leak e indirect injectionParcialInspeção recursive cobre prompt/messages/content, unicode invisível, delimiters e padrões documentados; JSON declarado inválido falha fechado e payload grande retorna 413. É heurística com possíveis falsos positivos/negativos.
SEC-27Exporta SBOM CycloneDX 1.5Integral no escopo Cargo delimitadoO CLI parseia Cargo.lock como TOML, emite UUID URN válido, bom-ref único, purl e checksum SHA-256 válido quando presente. Isso não é attestation, assinatura ou análise de vulnerabilidade.
SEC-28Scanner de rede prova nenhum leak em 0.0.0.0ParcialProbes loopback e heurísticas em source/.env/ss disponível reportam listeners unspecified e retornam falha. Containers, proxy, firewall, namespaces, UDP e reachability externa precisam de observação própria.
SEC-29Stress concorrente prova ausência de racesParcial; absoluto não recomendadoSuites multi-thread exercitam rate limit, honey, login e audit chain. Elas não enumeram todos os interleavings nem testam automaticamente Redis/failover distribuído.
SEC-30Git hooks garantem zero lint/unsafe/IDORParcialO instalador é idempotente, preserva/chains hooks e executa fmt, Clippy workspace/all-features/all-targets e o scanner fail-closed de unsafe/IDOR. Hooks podem ser ignorados e as análises são bounded; CI/review permanecem autoridade.
SEC-31Doctor verifica MSRV e ferramentas de segurançaIntegral como diagnóstico delimitadoO doctor agora parseia de fato rustc, exige ≥1.96.0, verifica fmt/Clippy/audit/geiger/deny/Kani e não chama autofix de sucesso sem confirmar status e disponibilidade. Ferramentas opcionais ausentes são reportadas, não instaladas silenciosamente.
SEC-32Toda criptografia/rede é 100% Pure Rustls sem OpenSSLParcial; absoluto não recomendadoPaths first-party HTTP/SQLx selecionam Rustls quando suportado. Uma garantia sobre todas as features e dependências transitivas exige inventário por lockfile/target; Rustls tampouco prova memory safety de todo o grafo.

O lote Security acrescentou hardening verificável sem inventar integrações: inputs de fingerprint/traps/MFA passaram a falhar fechados, o Schema Guard recusa JSON inválido/chaves duplicadas e aplica uma política 2020-12/OpenAPI 3.1 explicitamente montada sem resolução externa, o redator cobre valores repetidos e JSON, o firewall alcança prompts aninhados e o Login Guard oferece uma API que aplica o atraso. O QR de MFA e o SRI file-backed são artefatos reais; o SBOM e o doctor deixaram de aceitar identificadores/versões apenas aparentes. No gate focado passaram 129 testes unitários e 36 testes de integração, robustez e concorrência em rullst-security, além de 148 testes de biblioteca no CLI e Clippy estrito nos dois pacotes. Isso continua sendo evidência local do worktree; Redis distribuído, providers, certificação e deployment exigem suas próprias provas.

Inventário item a item — rullst-orm histórico

IDAlegação histórica deduplicadaClassificação atualEvidência e limite
ORM-01Orm::transaction envolve operações com commit/rollback automáticoIntegral no escopo executor-aware delimitadopool.rs, save_with_tx e CURRENT_TX cobrem operações geradas/execute_query!; regressões verificam que uma linha do caminho de erro realmente desaparece. SQL bruto que usa diretamente Orm::pool() não adere magicamente à transação e deve usar o handle/executor fornecido.
ORM-02Collections oferecem map, pluck e key_byIntegral no escopo delimitadocollection.rs implementa e testa esses helpers e operações adicionais sobre Vec<T>. É uma extensão em memória, não um cursor de banco.
ORM-03Macros verificam colunas SQL em compilaçãoIntegral no caminho tipado delimitadoCampos geram enum e métodos por nome; filtros de String, i32, f64 e bool agora exigem o tipo persistido na assinatura, de modo que valor incompatível não compila. Builders por string, conversões customizadas, SQL dinâmico/raw e schema live continuam runtime-checked/caller-owned e não são descritos como equivalentes a query!.
ORM-04Relações polimórficas morphTo, morphMany e morphOneIntegral no contrato tipado delimitadoA derive gera lazy/constrained/batched eager loading para morph_many, morph_one e alvos inversos explícitos morph_to. A inversa valida em macro expansion o ID persistido e o discriminador String, retorna None para outro tipo e suporta vários alvos declarados; não existe registry universal, tipo desconhecido implícito ou relação polyglot.
ORM-05Factories/seeders possuem API fluente de dados fakeIntegral no escopo delimitadoCada model recebe factory make/create com count; Seeder e Orm::seed executam registros fornecidos pela aplicação. Rullst não inventa faker/domain data automaticamente.
ORM-06Many-to-many possui suporte de pivotIntegral no escopo delimitadobelongs_to_many gera lazy/constrained load e eager loading em duas consultas, com identifiers validados. Escrita/metadata extra do pivot continuam explícitas.
ORM-07Paginação retorna dados e metadataIntegral no escopo delimitadopaginate calcula total/last/current page, normaliza página zero e agora recusa per_page = 0; matrizes relacionais exercitam a consulta. É paginação por offset.
ORM-08#[orm(json)] faz casting JSON tipadoIntegral no escopo delimitadoJson<T> fornece encode/decode e integração SQLx para os backends suportados, com testes de round-trip. Evolução/versionamento do schema JSON pertence à aplicação.
ORM-09Eager loading aceita closures restritivasIntegral no escopo delimitadoMétodos with_<relation>_constrained aplicam uma closure do builder antes da consulta em lote. O escopo segue as relações geradas, não expressões relacionais arbitrárias.
ORM-10CLI gera, executa, mostra status e reverte migrationsIntegral no escopo delimitadocargo-rullst, run_artisan_with_args e o perfil Turso cobrem generate/migrate/status/rollback. O runner SQLx agora registra cada migration logo após seu sucesso, evitando reaplicação quando uma posterior falha; DDL transacional varia por backend.
ORM-11Observers/lifecycle events podem ouvir create/save/delete externamenteIntegral no escopo process-local delimitadoA derive cria registry por model e callbacks async de saving/creating/updating/deleting e pós-operação. O novo callback committed recebe snapshot próprio apenas após commit de save/delete gerado direto ou Orm::transaction; os callbacks tradicionais continuam lifecycle síncrono à mutação. Não é bus durável ou distribuído.
ORM-12Subqueries e joins avançados aceitam closuresIntegral no escopo delimitadoCTE/subquery e JoinClause existem; joins agora propagam erros da closure e recusam tabela/coluna/operador fora da allowlist. Fragmentos com sufixo raw continuam escape hatch explícito.
ORM-13db:seed popula dados via seeders/factoriesIntegral no escopo delimitadoO CLI encaminha ao binário da aplicação e Orm::seed executa seeders registrados em ordem, propagando erros. Registro, idempotência e dataset pertencem à aplicação.
ORM-14Query logging permite inspecionar SQLIntegral no escopo delimitadoToggle global imprime SQL gerado e contagem de parâmetros, sem valores de bindings. Subscriber estruturado, sampling e export não estão implícitos.
ORM-15#[orm(hidden)] omite automaticamente campos de toda serializaçãoParcialO to_json gerado exclui campos hidden e testes cobrem o contrato. #[derive(Serialize)] separado continua vendo o struct original e precisa de sua própria política Serde.
ORM-16Edge/read replicas dividem SELECT local e write primary transparentemente, inclusive Turso com 1 msParcial; latência absoluta não recomendadainit_with_replicas publica estado atomicamente, reads gerados usam round-robin e writes usam primary. Não há health/failover/consistência configurável nem sincronização Turso transparente; 1 ms depende da topologia.
ORM-17Chunking/cursors processam milhões sem carregar tudoIntegral no escopo keyset delimitado.chunk_by_id(size, ...) e chunk_by_id_with_tx percorrem o id: i32 ascendente com id > cursor, recusam zero e propagam erro do callback. A regressão apaga cada linha já processada e ainda visita todos os IDs sem salto. .chunk(...) preserva compatibilidade por offset; não se promete cursor do servidor, snapshot cross-shard nem término sob inserção concorrente ilimitada.
ORM-18Queries expõem futures::StreamIntegral no escopo delimitadostream/stream_with_tx usam fetch do SQLx e aplicam decriptação/hook por linha. O consumidor ainda define backpressure, timeout total e cancelamento.
ORM-19.remember(seconds) fornece cache Redis integradoParcialA feature Redis usa chave SHA-256 versionada com namespace validado de aplicação, tenant opaco, tabela, SQL e bindings tipados; TTL zero é recusado e transações explícitas/task-scoped sempre ignoram cache. Save/delete gerado invalida após commit as chaves do tenant ativo/tabela com scan limitado; rollback as preserva. Configuração ausente falha fechada, enquanto falha de comando ou JSON corrompido usa o banco autoritativo. Gate live pinado cobre hit, TTL, recovery, bypass e invalidação. Raw/bulk writes, Redis cluster/failover e coerência distribuída continuam fora.
ORM-20Hooks reativos/webhooks/cache só disparam depois de commit confirmadoParcial; limites process-local e outbox explícito implementadosafter_commit, observer committed, invalidação/pub-sub Redis e Scout usam o commit de save/delete gerado direto ou Orm::transaction; rollback descarta callbacks, todos são tentados e PostCommit distingue falha posterior à persistência. O novo Outbox opt-in grava evento idempotente com a mutação e oferece claim com lease/token, retry e dead-letter em SQLite/PostgreSQL/MySQL/MariaDB. Ele não converte hooks automaticamente, não fornece dispatcher/webhook, autorização tenant, cleanup ou exactly-once; consumidores continuam idempotentes. Transação SQLx crua precisa usar enqueue_with_tx.
ORM-21Todos os findings críticos/médios de auditoria antiga foram resolvidosParcial; absoluto não verificávelGates atuais e esta campanha corrigem findings reproduzíveis, mas não há artefato imutável completo da auditoria Jules/Antigravity que sustente “todos” para o código atual.
ORM-22Criterion prova overhead desprezível contra Diesel/SeaORMIntegral como harness; conclusão histórica refutada/não recomendadaorm_comparison.rs fixa Diesel/SeaORM, usa drivers SQLite tipados, uma conexão por ORM, arquivos separados e schema/índice/100 linhas/política SQLite/operações equivalentes para find, filtro, count, list-ten e insert/delete; CI publica todos no mesmo runner/commit. O primeiro smoke local mostrou Diesel à frente nos cinco casos e Rullst competitivo com SeaORM nas leituras, portanto a alegação “desprezível” é contradita em vez de promovida. Isso não mede rede, concorrência, memória, cauda ou aplicações completas.
ORM-23OpenTelemetry cobre queries, transactions e pool checkoutIntegral no contrato de telemetria delimitadoQueries geradas/raw e streams emitem spans rullst.orm.query com modelo/tabela/operação estáticos, sem SQL, bindings, valores, DSN ou erros; transações registram begin e outcomes delimitados; todo pool criado por Orm::init*, inclusive réplicas, emite timing de checkout. O layer OpenTelemetry opt-in de Core exporta esses sinais quando inicializado. Subscriber, sampling, segurança/retenção do collector, pools SQLx criados pela aplicação e logs SQLx configurados separadamente continuam pertencendo ao host.
ORM-24Orm::raw(...).map_to<T>() preserva type safetyParcialO mapper exige FromRow<T> e valores passam por .bind, mas texto/colunas/tipos do SQL são validados somente em runtime. É escape hatch caller-owned.
ORM-25Multi-tenancy injeta tenant e exige unscoped() para acesso globalIntegral no escopo relacional delimitadoModelos tenant_column agora falham fechados sem with_tenant, validam campo/tipo em macro expansion, escopam queries e protegem save/partial/delete/restore/force-delete contra instância cross-tenant. unscoped() é explícito; autenticação/autorização para usá-lo pertence ao host.
ORM-26Auto migration aditiva lê structs e garante segurançaParcialmake:migration:auto compara AST e SQLite, gerando tabelas/colunas. Tipos são simplificados, Turso/Postgres/MySQL não têm esse diff e garantia universal de segurança não existe.
ORM-27Auto migration destrutiva sincroniza tudo sob --allow-destructive/safe defaultParcialColunas/tabelas removidas aparecem apenas como SQL comentado no diff SQLite. Não há flag de execução, plano tipado completo, backup ou prova de rollback.
ORM-28Prevent-lazy-loading elimina completamente N+1Parcial; absoluto não recomendadoMétodos de relação gerados retornam erro quando o toggle está ativo; eager loading em lote cobre relações suportadas. Código SQL/raw/repository da aplicação ainda pode gerar N+1.
ORM-29Dirty checking automático atualiza só campos alterados sem overheadParcialupdate_partial() é builder typed explícito, atualiza apenas setters escolhidos e agora não contorna policy/tenant. Ele não detecta automaticamente mutações anteriores nem possui prova zero-overhead.
ORM-30PersonalData + SecretString AES impedem leakage e entregam GDPR/LGPDParcial; compliance automático não recomendadoPersonalData descreve fields, SecretString redige Debug e encrypted model fields usam AES-256-GCM versionado/AAD/keyring. SecretString sozinho não cifra; acesso, retenção, consentimento e demais controles são externos.
ORM-31Audit revisions registram quem/o quê e permitem rollbackIntegral no escopo relacional delimitado#[orm(auditable)] exige AuditContext tipado, deriva o tenant ativo, registra correlação e persiste create/update/delete com payload recursivamente redigido no mesmo savepoint da mutação. Updates v2 bounded expõem restore compensatório com referência/reason, validação exata de model/ID/tenant, lock de linha PostgreSQL/MySQL e recusa de estado stale, segredo, legado, create/delete, malformação ou excesso. Migração v1→v2 e callbacks capturados após falha têm regressões. Bulk por linha, backup/DR, autoridade do principal fornecido pelo host e export externo durável continuam fora.
ORM-32Scout sincroniza Meili/Algolia/Elastic automaticamenteParcial; adapters delimitados implementadosscout-http fornece update/delete/search para Meilisearch, Elasticsearch e Algolia com URLs/recursos limitados, mock determinístico e erros de busca visíveis. Projeções geradas rodam após commit e propagam PostCommit. Meilisearch passa lifecycle real pinado; Elastic/Algolia passam fixtures de protocolo, não contas hospedadas. Sync gerado continua process-local; durabilidade exige Outbox explícito e worker idempotente.
ORM-33RefreshDatabase envolve teste em transação e rollbackIntegral no escopo executor-aware delimitado#[rullst_orm::test] inicializa ORM, abre/scopa transaction e faz rollback após o corpo. SQL que ignora o executor e usa conexão própria continua responsabilidade do teste.
ORM-34Model policies ligam autorização declarativa ao modelParcialCreate/update/delete/restore/force-delete chamam a policy e partial update deixou de contorná-la. Reads, principal, ownership e tenant authorization não são inferidos pela crate.
ORM-35ORM Admin é drop-in e gerencia dadosParcialdashboard_html é apenas uma shell estática. CRUD administrativo autenticado/fail-closed é responsabilidade da crate Nexus, não dessa função.
ORM-36API Resources/Transformers geram JSON limpoIntegral no escopo explícito delimitadoApiResource, JsonResource e ResourceCollection aplicam transforms definidos pela aplicação e possuem testes de coleções/nesting. Datas e relações não são inferidas magicamente.
ORM-37Relações SQL viram travessia distribuída automática via recursive CTEParcialBuilders oferecem CTE/recursive CTE manual. Não existe compilador de friends.of.friends, distribuição cross-node ou mapeamento automático da relação.
ORM-38Qdrant e Redis native data structures são first-classIntegral no contrato especializado delimitadoqdrant oferece coleção dense-cosine, upsert/delete e nearest-neighbor bounded com mock, fixture autenticada e lifecycle live pinado. redis oferece Hash, Set e Sorted Set namespaced, bounded, TLS-required fora do loopback, mock determinístico e lifecycle live com isolamento. Named/sparse/multivectors, filtros Qdrant arbitrários, Redis Lists/Streams, cluster/failover e autorização tenant continuam fora.
ORM-39CLI gera Mermaid ER diagram dos modelsIntegral no escopo estático delimitadogenerate:diagram parseia models e relações e emite diagram.md; não consulta automaticamente constraints live nem schemas polyglot.
ORM-40Soft delete em cascata é recursivo/automáticoParcialRelações has_one/has_many marcadas geram cascade. delete() agora abre transação quando necessário e reutiliza transação explícita/task-scoped; um trigger SQLite força falha no filho e prova rollback do pai. Descendentes recursivos, ciclos/profundidade arbitrária e efeitos externos estritamente post-commit ainda não são tratados.
ORM-41Rust enum mapeia a ENUM nativa de PostgreSQL/MySQL ou constraint SQLiteIntegral no contrato de perfil delimitadoderive(Enum) valida uma lista fechada de até 64 labels portáveis e gera metadata, string/parse, Serde, RullstValue e codecs SQLx coerentes. native_enum cria e compara exatamente um tipo nomeado no PostgreSQL com strict-postgres, emite ENUM inline no MySQL/MariaDB e TEXT CHECK no SQLite; matrizes live cobrem encode/decode, valor inválido e drift. PostgreSQL por SQLx Any falha antes do DDL porque o driver não decodifica custom types. Evolução/reordenação de variantes, ordem de deployment, remoção de dependências/tipo e rollback continuam migrations explícitas.
ORM-42Database-first introspection gera models de bancos legadosIntegral no escopo delimitadoCLI consulta metadata de SQLite/PostgreSQL/MySQL (MariaDB pelo protocolo), valida identifiers/collisions antes de escrever e gera structs. Relações, índices, defaults e tipos proprietários não têm paridade completa.
ORM-43pgvector/RAG tem where_similar/ordenação nativosIntegral no contrato pgvector delimitadopgvector + strict-postgres expõe Vector tipado e helpers L2/cosseno/inner-product com vetor/distância bindados; a ordem dos bindings independe da ordem de chamadas do builder. A matriz live pinada instala a extensão, insere valores tipados e executa filtros/ordenação. Orchestration RAG, tenant/application authorization, lifecycle produtivo de índice e tuning ANN continuam explícitos.
ORM-44ORM Sail escreve e inicia ambiente Docker zero-setupParcialsail:install escreve Compose para Postgres/Redis/Meilisearch/pgAdmin e testa o artefato. Não inicia Docker, não inclui o app e ainda exige configuração/pré-requisitos locais.
ORM-45Turso recebe suporte nativo completoIntegral no contrato Turso-primary delimitadoTransporte direto pelo protocolo oficial Hrana HTTP v3, SQL parametrizado, batch transacional atômico, migrations checksummed e derive typed CRUD/filter/order/paginate passam em fallback SQL real e servidor libSQL. Relações/hooks/auto-diff/seeds, replica sync e paridade com todo blueprint SQLx continuam explicitamente fora.

O inventário deduplicado está agora 190/190 (100%) classificado, mas o resultado honesto não é “190 funcionalidades prontas”. Neste lote ORM há 28 contratos/evidências integrais delimitados e 17 fundações parciais: 62,2% estrito ou 81,1% ponderado atribuindo metade do peso aos parciais. O benchmark comparativo conta como evidência entregue, não como confirmação da antiga conclusão de performance, que seus primeiros resultados contradizem. O hardening associado fechou o bypass tenant/policy em mutações, operadores de join injetáveis, inputs inválidos de paginação/chunk/vector e o tracking de migration anterior a uma falha posterior. O keyset chunking também impede offset drift quando o callback remove linhas já processadas. Os gates focados e o cache .remember deixou de atravessar a fronteira transacional, ganhou isolamento application/tenant sem expor o tenant bruto e invalidação por tabela após commit, preservada em rollback. O contrato after_commit também separa falha do efeito posterior à persistência. O Outbox relacional opt-in agora acrescenta durabilidade at-least-once verificável sem fingir que callbacks arbitrários podem ser serializados automaticamente ou entregues exactly-once. Os gates focados e o trifecta final continuam sendo registrados como evidência do worktree, nunca como certificação de uma aplicação ou deployment.