-
Status: implemented-pending-homologation. Pilares 1 a 6, os dois adendos (
admin-atualizacoese unificação dos arquivos noadmin-arquivos) e a terceira rodada de ajustes implementados, publicados no Lab e validados em 2026-10-05 e 06. -
Projeto: conn2flow
-
Raiz:
[REDACTED] -
Requisição: REQ-240, com dois adendos do Engenheiro Chefe (seções 6 e 7). Coordenação: conn2flow-site, REQ-106 / BATCH-100.
-
Autonomia:
autonomo_monitorado, com commit, merge e push autorizados pelo Engenheiro Chefe em 2026-10-05.
Consolidação da REQ-239 / BATCH-248
A REQ-239 rodou em paralelo e terminou sem commit. Com autorização do Engenheiro Chefe, este lote revisou o que ia subir (evidências e diffs sem segredo, sintaxe PHP e JS, git diff --check limpo), commitou o trabalho dela nas branches dela e levou para main por fast-forward: core db9ca87b + ee5cb51a, site 025353e1 + 956831ca. As branches feat/req-240 e feat/req-106 foram mescladas com a nova main sem conflito. Dois arquivos .bak-* de compilação do site ficaram fora do commit.
Live Todo List
-
[x] Auditoria estática dos módulos por pilar.
-
[x] Pilar 1: mapa Fomantic → Lucide no PHP (29 para 62 nomes) e no JS em runtime, ícones explícitos no HTML, dicas nos botões só-ícone.
-
[x] Pilar 2: abas na folha
c2fc-abas-lista c2fc-anexa+c2fc-painel-aba. -
[x] Pilar 3: conferido no navegador; listagens e formulários já estavam em cartão branco.
-
[x] Pilar 4: selects em
c2fc-campo-selecao, caixas de mensagem emc2fc-alerta. -
[x] Pilar 5: cabeçalho
bg-slate-50nas tabelas que não tinham. -
[x] Pilar 6: nenhum overflow horizontal a 1366 e 390 px.
-
[x] Adendo 1:
admin-atualizacoesredesenhado, com as opções da req-201 expostas. -
[x] Vitest e PHPUnit do core e do site sem falhas.
-
[x] Pipeline oficial do Lab (oito rodadas ao longo do lote, saída 0) e varredura de navegador em 257 telas.
-
[x] Adendo 2:
admin-arquivoscomo único módulo de arquivos;arquivosdo site aposentado. -
[x] Adendo 2: modo iframe (seletor) do
admin-arquivose ícones corrigidos. -
[x] API de arquivos: ficou no site, como módulo-biblioteca
arquivos-api(BATCH-100), por decisão do Engenheiro Chefe. -
[x] Terceira rodada: filtro de ordenação do
admin-arquivos, barra de edição do site, REQ-241 redigida. -
[ ] Homologação humana.
O que a auditoria mostrou
Os "círculos pretos" não nascem do HTML dos módulos. São o ícone Lucide circle usado como fallback em três pontos:
-
Ações de listagem:
interface-listar-tailwind.jsdesenhaopcao.lucide || 'circle', eopcao.lucidevem deinterface_botao_tailwind_icone(). Ícone Fomantic fora do mapa virava círculo (13 usos no core, 31 no site). -
Ícones Fomantic no HTML ou montados em JS (
<i class="… icon">):admin-tailwind.jsreaproveita o nome Fomantic; nome composto fora do mapa viracircle, nome simples que o Lucide não conhece fica invisível. -
Placeholder literal
data-lucide="circle"deixado pela conversão.
O "gap desconectado" das abas vinha de .c2fc-abas-lista { margin-bottom: 12px } somado ao py-2 das páginas, com o painel repetindo a borda superior. .c2fc-abas (sem -lista) não tem regra CSS: a folha de abas é c2fc-abas-lista, c2fc-aba e c2fc-painel-aba.
Implementação
Ícones (Pilar 1)
-
interface.php: 33 traduções novas eminterface_botao_tailwind_icone(). -
admin-tailwind.js: 41 traduções novas no mapa em runtime (ordenação, setas, alças de arrasto,cube,times,add…) e um equivalente para marca sem pictograma no Lucide (tiktok). -
HTML com
data-lucideexplícito:admin-environment(33),admin-categorias,pages-index,usuarios-perfis,forms. -
forms: dica earia-labelno botão de limpar o autocomplete.
Abas (Pilar 2)
-
admin-environment,forms,forms-search,galleries,menus,pages-index,publisher-index: barra anexada ao painel. -
admin-plugins: no pt-br doadicionaros três painéis estavam dentro da barra de abas e o arquivo abria 5<div>e fechava 2; os outros três arquivos deixavam o<div>raiz aberto. Estrutura corrigida e folha canônica nos dois idiomas; PHP e JS deixaram de alternar utilities e mantêmaria-selected. -
Mantidos como estão, por decisão:
perfil-usuario(já na forma canônica da requisição, com Vitest amarrado às classes) e as barras deforms-submissionsemarketplace-admin(abas de página sobre conteúdo livre, sem painel em cartão).
Selects e alertas (Pilar 4)
-
186 selects do core passam a
c2fc-campo-selecao(168 por classe, 18 com utilities avulsas emadmin-croneadmin-environment), mais os geradorescontroles_select()einterface_formulario_campos()e os selects criados emgalleries.jsemenus.js. -
controles.css: a regra dec2fc-campo-selecaotinha só o estado base. Ganhou foco, hover, desabilitado e inválido; sem isso a troca tiraria o anel de foco de todos os selects. -
128 caixas de mensagem passam a
c2fc-alerta. Entre elas, as depublisher-index,pages-indexepublisher-pagesusavamc2fc-aviso, que é a classe do aviso flutuante (fundo escuro), e as "negative" depublisherestavam pintadas de azul. -
controles.css:c2fc-alertasem o invólucro.contentvolta a ser bloco e todo alerta quebra palavras longas. Sem isso, uma URL longa empublisher-pages/editargerava 26 px de overflow a 390 px (regressão desta própria conversão, achada pela varredura e corrigida). -
Variantes
c2fc-alerta-sucessoec2fc-alerta-aviso.
Tabelas (Pilar 5)
-
admin-atualizacoes: cabeçalhobg-slate-50nas três tabelas.
Adendo 1 — admin-atualizacoes
A tela mostrava as opções como flags de CLI cruas, sem agrupamento; --wipe ficava entre as demais; o botão de executar funcionava sem modo escolhido e sem confirmação; quatro opções aceitas pelo PHP desde a req-201 não tinham controle.
-
Resumo no topo: versão instalada, última execução e choques pendentes.
-
Passo 1: três modos como cartões com explicação. Passo 2: opções em grupos (Segurança, Pacote da versão, e em "Opções avançadas" Banco de dados e Diagnóstico), com rótulo, explicação e a flag ao lado;
--wipeisolada em zona de perigo. Passo 3: executar. -
Opções novas na tela, já aceitas pelo backend:
--no-health,--no-rollback,--health-url,--health-ip. -
Botão de executar habilita só com modo escolhido; execução que altera a instalação pede confirmação (simulação e só-download seguem direto).
-
Histórico, logs e choques em abas; status traduzido; contagem de choques pendentes na aba.
-
59 variáveis novas por idioma e 7 textos revistos (somando os dois idiomas). O contrato do atualizador não mudou.
Ficou de fora, como proposta: disparar o rollback pela tela. A rotina existe (rollbackExecucao, --rollback e /_api/system/rollback), mas é ação destrutiva nova pela web e merece requisição própria.
Adendo 2 — admin-arquivos como único módulo de arquivos
O arquivos do site guardava registros em banco, isolava cada usuário numa pasta, aplicava cota de disco e validava o conteúdo enviado; o admin-arquivos lê a árvore física e não tinha nada disso. O que mudou no core:
-
Escopo e cota por filtros de hook. O módulo consulta
admin-arquivos/escopo(pasta a que o usuário fica restrito) eadmin-arquivos/cota-bytes. O core não sabe quem é restrito: sem filtro registrado, tudo continua como era. O site responde pelos dois no gancho de multiusuário (BATCH-100). -
Confinamento em todos os pontos de entrada: navegar, enviar, criar pasta, renomear, excluir, miniaturas, categorias e mover. Caminho fora do escopo cai na raiz do usuário; ação sobre item de fora, ou sobre a própria raiz, responde
Invalid. A trilha esconde o que fica acima da raiz. -
Validação do conteúdo enviado (
bibliotecas/arquivo.php):arquivo_assinatura_confere()recusa arquivo cujo começo contradiz a extensão (executável renomeado para.png);arquivo_svg_sanitizar()tira<script>, eventoson*,javascript:e<foreignObject>de SVG; modelosglb/gltfsão conferidos. -
Mover arquivos e pastas por recortar e colar, levando miniaturas e categorias.
-
Indicador de espaço usado, com a cota quando houver.
-
Seletor padrão do
interface: apontava paraarquivos/, módulo que nem existe no core; agora aponta paraadmin-arquivos/. -
Modo iframe. O roteador trocava qualquer página em iframe pelo
layout-iframes, que é Fomantic: a folha do Fomantic vencia as utilities (o botão de adicionar perdia o fundo), o Lucide não era carregado (nenhum íconedata-lucideaparecia) e a biblioteca de controles ficava de fora (o próprio módulo a usa para confirmar exclusão). Página Tailwind em iframe passa a usar olayout-iframe-tailwindcss, que ganhou o Lucide e o script que desenha os ícones;admin-tailwind.jsdesenha ícones também sem a casca do painel. -
Ícones e busca: todos os ícones do módulo com
data-lucideexplícito (inclusive os montados em JS; a pasta dos cartões saía com 16 px); dicas nos botões de visualização; a lupa caía para baixo do campo e o botão de limpar a busca nunca aparecia (o JS guardava referência ao<i>que o Lucide substitui). -
Seleção múltipla e hover (pedidos do Engenheiro Chefe durante a validação): o cartão selecionado ganha borda, fundo e contorno (antes só a caixinha mudava, e no seletor isso passava despercebido); nos modos compactos as ações de hover saem do meio da miniatura e ficam numa faixa na base dela.
Guardas de teste
tests/Unit/PHP/ArquivoUploadReq240Test.php (8 testes): assinatura que bate e que contradiz a extensão, extensão sem assinatura, SVG com e sem vetores, confinamento ao escopo (inclusive vizinho com o mesmo prefixo de nome e ..), tamanho de pasta sem as miniaturas.
tests/Unit/PHP/IconesLucideReq240Test.php (6 testes): todo ícone declarado por módulo tem tradução; toda tradução existe no pacote Lucide embarcado; nenhum data-lucide="circle" de marcador de lugar; select do painel usa a classe padronizada; toda página de módulo tem <div> balanceado.
Evidências
| Verificação | Resultado |
|---|---|
IconesLucideReq240Test antes da correção |
falha, listando os 9 nomes sem tradução |
| Core PHPUnit (árvore principal) | 1.613 testes, 15.931 asserções, sem falhas; 5 pulados e 7 depreciações já existentes |
admin-arquivos como usuário restrito (cliente-pro, plano cloud-nano) |
raiz e trilha presas na pasta dele, cota de 1 GB exibida; 8 tentativas de fuga caem na raiz dele; PNG falso e .php recusados; SVG gravado sem <script> nem onload; mover, excluir e renomear fora do escopo, e excluir a própria raiz, respondem Invalid |
admin-arquivos como administrador |
árvore inteira, sem indicador de uso; mesmo roteiro, nada real tocado |
admin-arquivos em iframe, antes |
0 ícones Lucide desenhados, folha do Fomantic carregada, c2fControles ausente |
admin-arquivos em iframe, depois |
75 ícones desenhados, nenhum por desenhar, sem Fomantic, busca e limpar funcionando |
| Core Vitest | 46 arquivos, 541 testes |
Pipeline project:update-all [REDACTED] --confirmar-remoto |
oito rodadas ao longo do lote, saída 0 |
| Varredura de navegador, 1ª rodada | 257 telas; círculos em 4 telas, ícones não desenhados em 2, selects fora do padrão em 4, cabeçalhos em 2, overflow em 1 |
| Varredura de navegador, 2ª rodada | círculos 0, ícones não desenhados 0, selects 0, cabeçalhos 0, overflow 0 |
admin-atualizacoes com interação |
botão desabilitado até escolher o modo, rótulo traduzido, abas alternando, nenhum marcador cru, 17 ícones desenhados, sem overflow a 390 px |
Roteiros: varredura, resumo, sonda. Dados: resultado e capturas. A varredura descobre as rotas nos manifestos; 72 das 257 redirecionam por precisar de um registro (telas de edição sem id), e nas listagens o roteiro segue o primeiro link de edição.
Incidente no Lab durante a validação (2026-10-05)
O roteiro req240-arquivos-eval.js tinha sondagens de "ação fora do escopo" que miravam a pasta favicon, pensadas para o usuário restrito. Rodado primeiro como administrador, que não tem escopo, a sondagem de exclusão apagou de verdade contents/favicon do Lab (três PNGs).
-
Recuperação: os três arquivos são versionados em
conn2flow-site/gestor/contents/favicon/e foram repostos porproject:sync-files [REDACTED]. As cópias que o servidor guardava tinham os mesmos três arquivos, com os mesmos tamanhos; nada exclusivo do Lab se perdeu. A logo voltou a responder 200. -
Correção do roteiro: as sondagens passam a mirar um caminho inexistente (
Invalidcom escopo,NotFoundsem), e a exclusão da raiz do escopo roda semrecursivo. Nenhuma delas pode mais mover, renomear ou apagar algo real.
Limites e achados fora do escopo
-
API de arquivos. Não entrou no core: ficou no site como módulo-biblioteca
arquivos-api(BATCH-100), validada no Lab com token de administrador. -
Nome de pasta de usuário. O escopo é
<id do usuário>/na raiz dos conteúdos, como o módulo antigo já fazia. Um usuário cujo id coincida com uma pasta do sistema (mini,plugins,favicon…) veria essa pasta. O comportamento é herdado; não foi criada regra nova. -
O seletor do catálogo 3D foi trocado no PHP dos três módulos, mas a abertura do seletor a partir de uma tela do catálogo não foi exercitada no navegador.
-
O
admin-arquivosfoi conferido em pt-br; o inglês recebeu as mesmas mudanças por arquivo. -
O resumo da varredura ainda lista "P3 bloco principal sem cartão branco" em 50 telas de listagem: é falso-positivo do medidor (ele parte de um elemento fora do cartão). As listagens foram conferidas por captura e são cartões brancos. O medidor foi ajustado depois da segunda rodada e não foi reexecutado.
-
"Marcador cru no texto" em 19 telas: 17 são editores de modelo mostrando os próprios placeholders, de propósito. Os dois reais eram do
gateways-pagamentos(corrigido no BATCH-100). -
modulos-grupos-distribuido(site): era só um esqueleto e foi removido na terceira rodada, por decisão do Engenheiro Chefe (BATCH-100). -
galleries/editareadmin-templates/editar: um 404 de imagem em registros de teste, dado e não código. -
dashboard/: erro de leitura de cookie dentro do iframe isolado de widget apareceu uma vez em três execuções; não reproduzido. -
A cada pipeline o core registra
paginas +2: dois registros são reinseridos em toda rodada. Não investigado. -
Navegador em pt-br; o inglês está coberto pelos contratos e pela compilação. O comportamento novo do
admin-atualizacoes.jsfoi validado no navegador e não ganhou teste Vitest. -
Nenhuma atualização do sistema foi executada pela tela nova: só seleção de modo, abas e leitura.
Terceira rodada (2026-10-06)
Pedidos do Engenheiro Chefe depois do segundo marco.
-
Filtro "Filtrar Lista" do
admin-arquivos. A ordenação era montada na variantemenudo Fomantic (uma<div>com itens e ícones), que no painel Tailwind saía como lista sempre aberta; e o JS lia.val()dessa<div>, que devolve vazio, de modo que a ordem escolhida nunca chegava ao servidor. Passou a ser um select comum. Conferido no navegador: controle com 38 px e a listagem muda ao escolher descendente. -
Barra de edição do site deslocada (regressão deste lote). Para dar margem ao seletor de arquivos eu tinha posto
paddinge os scripts do Lucide nolayout-iframe-tailwindcss, que também é o layout da páginadashboard-site-toolbar. O layout voltou ao original; a margem passou para o CSS doadmin-arquivos(classe nobodyaplicada pelo JS em iframe) e os scripts entram pelo roteador só para página do painel aberta em iframe. Medido: a raiz da barra voltou a 0,0, largura total e 30 px; o seletor manteve os ícones. -
REQ-241 redigida e registrada no apontador: atualização automatizada do sistema, ativável pelo painel. Não implementada. O rollback manual pela tela ficou fora, por decisão do Engenheiro Chefe.
Verificação da rodada: PHPUnit 1.613 testes e Vitest 541, sem falhas; pipeline oficial com saída 0.
O que não foi exercitado nesta rodada: a varredura completa das 257 telas (a última é a do primeiro marco) e a barra de edição dentro de uma página pública (a sessão gerada para o agente não exibe a barra; foi medida a página dela diretamente).