Lacunas — canta-igreja
Gerado pelo Revisor (Reversa) em 2026-05-11
doc_level: detalhado — categorizado por severidade: crítico / moderado / cosmético
Crítico — bloqueia reimplementação segura
GAP-01 · biblioteca/baixar-obra · Bug: disableExemplarObra com parâmetros vazios
Arquivo: src/repository/BibliotecaRepository.ts:195
Evidência:
await Banco.execute(this.disableExemplarObra.query, []);
// Query: UPDATE exemplar_biblioteca SET ativo=false WHERE id_obra=? and ativo
Problema: O placeholder ? nunca recebe o valor de id_obra. O comportamento resultante depende do driver SQLite — pode ser bind nulo (o que faria a cláusula WHERE id_obra=NULL não casar com nenhuma linha) ou erro em runtime. Em todo caso, o comportamento diverge da intenção declarada de desativar apenas o exemplar daquela obra específica.
Impacto na spec: biblioteca/baixar-obra/requirements.md — RF-04 ("Registrar exemplar e desativar o anterior") está documentado como 🟢 mas a implementação não confirma a intenção.
Pergunta relacionada: questions.md → Pergunta 1
Status: 🟢 respondida e confirmada como bug já corrigido no legado
GAP-02 · livros/listar-livros · Bug: LivrosSelect.allIds → it.repertorios.ids
Arquivo: src/store/Livros/Livros.selector.ts:12
Evidência:
static readonly allIds = (it: RootState) => it.repertorios.ids;
Problema: O seletor allIds do slice de Livros retorna IDs do slice de Repertórios. A LivrosScreen usa este seletor para popular a FlatList, resultando em exibição de IDs incorretos (ou tela vazia se os slices têm formatos diferentes).
Impacto na spec: livros/listar-livros/requirements.md — RF-01 ("Exibir lista de edições de livros") está comprometido. A tarefa de correção não existe em tasks.md.
Pergunta relacionada: questions.md → Pergunta 2
Status: 🟢 respondida e confirmada como bug já corrigido no legado
GAP-03 · liturgia/exibir-liturgia · LACUNA: LeituraDiaView não analisado
Arquivo: src/view/fragment/Musica/LeituraDia/LeituraDiaView.tsx
Problema: O componente responsável por toda a renderização de liturgia (estados de loading, vazio e erro) não foi lido durante a extração. Os requisitos RF-02, RF-03 e RF-04 de exibir-liturgia foram inferidos a partir de LiturgiaDoDiaScreen.tsx e da estrutura RTK Query, mas não foram confirmados no código de apresentação.
Impacto na spec: liturgia/exibir-liturgia/requirements.md — RF-02, RF-03, RF-04 estão como 🟡. Podem estar ausentes ou divergentes na UI real.
Pergunta relacionada: questions.md → Pergunta 3
Status: 🟢 respondida e confirmada no código (LeituraDiaView lida)
Moderado — afeta completude mas não bloqueia reimplementação
GAP-04 · livros/listar-livros · Contradição entre RF-04 e Gherkin
Arquivo: docs/reversa/livros/listar-livros/requirements.md
Problema: RF-04 (prioridade Should) afirma "Não recarregar lista se livros já estão no store", mas o critério de aceitação Gherkin correspondente afirma "dispatch de carregar é re-executado (não há guard de idempotência no carregar geral)". O RF descreve o comportamento desejado, enquanto o Gherkin descreve o comportamento atual. Essa distinção está implícita mas pode confundir durante reimplementação.
Recomendação: Separar explicitamente "comportamento atual" de "comportamento desejado" ou ajustar o RF para documentar o bug como dívida técnica.
Status: 🟡 sem pergunta pendente — cabe ao desenvolvedor decidir a prioridade
GAP-05 · livros/edge-cases.md EC-02 · carregarLivro sem handler rejected
Arquivo: src/store/Livros/Livros.reducer.ts
Problema: O thunk carregarLivro pode ser rejeitado (ID inexistente) mas não há handler .addCase(rejected) documentado. A UX para este cenário (tela em branco, loop de loading, navegação de volta) é desconhecida.
Pergunta relacionada: questions.md → Pergunta 5
Status: 🟡 aguardando confirmação
GAP-06 · repertorios/edge-cases.md EC-04 · ordem_musicas dessincronizada
Arquivo: src/model/repertorio/Repertorio.ts + queries de leitura
Problema: O comportamento quando ordem_musicas referencia um id_item_repertorio inexistente não está documentado. Sem sanitização confirmada, uma reimplementação pode assumir que todos os IDs são válidos.
Pergunta relacionada: questions.md → Pergunta 7
Status: 🟡 respondida: sem tratamento defensivo; risco mantido
GAP-07 · Units com cobertura reduzida (auth, configuracoes, youtube-player)
Unidades afetadas:
auth/autenticar/requirements.md— sem tabela RF completa, sem Gherkinauth/deslogar/requirements.md— sem tabela RF, sem Gherkinconfiguracoes/alterar-tema/requirements.md— sem tabela RF, sem Gherkinconfiguracoes/alterar-configuracoes-musica/requirements.md— sem tabela RF, sem Gherkinyoutube-player/modo-mini/requirements.md— sem tabela RF, sem Gherkin
Problema: Estas units têm regras de negócio extraídas corretamente mas carecem da estrutura completa (tabela RF + critérios Gherkin) esperada para doc_level: detalhado. O conteúdo presente é correto, mas a rastreabilidade para testes de aceitação está incompleta.
Recomendação: Expandir as units ou confirmar que a cobertura atual é suficiente para os objetivos do projeto.
Status: 🟡 sem pergunta pendente — cabe ao desenvolvedor decidir
GAP-08 · youtube-player/modo-mini · resetPosition sem gatilho confirmado
Arquivo: src/view/fragment/Youtube/useMiniPlayerDrag.ts — lido parcialmente
Problema: A regra "resetPosition restaura posição inicial ao voltar para modo full" está marcada como 🟡. Não foi confirmado quais eventos disparam o reset (rotação, troca de música, apenas retorno ao full).
Pergunta relacionada: questions.md → Pergunta 4
Status: 🟡 aguardando confirmação
GAP-09 · biblioteca/edge-cases.md EC-01/EC-02 · Arquivo parcial em cache após falha
Arquivo: src/service/ObraService.ts
Problema: Em falha de rede durante download (EC-01) ou fechamento abrupto do app (EC-02), o arquivo .db parcialmente baixado permanece no cachePath. Não há limpeza documentada do arquivo corrompido. Uma reimplementação pode assumir que o cache é sempre consistente.
Status: 🟡 sem pergunta pendente — comportamento atual documentado como risco no edge-cases.md
Cosmético — não afeta funcionalidade nem reimplementação
GAP-10 · musicas · informacoes (campo JSON livre) — uso futuro não documentado
Arquivo: musicas/requirements.md, musicas/visualizar-musica/requirements.md
Problema: O campo informacoes (v9, JSON livre) existe no schema mas não é exibido na UI. Documentado como "campo de extensão futura" (🟡). Não há roadmap ou placeholder de uso.
Status: 🟡 aceitável como dívida de produto
GAP-11 · configuracoes · Tema.SISTEMA comentado
Arquivo: src/store/ui/Configuracoes/Configuracoes.types.ts — comentado
Problema: A opção SISTEMA (tema automático pelo SO) está comentada no enum Tema. A spec menciona isso como 🟡. Não está claro se é feature planejada ou descartada.
Status: 🟡 aceitável como dívida de produto
GAP-12 · musicas/busca-musicas EC-03 · Índices alfanuméricos não reconhecidos
Arquivo: src/repository/musicas/MusicasRepository.ts — parseInt(termo)
Problema: Hinários com índices alfanuméricos (ex.: "23a", "S-1") não são reconhecidos pela estratégia porIndice. A busca textual pode ou não encontrá-los dependendo do conteúdo.
Status: 🟡 comportamento atual documentado — é limitação conhecida, não bug
Sumário de Lacunas
| ID | Módulo | Severidade | Status |
|---|---|---|---|
| GAP-01 | biblioteca/baixar-obra | Crítico | 🟢 resolvido |
| GAP-02 | livros/listar-livros | Crítico | 🟢 resolvido |
| GAP-03 | liturgia/exibir-liturgia | Crítico | 🟢 resolvido |
| GAP-04 | livros/listar-livros | Moderado | 🟡 sem pergunta |
| GAP-05 | livros/edge-cases | Moderado | 🟡 Pergunta 5 |
| GAP-06 | repertorios/edge-cases | Moderado | 🟡 respondida |
| GAP-07 | auth, configuracoes, yt-player | Moderado | 🟡 sem pergunta |
| GAP-08 | youtube-player/modo-mini | Moderado | 🟡 Pergunta 4 |
| GAP-09 | biblioteca/edge-cases | Moderado | 🟡 sem pergunta |
| GAP-10 | musicas | Cosmético | 🟡 sem pergunta |
| GAP-11 | configuracoes | Cosmético | 🟡 sem pergunta |
| GAP-12 | musicas/busca | Cosmético | 🟡 sem pergunta |