# Registro Master de Bugs, Vulnerabilidades e Dívidas Técnicas

> **Data:** 2026-10-21
> **Escopo:** plataforma legada do portal municipal — `v5/` (Laravel 5.5.50 / PHP 7.2.34) e `v6/` (mesma stack, com módulos novos)
> **Fontes:** os 66 dossiês `dossie_modules/*/08-GAPS-E-DIVIDAS.md`, os relatórios já verificados
> `15-SEGURANCA-INJECAO-SQL.md` e `16-AUTORIZACAO-ROTA-SEM-AUTENTICACAO.md`, e
> `dossie_modules/_00_panorama/08-GAPS-E-DIVIDAS.md`.
> **Método:** cada item foi conferido contra o código-fonte antes de entrar neste registro.
> A evidência é sempre `arquivo:linha` da versão citada. Itens que não se confirmaram
> estão na §5.
> **Finalidade:** backlog priorizado para a reconstrução em PHP 8.x + Laravel 11/12 (`v7`).
> **Total:** 204 itens — 179 no lote principal + 25 do último lote de dossiês
> (2 críticos, 16 altos, 7 médios), detalhados em `17d-DETALHAMENTO-BUGS-G6.md`.

---

## 1. Como ler este registro

| Severidade | Critério |
|---|---|
| **Crítica** | Explorável por visitante anônimo, ou perda/corrupção silenciosa de dados em produção. Bloqueia o rebuild. |
| **Alta** | Quebra funcionalidade do CMS/portal ou expõe dado sensível a usuário não autorizado. |
| **Média** | Funcionalidade degradada, inconsistência de dados ou dívida que gera retrabalho na v7. |
| **Baixa** | Code smell, texto errado, código morto. Não bloqueia nada. |

**Categorias:** `SEC` (segurança) · `DATA` (dados/integridade) · `FUNC` (funcional) ·
`PERF` (performance) · `UX` (UX/Admin) · `MIG` (migração/build).

> **IDs:** `BUG-<CAT>-<nnn>`, estáveis. Um bug relatado em vários módulos é **um** item,
> com todas as ocorrências listadas em "Onde".

---

## 2. Tabela-resumo

| BUG-DATA-001 | Crítica | DATA | ouvidoria | `OmbudsmanRequestController@update` altera **sempre o primeiro registro** | `v6/app/Http/Controllers/Prefecture/OmbudsmanRequestController.php:50` |
| BUG-DATA-002 | Crítica | DATA | licitacoes | Exclusão de anexo apaga o arquivo errado (busca pelo id da licitação) | `v6/app/Http/Controllers/Prefecture/Bidding/BiddingController.php:292` |
| BUG-DATA-003 | Alta | DATA | licitacoes | Coluna `contracts.agent` (filtro por responsável) removida na v6 | `v6/app/Http/Model/Prefecture/Contract.php:24` |
| BUG-DATA-004 | Alta | DATA | arquivo/drive | Tabela `archive_categories` e coluna `archives.category_id` removidas na v6 | `v5/database/migrations/2025_10_16_105153_create_archive_categories_table.php:12` |
| BUG-DATA-005 | Alta | DATA | diario-oficial | Chave privada do certificado (`pkey`) gravada em texto claro no banco | `v6/app/Http/Controllers/Prefecture/DiarioCertificadosController.php:58` |
| BUG-DATA-006 | Alta | DATA | diario-oficial | Estado `generation_status = 'pending'` gravado sem nenhum consumidor | `v6/app/Http/Controllers/Prefecture/DiarioController.php:259` |
| BUG-DATA-007 | Alta | DATA | enquetes | Voto aceito em enquete encerrada ou em rascunho | `v6/app/Http/Controllers/Portal/SurveyController.php:91` |
| BUG-DATA-008 | Alta | DATA | enquetes | Sem unicidade — mesmo voter pode votar indefinidamente | `v6/database/migrations/2022_01_17_100753_create_survey_results_table.php:17` |
| BUG-DATA-009 | Alta | DATA | enquetes | Voto aceito com `survey_answer_id` pertencente a outra enquete | `v6/app/Http/Controllers/Portal/SurveyController.php:97` |
| BUG-DATA-010 | Alta | DATA | formularios-dinamicos | `published_at` gravado em formato de 12 horas (`h:i:s A`) | `v6/app/Http/Model/Prefecture/DynamicForms/Questionnaire.php:43` |
| BUG-DATA-011 | Alta | DATA | formularios-dinamicos | `required_if` aponta para campo inexistente (`style` em vez de `ask_type_id`) | `v6/app/Http/Requests/Prefecture/DynamicForms/Questionnaire/SaveRequest.php:56` |
| BUG-DATA-012 | Alta | DATA | obras | `SaveRequest` sobrescreve o `id` do formulário com `null` (parâmetro de rota errado) | `v5/app/Http/Requests/Prefecture/Works/SaveRequest.php:80` |
| BUG-DATA-013 | Alta | DATA | noticias | `scopeByStatusNoticias` retorna **dentro** do `foreach` — filtra só o primeiro item | `v6/app/Http/Model/Prefecture/Content.php:145` |
| BUG-DATA-014 | Alta | DATA | noticias | Escopo de categoria grava filtro na sessão; só a rota AJAX limpa | `v6/app/Http/Model/Prefecture/Content.php:216` |
| BUG-DATA-015 | Alta | DATA | obras | `update()` cria obra nova quando o id da URL não existe | `v5/app/Http/Controllers/Prefecture/Works/WorkController.php:213` |
| BUG-DATA-021 | Alta | DATA | transparencia-fiscal | `InformationsRequest::answers()` aponta para coluna inexistente (`answers_id`) | `v6/app/Http/Model/Prefecture/InformationsRequest.php:79` |
| BUG-DATA-022 | Alta | DATA | viap | `amount` nunca preenchida e `description` nunca persistida — colunas órfãs | `v6/app/Http/Model/Prefecture/Viap.php:20` |
| BUG-DATA-016 | Média | DATA | configuracoes | `configurations.key` sem índice único — chaves duplicadas gravam só a primeira | `v6/database/migrations/2018_05_11_131302_create_configurations_table.php:16` |
| BUG-DATA-017 | Média | DATA | multiplos | Slugs de conteúdo sem índice único — colisão resolve por sufixo `-<maxid+1>` | `v6/app/Http/Controllers/Prefecture/ContentController.php:665` |
| BUG-DATA-018 | Média | DATA | a-instituicao | `contents.secretaria` nunca preenchida — vínculo por slug impossível | `v6/app/Http/Model/Prefecture/Content.php:72` |
| BUG-DATA-019 | Média | DATA | formularios-dinamicos | `ON DELETE CASCADE` em `ask_style_id` nullable apaga perguntas | `v6/database/migrations/2024_03_27_190914_create_asks_table.php:29` |
| BUG-DATA-020 | Média | DATA | configuracoes | `configurations` sem FK para `modulos` — órfãos silenciosos | `v6/database/migrations/2018_05_11_131302_create_configurations_table.php:35` |
| BUG-FUNC-001 | Crítica | FUNC | carta-de-servicos | Classe `ServiceLetterPdfService` não existe — "Gerar PDF" dá 500 | `v6/app/Http/Controllers/Prefecture/ServiceLetter/ServiceLetterPdfController.php:62` |
| BUG-FUNC-002 | Crítica | FUNC | multiplos | Rotas `Route::resource` apontam para métodos inexistentes (e-vacina, logs, menu, changelog) | `v6/routes/basepro.php:76` |
| BUG-FUNC-003 | Crítica | FUNC | obras | Módulo Obras removido por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/Works/WorkController.php:1` |
| BUG-FUNC-004 | Crítica | FUNC | concursos-pss | Módulo Concursos PSS removido por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/ConcursoPssController.php:32` |
| BUG-FUNC-005 | Crítica | FUNC | obras-paralisadas | Módulo Obras Paralisadas removido por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/ObraParalisadaController.php:1` |
| BUG-FUNC-006 | Crítica | FUNC | estagiarios | Módulo Estagiários removido por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/EstagiarioController.php:1` |
| BUG-FUNC-007 | Crítica | FUNC | fila-espera-sus | Módulo Fila de Espera SUS removido por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/FilaEsperaSusController.php:1` |
| BUG-FUNC-008 | Crítica | FUNC | licitantes-sancionados | Módulo Licitantes Sancionados removido por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/LicitanteSancionadoController.php:1` |
| BUG-FUNC-009 | Crítica | FUNC | terceirizados | Módulo Terceirizados removido por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/OutsourcedController.php:1` |
| BUG-FUNC-010 | Crítica | FUNC | relatorio-estatistico-ouvidoria | CRUD de relatórios PDF da Ouvidoria removido na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/RelatorioEstatisticoOuvidoriaController.php:15` |
| BUG-FUNC-011 | Crítica | FUNC | gemini | Fluxo de geração de conteúdo com IA removido na v6 (regressão) | `v6/app/Http/Traits/DataMaskTrait.php:213` |
| BUG-FUNC-012 | Crítica | FUNC | arquivo/drive | Categorização de arquivos removida por completo na v6 (regressão) | `v5/app/Http/Controllers/Prefecture/ArchiveCategoryController.php:16` |
| BUG-FUNC-013 | Alta | FUNC | multiplos | Erro 500 quando o slug não existe (acesso-rápido, agenda, comitê, atas, publicações) | `v6/app/Http/Controllers/Portal/QuickAccessController.php:49` |
| BUG-FUNC-014 | Alta | FUNC | multiplos | Conteúdo despublicado (`status = false`) continua acessível pela URL | `v6/app/Http/Controllers/Portal/PublicationController.php:157` |
| BUG-FUNC-015 | Alta | FUNC | multiplos | `view()` serve conteúdo de qualquer módulo (sem filtro de categoria) | `v6/app/Http/Controllers/Portal/AtasEPontosController.php:124` |
| BUG-FUNC-016 | Alta | FUNC | multiplos | Nomes de rota duplicados (`static.show`, `transparencia.index`, `a-instituicao.index`) | `v6/routes/basepro.php:548` |
| BUG-FUNC-017 | Alta | FUNC | multiplos | Referência a nome de rota inexistente (`a-instituicao-secretarias.index`) | `v6/app/Http/Controllers/Portal/PortalController.php:332` |
| BUG-FUNC-018 | Alta | FUNC | a-instituicao | Formulário do CMS de A Instituição aponta para o módulo A Cidade | `v6/resources/views/prefecture/contents/a-instituicao/form.blade.php:21` |
| BUG-FUNC-019 | Alta | FUNC | multiplos | `layout` inválido no CMS derruba o portal inteiro (mãotenance forçada) | `v6/app/Http/Traits/GetInformationsPrefectureTrait.php:96` |
| BUG-FUNC-020 | Alta | FUNC | agenda-de-eventos | Falha silenciosa ao salvar evento com `final_date` vazio | `v6/app/Http/Requests/CalendarEventRequest.php:36` |
| BUG-FUNC-021 | Alta | FUNC | agenda-de-eventos | Evento sem categoria quebra o card da listagem pública | `v6/resources/views/portal/layouts/calendar-events/index.blade.php:41` |
| BUG-FUNC-022 | Alta | FUNC | banners | `updateSuperBanner` assume exatamente dois super banners | `v6/app/Http/Controllers/Prefecture/ContentController.php:1431` |
| BUG-FUNC-023 | Alta | FUNC | banners | Caminho de upload do super banner divergente entre criação e update | `v6/app/Http/Controllers/Prefecture/ContentController.php:1460` |
| BUG-FUNC-024 | Alta | FUNC | e-vacina | `update` quebra com erro fatal quando não há nenhum registro | `v6/app/Http/Controllers/Prefecture/EvacinaController.php:68` |
| BUG-FUNC-025 | Alta | FUNC | feriados-municipais | `destroyAll` sempre truthy — exclusão em lote responde sucesso sem apagar | `v6/app/Http/Controllers/Prefecture/FeriadosMunicipaisController.php:149` |
| BUG-FUNC-026 | Alta | FUNC | enquetes | `SurveyRepository::upInsert()` não retorna o model criado | `v6/app/Repositories/Eloquent/Prefecture/Survey/SurveyRepository.php:41` |
| BUG-FUNC-027 | Alta | FUNC | obras | `destroy()` ignora o `DeleteRequest` e devolve 500 para id inválido | `v5/app/Http/Controllers/Prefecture/Works/WorkController.php:237` |
| BUG-FUNC-028 | Alta | FUNC | obras | `DeleteRequest` reprovaria sempre — validação é código morto | `v5/app/Http/Requests/Prefecture/Works/DeleteRequest.php:37` |
| BUG-FUNC-029 | Alta | FUNC | licitacoes | `Route::resource('licitacao')` gera rota `show` inexistente | `v6/routes/basepro.php:184` |
| BUG-FUNC-030 | Alta | FUNC | licitacoes | Filtro por órgão é exibido no formulário mas ignorado na query | `v6/app/Http/Filter/FilterBiddings.php:22` |
| BUG-FUNC-031 | Alta | FUNC | licitacoes-antigas | Listagem quebra (500) por tabelas de catálogo inexistentes | `v6/app/Http/Controllers/Portal/BiddingOldController.php:54` |
| BUG-FUNC-032 | Alta | FUNC | ouvidoria | Captcha renderizado no formulário mas nunca validado no backend | `v6/app/Http/Controllers/Portal/OmbudsmanController.php:114` |
| BUG-FUNC-033 | Alta | FUNC | ouvidoria | Comparação de modalidade com acento que nunca casa com o valor gravado | `v6/app/Http/Controllers/Portal/OmbudsmanController.php:176` |
| BUG-FUNC-034 | Alta | FUNC | ouvidoria | Consulta por protocolo expõe dados pessoais em claro | `v6/app/Http/Controllers/Portal/OmbudsmanController.php:154` |
| BUG-FUNC-035 | Alta | FUNC | comite-de-investimentos | Resposta AJAX do Comitê renderiza o partial de Publicações | `v6/app/Http/Controllers/Portal/ComiteDeInvestimentosController.php:91` |
| BUG-FUNC-036 | Alta | FUNC | publicacoes | Slug inexistente na URL do portal gera erro 500 | `v6/app/Http/Controllers/Portal/PublicationController.php:157` |
| BUG-FUNC-037 | Alta | FUNC | orgaos | Filtros da API de órgãos descartados (`whereRaw` sem reatribuição) | `v6/app/Http/Controllers/Swagger/V1/Portal/OrgaoController.php:91` |
| BUG-FUNC-038 | Alta | FUNC | atas-e-pontos-de-frequencia | Precedência AND/OR na view `atas_e_pontos` devolve linhas erradas | `v6/database/migrations/2025_01_20_122421_create_view_atas_e_pontos_table.php:30` |
| BUG-FUNC-039 | Alta | FUNC | manual-do-sistema | `ManualController@update` sem nenhuma validação de entrada | `v6/app/Http/Controllers/Prefecture/ManualController.php:110` |
| BUG-FUNC-040 | Alta | FUNC | menus-do-site | Rota pública de ativação/desativação de itens de menu | `v6/routes/web.php:232` |
| BUG-FUNC-041 | Alta | FUNC | glossario | Layout `default` quebra a página `/glossario` (view inexistente) | `v6/app/Http/Controllers/Portal/GlossaryController.php:23` |
| BUG-FUNC-042 | Alta | FUNC | noticias | View SQL e escopo do portal exigem categoria pai `id = 1` | `v6/database/migrations/2024_07_01_094338_udate_noticias_view.php:37` |
| BUG-FUNC-043 | Alta | FUNC | perguntas-frequentes | Itens desativados (`status = false`) são publicados no portal | `v6/app/Http/Traits/GetInformationsPrefectureTrait.php:28` |
| BUG-FUNC-044 | Alta | FUNC | pauta-do-dia | Pauta não publicada aparece no portal | `v6/app/Http/Controllers/Portal/PautaDoDiaController.php:15` |
| BUG-FUNC-045 | Alta | FUNC | configuracoes | `config.json` obrigatório no boot — sem ele a aplicação não sobe | `v6/config/app.php:6` |
| BUG-FUNC-046 | Alta | FUNC | configuracoes | Sobreposição literal entre `configuracoes-da-instituicao` e `outras-configuracoes` | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:59` |
| BUG-FUNC-047 | Alta | FUNC | configuracoes | Composer `$modulos` ausente nas telas do CMS (fora do dashboard) | `v6/app/Providers/ModulosServiceProvider.php:26` |
| BUG-FUNC-048 | Alta | FUNC | configuracoes | `Menu::menuItems()` declarado como `belongsTo` | `v6/app/Http/Model/Prefecture/Menu.php:30` |
| BUG-FUNC-049 | Alta | FUNC | configuracoes | `MenuItem` sem `SoftDeletes` apesar da coluna `deleted_at` | `v6/app/Http/Model/Prefecture/MenuItem.php:18` |
| BUG-FUNC-050 | Alta | FUNC | configuracoes | `Array` de `slug` duplicado em `modulos` (`logs-do-sistema`, `diario-ofifical`) | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:65` |
| BUG-FUNC-051 | Alta | FUNC | configuracoes | Slug do módulo gravado como `detaques` (typo) — não casa com `resources.slug` | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:355` |
| BUG-FUNC-052 | Alta | FUNC | configuracoes | `modulos.status = 0` desabilita módulos no menu do CMS (destaques, lgpd, comitê) | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:356` |
| BUG-FUNC-053 | Alta | FUNC | configuracoes | `Cache::rememberForever('modulos')` sem invalidação ao alterar `status` | `v6/app/Providers/ModulosServiceProvider.php:22` |
| BUG-FUNC-054 | Alta | FUNC | configuracoes | `Layout` model com `'kay'` no `$fillable` — o campo real é `key` | `v6/app/Http/Model/Prefecture/Layout.php:18` |
| BUG-FUNC-055 | Alta | FUNC | multiplos | `Route::getCurrentRoute()` pode retornar `null` — `explode('.', null)` | `v6/app/Http/Middleware/CheckRoutePermission.php:59` |
| BUG-FUNC-056 | Alta | FUNC | multiplos | `array_where()` foi removido do core no Laravel 6+ — ponto de ruptura na v7 | `v6/app/Http/Middleware/CheckRoutePermission.php:75` |
| BUG-FUNC-057 | Alta | FUNC | multiplos | Funções globais carregadas só em `autoload-dev` — quebram em `--no-dev` | `v6/composer.json:62` |
| BUG-FUNC-058 | Alta | FUNC | multiplos | `AuthServiceProvider` referencia policy inexistente (`App\Policies\ModelPolicy`) | `v6/app/Providers/AuthServiceProvider.php:16` |
| BUG-FUNC-059 | Alta | FUNC | multiplos | `Exception Handler` engole a exceção e a anexa à resposta JSON | `v6/app/Exceptions/Handler.php:51` |
| BUG-FUNC-060 | Alta | FUNC | multiplos | `TokenMismatchException` vira redirect de logout — POST sem CSRF desloga o operador | `v6/app/Exceptions/Handler.php:75` |
| BUG-FUNC-061 | Alta | FUNC | manual-do-sistema | Recurso `manual-usuario` só é criado por seeder opcional | `v6/database/seeds/ManualDoSistemaResourceSeeder.php:16` |
| BUG-FUNC-062 | Alta | FUNC | novidades | Módulo sem resource/permissão concedível — só `super-admin` opera | `v6/app/Http/Controllers/Admin/ChangeLogController.php:16` |
| BUG-FUNC-063 | Alta | FUNC | novidades | `catch` vazio na conversão da data de versão | `v6/app/Http/Controllers/Admin/ChangeLogController.php:46` |
| BUG-FUNC-064 | Alta | FUNC | redes-sociais | Reordenação por drag-and-drop morta (classe `item-list` nunca aplicada) | `v6/resources/views/prefecture/contents/rede-social/index.blade.php:58` |
| BUG-FUNC-065 | Alta | FUNC | logs-do-sistema | Item de menu de logs nunca exibido (slug duplicado resolve para `false`) | `v6/resources/views/vendor/adminlte/page.blade.php:284` |
| BUG-FUNC-066 | Alta | FUNC | logs-do-sistema | `Route::resource('log')` gera 6 ações inexistentes | `v6/routes/basepro.php:71` |
| BUG-FUNC-067 | Alta | FUNC | mais-conteudos | Rotas de `categoria-conteudo` sem `check.logged` | `v6/routes/basepro.php:173` |
| BUG-FUNC-068 | Alta | FUNC | newsletters | Exclusão em lote apaga linhas da tabela errada | `v6/resources/views/prefecture/contents/newsletter/index.blade.php:22` |
| BUG-FUNC-069 | Alta | FUNC | novidades | `changelog.show` aponta para método inexistente — 500 em `/cms/novidades/{id}` | `v6/routes/basepro.php:76` |
| BUG-FUNC-070 | Alta | FUNC | configuracoes | Segredos gravados em claro no log de atividades | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:130` |
| BUG-FUNC-071 | Alta | FUNC | agenda-de-eventos | `ajaxUploadFiles` engole exceções e não devolve resposta | `v6/app/Http/Controllers/Prefecture/CalendarEvent/CalendarEventController.php:352` |
| BUG-FUNC-072 | Alta | FUNC | configuracoes | Endpoint de selos institucionais sem rota registrada | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:563` |
| BUG-FUNC-101 | Alta | FUNC | usuarios | `RoleController@update` zera as permissões do perfil ao salvar sem marcações | `v6/app/Http/Controllers/Admin/RoleController.php:140` |
| BUG-FUNC-102 | Alta | FUNC | transparencia-fiscal | Resposta do e-SIC injetada no HTML sem escape — XSS armazenado | `v6/resources/views/portal/layouts/modelo1/transparencia-fiscal/relatorio-estatistico/js.blade.php:75` |
| BUG-FUNC-103 | Alta | FUNC | transparencia-fiscal | `TransparencyController@show` acessa `$transparencia->title` sem proteger o objeto | `v6/app/Http/Controllers/Portal/TransparencyController.php:99` |
| BUG-FUNC-104 | Alta | FUNC | transparente-fiscal | 9 rotas declaradas com apenas 3 nomes distintos (4 e 5 duplicações) | `v6/routes/web.php:165` |
| BUG-FUNC-105 | Alta | FUNC | tv-camara | `down()` da migration derruba a tabela errada (`tv_camara` vs `tv_camaras`) | `v6/database/migrations/2024_11_11_164932_create_tv_camara_table.php:36` |
| BUG-FUNC-106 | Alta | FUNC | tv-camara | Botão de exclusão em lote usa slug inexistente `tv-camaras.delete` | `v6/resources/views/prefecture/contents/tv-camara/index.blade.php:16` |
| BUG-FUNC-107 | Alta | FUNC | vereadores | `sync()` de mandatos insere no pivot sem `role` — coluna `NOT NULL` | `v6/app/Http/Controllers/Prefecture/CityCouncilorController.php:95` |
| BUG-FUNC-108 | Alta | FUNC | vereadores | `update` não valida com `CityCouncilorRequest` | `v6/app/Http/Controllers/Prefecture/CityCouncilorController.php:194` |
| BUG-FUNC-109 | Alta | FUNC | vereadores | Botão de excluir vereador controlado por `agenda.delete` (permissão de outro módulo) | `v6/resources/views/prefecture/councilmen/index.blade.php:59` |
| BUG-FUNC-110 | Alta | FUNC | unidade-gestora | Regra de unicidade da atualização aponta para tabela/coluna erradas | `v6/app/Http/Requests/ManagementUnitRequest.php:33` |
| BUG-FUNC-111 | Alta | FUNC | transmissoes | ID cru do YouTube gravado como `/YbJOTdZBX1g` — o player não funciona | `v6/app/Helpers/functions.php:672` |
| BUG-FUNC-112 | Alta | FUNC | transmissoes | Toggle de status não desativa as demais transmissões (`order` = NULL) | `v6/app/Http/Controllers/Prefecture/ContentController.php:1571` |
| BUG-FUNC-113 | Alta | FUNC | terceirizados | Exclusão em lote não funciona — o JS envia `toDelete`, o controller lê `ids` | `v5/app/Http/Controllers/Prefecture/OutsourcedController.php:157` |
| BUG-FUNC-114 | Alta | FUNC | terceiros | 404 na página pública quando o layout ativo não é `modelo1..modelo6` | `v5/app/Http/Controllers/Admin/Controller.php:39` |
| BUG-FUNC-115 | Alta | FUNC | temas-e-cores | `->first()->value` sem guarda em views e controller — falha fatal no portal | `v6/resources/views/portal/layouts/default/master.blade.php:7` |
| BUG-FUNC-116 | Alta | FUNC | temas-e-cores | `layout` só é validado quando é o primeiro campo enviado no POST | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:271` |
| BUG-FUNC-073 | Média | FUNC | multiplos | `ContentRequest` sem `case` para glossario/atas/comitê — campos não validados | `v6/app/Http/Requests/ContentRequest.php:308` |
| BUG-FUNC-074 | Média | FUNC | multiplos | `status` e `order` não validados pelo `ContentRequest` | `v6/app/Http/Requests/ContentRequest.php:193` |
| BUG-FUNC-075 | Média | FUNC | agenda-de-eventos | `CategoryCalendarEventRequest` permite `name` vazio | `v6/app/Http/Requests/CategoryCalendarEventRequest.php:28` |
| BUG-FUNC-076 | Média | FUNC | configuracoes | `configurations.key` gravado sem FK — `category_configurations_id` não validado | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:228` |
| BUG-FUNC-077 | Média | FUNC | configuracoes | `echo` no controller antes do redirecionamento | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:263` |
| BUG-FUNC-078 | Média | FUNC | configuracoes | Permissão assimétrica entre leitura e gravação das configurações | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:228` |
| BUG-FUNC-079 | Média | FUNC | configuracoes | `$modulos` não registrado nas telas do CMS fora do dashboard | `v6/app/Providers/ModulosServiceProvider.php:47` |
| BUG-FUNC-080 | Média | FUNC | configuracoes-da-instituicao | `ConfigurationsComposer` não registrado em nenhum provider | `v6/app/Http/Views/Composers/ConfigurationsComposer.php:8` |
| BUG-FUNC-081 | Média | FUNC | configuracoes | View `configuracoes` expõe `value` como `row_number()` | `v6/database/migrations/2023_04_17_144615_create_view_to_configuracoes.php:17` |
| BUG-FUNC-082 | Média | FUNC | configuracoes | Endpoints de selos institucionais sem rota | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:597` |
| BUG-FUNC-083 | Média | FUNC | noticias | `limit()` anulado por `paginate()` no portal de notícias | `v6/app/Http/Traits/NewsTrait.php:36` |
| BUG-FUNC-084 | Média | FUNC | noticias | `scopeByLimit` aplica `limit` no sub-select do `whereHas` | `v6/app/Http/Model/Prefecture/Content.php:245` |
| BUG-FUNC-085 | Média | FUNC | ouvidoria | Comparação de modalidade com acento que nunca casa | `v6/app/Http/Controllers/Portal/OmbudsmanController.php:176` |
| BUG-FUNC-086 | Média | FUNC | ouvidoria | Validação de `modality` inconsistente com o formulário | `v6/app/Http/Controllers/Portal/OmbudsmanController.php:98` |
| BUG-FUNC-087 | Média | FUNC | glossario | Índice alfabético case-sensitive no PostgreSQL — verbetes minúsculos inalcançáveis | `v6/app/Http/Controllers/Portal/GlossaryController.php:34` |
| BUG-FUNC-088 | Média | FUNC | glossario | Verbetes desativados aparecem no portal | `v6/app/Http/Controllers/Portal/GlossaryController.php:33` |
| BUG-FUNC-089 | Média | FUNC | glossario | Letra da URL é descartada no redirecionamento de `contentList` | `v6/app/Http/Controllers/Portal/PortalController.php:321` |
| BUG-FUNC-090 | Média | FUNC | licitacoes | Permissões `licitacoes.*` não existem no banco | `v6/app/Http/Controllers/Prefecture/Bidding/BiddingTypeController.php:29` |
| BUG-FUNC-091 | Média | FUNC | licitacoes | Exportação de contratos gera PDF de licitações | `v6/resources/views/portal/layouts/modelo1/licitacao/contratos/filtro.blade.php:162` |
| BUG-FUNC-092 | Média | FUNC | licitacoes-antigas | Recurso inexistente devolve HTTP 200 em vez de 404 | `v6/app/Http/Controllers/Portal/BiddingOldController.php:93` |
| BUG-FUNC-093 | Média | FUNC | paginas-estaticas | Página inexistente devolve HTTP 200 com view de erro | `v6/app/Http/Controllers/Portal/PortalController.php:276` |
| BUG-FUNC-094 | Média | FUNC | orgaos | `modulos.status = false` impede o vínculo notícia-órgão | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:124` |
| BUG-FUNC-095 | Média | FUNC | orgaos | Órgãos sem model próprio — dependência de `category_contents_id = 32` | `v6/app/Http/Model/Prefecture/Content.php:85` |
| BUG-FUNC-096 | Média | FUNC | configuracoes | Endpoints de selos institucionais sem rota (segunda ocorrência) | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:641` |
| BUG-FUNC-097 | Média | FUNC | configuracoes | `Configuracao` duplicado por nome — dois namespaces no mesmo diretório | `v6/app/Http/Model/Prefecture/Configuration.php:1` |
| BUG-FUNC-098 | Média | FUNC | multiplos | `dd()` em produção em 6 pontos de controller | `v6/app/Http/Controllers/Prefecture/ContentController.php:1294` |
| BUG-FUNC-099 | Média | FUNC | multiplos | `catch (\Throwable $th) {}` engole erros no `contentList` | `v6/app/Http/Controllers/Portal/PortalController.php:367` |
| BUG-FUNC-100 | Média | FUNC | configuracoes | `EventServiceProvider` é placeholder do skeleton — nenhum listener real | `v6/app/Providers/EventServiceProvider.php:16` |
| BUG-FUNC-117 | Média | FUNC | viap | Listagem pública do VIAP vazia quando não há filtros | `v6/app/Http/Controllers/Portal/ViapPortalController.php:61` |
| BUG-FUNC-118 | Média | FUNC | temas-e-cores | `cor_cms` não é validada contra a lista de skins | `v6/app/Http/Requests/ConfigurationRequest.php:60` |
| BUG-FUNC-119 | Média | FUNC | temas-e-cores | Rotas do modelo 5 sem permissão de recurso mapeada | `v6/routes/basepro.php:358` |
| BUG-FUNC-120 | Média | FUNC | temas-e-cores | Upload de `background` ignora o redimensionamento | `v6/app/Http/Controllers/Prefecture/ConfigurationController.php:366` |
| BUG-MIG-001 | Crítica | MIG | multiplos | 8 módulos inteiros removidos na v6 sem justificativa documentada | `v6/app/Http/Controllers/Prefecture/` |
| BUG-MIG-003 | Alta | MIG | multiplos | Pacote `davejamesmiller/laravel-breadcrumbs` removido do GitHub (404) | `v5/composer.json:20` |
| BUG-MIG-004 | Alta | MIG | multiplos | `DB::raw` com `concat`/`CASE`/`to_char` montados em PHP — SQL não portável | `v6/app/Http/Controllers/Prefecture/ContractController.php:67` |
| BUG-MIG-005 | Alta | MIG | multiplos | `orderByRaw` com regex PostgreSQL em `biddings.number` — específico do PG | `v6/app/Http/Controllers/Prefecture/ContractController.php:190` |
| BUG-MIG-006 | Alta | MIG | multiplos | Views SQL com `category_contents_id` fixo — perdem sentido ao recriar o banco | `v6/database/migrations/2024_11_29_103842_update_view_comite_de_investimentos.php:20` |
| BUG-MIG-007 | Alta | MIG | multiplos | Colunas reservadas como `"order"` exigem aspas em todo o SQL | `v6/database/migrations/2018_04_02_181807_create_archives_table.php:22` |
| BUG-MIG-008 | Média | MIG | multiplos | Renomeação de módulo feita por seed, não por migration | `v6/database/seeds/CategoryContentTableSeeder.php:41` |
| BUG-MIG-009 | Média | MIG | multiplos | View `a_prefeitura` órfã em bases migradas da v5 | `v5/database/migrations/2023_04_10_145149_create_view_to_a_prefeitura.php:18` |
| BUG-MIG-010 | Média | MIG | multiplos | Slug semântico duplicado em `contents`, `category_contents`, `menu_orders`, `resources` | `v6/app/Helpers/functions.php:472` |
| BUG-MIG-011 | Média | MIG | multiplos | `DOWN` das migrations derruba views que não existem | `v6/database/migrations/2026_01_20_221003_create_service_letters_views.php:65` |
| BUG-MIG-012 | Média | MIG | multiplos | `modulos` sem `UNIQUE` em `slug` — duplicatas permitidas por migration | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:65` |
| BUG-MIG-013 | Média | MIG | multiplos | Coluna `contents."order"` — colisão com palavra reservada | `v6/app/Http/Model/Prefecture/Content.php:26` |
| BUG-MIG-014 | Média | MIG | multiplos | `biddings_id` e `status_create` — colunas mortas desde 2018 | `v6/app/Http/Model/Prefecture/Archive.php:39` |
| BUG-PERF-001 | Alta | PERF | multiplos | Paginação em memória no portal — o conjunto inteiro é carregado para paginar | `v5/app/Http/Controllers/Portal/ConcursosPssController.php:45` |
| BUG-PERF-002 | Alta | PERF | legislacao | Endpoint de filtro carrega toda a subcategoria **duas vezes**, sem `LIMIT` | `v6/app/Http/Controllers/Portal/LegislationController.php:197` |
| BUG-PERF-003 | Alta | PERF | configuracoes-da-instituicao | N+1 no `ConfigurationRequest` — uma query por campo enviado | `v6/app/Http/Requests/ConfigurationRequest.php:53` |
| BUG-PERF-004 | Alta | PERF | plataforma | `head.blade.php` executa 5 queries por renderização, sem guarda de nulo | `v6/resources/views/portal/layouts/barra-privacidade/head.blade.php:3` |
| BUG-PERF-005 | Média | PERF | logs-do-sistema | Ordenação invertida e `LIMIT 5000` sem paginação | `v6/app/Http/Controllers/Prefecture/DatatableController.php:525` |
| BUG-PERF-006 | Média | PERF | arquivo/drive | Drive não pagina no servidor e dispara um `HEAD` HTTP por arquivo | `v5/public/assets/js/custom/contents/midias/index.js:201` |
| BUG-PERF-007 | Média | PERF | multiplos | Query inerte executada a cada requisição (comitê de investimentos) | `v6/app/Http/Controllers/Portal/ComiteDeInvestimentosController.php:29` |
| BUG-PERF-008 | Média | PERF | plataforma | Composer global calcula `$acessos` em todas as requisições | `v6/app/Providers/ConfigHeaderServiceProvider.php:86` |
| BUG-PERF-009 | Média | PERF | banners | Consulta de banners executada a cada renderização | `v6/resources/views/portal/layouts/default/side-banners.blade.php:2` |
| BUG-PERF-010 | Média | PERF | plataforma | N+1 no `reorder()` — uma query por item reordenado | `v6/app/Http/Traits/AppTrait.php:743` |
| BUG-PERF-011 | Média | PERF | noticias | `updateClicks` faz read-modify-write — 2 queries por visita | `v6/app/Http/Controllers/Portal/NewsController.php:141` |
| BUG-PERF-012 | Média | PERF | plataforma | Busca com função SQL sobre a coluna impede uso de índice | `v6/app/Http/Controllers/Prefecture/DatatableController.php:101` |
| BUG-SEC-001 | Crítica | SEC | multiplos | Injeção de SQL por `$_GET['ano']` interpolado em `DB::select` (6 pontos, v5+v6) | `v6/app/Http/Controllers/Portal/LegislationController.php:56` |
| BUG-SEC-002 | Crítica | SEC | multiplos | Injeção de SQL por concatenação em `whereRaw` (`req_name`, `cpf`, `num_diaria`, `termo`) | `v6/app/Http/Controllers/Portal/BuscaDiariasController.php:33` |
| BUG-SEC-003 | Crítica | SEC | multiplos | 80 controllers do CMS perdem `check.route.permission` por não chamar `parent::__construct()` | `v6/app/Http/Controllers/Prefecture/Controller.php:20` |
| BUG-SEC-004 | Crítica | SEC | e-vacina, enquetes, drive | Rotas de escrita do CMS sem `check.logged` — criação/alteração/exclusão por anônimo | `v6/routes/basepro.php:352` |
| BUG-SEC-005 | Crítica | SEC | multiplos | `CheckRoutePermission` libera qualquer rota `*.create/store/update/destroy` por bug do `array_where` | `v6/app/Http/Middleware/CheckRoutePermission.php:75` |
| BUG-SEC-006 | Crítica | SEC | gemini | Chave da API Gemini versionada em texto claro no repositório (v5 e v6) | `v5/database/seeds/AddToConfigurationsGeminiApiKeyValue.php:16` |
| BUG-SEC-007 | Crítica | SEC | gemini | Rota pública de geração de conteúdo por IA, sem login e sem `throttle` | `v5/routes/web.php:203` |
| BUG-SEC-008 | Crítica | SEC | arquivo/drive | Rotas do Drive/galeria respondem sem autenticação (v5 e v6) | `v6/app/Http/Controllers/Prefecture/ArchiveController.php:33` |
| BUG-SEC-009 | Crítica | SEC | diario-oficial | Senha do certificado passada a `shell_exec` sem escape | `v6/app/Http/Controllers/Prefecture/DiarioCertificadosController.php:67` |
| BUG-SEC-026 | Crítica | SEC | usuarios | **Escalada de privilégio confirmada em runtime**: `perfil.store` cria perfil com permissões arbitrárias, sem guarda interna | `v6/app/Http/Controllers/Admin/RoleController.php:53` |
| BUG-SEC-027 | Crítica | SEC | viap | `ajaxDeleteFiles` apaga arquivo de **qualquer** módulo — sem verificação de posse | `v6/app/Http/Controllers/Prefecture/ViapController.php:112` |
| BUG-SEC-010 | Alta | SEC | multiplos | `clean_slug()` usado como sanitização de SQL — proteção inconsistente e insuficiente | `v6/app/Helpers/functions.php:823` |
| BUG-SEC-011 | Alta | SEC | gemini | Chave da API em texto claro no `activity_log` e na query string `?key=` | `v5/app/Http/Controllers/Prefecture/ConfigurationController.php:200` |
| BUG-SEC-012 | Alta | SEC | multiplos | Mensagem de exceção do Guzzle/handler devolvida ao cliente, vaza stack trace e URL da API | `v5/app/Http/Controllers/Prefecture/GeminiController.php:84` |
| BUG-SEC-013 | Alta | SEC | multiplos | `dd()` em produção vaza stack trace ao visitante (7 pontos) | `v6/app/Repositories/Repository.php:67` |
| BUG-SEC-014 | Alta | SEC | multiplos | Exceções internas exibidas ao operador (`$e->getMessage()`) sem `report()` | `v5/app/Http/Controllers/Prefecture/EstagiarioController.php:47` |
| BUG-SEC-015 | Alta | SEC | configuracoes | Datatable de configurações expõe **todas** as chaves, incluindo segredos | `v6/app/Http/Controllers/Prefecture/DatatableController.php:384` |
| BUG-SEC-016 | Alta | SEC | multiplos | XSS armazenado: HTML do Summernote impresso com `{!! !!}` no portal | `v6/resources/views/portal/layouts/modelo1/home/aviso.blade.php:13` |
| BUG-SEC-017 | Alta | SEC | obras | SQL injection no filtro público de contratos e editais (`?contract=`/`?edital=`) | `v5/app/Http/Controllers/Portal/WorksController.php:33` |
| BUG-SEC-018 | Alta | SEC | orgaos | Termo do usuário concatenado no SQL na API Swagger de órgãos | `v6/app/Http/Controllers/Swagger/V1/Portal/Controller.php:109` |
| BUG-SEC-019 | Alta | SEC | fila-espera-sus | Cartão SUS completo pesquisável e gravado em texto claro no log | `v5/app/Http/Filter/FilterFilaEsperaSus.php:31` |
| BUG-SEC-020 | Alta | SEC | arquivo/drive | `nameFile` do usuário não sanitizado — concatenado ao caminho de `storeAs` | `v5/app/Http/Controllers/Prefecture/ArchiveController.php:123` |
| BUG-SEC-021 | Alta | SEC | multiplos | Upload sem validação de tipo real, MIME ou tamanho | `v6/app/Http/Controllers/Prefecture/ArchiveController.php:86` |
| BUG-SEC-022 | Média | SEC | gemini | Prompt do usuário vai cru ao modelo, em rota pública — *prompt injection* | `v5/app/Http/Controllers/Prefecture/GeminiController.php:13` |
| BUG-SEC-023 | Média | SEC | arquivo/drive | Endpoint aceita o nome da coluna pela URL — enumeração de colunas | `v5/app/Http/Controllers/Prefecture/ArchiveController.php:167` |
| BUG-SEC-024 | Média | SEC | lgpd | Cookie de consentimento sem `Secure`/`SameSite`/`HttpOnly`, escrito por JS | `v6/public/assets/js/custom/portal/barra-privacidade.js:33` |
| BUG-SEC-025 | Média | SEC | carta-de-servicos | Servidor de PDF sem `Content-Disposition` nem `nosniff` | `v6/app/Http/Controllers/Prefecture/ServiceLetter/ServiceLetterPdfController.php:123` |
| BUG-UX-001 | Alta | UX | temas-e-cores | Layouts só têm `path` apontando para `modelo5` — o editor só sabe editar um modelo | `v6/app/Http/Model/Prefecture/Layout.php:25` |
| BUG-UX-002 | Alta | UX | avisos | Erro 500 na home quando o aviso ativo não tem imagem de destaque | `v6/resources/views/portal/layouts/modelo1/home/aviso.blade.php:13` |
| BUG-UX-003 | Alta | UX | acesso-rapido | Destinos trocados no menu "Acesso Rápido" (menu 3) | `v6/database/seeds/MenuItemsTableSeeder.php:1049` |
| BUG-UX-004 | Alta | UX | redes-sociais | `permissions` do seed divergem das permissões avaliadas no código | `v6/database/seeds/RolesTableSeeder.php:84` |
| BUG-UX-005 | Média | UX | banners | `maxlen` do formulário diverge da validação do backend | `v6/resources/views/prefecture/contents/banners/form.blade.php:30` |
| BUG-UX-006 | Média | UX | multiplos | Link "Concurso público" morto no rodapé da v6 | `v6/resources/views/portal/layouts/modelo6/layout/footer/mais-populares.blade.php:26` |
| BUG-UX-007 | Média | UX | carta-de-servicos | CSS do formulário da Carta de Serviços não existe | `v6/resources/views/prefecture/service-letter/services/form.blade.php:1` |
| BUG-UX-008 | Média | UX | lgpd | CSS referenciado da barra LGPD não existe — 404 por página | `v6/resources/views/portal/layouts/barra-privacidade/barra-privacidade.blade.php:26` |
| BUG-UX-009 | Média | UX | plataforma | Módulos com slug divergente entre `menu_orders` e `modulos` — correção manual | `v6/database/migrations/2026_09_01_100000_fix_menu_orders_missing_modulo_id.php:27` |
| BUG-UX-010 | Média | UX | temas-e-cores | Checkboxes de `background` renderizados dentro do bloco condicional de `background` | `v6/resources/views/prefecture/configurations/temas/form.blade.php:72` |
## 4. Regressões v5 → v6

### 4.1 Módulos inteiros removidos na v6

Nenhum ADR, ticket ou changelog no repositório justifica a remoção. **A v5 é a única especificação funcional existente** para estes módulos.

| Módulo | Evidência da existência na v5 | Evidência da ausência na v6 | Impacto |
|---|---|---|---|
| **Obras** | `v5/app/Http/Controllers/Prefecture/Works/WorkController.php:1` · `v5/app/Http/Controllers/Prefecture/Works/WorkCategoryController.php:1` · `v5/app/Http/Controllers/Portal/WorksController.php:33` · `v5/routes/basepro.php:526` | `v6/app/Http/Controllers/Prefecture/Works/` não existe; nenhum controller, model, request, enum, serviço de geocodificação, exportador, view (CMS e portal), JS, rota ou tabela (`works`, `work_categories`, `work_statuses`, `work_archives`) | Perde-se a divulgação de obras, a geocodificação, o mapa, o filtro sem acento, a exportação e as regras de justificativa de suspensão/cancelamento |
| **Obras Paralisadas** | `v5/app/Http/Controllers/Prefecture/ObraParalisadaController.php:1` · `v5/routes/basepro.php:516` · `v5/routes/web.php:210` | Model, 2 controllers, request, migration, 22 views Blade, componente de listagem, 2 JS, breadcrumbs, item de menu e as 10 rotas desapareceram; o resource `obras` (id 13), de onde herdavam as permissões, também não existe | O cidadão fica sem canal para saber quais obras estão paralisadas, por quê e quando voltam |
| **Concursos PSS** | `v5/app/Http/Controllers/Prefecture/ConcursoPssController.php:32` · `v5/app/Http/Controllers/Portal/ConcursosPssController.php:26` · `v5/routes/basepro.php:356` · `v5/routes/web.php:162` | Nenhuma ocorrência de `concurso-pss`, `concursos_pss` ou `ConcursoPss` na v6: sumiram controllers (CMS e portal), model, request, export, views, JS, rotas, breadcrumbs, tabela, view SQL, `resources` (id 16) e `menu_orders` (id 36) | O cidadão perdeu a listagem pública e o download de editais; o operador perdeu o cadastro |
| **Estagiários** | `v5/app/Http/Controllers/Prefecture/EstagiarioController.php:1` · `v5/routes/basepro.php:330` | Controller, model, request, views, rotas e tabela ausentes na v6 | Perde-se o cadastro e a listagem de estágios |
| **Fila de espera SUS** | `v5/app/Http/Controllers/Prefecture/FilaEsperaSusController.php:1` · `v5/app/Http/Controllers/Portal/FilaEsperaSusController.php:93` · `v5/routes/basepro.php:399` | Controllers, models, requests, filtro, exportador, views, rotas e tabela ausentes na v6 | Perde-se a consulta pública de fila e a gestão de anexos |
| **Licitantes Sancionados** | `v5/app/Http/Controllers/Prefecture/LicitanteSancionadoController.php:1` · `v5/app/Http/Controllers/Portal/LicitantesSancionadosController.php:11` · `v5/routes/basepro.php:347` | Controllers, models, request, views, rotas e tabela ausentes; o resource/permissão do módulo não está cadastrado nem na v5 | Perde-se a divulgação de sanções — impacto direto na transparência |
| **Terceirizados** | `v5/app/Http/Controllers/Prefecture/OutsourcedController.php:1` · `v5/routes/basepro.php:395` | `Route::resource('terceirizados')` e todo o conjunto ausentes na v6 | Perde-se a relação de terceirizados |
| **Relatório Estatístico da Ouvidoria** | `v5/app/Http/Controllers/Prefecture/RelatorioEstatisticoOuvidoriaController.php:15` · `v5/app/Http/Model/Prefecture/RelatorioEstatisticoOuvidoria.php:1` · `v5/database/migrations/2026_05_27_135849_create_relatorios_estatisticos_ouvidoria_table.php:1` · `v5/routes/basepro.php:339` | Controller, model, request, migration, tabela, 4 views, JS do DataTable e 6 rotas ausentes; o item de menu sumiu (`v6/app/Providers/MenuServiceProvider.php:152` lista 6 itens em `case 'ouvidoria'`, sem o relatório) | A prefeitura não consegue mais cadastrar o relatório oficial (PDF) por ano de gestão |

### 4.2 Funcionalidade perdida dentro de módulo mantido

| # | O que foi perdido | Evidência | Impacto |
|---|---|---|---|
| R1 | **Coluna `contracts.agent`** (filtro por responsável do contrato) | Migration `v5/database/migrations/2025_06_07_004403_add_agent_column_to_contracts_table.php:12` ausente na v6; uso na v5 em `v5/app/Http/Controllers/Portal/ContractController.php:66` e `v5/app/Http/Model/Prefecture/Contract.php:33` | O portal da v6 perdeu o campo "Agente" e o filtro; dados da v5 não têm destino |
| R2 | **Relatório Estatístico da Ouvidoria — camada de análise** | `v6/app/Http/Controllers/Portal/OmbudsmanController.php:257` (implementação simplificada) vs. `v5/app/Http/Controllers/Portal/OmbudsmanController.php:344`; os componentes `v5/resources/views/portal/components/relatorio-estatistico-ouvidoria/{stats,charts-js}.blade.php` não existem na v6 | Perdem-se os cartões "Recebidos/Atendidos/Indeferidos", o gráfico "Por Tipo de Manifestação" e o "Por Gênero dos Solicitantes" — o principal ganho do módulo |
| R3 | **`archive_categories` e `archives.category_id`** | `v5/database/migrations/2025_10_16_105153_create_archive_categories_table.php` e `2025_10_16_105256_add_category_into_archives.php` ausentes na v6; `v5/app/Http/Controllers/Prefecture/ArchiveCategoryController.php:16` ausente | O acervo do Drive ficou sem categorização |
| R4 | **Fluxo de geração de conteúdo com IA (Gemini)** | Controller, Form Request, rota `gemini.ia`, modal Blade e JS `ia-modal.js` removidos (`v5/app/Http/Controllers/Prefecture/GeminiController.php:1`, `v5/routes/web.php:203`, `v5/public/assets/js/custom/utilities/helpers/ia-modal.js`) — mas a tela de Configurações **continua pedindo a chave** (`v6/resources/views/prefecture/configurations/configuracoes/form.blade.php:157`) e o mascaramento LGPD foi mantido (`v6/app/Http/Traits/DataMaskTrait.php:213`) | O operador configura uma credencial achando que habilita a redação com IA — e não habilita |
| R5 | **Campos demográficos do cidadão na Ouvidoria** | Migration `v5/database/migrations/2026_05_25_000000_add_new_fields_to_ombudsman_requests_table.php` (`cpf_cnpj`, `gender`, `education_level`, `birth_date`, `attachment`) ausente na v6 | Perda de dados já coletados; motivo (LGPD ou descuido) não documentado |
| R6 | **Drive: upload de PDF/DOC, recorte de imagem, filtro de escopo e ordenação independente** | `v6/public/assets/js/custom/contents/midias/index.js:15` (`acceptFiles` só de imagem) vs. `v5/resources/views/prefecture/contents/midias/form.blade.php:65`; filtro `%midias%` removido em `v6/app/Http/Controllers/Prefecture/ArchiveController.php:161` | Na v6 o "Drive" lista o acervo inteiro e não aceita mais documentos |
| R7 | **Ordenação por `order` na listagem do Drive** | `v6/app/Http/Controllers/Prefecture/ArchiveController.php:161` (só `id DESC`) vs. `v5/app/Http/Controllers/Prefecture/ArchiveController.php:180` (`order DESC, id DESC`) | A ordenação manual de arquivos não é respeitada |
| R8 | **Anexos em respostas da Ouvidoria** | Pivot `v5/database/migrations/2026_08_06_162636_create_ombudsman_answer_archives_table.php` e relação `v5/app/Http/Model/Prefecture/OmbudsmanAnswer.php:59` ausentes na v6 (a relação está **comentada** em `v6/app/Http/Model/Prefecture/OmbudsmanAnswer.php:60`) | Responder chamado com anexo não funciona |
| R9 | **Rota dedicada de exportação do relatório** | `v5/routes/web.php:33` (`/relatorio-estatistico-ouvidoria/exportacao`) ausente na v6; a exportação passou a usar `?type=` na própria rota (`v6/app/Http/Controllers/Portal/OmbudsmanController.php:275`) | Quebra de links externos e de scripts apontando para a URL antiga |
| R10 | **Cabeçalho "Ano de Gestão" e nome da prefeitura nos arquivos exportados** | `v6/resources/views/exports/ombudsman-requests.blade.php` mostra apenas "Data da exportação" e título fixo | Documento exportado menos rastreável e menos identificável |

### 4.3 Bugs **introduzidos** na v6

| # | Bug introduzido | Evidência |
|---|---|---|
| I1 | `ServiceLetterPdfService` referenciado mas inexistente | `v6/app/Http/Controllers/Prefecture/ServiceLetter/ServiceLetterPdfController.php:62` |
| I2 | Slug `detaques` (typo) no registry de módulos | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:355` |
| I3 | Módulos nascendo com `status = 0` (destaques, lgpd, comitê de investimentos) | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:356` e `:41` |
| I4 | `modulos` sem `UNIQUE(slug)` e com slug duplicado | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:65` e `:217` |
| I5 | Cache de módulos com `rememberForever` e sem invalidação | `v6/app/Providers/ModulosServiceProvider.php:22` |
| I6 | `Layout` model com `'kay'` no `$fillable` | `v6/app/Http/Model/Prefecture/Layout.php:18` |
| I7 | `config.json` obrigatório no boot da aplicação | `v6/config/app.php:6` |
| I8 | `Menu::menuItems()` declarado como `belongsTo` | `v6/app/Http/Model/Prefecture/Menu.php:30` |
| I9 | `MenuItem` sem `SoftDeletes` apesar da coluna `deleted_at` | `v6/app/Http/Model/Prefecture/MenuItem.php:18` |
| I10 | `Resource` do manual do sistema só em seeder opcional | `v6/database/seeds/ManualDoSistemaResourceSeeder.php:16` |
| I11 | Rotas `Route::resource` apontando para métodos inexistentes (e-vacina, logs, changelog, menu, licitacao) | `v6/routes/basepro.php:201`, `:71`, `:76`, `:171`, `:184` |
| I12 | Tabela `service_letters_access_logs` referenciada por model, mas com nome divergente da migration | `v6/app/Http/Model/Prefecture/ServiceLetter/ServiceLetterAccessLog.php:11` |
| I13 | `modulos.status` como segunda chave de exibição do menu — módulos ocultos | `v6/app/Providers/MenuServiceProvider.php:46` |
| I14 | `Route::resource` gerado para `licitacoes-antigas` com tabelas de catálogo inexistentes | `v6/app/Http/Controllers/Portal/BiddingOldController.php:54` |
| I15 | Coluna `galery` (grafia divergente) e boolean sem default | `v6/database/migrations/2024_11_29_093605_update_view_agenta_de_eventos.php:32` |

### 4.4 Ganhos da v6 (para não regredir na reconstrução)

| Ganho | Evidência |
|---|---|
| **Carta de Serviços** — 12 tabelas `service_letter_*`, 8 controllers, rotas próprias | `v6/routes/service_letter.php` |
| **VIAP**, **Vereadores/Mandatos**, **TV Câmara**, **Comitê de Investimentos**, **Atas e Pontos**, **Pauta do Dia**, **Requerimentos**, **Unidades de Atendimento**, **Sessões** | `v6/app/Http/Controllers/Prefecture/ViapController.php:1` e equivalentes |
| **Registry de módulos** (tabela `modulos`) | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php:1` |
| **Dashboard** com 16 widgets | `v6/app/Http/Controllers/Admin/DashboardWidgetController.php:1` |
| **Swagger/OpenAPI** | `v6/swagger-bootstrap/` |
| **E2E** (Playwright) | `v6/tests-e2e/` |
| Reordenação **em lote e escopada** do acervo, edição inline de título/descrição, `archives.tv_camara_id` | `v6/app/Http/Controllers/Prefecture/ArchiveController.php:161` e `v6/database/migrations/2024_11_16_121841_add_tv_camaras_id_in_archives.php:1` |

---

## 5. Itens explicitamente NÃO verificados

Nada abaixo foi usado como base para nenhum ID deste registro.

> **Resolvido durante a investigação:** a cadeia de escalada de privilégio
> (**BUG-SEC-026**) estava nesta lista como "análise estática". Ela foi
> **explorada em runtime** na instância local da v6 e **confirmada**: um
> usuário com o papel `basico` (**zero permissões**) criou um perfil com as
> **474** permissões do catálogo `resources` via `POST /cms/perfil`, atribuí-lo
> a si mesmo e passou a acessar `/cms/usuario`, `/cms/usuario/create`,
> `/cms/perfil`, `/cms/diario-oficial` e o **log de auditoria** (`/cms/log`).
> O estado do banco foi restaurado. Detalhes e tabela antes/depois em
> `17d-DETALHAMENTO-BUGS-G6.md`.

| Item | Origem | Motivo |
|---|---|---|
| Estado do banco em produção (`prefeituras_v5` / instâncias de homologação) | vários dossiês | O acesso foi feito ao banco de desenvolvimento; o conteúdo real de produção não foi inspecionado. As contagens citadas nos dossiês (184 conteúdos, 91 arquivos, 1 assunto, 13 setores, 58 módulos etc.) **não** foram reconferidas aqui. |
| `DB_USERNAME=postgres` como superusuário em produção | `15-SEGURANCA-INJECAO-SQL.md` §5 | Os `.env` de v5 e v6 são versionados, mas a configuração de **produção** não foi acessada. O impacto de `pg_read_file`/`COPY PROGRAM` depende disso e está listado como "verificar". |
| Remoção dos 8 módulos: houve decisão de produto? | `14-RISCOS-E-PERGUNTAS.md` | Não existe ADR, ticket ou changelog no repositório. A ausência é fato; a **intenção** é desconhecida. |
| Ativos do Gemini: hardcoded em `v6/GEMINI.md` | `v6/GEMINI.md` | O arquivo existe mas não foi lido nesta consolidação; apenas os seeders foram verificados. |
| Menu "Acesso Rápido" — os `static_pages_id` trocados | `v6/database/seeds/MenuItemsTableSeeder.php:1049` | A troca **entre os destinos** foi confirmada no seeder; se o mapeamento correto é esse ou se o seeder está certo e o `MenuItemPresenter` está errado **não** foi decidido — requer validação com o negócio. |
| Ausência de testes do módulo de Atas e Pontos, Gemini, e do e-SIC | dossiês de módulo | Confirmada por `grep` nos diretórios `tests/`; a **suficiência** da suíte de testes da v6 como um todo não foi avaliada. |

---

## 6. Referências cruzadas

| Documento | Conteúdo |
|---|---|
| `15-SEGURANCA-INJECAO-SQL.md` | Detalhamento dos 8 pontos de injeção confirmados em runtime (v5 e v6) e correções recomendadas. |
| `16-AUTORIZACAO-ROTA-SEM-AUTENTICACAO.md` | Inventário dos 80 controllers sem `parent::__construct()`, rotas exploradas em runtime e bug do `array_where`. |
| `14-RISCOS-E-PERGUNTAS.md` | Riscos transversais e perguntas em aberto ao negócio. |
| `13-DEPENDENCIAS-E-RISCOS.md` | Dependências de composer e riscos de plataforma. |
| `18-BACKLOG-PRIORIZADO.md` | Backlog P0–P3 derivado deste registro, com esforço e sequenciamento. |
| `dossie_modules/<slug>/08-GAPS-E-DIVIDAS.md` | Dossiê por módulo — detalhe funcional e evidência completa. |
| `17d-DETALHAMENTO-BUGS-G6.md` | Detalhamento dos **25 itens** do último lote de dossiês (temas-e-cores, viap, unidade-gestora, terceirizados, transparencia-fiscal, tv-camara, vereadores, usuarios, unidades-de-atendimento, transmissoes), incluindo 2 novos críticos: escalada de privilégio via `perfil.store` (BUG-SEC-026) e exclusão arbitrária de arquivo via `ajaxDeleteFiles` do VIAP (BUG-SEC-027). |
| `17b-DETALHAMENTO-DE-BUGS.md` · `17c-DETALHAMENTO-DE-BUGS-CONTINUACAO.md` | Detalhamento item a item dos 179 itens do lote principal. |
