Skip to content

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.allIdsit.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 Gherkin
  • auth/deslogar/requirements.md — sem tabela RF, sem Gherkin
  • configuracoes/alterar-tema/requirements.md — sem tabela RF, sem Gherkin
  • configuracoes/alterar-configuracoes-musica/requirements.md — sem tabela RF, sem Gherkin
  • youtube-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.tsparseInt(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