Commit graph

2574 commits

Author SHA1 Message Date
Francisco Solla
c5c9b0243a docs(ops131): registra a decisão A e o runbook do cutover
Decisão A (site público + /campanha no domínio novo, passkeys re-registradas uma vez) refletida no plano; runbook de cutover/rollback no docs/ops/teqo-1313-deploy.md com pré-flight, ingress/DNS, env, verificação e janela read-only do WordPress; changelog da entrega.
2026-11-08 20:09:51 -03:00
Francisco Solla
cac8af0d6f feat(site): mapeia os permalinks do WordPress legado para o domínio novo (OPS131)
Os 43 posts publicados no WordPress (último em 2026-08-17) ganham redirect permanente do permalink /<ano>/<mês>/<dia>/<slug>/ para o caminho canônico do Teqo, com destino derivado do type/category atuais de produção. Categoria, tag, author, feeds, paginação e arquivos de data vão para /artigos; /home vai para /; wp-admin/wp-login.php para /. O mapa fica em scripts/lib/legacyWordPressRedirects.mjs (43 entradas) e é consumido pelo next.config.mjs; unit pina contagem/forma/unicidade e o e2e do frontend cobre os redirects. Sem migration, sem Consent e sem mudança de conteúdo no CMS.
2026-11-08 20:09:51 -03:00
Francisco Solla
377a2c89b1 fix(ci): pina ubuntu-24.04 nos jobs com Playwright
Some checks failed
Deploy / preflight (push) Has been cancelled
Deploy / verify (push) Has been cancelled
Deploy / deploy staging (teqo-staging) (push) Has been cancelled
Deploy / requeue when main advanced (push) Has been cancelled
Deploy / deploy production (teqo-1313) (push) Has been cancelled
O label ubuntu-latest migrou para Ubuntu 26.04 em out/2026 e o Playwright 1.58.2 não tem build para 26.04 (run 42095564329: 'Playwright does not support chromium on ubuntu26.04-x64'). Pina o job checks do ci-pr e o verify do deploy em ubuntu-24.04 até o bump do Playwright.
2026-11-05 17:06:44 -03:00
Francisco Solla
ebbc662794 docs(postmortem): vincula o PR #1450 2026-11-05 17:06:44 -03:00
Francisco Solla
2f79e14a1b docs(postmortem): registra a regressão do destaque do board 2026-11-05 17:06:44 -03:00
Francisco Solla
a4c2ab226a fix(site): limita o título do board e remove text-balance dos cards (S47)
O card em destaque perdeu o line-clamp-3 na reescrita da S47: com o feed do Instagram na frente, a legenda inteira (889 caracteres no caso real) era renderizada a 31px e esticava o board. Restaura o clamp de 3 linhas no destaque, mantém o clamp do compacto, troca text-balance por break-words (balance quebra o line-clamp em alguns browsers) e adiciona min-w-0 às colunas do grid. O e2e passa a pinar o clamp do card em destaque, não só o do compacto.
2026-11-05 17:06:44 -03:00
Francisco Solla
93bda37c29 test(e2e): alinha o acervo à Central pública retirada (S47)
Some checks failed
Deploy / preflight (push) Has been cancelled
Deploy / verify (push) Has been cancelled
Deploy / deploy staging (teqo-staging) (push) Has been cancelled
Deploy / requeue when main advanced (push) Has been cancelled
Deploy / deploy production (teqo-1313) (push) Has been cancelled
Os testes de exclusão da Central deixam de esperar o antigo /conteudos/<slug> (200/404) e passam a pinar o redirect permanente para /artigos, mantendo o contrato do arquivo privado no /campanha.
2026-10-22 02:16:08 -03:00
Francisco Solla
5635e6522c feat(site): vira o site público para o mandato pós-eleição (S47)
Home abre no agradecimento pelos 152.049 votos com board 1+3, trajetória, bandeiras do mandato, galeria de fotos e rodapé institucional; chrome novo (header home/interno, lockup de nome, menu mobile acessível) e /artigos//fotos com título compacto.

As superfícies de campanha saem do ar (308 de /conteudos, /jingles e /cards), junto com newsletter, estúdio público de cards e UI da Central/jingles; download de foto e .ics perdem o 1313. Sem migration, sem Consent novo e sem apagar dados do CMS.
2026-10-22 02:16:08 -03:00
Francisco Solla
5be50b182c docs(plans): registra o follow-up do JSON-LD da petição
Débito da S48 (#1443): a página de petição serializa o JSON-LD sem
escapar '<', enquanto o artigo já escapa. A Issue #1447 fecha o escopo
com um helper único em src/utilities/seo.ts usado nas duas páginas.
2026-10-22 00:51:20 -03:00
Francisco Solla
5786bc57dc feat(petition): publica a petição do PL 5594/2026
A ferramenta de abaixo-assinado já existia, mas a petição do PL não tinha
caminho reproduzível fora do dump legado: produção só carregava as três
petições antigas editadas no admin. O conteúdo agora é versionado em
scripts/lib/petitionPl5594Content.mjs e provisionado por
pnpm seed:petition-pl-5594 — dry-run por padrão, create-if-missing por id,
Consent whatsapp-inscricao resolvido por chave (fail-closed) e guards de
escrita (PETITION_SEED_CONFIRM + TEQO_ENV casando o banco exato), sem
sobrescrever edição do admin.

O corpo traz os fatos do inteiro teor (autorização no registro, 5
exercícios de IR, sigilos bancário/fiscal/telefônico/de conexão, exclusão
do conteúdo das comunicações, auditoria, LGPD e divulgação pela Justiça
Eleitoral), a motivação de 18-19/10 sem acusar crime e o pedido sem
prometer aprovação. A copy hardcoded do bloco do formulário deixa de falar
em 'campanha'/'luta dos trabalhadores' e vira genérica.

Prova: unit full 475 arquivos/5238 testes verdes, lint/typecheck/format
limpos, seed aplicado e reaplicado em DB temporário (criação + no-op) e
smoke real no navegador (página 200, consent, assinatura nº 1). Sem
migration, collection, Consent novo ou mudança no fluxo de assinatura.
2026-10-22 00:51:20 -03:00
Francisco Solla
8fa6432b7b docs(plans): planeja o site pós-eleição, o PL 5594/2026 e o cutover de domínio
Some checks are pending
Deploy / preflight (push) Waiting to run
Deploy / verify (push) Blocked by required conditions
Deploy / deploy staging (teqo-staging) (push) Blocked by required conditions
Deploy / requeue when main advanced (push) Blocked by required conditions
Deploy / deploy production (teqo-1313) (push) Blocked by required conditions
S47 (#1442), S48 (#1443), OPS130 (#1444) e OPS131 (#1445). Inclui o design hi-fi do S47 e a regra pós-eleição no DESIGN.md.
2026-10-21 22:59:32 -03:00
Francisco Solla
321ac7b872 feat(relatorio-cidade): foca o relatório na mobilização do 2º turno
Some checks failed
Deploy / preflight (push) Has been cancelled
Deploy / verify (push) Has been cancelled
Deploy / deploy staging (teqo-staging) (push) Has been cancelled
Deploy / requeue when main advanced (push) Has been cancelled
Deploy / deploy production (teqo-1313) (push) Has been cancelled
A federal foi decidida em 04/10; o documento de cidade passa a servir
inteiro à eleição de Lula. Saem conta eleitoral/cadeira de Solla,
concorrentes e pré-candidatos, emendas e entregas (sem fetch do Portal
da Transparência no builder), acervo de falas, panorama regional e
sinais/demandas; demografia, economia e transporte ficam como contexto
da visita.

A página 1 vira só mobilização: KPIs oficiais do artefato TSE 2026
(Lula/Δ, X₁/X₂, Solla), papel determinístico da cidade, quem mobiliza,
movimento local do 2º turno, riscos e o painel "O que pedir e falar"
(pedido Lula 13; guardrail de votos em jogo no lugar do defeso).

O checklist cai de 10 para 8 itens (emendas_web e quem_investe saem;
relacao_campo/disputa_local reancorados no 2º turno); listas
preCandidates/investments/emendasIndicators saem do contrato (arquivos
antigos seguem aceitos em replay). O snapshot enxuga para rede +
conjuntura + demografia (cityReportTerritory.mjs removido).

Prova: unit 5.232 verdes, int do snapshot sem PII e sem os grupos
aposentados, lint/format/typecheck/knip limpos e rebuild da fixture de
Cruz das Almas (9 seções, 16 páginas contra 21, página 1 fechando sem
fallback).
2026-10-10 16:57:20 -03:00
Francisco Solla
31f78f07ad feat(briefing): pedido dual 1313 + Lula 13 e missão do 2º turno
Some checks failed
Deploy / preflight (push) Has been cancelled
Deploy / verify (push) Has been cancelled
Deploy / deploy staging (teqo-staging) (push) Has been cancelled
Deploy / requeue when main advanced (push) Has been cancelled
Deploy / deploy production (teqo-1313) (push) Has been cancelled
O briefing de capacitação passa a renderizar o pedido dual (deputado
federal 1313 e, no 2º turno, Lula 13) e a exigir ao menos uma pergunta
de 2º turno no Q&A; dossiê e boletim seguem sem CTA (prova material do
argumento, não peça de rua). Registra o changelog da entrega.
2026-10-09 04:01:20 -03:00
Francisco Solla
9fae859c0d feat(relatorio-cidade): leva o 2º turno (Lula × Flávio) ao relatório
Artefato oficial por unidade (município e ZE de Salvador): TSE 2026
presidente por seção + Solla 2026 e a fatia de 2022 da análise
2º turno; cada número validado contra o baseline TSE e os totais da BA
pinados (pnpm build:second-round).

O relatório ganha a seção "2º turno no município (Lula × Flávio)" com
X₁/X₂ pela mesma fórmula do /potencial, o papel determinístico da cidade
(prioridade/mobilizacao/defesa/expansao) e o novo item de pesquisa
segundo_turno (movimento local com fonte); a seção fica fora da página 1
porque é determinística e a página 1 falha fechada por medição.
2026-10-09 04:01:20 -03:00
Francisco Solla
c5ccd8e0e7 style(potencial): formata o int spec após o rename do query param
Some checks failed
Deploy / preflight (push) Has been cancelled
Deploy / verify (push) Has been cancelled
Deploy / deploy staging (teqo-staging) (push) Has been cancelled
Deploy / requeue when main advanced (push) Has been cancelled
Deploy / deploy production (teqo-1313) (push) Has been cancelled
2026-10-07 19:47:19 -03:00
Francisco Solla
c8badc8763 docs(potencial): impl plan e changelog da entrega S46
Impl plan com as decisões de engenharia (artefato vs collection, API,
cálculo compartilhado, ganho ≥ 0), as premissas assumidas (13 candidaturas
no bulk, X₁ não seletivo) e os débitos deferidos da triagem do simplify.
2026-10-07 19:47:19 -03:00
Francisco Solla
67d889661a feat(potencial): página pública, formulário e story 1080×1920
A rota estática /potencial informa UF/município/zona/seção do título e
mostra as três leituras da seção com o ganho em p.p., rotulado como cenário
hipotético, com a prévia do story (canvas real) e baixar/compartilhar. A
ilha trata carregando, resultado, não encontrada e sem dado; o combobox de
município busca a partir de 3 letras pelo normalizador dos pickers; foco
amarelo+separador escuro e alvos ≥44px. Arimo/Exo 2 passam a viver em
fonts.ts (owner único) para o canvas receber a família. E2E novo
frontendPotencial (projeto + manifest + prewarm no setup).
2026-10-07 19:47:19 -03:00
Francisco Solla
62b674cfba feat(potencial): cálculo puro, loader e rotas públicas da seção
sectionPotential.ts parseia/valida o shard (ordem fail-closed), busca por
seção e computa o cenário aprovado — válidos = nominais, X₁ = comparecimento
− Lula − Flávio (todos os terceiros; o bulk tem 13 candidaturas) e X₂ =
aptos − Lula − Flávio — com formatadores pt-BR e o nome do PNG. O loader
server-only lê os shards por fs com cache por processo; as rotas públicas
/api/potencial/{municipios,secao} aplicam same-origin, rate-limit e zod
strict, com 404 honesto e cache de um dia. O story 1080×1920 é desenhado
por um renderer puro com contexto estrutural. 'potencial' entra nos slugs
reservados e o módulo novo no pin do top-level de utilities.
2026-10-07 19:47:19 -03:00
Francisco Solla
6aad284e11 feat(potencial): artefato TSE 2026 por seção + ingestão nacional validada
O bulk oficial do TSE (votacao_secao_2026_BR + detalhe_votacao_secao_2026)
é ingerido uma vez em 27 shards por UF (497.897 seções, 13,6 MB) sob
public/dados/potencial-secao-2026/, com manifest de hashes. A ingestão
valida totais nacionais e do recorte BA pinados (aborta em divergência),
conta os votáveis Lula/Flávio vistos e faz merge do recibo em runs --only.
Cache gitignored em data/tse-2026/.
2026-10-07 19:47:19 -03:00
Francisco Solla
3e6afeb58f refactor(briefing-geral): usa dieWithLabel do cli compartilhado
Convenção do repo: o 'die' é importado de scripts/lib/cli.mjs, nunca reescrito no script (guard do codebaseConventions).
2026-10-07 13:01:31 -03:00
Francisco Solla
d6bdd9ff2d fix(reels): pina colinhaReel/colinhaReelTemplate no SCRIPTS_SPEC_PINNED
O invariante do ciSkipInvariants exige todo módulo de scripts/ alcançado por spec no mapa literal de blast radius — o unit novo da colinha puxa os dois libs.
2026-10-07 13:01:31 -03:00
Francisco Solla
c6d9a7009d docs(campanha): prompt do redesign do site público
Mission operacional para o designer/agentes: repensar as superfícies públicas de jorgesolla1313.com.br (campanha + editorial) como PR mergeável, com as leis da casa, escopo por rota e gate de design.
2026-10-07 13:01:31 -03:00
Francisco Solla
6c81769bb9 feat(briefing-geral): livretos de 1 folha e pesca mínima (BRIEFING-GERAL)
Impressor do Briefing Geral de Militância: lê os JSONs autorais do corpus em data/briefing-geral-militancia/ com falha fechada quando âncora ou lastro de proposta não resolve, e imprime cada recorte como livreto A5 de 4 páginas imposto em 1 folha A4 paisagem (frentes/versos), a pesca mínima de 8 páginas em 2 folhas, a edição completa e o guia de impressão. Paginação medida de verdade no Chromium (Playwright) com poda na ordem declarada, nunca cortando página no meio.

Corpus e saídas seguem gitignored (material interno num repo público); o script é o artefato versionado do fluxo.
2026-10-07 13:01:31 -03:00
Francisco Solla
9d6edd44c1 feat(analise): expansão por seção eleitoral 2022 — o voto que falta (EXPANSAO-SECOES)
Análise TSE 2022 na menor unidade publicada (seção): sobra do bloco Lula+Jerônimo por cargo (teto de transferência, max(0, min(Lula,Jer) − válidos)), piso/teto da pergunta literal, LQ e quebras por município, zona de Salvador, bairro do local de votação, RMS e Território de Identidade. Builder em duas fases: --compute faz a passagem pesada sobre os seis CSVs no cache gitignored data/tse-2022/ e grava o JSON; sem a flag só renderiza MD + PDF via Chromium (HTML intermediário também no cache).

Validação unidade a unidade contra o baseline commitado src/lib/electionAggregates/bahia-federal-baseline.json (435 municípios/zonas, sem divergência; resíduo de −0,023% nos nominais federais explicado por candidaturas invalidadas). Documento interno de análise (listas de ataque não viram material público); referenciado pelo plano S46.
2026-10-07 13:01:31 -03:00
Francisco Solla
a662c77072 feat(reels): colinha 1313 determinística e lote por dobradinha (REEL1–REEL3)
Builder do reel de conversa com roteiro/timeline puros em scripts/lib/colinhaReel.mjs (25 beats na ordem da urna) e template HTML/CSS 540×960@2x screenshotado quadro a quadro (sem animação CSS, sem drift); três finais no mesmo pacote (motion, estático e o card EXATO do site dirigido em produção) e lote por dobradinha ativa — 42 curadas da plataforma em scripts/reels/dobradinhas.json, com paralelismo e falha isolada por dobradinha. Trilha de 'confirma' da urna por card + cama do jingle desde o início do vídeo, montada num passe e mixada com -c:v copy.

Derivativos oficiais commitados em scripts/reels/assets/colinha-time-1313/ (proveniência e receitas no README da pasta): fotos/webp, logo da rádio, subset da Inter e os dois áudios do reel, que ganham exceção à regra global de áudio no .gitignore. package.json ganha reels:colinha e reels:dobradinhas.

Verificação: unit colinhaReel 6/6 (ordem da urna, números, timeline, template e ativos), eslint/typecheck/format:check/knip verdes.
2026-10-07 13:01:31 -03:00
Francisco Solla
4d1e305193 style(docs): formata plano e design do S46 (prettier)
Some checks are pending
Deploy / preflight (push) Waiting to run
Deploy / verify (push) Blocked by required conditions
Deploy / deploy staging (teqo-staging) (push) Blocked by required conditions
Deploy / requeue when main advanced (push) Blocked by required conditions
Deploy / deploy production (teqo-1313) (push) Blocked by required conditions
2026-10-07 11:00:50 -03:00
Francisco Solla
4578f9f5d7 docs(plan): S46 — story da sua seção (potencial de Lula) (Related #1436) 2026-10-07 11:00:50 -03:00
Francisco Solla
331cb3aac7 docs(bug-fix): registra merge, deploy e verificação em prod do fix #1433
Some checks failed
Deploy / preflight (push) Has been cancelled
Deploy / verify (push) Has been cancelled
Deploy / deploy staging (teqo-staging) (push) Has been cancelled
Deploy / requeue when main advanced (push) Has been cancelled
Deploy / deploy production (teqo-1313) (push) Has been cancelled
2026-10-02 22:51:17 -03:00
Francisco Solla
8e32c7cee7 fix(storage): desliga checksum automático de upload no client S3 (Garage multipart) (C246-hotfix)
Some checks are pending
Deploy / preflight (push) Waiting to run
Deploy / verify (push) Blocked by required conditions
Deploy / deploy staging (teqo-staging) (push) Blocked by required conditions
Deploy / requeue when main advanced (push) Blocked by required conditions
Deploy / deploy production (teqo-1313) (push) Blocked by required conditions
O adapter storage-s3 usa multipart acima de 50 MB e o Garage grava um x-amz-checksum-crc32 errado; o SDK valida no GET e toda leitura do objeto falhava (500 nas fotos 80/83, panorâmicas de 54 MB — conteúdo correto). requestChecksumCalculation: WHEN_REQUIRED no client do plugin; a leitura segue validando o checksum que o objeto tiver e a varredura de integridade segue como checagem honesta. Os dois objetos foram reescritos com PUT único (checksum correto) no ops: canário 2/2 e URLs públicas 200 com 53.762.718 bytes.
2026-10-02 20:01:24 -03:00
Francisco Solla
afc22e5bf3 docs(bug-fix): post-mortem e changelog das chaves AVIF presas no otimizador 2026-10-02 18:55:54 -03:00
Francisco Solla
e4e51a3651 fix(images): hero e cards da home servem masters WebP — AVIF fora do otimizador
Otimizar AVIF no Next 15.4.11 decodifica via libheif (GHSA-2xp9-vwfh-vxw4) e um hang transiente envenena a chave para sempre no Batcher do ResponseCache; o patch oficial (15.5.24) bypassa AVIF. Masters WebP mantêm a entrega e o enquadramento; guards proíbem AVIF em src/ e public/.
2026-10-02 18:55:54 -03:00
Francisco Solla
4aab740895 test(int): estabiliza os specs do álbum no global photoAlbum compartilhado
Aprovações passam a setar o canal e aprovar sob o lease exclusivo do global
(fecha a corrida com o teardown de specs irmãos) e os afterAll não fecham
mais o canal — o padrão que os specs de face já seguiam.
2026-10-02 17:40:41 -03:00
Francisco Solla
53f8e4a3cd fix(fotos): mantém o encoder do store interno ao dono (knip) 2026-10-02 17:40:41 -03:00
Francisco Solla
c15f09531a feat(fotos): miniaturas AVIF pré-geradas do álbum público (C248)
Derivada AVIF 720px q60 armazenada como objeto-irmão determinístico de cada
foto aprovada (flickr-<id>-grade.avif), servida direto quando o cliente
negocia Accept: image/avif; fallback JPEG on-the-fly em ausência/falha, heal
preguiçoso via after(), warm no afterChange da aprovação e backfill
pnpm archive:thumbnails idempotente com recibo e guardas *_CONFIRM.

Sem migration, sem UI, sem mudança de URL pública ou pull-down.
Closes #1424
2026-10-02 17:40:41 -03:00
Francisco Solla
4feea40c01 docs(archive): verificação do canário por GET no runbook (HEAD não valida checksum) 2026-10-02 17:37:39 -03:00
Francisco Solla
255751f5ce fix(archive): teto de 15 min no download do reparo e caminhos do runbook (C246-followup)
O canário 80/83 abortou no download do Flickr: original de ~54 MB (panorâmica 7952px) a ~260 KB/s no link direto do homeserver leva ~3,5 min, acima do teto de 2 min herdado do C231. ARCHIVE_INTEGRITY_DOWNLOAD_TIMEOUT_MS vira 15 min (exportada e pinada no unit); falha de download segue failed retentável. Runbook §C246 usa ~/archive-reports (o /srv do texto original não existe/grava) e ganha docker pull do migrator (a limpeza pós-deploy remove a tag local).
2026-10-02 17:37:39 -03:00
Francisco Solla
a3a49c3462 feat(archive): preflight de integridade antes de aprovar drafts (C249)
O pnpm archive:publish passa cada draft elegível pelo inspectPrivateMediaObject do C246 (download pelo caminho da rota pública + decode sharp) antes de qualquer payload.update: objeto missing/corrupt fica fora do lote, é nomeado no recibo como skippedBroken (stage + motivo) e o comando sai 1 — no plan (read-only) e no apply. A fila seleciona filename além de id; o lote vira o seam exportado runArchivePublishBatch (temp por foto removido no finally) com guard isDirectRun, e o puro scripts/lib/archivePublishPlan.mjs ganha skippedBroken/skippedBrokenCount no summary e as linhas do recibo. scripts/publish-archive-photos.mjs entra no SCRIPTS_SPEC_PINNED (high-risk exato: unit/int full + e2e curado). Guardas do publish intactas; sem S3 num alvo não-local o probe classifica tudo missing (fail-closed). Sem migration, sem UI. Runbook C242/C246 e changelog atualizados; unit do summarize/format, int do lote real (íntegro aprovado, corrompido decode, removido missing, plan sem escrita) e impl plan em docs/plans/acervo-publish-preflight-integridade-impl.md.
2026-10-02 17:25:03 -03:00
Francisco Solla
ac39c81765 style(docs): separa as seções C244/C246 no runbook após o rebase
Some checks are pending
Deploy / preflight (push) Waiting to run
Deploy / verify (push) Blocked by required conditions
Deploy / deploy staging (teqo-staging) (push) Blocked by required conditions
Deploy / requeue when main advanced (push) Blocked by required conditions
Deploy / deploy production (teqo-1313) (push) Blocked by required conditions
2026-10-02 10:53:39 -03:00
Francisco Solla
dcf8e85a9d feat(archive): varredura e reparo de integridade do acervo no Garage (C246)
Adiciona a CLI pnpm archive:integrity: varredura read-only de todas as archivePhoto (download + decode pelo mesmo caminho da rota pública e do índice facial; sai 1 enquanto houver mídia quebrada approved) e --apply que re-ingere do Flickr pelo flickrId, substitui o objeto na mesma chave via payload.update filePath (sem tocar curadoria/status) e rebaixa a draft as irrecuperáveis (removed intocado).

Dono da leitura ganha inspectPrivateMediaObject e isPrivateMediaMissingError (S3 NoSuchKey/404 + ENOENT local; checksum nunca é missing); archivePhotoIngest ganha repairArchivePhotoObject e withdrawArchivePhotoFromPublic; decisão do reparo em scripts/lib/archiveIntegrityRepair.mjs com deps injetadas e puro de CLI/recibo em scripts/lib/archiveIntegrityPlan.mjs. Sem migration, sem UI. Guardas: ARCHIVE_INTEGRITY_CONFIRM + TEQO_ENV exato + 4 S3_* (em qualquer modo no alvo não-local) + FLICKR_API_KEY. Runbook C246, changelog e unit/int/e2e afetado.
2026-10-02 10:53:39 -03:00
Francisco Solla
ecd9fe478d fix(C245): regenera a migration sobre a cadeia pós-C244
O snapshot da migration da sessão foi gerado antes do merge do C244
(face_figure); regenerado sobre a cadeia nova, o diff segue só coluna
catalog_metadata_checked_at + índice. Aplicada nos bancos do worktree.
2026-10-02 10:17:49 -03:00
Francisco Solla
b6b9bd6360 style(C245): estabiliza a formatação do spec do CLI 2026-10-02 10:17:49 -03:00
Francisco Solla
930db3eb02 feat(C245): catalogar o acervo em produção por camadas — metadados primeiro
A catalogação do C232 nunca rodou em produção: catalog.* zerado nas 6.492
fotos publicadas e o engine de visão fora do ar. O pnpm archive:catalog
ganha --metadata-only: deriva município (gazetteer) e temas do texto já
ingerido, sem engine e sem mídia, grava catalog.metadataCheckedAt
(migration aditiva) e não marca catalogedAt — a fila da IA segue aberta.
Nunca escreve catalog.people (C244 assume a faceta por facial).

A passada de IA passa a carimbar os dois markers; a fila de metadados exclui
linha já catalogada pela IA (não rebaixa o source); o --verify relata as duas
camadas com exit pela selecionada; o --apply de metadados dispensa S3_* e
engine. Runbook §C245: metadados → revalidate archivePhotos → IA.

Closes #1417
2026-10-02 10:17:49 -03:00
Francisco Solla
539138db0a docs(ops): runbook e changelog do ops:global (C247) 2026-10-02 10:10:16 -03:00
Francisco Solla
269b3d9e3b feat(ops): CLI ops:global para flags de globais públicos (C247)
Grava um único campo do global via Local API e busta a tag no processo Next vivo pelo POST /api/revalidate (allowlist ampliada com REVALIDATE_PHOTO_ALBUM_CACHE_TAG), com guardas de escrita, plan/apply/verify, recibo com rollback e int pin do update parcial.
2026-10-02 10:10:16 -03:00
Francisco Solla
d8020607b9 docs(C244): impl plan, runbook, AGENTS-public e changelog 2026-10-02 09:35:43 -03:00
Francisco Solla
9a60807d4e test(C244): e2e da faceta facial e manifesto de afetados 2026-10-02 09:35:43 -03:00
Francisco Solla
ee3dda757b feat(C244): aviso do índice curado, seed de figuras e enrollment 2026-10-02 09:35:43 -03:00
Francisco Solla
e46ed57e2c feat(C244): faceta pessoa do álbum lê o reconhecimento facial 2026-10-02 09:35:43 -03:00
Francisco Solla
625ab5c10e feat(C244): collection curada faceFigure, migração e matcher puro 2026-10-02 09:35:43 -03:00
Francisco Solla
8a87f5f81b docs(plan): C248 — miniaturas AVIF pré-geradas do álbum público (Related #1424) 2026-10-02 09:24:47 -03:00