Commit graph

297 commits

Author SHA1 Message Date
Francisco Solla
f658d5eaaa fix(C186): dossiê/boletim sem cortes — copy reformulada (brief) + paginação (Related #1132)
O builder cortava o texto no meio com "…" quando não cabia no A4, perdendo
informação. Agora:

- contrato de pesquisa ganha `brief` (`title` ≤80 / `note` ≤120) reescrito pelo
  researcher: o PDF imprime o brief reformulado e o registro/.md mantém
  `answer`/`details` integrais (sem fonte nova, sem trocar a fase);
- sem `brief` o renderer cai no texto completo e a guarda de fit A4 falha
  fechado — nunca mais corta em silêncio;
- tabelas longas (lacunas, notícias) e os cards de "Atuação registrada" das eras
  são paginados em folhas de continuação: nada é truncado nem descartado;
- corrige honrarias da Era C vazando para a página da Era B;
- remove o `clipCopy`/`MAX_NEWS_ROWS`; SKILL.md e agent doc documentam o `brief`.
2026-09-17 18:19:56 -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
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
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
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
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
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
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
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
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
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
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
c0b83611ee chore(C168): mapeia superfícies da biblioteca de cortes no manifesto e2e 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
Francisco Solla
e579406b1f feat(C163): relatório de cidade pré-viagem (agente + skill → PDF A4) (Closes #1007) 2026-09-15 07:10:45 -03:00
Francisco Solla
119b8980fb fix(OPS107): aprovação de produção não ocupa a lane do staging (Closes #1002)
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-14 08:18:21 -03:00
Francisco Solla
fbe67f0358 feat(C162): player do acervo resolve o trecho sob demanda e YouTube vira default (Closes #999) 2026-09-14 07:09:58 -03:00
Francisco Solla
37b338a700 feat(OPS106): falha do verify dispara agente autônomo de desbloqueio (single-flight)
Workflow separado auto-unblock.yml (workflow_run no Deploy, push/main + job verify vermelho pela jobs API), launcher com flock próprio + Issue token auto-unblock como single-flight, e wrapper destacado que provisiona worktree fix/* via worktree.mjs fix --headless, aplica guard de banco local teqo_wt* fail-closed e roda opencode run --command bug-fix (cap 4h). deploy.yml/verify intocados; sem auto-retry e produção segue com approval humano.
2026-09-14 05:51:39 -03:00
Francisco Solla
dd8daa2420 feat(C159): Sollinha na assessoria de comunicação — chat escopado ao acervo (Closes #983) 2026-09-14 05:45:28 -03:00
Francisco Solla
03d1b79629 fix(C160): normaliza coleções obsoletas (J/vazia) do link legado para D
A varredura de produção (2026-09-14) achou 33 falas em selCodColecaoCsv=J e 1
com o parâmetro vazio: o endpoint devolve 'Documento não encontrado' e a mesma
data/página resolve na coleção D que a busca atual da Câmara gera. Aliases
J/vazio → D, puros e unit-testados; DCN e demais códigos ficam como estão.
2026-09-14 05:00:18 -03:00
Francisco Solla
e7369839aa feat(C160): link oficial do acervo vira PDF direto do Diário (#988)
- puros: classify/parse da URL legada (dc_20b/dc_20, montaPdf), build do PDF
  direto com #page, cache key por publicação, plano de reparo e fallback
- camaraFetch: resolveOfficialPdfUrl segue o redirect via .leg.br (fail-closed)
  e probeLink generalizado (Range + contentType)
- import: normaliza officialTextUrl no write path (cache <out>/diario por
  publicação; falha preserva PDF direto anterior, senão null)
- novo modo --repair-links [--dry-run] com guard CAMARA_IMPORT_CONFIRM fora de
  alvo local, relatório de cobertura e idempotência
2026-09-14 05:00:18 -03:00
Francisco Solla
fc4ecc752c fix(C161): remove 'action plan' do comentário (termo banido pelo guard de convenções) 2026-09-14 04:36:17 -03:00
Francisco Solla
fa79e4da75 feat(C161): relatório Solla × Ceuci com votos por bairro (seções e locais de votação)
A camada de bairro desce à seção eleitoral: votos por seção (votacao_secao_2022_BA),
cadastro seção → local → bairro (eleitorado_local_votacao_2022), aferição por seção
(detalhe_votacao_secao_2022_BA) e candidaturas válidas (votacao_candidato_munzona_2022);
133 coordenadas ausentes preenchidas pelo cadastro atual pelo número do local.

- JSON commitado: 138 bairros, 474 locais, 5.023 seções; Solla 27.264 e Ceuci 19.776
  conferidos zona a zona contra o recorte C157.
- Extrator scripts/build-solla-ceuci-salvador-bairros.mjs (--download cacheia em
  data/tse-2022/, gitignored; sem banco).
- Gerador revisado: mapas por bairro com dados reais, quadrantes de LQ, tabela de
  138 bairros e filas de ação por bairro.
- Personas refeitas com a base granular: sobreposição 62,9% nos bairros (vs 67,8%
  nas zonas); Ceuci supera Solla em 25 bairros com 61,6% do voto dela; redutos
  compartilhados Pituba/Brotas/Itaigara/Ondina/Graça/Imbuí/STIEP/Pituaçu; pontes
  Rio Vermelho/Cabula/Federação/Jardim Armação.
- Métricas puras de bairro + 9 unit tests; README e changelog atualizados.

Closes #992
2026-09-14 04:36:17 -03:00
Francisco Solla
f58a712ad9 feat(OPS104): inicia o deploy no merge, com staging automático e produção com review
- deploy.yml: trigger push em main + preflight guard (pula se há run queued/in_progress; waiting não conta) e job hosted requeue após deploy-staging (fora do grupo deploy-homeserver)
- scripts/lib/deploy-trigger.mjs (decidePreflight/decideRequeue) + CLIs deploy-preflight/deploy-requeue; github-api ganha listWorkflowRuns/getBranchHead
- pins: ciSkipInvariants reescrito (push + guard + dispatch + requeue fora do grupo), deployTrigger/githubApi novos; deployScript intocado
- docs realinhados (AGENTS*, AGENT-OPS, README, runbook, rules/skills) + changelog

Closes #980
2026-09-14 03:07:59 -03:00
Francisco Solla
26a450c8d2 feat(C157): relatório de sobreposição Solla × Ceuci em Salvador (Closes #979) 2026-09-14 02:49:31 -03:00
Francisco Solla
89519a4cf6 fix(C155): probe do VOD com uma retentativa para absorver reset transiente do CDN 2026-09-14 01:54:55 -03:00
Francisco Solla
b926e71d91 feat(C155): fallback de listagem desce ao mês quando o ano inteiro falha 2026-09-14 01:54:55 -03:00
Francisco Solla
563a407572 feat(C155): fallback de listagem por ano quando a API recusa página funda 2026-09-14 01:54:55 -03:00
Francisco Solla
da6a392260 docs(C155): triage de débitos pós-simplify e HELP do --date 2026-09-14 01:54:55 -03:00