Commit graph

1551 commits

Author SHA1 Message Date
Francisco Solla
e652f0ae45 feat(S20): ajuste lateral da foto do card time sem limite artificial (Closes #1216) 2026-09-19 16:32:33 -03:00
Francisco Solla
8b74aa705a fix(S19): imagem do cartão no origem do deploy, não no domínio canônico
O resolveShareLinkOgImageUrl absolutizava /api/media/file/… contra o siteUrl do global metadata (hoje https://jorgesolla.com.br, servido pelo WordPress antigo), que responde 404 no proxy de mídia — o WhatsApp lia título/descrição mas derrubava a miniatura (caso real do cartão plenaria-cultura, da plenária de 19/09).

- resolveDeploymentOrigin (novo em seo.ts): NEXT_PUBLIC_SITE_URL primeiro (inlinado no build de produção, mesmo carrier do isStagingSite), fallback no URL do global; canonical/og:url seguem a cadeia global-first documentada — só a URL do asset muda.
- Unit do resolver (env vence/fallback/vazio); int pina o env sobre um URL de global estrangeiro.
2026-09-19 16:28:32 -03:00
Francisco Solla
ca59523759 feat(C207): projeção no último período do trio do gerador de gráficos (gate 2026-09-19) 2026-09-19 16:00:59 -03:00
Francisco Solla
5be9a1af4d style(S20): formata plano e design com prettier (Related #1216) 2026-09-19 15:34:12 -03:00
Francisco Solla
b4db67da87 docs(S20): plano de intenção — ajuste lateral da foto sem limite artificial (Related #1216) 2026-09-19 15:34:12 -03:00
Francisco Solla
468f33e5b2 feat(S19): links de compartilhamento com miniatura OG (Closes #1207) 2026-09-19 14:02:17 -03:00
Francisco Solla
cde96b26d0 feat(S18): cabeça do visitante proporcional à dos candidatos no card Time de você
- FaceDetector (blaze_face_full_range, Apache-2.0, lazy/on-device) mede o maior rosto no canvas do recorte; math pura frameCardPhotoOnFace escala a face à referência TEAM_CARD_FACE_REFERENCE_SIZE=103 (mediana das 5 caixas da arte-mestre).
- Piso do time CARD_TEAM_PHOTO_MIN_ZOOM=0.2 com clamp contain/cover por eixo (minZoom opcional preserva os 3 modelos S13/S14); fallback silencioso ao enquadramento S15 sem rosto/falha.
- Stub e2e estendido ('noface'); unit novo da math e da seleção do rosto; craft com retrato real 86-98px vs 103 (±20%); crítica Tier 1 certificada.

Closes #1197
2026-09-19 13:42:22 -03:00
Francisco Solla
ca19b2c86f feat(C205): linha de três séries e marca maior no rodapé do gerador de gráficos (Closes #1212) 2026-09-19 13:35:01 -03:00
Francisco Solla
dbd9ecdfd4 feat(S16): banner azul dinâmico no card "Time de você" — nomes longos cabendo (Closes #1195) 2026-09-19 13:05:52 -03:00
Francisco Solla
88d6ff3f1c fix(C191): cena 02A na paleta oficial do C203 — duas colunas no mesmo #e4102f
Re-decisão do designer sob a paleta do kit 1313: as duas categorias positivas compartilham o vermelho oficial (sem segundo vermelho, sem hierarquia); ordem de entrada, nunca o maior valor. Rebase em cima do C203 e peça re-renderizada na marca oficial.
2026-09-19 12:57:40 -03:00
Francisco Solla
384cfe98e8 feat(C191): coluna de comparação entre categorias e variante duas colunas positivas — unidade %, kicker pela relação
Skill, núcleo (chartData), renderer (columnBody/CSS), design CENA 02A com sign-off humano e testes.
Entrega: docs/research/graficos-instagram/a-maioria-dos-internados-nos-dois-hospitais-de-v-2026-09-19-feed.png (worktree work/21, sem claim).
2026-09-19 12:57:40 -03:00
Francisco Solla
0d6518c3d1 feat(C200): separar falas por pessoa nas gravações enviadas (Closes #1167) 2026-09-19 12:32:46 -03:00
Francisco Solla
0dae7d4ac1 refactor(C203): seletor de chave no dono do kit, guard estrito e nomes (simplify)
- readKitAssets({ keys }) lê só o ativo pedido; o entry pede namePositive (não falha por ativo alheio)
- guard do brandLogo com regex estrita de data URI PNG/base64 (vazio/aspas fora)
- helper brandMark (sem colisão com a opção brandLogo); JSDoc @param/@returns no dono
- entry-spec: teste dedicado do ativo com repoRoot tmp; stub base64 válido; helper tipado
- triage pós-simplify no impl plan (S9 defer com gatilho; S10 explicitamente fora)
2026-09-19 11:24:06 -03:00
Francisco Solla
258fd22379 feat(C203): gráficos do Instagram na marca e paleta oficiais do kit 1313
- rodapé com jorge-solla-positivo.png (data URI, frame 286×90) no lugar do lockup tipográfico; renderer fail-closed sem a marca
- paleta oficial: destaque/valência boa #e4102f, sinal de marca #184e92; amarelo/verde só nos ativos
- dono único da leitura do kit (scripts/lib/campaignKitAssets.mjs; root por import.meta.url) reusado pelo reel
- lineChart default alinhado ao vermelho oficial; CHART_COLORS/dossiê intactos
- skill/command e pinos de prosa/teste atualizados; SCRIPTS_SPEC_PINNED + impl plan + changelog
2026-09-19 11:24:06 -03:00
Francisco Solla
1bb32ad1a9 docs(S19): plano de intenção — links de compartilhamento com miniatura OG (Related #1207) 2026-09-19 11:22:56 -03:00
Francisco Solla
8a73eb2154 fix(flip): removeLabels idempotente — restaura o ignoreNotFound revertido pelo C140 (descoberto no PR #1202) 2026-09-19 11:15:34 -03:00
Francisco Solla
d7d4258cd7 feat(S17): controle "Harmonizar cores" no ready do card Time de você
Ajuste local de brilho/contraste/saturação (clamps fixos ≤12%, alpha byte-a-byte) para aproximar a selfie do tom da arte-mestre; variante gerada 1× no ready do useCardCutout e escolhida pelo toggle no mesmo canvas da prévia e do PNG. Sem migration/Consent/rede/persistência; os 3 modelos e o recorte intocados. Crítica do designer certificada no tier primário (artefato revalidado sem DEGRADED).
2026-09-19 10:55:18 -03:00
Francisco Solla
4d37640210 fix(OPS71): ready-automerge de volta — AUTOMERGE_PAT rotacionado para o token longevo do gh + contrato/verificação (Closes #1176, #1177, #1184)
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-09-19 03:07:29 -03:00
Francisco Solla
4ac68de29c feat(C191): barra de variação (delta) no gráfico de Instagram — base e extensão por categoria, sem valência
Skill, núcleo (chartData), renderer (deltaBody/CSS), design CENA 02C com sign-off humano e testes.
Entrega: docs/research/graficos-instagram/equipes-saude-vdc-2020-2026-feed.png (worktree work/20, sem claim).
2026-09-19 01:23:23 -03:00
Francisco Solla
9ad4658ffd docs(C204): kit 1313 como fonte de marca única — doutrina, ponteiros e 14 ativos (Closes #1193) 2026-09-19 01:21:40 -03:00
Francisco Solla
8480868059 chore(S16,S17,S18): formata artefatos ui-design (prettier) para o gate 2026-09-19 01:07:14 -03:00
Francisco Solla
eadaf6f64f docs(S16,S17,S18): planos de intenção — ajustes pós-UAT do card Time de você (Related #1195, #1196, #1197) 2026-09-19 01:07:14 -03:00
Francisco Solla
ebee7c0a7a docs(C203,C204): planos de intenção — kit 1313 na marca oficial (Related #1192, #1193) 2026-09-19 00:48:29 -03:00
Francisco Solla
31ebb932af feat(C197): narração rascunho (TTS pt-BR) + transcrição sempre no pacote do reel (Closes #1156) 2026-09-19 00:33:37 -03:00
Francisco Solla
c0760f4234 docs(OPS128): remove verificação pós-deploy em staging do fechamento do work-issue (Closes #1188) 2026-09-19 00:29:23 -03:00
Francisco Solla
78598906de docs(OPS128): plano de intenção — remover verificação pós-deploy em staging do work-issue (Related #1188) 2026-09-18 23:45:29 -03:00
Francisco Solla
d0f606a55d feat(C199): gravações enviadas no acervo de comunicação (Closes #1166) 2026-09-18 23:42:30 -03:00
Francisco Solla
fdbab4b91c
Merge pull request #1175 from fsolla/fix/token-401
fix: 401 do GITHUB_TOKEN local (PAT expirado) — dica acionável, testes e docs
2026-09-18 23:40:26 -03:00
Francisco Solla
5b27bfa0c2
Merge pull request #1183 from fsolla/C196-skill-de-geracao-de-reels-captura-composicao-do-video
C196 — skill /reels-tutoriais: captura + composição do vídeo (kit oficial 1313)
2026-09-18 23:40:06 -03:00
Francisco Solla
8bf79ff4cc feat(C191): linha de duas séries no gráfico de Instagram — valência bom/ruim, projeção e cruzamento
Skill, núcleo (chartData), desenho (dualLineChart/renderer), design CENA 02B certificado e testes.
2026-09-18 23:12:05 -03:00
Francisco Solla
83092adabf chore(C196): merge origin/main (resolve SCRIPTS_SPEC_PINNED com reel-ingest do C195) 2026-09-18 22:55:52 -03:00
Francisco Solla
a8a5ed324f
C195 — Ingestão do pacote do reel na biblioteca privada (#1182)
C195 — Ingestão do pacote do reel na biblioteca privada
2026-09-18 22:30:57 -03:00
Francisco Solla
8041f64b0b chore(C196): merge origin/main (resolve lista de commands) 2026-09-18 22:24:21 -03:00
Francisco Solla
560f2e494a feat(S15): card "Time de você" — quarto modelo auto-serviço no funil público (Closes #1161) 2026-09-18 22:17:52 -03:00
Francisco Solla
7079c63949 Merge remote-tracking branch 'origin/main' into C195-ingestao-do-pacote-do-reel-na-biblioteca-privada
# Conflicts:
#	src/lib/reel.ts
2026-09-18 22:01:32 -03:00
Francisco Solla
448f3845a2 feat(C194): biblioteca de reels na vertical Comunicação (#1153)
Lista publicados-only com capas 9:16, detalhe com player 9:16 e painel de
downloads (vídeo sem áudio primário; com áudio, mp3 e .srt quando existem;
transcrição em texto) e kill switch reversível: despublicar tira da lista e
bloqueia a mídia (C193 decision B), republicar reativa e re-carimba publishedAt.

Fiação: gate communicationCatalog (rename do speechCatalog), 3º sub-item da
vertical no nav, rule da lista no chrome, paths e loader próprios; sem
migration, sem Consent, sem tocar Media.read ou a rota de mídia do C193.

Design tier: DEGRADED — crítica final do designer indisponível no tier
primário (limite de uso); requer sign-off humano antes de push/PR.
2026-09-18 21:54:37 -03:00
Francisco Solla
8504b3b13a feat(C196): skill /reels-tutoriais — captura mobile + composição de vídeo
- skill + command finos: shot list é a fonte única; ajuste regenera, nada publica
- scripts/build-reel.mjs + scripts/lib/reel*.mjs: captura CDP com timestamps de
  parede (sem drift), cursor/halo DOM-injected, zoompan do log de cliques,
  legendas queimadas, capa 1080x1350-safe, concat H.264 1080x1920/30fps
- ffmpeg: FFMPEG_PATH -> PATH -> @ffmpeg-installer (registry-only) com probe fail-closed
- kit oficial da campanha: public/campaign-kit (marcas positiva/negativa, numero,
  estrela) + manual em docs/campaign-kit + README de regras; skill e agente de
  design referenciam o material
- 26 testes unit novos + pin do command; changelog 2026-09-18-c196

Closes #1155
2026-09-18 21:50:28 -03:00
Francisco Solla
5afa16c33b feat(C195): ingestão do pacote do reel na biblioteca privada (Closes #1154) 2026-09-18 21:47:48 -03:00
Francisco Solla
11a38d9c04 docs(C201): impl plan da verificação do typecheck da main (Related #1169) 2026-09-18 21:39:08 -03:00
Francisco Solla
adf21ba5c7 fix(C190): boletim de uma página cabe por medição (painel de acervo + fit)
O run real (Educação) entregava o dossiê mas o boletim media 3502px vs 1133px úteis: os 15 fatos do acervo (sphere area) dominavam os destaques com o summary integral e não havia contador nem fit no one-pager.

- dossieBlocks marca as falas do acervo com sourcePanel: true; buildBulletin as mantém contadas no "e mais N" e fora das vagas impressas (destaques/E mais ficam com findings com fonte)
- buildBulletin ganha printLimit; emitHtmlPairPdf ganha onBulletinOverflow (espelho do onDossierOverflow do C188) e o builder do tema re-renderiza com 2 fatos a menos até caber, fail-closed
- boletim subject (tema/instituição) ganha o contador C188 que só o município tinha, com copy.remaining por descritor
- contrato do tema documenta brief/summary (C188) na skill e no subagente researcher
2026-09-18 19:08:45 -03:00
Francisco Solla
ddfd8b31f3 feat(C191-runtime): cobertura do entry/PNG real e parse pt-BR explícito (Closes #1151) 2026-09-18 19:08:22 -03:00
Francisco Solla
9477fed34e docs: aponta o post-mortem para o PR #1175 (supersede #1174) 2026-09-18 19:03:29 -03:00
Francisco Solla
10bab7d988 fix: 401 do GITHUB_TOKEN local (PAT expirado) — dica acionável, testes e docs (Related #1169)
O GITHUB_TOKEN exportado no shell desde o OPS71 (PAT fine-grained) expirou e,
inválido, sombreava a credencial válida do gh (keyring) — quebrando
pnpm issue/agent:*/github-pr.mjs e o próprio gh (o bash dos agentes herda o env
do opencode serve, não do .bashrc). github-api.mjs passa a anexar dica acionável
a todo 401 (REST + GraphQL), com 2 testes de regressão; AGENT-OPS documenta a
expiração e a recuperação (derivar de gh auth token).

Mesmo lote do OPS71: o secret AUTOMERGE_PAT também expirou (safety net falha
fail-closed desde 21:39Z) — rotação é ação humana pendente.

C201/#1169: o typecheck da main (RED desde bdaf3c7c) foi corrigido pelo PR #1171;
este PR fecha o tracker item.

Post-mortem: docs/postmortems/2026-09-18-github-token-401.md
2026-09-18 19:00:11 -03:00
Francisco Solla
c7d1fd29cc fix(C193): renomeia referência perdida do predicado da vertical de comunicação (Related #1152) 2026-09-18 18:52:38 -03:00
Francisco Solla
bdaf3c7cbb feat(C193): reel privado no CMS — modelo, upload privado e kill switch (Closes #1152) 2026-09-18 17:48:34 -03:00
Francisco Solla
45eef25b1a feat(C192): busca semântica no acervo de falas (Closes #1147)
Modo "Por tema" no acervo de falas: expansão determinística do tema via
DeepSeek (generateObject, timeout, fallback null) alimenta o motor lexical
existente (searchText/keywords OR), mantendo facetas AND, paginação por fala,
o OR de cortes do C174 e o access control intacto. Resultado de tema mostra
selo e "Por que apareceu" com trecho real (frase contínua), sem score;
degradação honesta para termo exato com aviso e vazio honesto com saídas.

- URL: mode=tema (default omitido; canonicaliza sem q), seletor otimista
- ai/expandSpeechSearchTheme + lib/speechThemeTerms (sanitiza saída do modelo)
- view model com themeMatchTerm + espelho speechMatchesSearchTerm
- UI do card de tema (selos, proveniência, ações) e aviso degradado
- sem migration/Consent/exposição pública; gate de leitura inalterado
- testes unit/int/e2e; design hi-fi estendido e certificado pelo designer
2026-09-18 17:48:28 -03:00
Francisco Solla
af6fa698db docs(C199,C200): planos + designs hi-fi — gravações enviadas no acervo (Related #1166, #1167) 2026-09-18 17:46:24 -03:00
Francisco Solla
e91dea637f feat(C191): gráficos de dados para Instagram — skill + builder local (Closes #1145) 2026-09-18 17:32:48 -03:00
Francisco Solla
b5666d6647 docs(S15): plano + design hi-fi do card "Time de você" (Related #1161) 2026-09-18 17:31:35 -03:00
Francisco Solla
e5e1ae7ee8 feat(C190): dossiê Solla por tema/área + boletim modelo (skill + builder)
Terceira variante da família de dossiês: recorte pela área canônica do
acervo (SPEECH_TOPICS), com o pipeline C186/C187 generalizado para a forma
subject via THEME_UNIT (generalização aditiva; C186/C187 byte-idênticos).

- resolveSpeechTopic no dono speechFacets (fail-closed, sem slug inventado)
- themeSnapshot + extract-theme-snapshot (THEME_REPORT_CONFIRM=1, read-only)
- build-dossie-solla-tema (pack medido, PDF A4 + .md + boletim 1 página)
- skill/comando/2 subagentes (researcher por era + redator) + specs
- cenas theme-only no descritor (acervo universo/amostra, abrangência,
  lacunas, hierarquia de fontes, pills do boletim) certificadas pelo designer

Closes #1143
2026-09-18 17:02:56 -03:00
Francisco Solla
6ec14823e5 style(OPS127): alinha a tabela de sessões ao Prettier 2026-09-18 16:55:08 -03:00
Francisco Solla
fd68014edc feat(OPS127): launch do worktree nasce na variante max (Closes #1149) 2026-09-18 16:55:08 -03:00
Francisco Solla
161c49a260 docs(C193,C194,C195,C196,C197): planos + designs hi-fi — reels de tutoriais do site (skill + biblioteca privada)
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
Related #1152,#1153,#1154,#1155,#1156
2026-09-18 16:45:28 -03:00
Francisco Solla
5f8233c7e9 docs(plan): OPS127 — launch do worktree --go em variante max (Related #1149) 2026-09-18 16:20:59 -03:00
Francisco Solla
f55996328c docs(C192): plano + design hi-fi da busca semântica no acervo (Related #1147) 2026-09-18 16:10:40 -03:00
Francisco Solla
444c5830e2 style(C191): formata o design hi-fi conforme Prettier 2026-09-18 15:52:39 -03:00
Francisco Solla
fcfbc68604 docs(C191): plano + design hi-fi da skill de gráficos de dados para Instagram (Related #1145) 2026-09-18 15:52:39 -03:00
Francisco Solla
a014894341 docs(C190): plano + designs hi-fi do dossiê Solla por tema/área (Related #1143) 2026-09-18 09:50:44 -03:00
Francisco Solla
5644a9f947 feat(C186/C187): dossiê corrente sem caps + redação, síntese e gráficos (paridade cidade × instituição)
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
Revisão de produto a partir do uso real (UFBA): as seções deixam de ser
capadas e fluem por quantas folhas precisarem, com packing medido
(probe → grow/shrink por folha, scripts/lib/dossiePack.mjs) e guarda de A4
no emit; o dossiê ganha redação de abertura (narrative.json escrito por
sub-agente e auditado pelo orquestrador), parágrafo de consolidação por
era, páginas de síntese e gráficos (recursos com fase, abrangência,
trajetória) e acervo como amostra declarada. O dono (dossieBlocks/
dossieRender/dossieUnit/buildPdf) foi generalizado e o ramo cidade adotou
as mesmas decisões; skills, comandos, agentes redatores, specs e designs
hi-fi re-sincronizados.
2026-09-17 23:00:08 -03:00
Francisco Solla
4b00a8778a feat(C188): relatórios e dossiês sem truncamento mecânico
Dono único de orçamento de texto em reportText.mjs (capList,
excerptDeepDive, joinWithRemainder, summaryText/summarySurfaceText,
summaryListText), reusado por C163 e C186. Contrato summary por item nos
dois arquivos de pesquisa; superfície de resumo nunca corta com "…" e
aponta o aprofundamento; toda lista capada mostra contador; builders com
2 passadas guard-gated (integral → ponteiro → die fail-closed).

Closes #1136
2026-09-17 19:59:02 -03:00
Francisco Solla
cb5854d17e feat(C187): dossiê Solla por instituição + boletim modelo (skill + builder) (Closes #1135)
Generaliza aditivamente o pipeline C186 (default município; specs verdes) via o
descritor scripts/lib/dossieUnit.mjs (municipality|institution), extrai o emit
A4/fit-guard para scripts/lib/buildPdf.mjs e a receita read-only para
scripts/lib/readOnlyExtract.mjs.

- Catálogo fail-closed src/lib/institutionCatalog.ts + institutionNameAliases.ts
  (seed UFBA/Correios/Enfermagem; escape one-off --slug/--name; dedup).
- Skill/command/subagente /dossie-solla-instituicao; eras A/B/C reusadas.
- Abrangência instituição × setor × rede nunca somada; era sem fonte vira página
  de lacuna explícita; lista capada declara "e mais N" (regra C188 no dono).
- Boletim modelo 1×A4 com fase junto ao valor, sem fontes, sem CTA; herda apenas
  fatos com fonte do dossiê (incl. falas do acervo read-only).
- Sem schema/migration/DB write; artefatos gitignored.
2026-09-17 19:25:13 -03:00
Francisco Solla
ef87c68a18 style(C187): prettier nos artefatos de plano (gate format) 2026-09-17 17:48:35 -03:00
Francisco Solla
30124db224 docs(C187,C188): planos + designs hi-fi (dossiê instituição; sem truncamento) 2026-09-17 17:48:35 -03:00
Francisco Solla
4364ca203a docs(C186): registra a triage dos débitos de review no impl (Related #1132) 2026-09-17 16:41:32 -03:00
Francisco Solla
23456bb81d refactor(C186): endurece o builder e enxuga o modelo do dossiê (review) (Related #1132) 2026-09-17 16:41:32 -03:00
Francisco Solla
264fbb8864 feat(C186): dossiê Solla por cidade + boletim modelo — skill + builder (Closes #1132) 2026-09-17 16:41:32 -03:00
Francisco Solla
b9de38212c docs(C186): plano + designs hi-fi do dossiê Solla por cidade (Related #1132)
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-09-17 15:16:00 -03:00
Francisco Solla
2364b3e2d9 fix(C163): página 1 cabe com muitos indícios de emenda (Closes #1130) 2026-09-17 14:57:23 -03:00
Francisco Solla
10b58afe4c chore(OPS125): conta de teste dos agentes no staging (Closes #1126)
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-09-17 02:08:57 -03:00
Francisco Solla
1ebae91428 fix(OPS126): auto-unblock honra o proxy do homeserver e resolve o opencode fora do PATH
Duas causas independentes mantinham o agente de desbloqueio (OPS106) sem
entregar:

1. `fetch failed` no launcher: o homeserver só alcança o GitHub pelo proxy
   CONNECT local (github-tunnel + http-proxy-socks) e o `fetch` global do Node
   ignora HTTP(S)_PROXY sem `NODE_USE_ENV_PROXY` (Node >= 24). O launcher
   morria lendo os jobs do run (run 35171293357) e nenhum token era criado.
   `scripts/auto-unblock.sh` passa a exportar `NODE_USE_ENV_PROXY=1` quando há
   proxy no env; o agente destacado herda.

2. exit 127 do agente: o serviço do runner não carrega o profile interativo,
   então `~/.opencode/bin` fica fora do PATH e o `timeout ... opencode` morria
   com *No such file or directory* (log unblock-35101121310.log), deixando o
   token `blocked` sem PR. Novo `resolveOpenCodeBinary` (OPENCODE_BIN → argv0
   com path → `$HOME/.opencode/bin` → PATH) usado pelo wrapper, pelo `--check`
   e por um gate fail-closed no launcher (token blocked, sem provisionar
   worktree).

Runbook + changelog OPS126; unit tests do resolver. Token órfão #1089 fechado
no replay. Flakiness de e2e full segue na #1124.
2026-09-17 02:07:18 -03:00
Francisco Solla
f70c5e2d0b refactor(C179): helper único da URL do thumbnail do YouTube (Closes #1093) 2026-09-17 01:30:43 -03:00
Francisco Solla
bdd2b0dbf0 docs(OPS125): plano de conta de teste dos agentes em staging (Related #1126) 2026-09-17 01:29:09 -03:00
Francisco Solla
f8b0d5ecac feat(C173): pré-visualizar no player o trecho selecionado (Closes #1083) 2026-09-16 22:22:29 -03:00
Francisco Solla
45738b16f0 docs(C173): impl plan aprovado + extensão do artefato (trigger a) 2026-09-16 22:22:29 -03:00
Francisco Solla
b1beb07f2a fix(C182): acervo mostra o frame do meio de cada fala, não a capa da sessão (Closes #1104) 2026-09-16 21:42:36 -03:00
Francisco Solla
c51db57865 feat(C163): página 1 mostra os indícios de emenda e perde o "O que NÃO anunciar"
Contrato novo emendasIndicators[] (author+sphere obrigatórios, fonte obrigatória, fail-closed
para lacuna) alimenta um bloco indicatorList na página 1: uma linha por indício com
valor, finalidade, badge de esfera (município/região/polo) e link de fonte. O painel
fixo "O que NÃO anunciar" sai da página 1 e o par vira panel único de anúncio (3 bullets
invariantes viram 1), preservando a advertência de defeso. Atualiza a skill canônica e
os testes de validador/blocks/render.
2026-09-16 21:23:45 -03:00
Francisco Solla
a84c0183b1 B203 — Sollinha começa fechado no desktop (Closes #1107) 2026-09-16 21:08:25 -03:00
Francisco Solla
20d2f03226 fix(C181): player do acervo volta a ter o YouTube in-page e espera a Câmara gerar o trecho
- restaura o embed do YouTube como superfície opt-in no SpeechDetailPlayer
  (a Câmara segue a entrada padrão; o embed nunca é a porta automática, guardrail C178)
- controle simétrico "Assistir no YouTube"/"Assistir na Câmara" no bloco de saída,
  com o ponto da fala preservado na troca (pendingSeekRef/youtubeStart)
- SPEECH_VOD_PLAYER_POLICY passa a pollAttempts: 2 / pollDelayMs: 3000 — espera
  bounded dentro do clique em vez de tratar o primeiro GERANDO como falha
- unit do resolver (pin + GERANDO→PRONTO) e do player (ida-e-volta + ponto);
  pin SSR do e2e mantendo o embed fora do HTML inicial

Closes #1103
2026-09-16 21:08:01 -03:00
Francisco Solla
691490709b Add implementation plan for acervo player YouTube return and Câmara wait 2026-09-16 21:08:01 -03:00
Francisco Solla
9de601b7aa feat(C183): apaga um corte da biblioteca e recupera cortes falhados (Closes #1105) 2026-09-16 20:34:12 -03:00
Francisco Solla
42f2f0ecaa fix(C180): select enxuto dos loaders, teto do id in da origem e paridade busca↔VM (Closes #1097) 2026-09-16 20:27:36 -03:00
Francisco Solla
5f64321cc5 fix(C177): "Abrir fonte" do acervo só com fonte oficial (Closes #1087) 2026-09-16 20:06:18 -03:00
Francisco Solla
067857a03a fix(OPS124): desabilita o plugin Payload do knip e explicita as exclusões (Closes #1094)
O `pnpm knip` imprimia `ERROR: Error loading src/payload.config.ts
(...server-only...)` e saía 0 — gate verde com o ERROR silencioso, no CI
(`ci-pr.yml`/`deploy.yml`) e local. O plugin embutido do Payload carregava
`src/payload.config.ts` via jiti sob as condições Node padrão e o import
transitivo de `server-only` lançava (só o `react-server` traz o `empty.js`);
o `paths.server-only` do `knip.json` alimenta apenas o resolver estático, não
o carregamento jiti (e o `tsconfig` alias, que funcionaria no load, foi
rejeitado por re-apontar a guarda server/client — classe OPS69).

Fix: `"payload": false` e as contribuições do plugin explicitadas no
`knip.json` (`!src/payload-types.ts` load-bearing; `!src/migrations/**`
paridade), removendo o bloco `paths` inerte. Provado: `pnpm knip` sai 0 sem o
ERROR, um export morto plantado é detectado, e a corrida de controle com
`server-only` neutralizado dá findings idênticos.

Plano: docs/plans/ops-knip-importmap-artifact-impl.md
2026-09-16 19:55:07 -03:00
Francisco Solla
4b3bee7c7d fix(C172): player e link abrem no ponto certo da fala (Closes #1082) 2026-09-16 19:33:04 -03:00
Francisco Solla
42f013317a fix(OPS122): launch do worktree honra o modelo na sessão e o --auto (Closes #1088) 2026-09-16 19:09:12 -03:00
Francisco Solla
8483387034 style(C178): prettier no plano do OPS124 2026-09-16 19:08:00 -03:00
Francisco Solla
97f84ffeda docs(C178): corrige o diagnóstico do débito OPS124 (knip sai 0, análise degradada em CI e local) 2026-09-16 19:08:00 -03:00
Francisco Solla
b378e1a91d fix(C178): player do acervo nunca abre a parede de signin do YouTube — Câmara vira default e YouTube só a saída externa (Closes #1081) 2026-09-16 19:08:00 -03:00
Francisco Solla
17ad33f0f8 docs(plan): C181–C184 + B203 — acervo (player/preview/cortes), nav e Sollinha
Related #1103, #1104, #1105, #1106, #1107
2026-09-16 19:02:27 -03:00
Francisco Solla
f066bee92b feat(C174): encontrar cortes — navegação, na fala e na busca (Closes #1084)
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-09-16 12:58:40 -03:00
Francisco Solla
01be1de7be feat(C176): página pública do corte — revisão de design (Closes #1086)
Corrige o fundo tintado (gradiente do body herdado de :root) com um
layout de segmento `data-theme="editorial"` + scroll interno, espelhando
`[type]/layout.tsx`, e porta o gate aprovado: vídeo herói, título à
esquerda, meta em relógio, prosa medida, kit WhatsApp-first responsivo,
secundárias em grade no mobile e estado indisponível redesenhado.

Extrai os botões do share kit no próprio dono (acervo/biblioteca
inalterados) e adiciona o guard e2e `data-theme="editorial"`.
2026-09-16 12:36:55 -03:00
Francisco Solla
d199c6b006 feat(C175): miniatura do trecho na listagem de falas (Closes #1085) 2026-09-16 12:36:35 -03:00
Francisco Solla
6641e7e993 chore(OPS119++): blast radius de scripts/ — risk map das libs + static scope (Closes #1077)
Fecha o resíduo da classe S6 da OPS119+ no resto de scripts/. F1: SCRIPTS_SPEC_PINNED (42 módulos scripts/** alcançáveis de specs unit+int) espalhado em HIGH_RISK_EXACT, sincronizado por invariante de igualdade que anda o grafo de imports dos specs (missing = lib nova pinada; stale = rename). F2: isCodePath cobre scripts/ (classifyStaticScope = code). Sem migration/access/Consent/UI. gate:fast verde.
2026-09-16 12:12:37 -03:00
Francisco Solla
96deb2c9d9 chore(OPS121): verificação pós-deploy em staging no fluxo work-issue (Closes #1079) 2026-09-16 11:53:54 -03:00
Francisco Solla
f6a6d8e42b chore(OPS123): reserva o provider openai aos agentes de design (Closes #1091)
Nenhum modelo openai/* (luna/sol-fast/terra inclusive) fora dos agentes de design, por /models, --model, small_model ou config. Cobre o uso de gpt-5.6-luna em sessoes build. Regra always-on no AGENTS.md + doutrina/AGENT-OPS; guard estatico em tests/unit/openaiProviderScope.unit.spec.ts.
2026-09-16 11:10:44 -03:00
Francisco Solla
a4a0e58add chore(OPS123): escopo de dispatch do designer frontier — só design de fato (Closes #1091)
O frontier designer (openai/gpt-5.6-sol, OAuth ChatGPT Plus) só roda Criar/Criticar o artefato de item que muda UI. A regra vive na doutrina ui-design-html.md §Escopo de dispatch (gate de 3 perguntas + lista fechada); plan-issue e execution-pipeline apontam para o dono; o agente recusa fora do escopo e o smoke do guard vai para o designer-degraded.
2026-09-16 11:10:44 -03:00
Francisco Solla
37f4bba998 style(plan): prettier nos planos e designs do lote C172–C178/OPS122
Related #1081, #1082, #1083, #1084, #1085, #1086, #1087, #1088
2026-09-16 10:44:57 -03:00
Francisco Solla
4e9b11d991 docs(plan): C172–C178 + OPS122 — acervo/cortes, player e launch do worktree
Planos de intenção + designs hi-fi do gate para o lote pós-teste do dono:
- C178 #1081 player do YouTube sem parede de signin (defect, P1)
- C172 #1082 player/link no ponto certo da fala (defect, P1)
- C173 #1083 pré-visualizar o trecho selecionado (P2)
- C174 #1084 encontrar cortes (nav, fala, busca) (P2)
- C175 #1085 preview do trecho na listagem (P2)
- C176 #1086 página pública do corte — design (P2)
- C177 #1087 'Abrir fonte' só com fonte oficial (chore, P3)
- OPS122 #1088 launch do worktree honra modelo e --auto (defect, P2)

Related #1081, #1082, #1083, #1084, #1085, #1086, #1087, #1088
2026-09-16 10:44:57 -03:00
Francisco Solla
821db8278b docs(OPS121): plano de verificação pós-deploy em staging no work-issue (Related #1079) 2026-09-16 10:33:17 -03:00
Francisco Solla
951c8b4b30 chore(OPS119+): risk map das libs de launch + pin do wiring do plan (Closes #1071) 2026-09-16 10:18:54 -03:00
Francisco Solla
b0582d5011 fix(OPS120): página 1 do relatório de cidade cabe com pesquisa cheia (Closes #1069)
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-09-16 01:31:41 -03:00
Francisco Solla
ef2df24a80 feat(OPS116): painel aceita -ui-design.html com retrocompat -ui-draft.html (Closes #1059)
O painel `pnpm issues:tui` volta a enxergar o design UI depois do rename do
OPS114: `siblingPlanPaths` deriva `-ui-design.html` (vigente) e
`-ui-draft.html` (legado) e o novo `resolveUiDraft(planPath, exists)` — puro,
com a existência injetada pelo CLI — é dono da precedência (design vence,
draft é fallback, nenhum → design com `exists:false`). O `readPlans` sonda
design→draft no disco e o caminho REAL flui por `plansByNumber`/`buildIssueRow`
até o view model; o contrato `--json` segue `version: 1` com o shape
`{ path, exists }` e a chave histórica `uiDraft`. As superfícies do painel
trocam "rascunho UI" por "design UI".

Retrocompat é só de leitura — o acervo legado (30 `*-ui-draft.html`) não é
tocado. Unit dos dois specs cobre design-only, draft-only, ambos, nenhum, o
caminho real, body linkando o impl e o shape do JSON. Sem migration.
2026-09-16 01:14:21 -03:00
Francisco Solla
6561f7fca7 docs(OPS115): designer em qualquer toque de design + crítica visual fail-closed nas skills (Closes #1058) 2026-09-16 01:06:48 -03:00
Francisco Solla
16f41a9188 feat(OPS119): worktree plan abre driverless sem bag e auto-envia /plan-issue <bag> (Closes #1066)
`worktree plan` sem argumento cria a sessão persistente sem driver (contrato do
`new`); com bag auto-submete uma única `/plan-issue <bag>` e usa o mesmo texto
como rótulo do branch, espelhando o `fix`.

- purposeInvocation (lib/agent-session): ramo plan reusa a sanitização do fix e
  devolve null quando o bag fica vazio (driverless por desenho).
- opencodeLaunchDirective emite --argument para fix||plan; cmdPlan repassa
  argument: bag; cmdStart isenta plan do aviso "sem comando".
- next/new/fix, --stay e o comando /worktree intactos.
- Specs repinados; textos vivos e changelog atualizados. Débito de risk map das
  libs + pin do wiring registrado em #1071.
2026-09-16 01:00:03 -03:00
Francisco Solla
06b118a4ff chore(OPS117): guard de escrita via bash nos agentes de design (Closes #1063) 2026-09-16 00:55:34 -03:00
Francisco Solla
04135df820 feat(OPS118): relatório de cidade em lote + researcher por cidade (Closes #1065) 2026-09-16 00:47:04 -03:00
Francisco Solla
98c9a6637a refactor(OPS114): bloco do sub-agente Designer, dono da gravação e links da doutrina (Related #1057) 2026-09-16 00:22:34 -03:00
Francisco Solla
b7f86e50fe docs(OPS114): design hi-fi obrigatório no gate — aposenta o rascunho low-fi (Closes #1057) 2026-09-16 00:22:34 -03:00
Francisco Solla
7b840e7dc7 docs(plans): OPS118/OPS119 — relatório em lote + worktree plan sem auto-envio (Related #1065, Related #1066) 2026-09-16 00:08:11 -03:00
Francisco Solla
20294286bf docs(OPS113): triage pós-simplify — registra OPS117, alinha OPS114 e fecha o impl plan (Related #1056, Related #1063) 2026-09-15 23:56:50 -03:00
Francisco Solla
5496c5e2e6 refactor(OPS113): prompts enxutos, permission restrita ao artefato e frontmatter citado (Related #1056) 2026-09-15 23:56:50 -03:00
Francisco Solla
6769ca2e9a feat(OPS113): designer e designer-degraded — design hi-fi como fonte de verdade do port (Closes #1056) 2026-09-15 23:56:50 -03:00
Francisco Solla
ed9dfd3e85 fix(C171-F1): troca para a Câmara preserva o ponto clicado na transcrição (Closes #1052) 2026-09-15 23:50:24 -03:00
Francisco Solla
b061190585 chore(OPS112): modelos padrao do worktree --go/--zen (DeepSeek V4.1 Flash / Muse Spark 1.3 Free) 2026-09-15 23:27:04 -03:00
Francisco Solla
45dbbfaf6d docs(plans): OPS113–OPS116 — designer agent + design hi-fi no gate (Related #1056, Related #1057, Related #1058, Related #1059) 2026-09-15 23:11:58 -03:00
Francisco Solla
845790970c docs(C169): registra débitos deferidos da triagem pós-simplify (Related #1045)
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-09-15 22:37:41 -03:00
Francisco Solla
046b51e38b fix(C169): corte do acervo resolve o trecho com a Câmara instável e falha dizendo o porquê (Closes #1045) 2026-09-15 22:37:41 -03:00
Francisco Solla
83f30dfc82 fix(C171): player do acervo toca ou oferece a saída em um clique — nunca beco de signin (Closes #1047) 2026-09-15 22:27:28 -03:00
Francisco Solla
c010cf815b feat(C170): acervo sem teto de corte — 5 s até o fim da fala (Closes #1046) 2026-09-15 22:17:01 -03:00
Francisco Solla
44e4502978 feat(C163): pauta das lideranças, acervo por região/tema e fonte inline no relatório de cidade 2026-09-15 22:12:19 -03:00
Francisco Solla
28c3b3a0fe fix(B32-B34-F1): clamp nunca esconde todos os chips + key warning do head (Closes #1042) 2026-09-15 21:55:30 -03:00
Francisco Solla
2e389365a3 docs(plan): C169 + C170 + C171 + OPS112 — acervo (corte confiável, sem teto, player) e modelos do worktree (Related #1045, #1046, #1047, #1048) 2026-09-15 21:22:55 -03:00
Francisco Solla
ee9c9ca068 fix(B32-B34): fixture e2e não pode apagar lideranças vivas (or vazio = match-all) + pin do semantic (Closes #1036) 2026-09-15 19:06:36 -03:00
Francisco Solla
e72677bee7 fix(B32-B34): estabiliza e2e de lideranças — settle/poll, colapso por conteúdo e waiter diagnóstico (Closes #1036) 2026-09-15 19:06:36 -03:00
Francisco Solla
d46360d1dc feat(C163): relatório — frente de oposição, dobradinhas, investimentos e seções dinâmicas
- Frente de oposição: lista de pesquisa 'opposition' (fato publicado com URL+data, sem inferir culpa) renderizada na seção 2, com nota de guardrail e URLs na seção de fontes.

- Dobradinhas: lista 'alliances' (com quem Solla soma na cidade) como bloco na seção de rede, insumo direto da abordagem.

- Investimentos: lista 'investments' (Solla, estado e federal, município e região; empenho ≠ pagamento) como bloco na conjuntura.

- Seções dinâmicas: numeração por posição; Sinais recentes e Demandas e visitas omitidas quando vazias (lacuna explícita só onde é produto).

Skill, changelog e testes unit cobrindo validador e builder.
2026-09-15 18:38:56 -03:00
Francisco Solla
afd5f137ac fix(C163): alarga a coluna Título da seção 11 do relatório de cidade
A tabela "Notícias internas e imprensa local" não tinha larguras: o layout automático dava ~2.000px à coluna Link (URL crua, sem espaços) e estourava a página (tabela de 2.261px), espremendo o Título a 64px. Larguras explícitas (Data 9 · Veículo 14 · Título 49 · Link 28) tornam a tabela table-fixed, quebram a URL dentro da célula e dão ao Título — o texto mais longo — a maior fatia. Decisão persistida no script e na skill relatorio-cidade, com entrada em docs/changelog.
2026-09-15 18:09:41 -03:00
Francisco Solla
c2ee60dd6a feat(OPS109): painel de issues e planos no terminal (via SSH) 2026-09-15 16:24:15 -03:00
Francisco Solla
9e00de36c9 fix(OPS111): setup-node 24 antes do pnpm/action-setup no auto-unblock (Closes #1035) 2026-09-15 16:02:29 -03:00
Francisco Solla
46f659147d OPS108 — Modo autônomo por flag --auto nas skills plan-issue e work-issue 2026-09-15 16:01:47 -03:00
Francisco Solla
a164961344 docs(ops): ajusta wrapping do prettier 2026-09-15 15:46:01 -03:00
Francisco Solla
b9052f37bb docs(ops): staging.jorgesolla1313.com.br vivo no túnel Cloudflare (ingress zero; runbook atualizado) 2026-09-15 15:46:01 -03:00
Francisco Solla
36d9abe8c0 docs(plans): OPS111 auto-unblock setup + B32/B34 lideranças verify (Related #1035, Related #1036) 2026-09-15 15:34:31 -03:00
Francisco Solla
13aeb9bb36 chore(OPS110-F1): flags desconhecidas falham alto, single-flight do start pinado e help/list completos (Closes #1026) 2026-09-15 14:36:54 -03:00
Francisco Solla
8dece9cd32 fix(C165-F1): fecha município nulo/fora da carteira no access de update da atividade (Closes #1030)
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-09-15 13:48:17 -03:00
Francisco Solla
77216481d8 feat(C168): biblioteca de cortes no acervo (origem, download, compartilhar, editar texto)
Lista + detalhe em /campanha/comunicacao/acervo/cortes: busca por título/descrição,\norigem da fala, player do MP4, edição de título/descrição e kill switch de\npublicar/despublicar no mesmo /corte/<id>. Gate speechCatalog fail-closed para\nadvisor/leader. Sem collection/migration nova.
2026-09-15 12:56:51 -03:00
Francisco Solla
897154b58b feat(campaign): C165 — importa eventos do Google como atividades sem município (Closes #1010) 2026-09-15 11:54:21 -03:00
Francisco Solla
352801853f feat(C167): corta o trecho [início,fim] do acervo e publica o arquivo numa página compartilhável
Seleção do C166 ganha "Cortar vídeo": título/descrição por IA (editáveis, com fallback determinístico), job assíncrono com ffmpeg por re-encode exato e polling dos quatro passos, e página pública unlisted /corte/<id> (noindex, OG, crédito CC BY) servindo o mesmo MP4. Collection speechCut com access canReadSpeechCut (advisor/leader negados) e kill switch por status; ffmpeg entra só no runner da imagem com FFMPEG_PATH para teste.
2026-09-15 10:24:36 -03:00
Francisco Solla
19c403f0dc fix(C163): calibra link do vídeo do acervo ao t=608s da sessão 2026-09-15 10:24:27 -03:00
Francisco Solla
bbd147fffb fix(C163): vídeo do acervo ancorado no trecho da Câmara, com folga 2026-09-15 10:24:27 -03:00
Francisco Solla
68efa6eef6 fix(C163): vídeo do acervo abre no início da fala (speechAt − sessão) 2026-09-15 10:24:27 -03:00
Francisco Solla
ebf484c984 feat(C163): link do vídeo do acervo na minutagem do trecho 2026-09-15 10:24:27 -03:00
Francisco Solla
e8f85f6a83 feat(C163): vídeo e transcrição no acervo de falas 2026-09-15 10:24:27 -03:00
Francisco Solla
0f0f9a6eab feat(C163): unifica a visualização da demografia em uma tabela 2026-09-15 10:24:27 -03:00
Francisco Solla
7a17798cda feat(C163): total populacional e revisão de apresentação do relatório 2026-09-15 10:24:27 -03:00
Francisco Solla
18069dd074 feat(C163): demografia complementar, atividade econômica e transporte no relatório 2026-09-15 10:24:27 -03:00
Francisco Solla
5b801c4b52 feat(C163): colunas mais largas no acervo de falas 2026-09-15 10:24:27 -03:00
Francisco Solla
05d4ac42d5 feat(C163): partido na lista de lideranças da cidade 2026-09-15 10:24:27 -03:00
Francisco Solla
63b60ca7a6 feat(C163): concorrentes, falas descritivas, indícios de emenda, abordagem e links clicáveis no relatório (Related #1025) 2026-09-15 10:24:27 -03:00
Francisco Solla
85de335cc3 fix(C163): emendas por localidade, fontes compactas na página 1 e datas pt-BR (Related #1025) 2026-09-15 10:24:27 -03:00
Francisco Solla
ab9c164615 feat(OPS110): sessões persistentes de agente com attach/detach (Closes #1019) 2026-09-15 09:31:45 -03:00