Commit graph

1882 commits

Author SHA1 Message Date
Francisco Solla
cba515bf8b style(OPS72): alinha tabela CI/AUTOMERGE do AGENT-OPS.md (prettier) 2026-08-20 02:12:39 +00:00
Francisco Solla
0c7a3b9023 style(OPS72): alinha continuação do comentário do gate-ci.mjs (prettier) 2026-08-20 02:12:39 +00:00
Francisco Solla
780392d343 fix(OPS72): referência do guard do importMap (OPS70/#87, não #77) 2026-08-20 02:12:39 +00:00
Francisco Solla
ae1f21d1c4 fix(OPS72): saneia o changelog (tokens markdown que o prettier reescrevia como ênfase) 2026-08-20 02:12:39 +00:00
Francisco Solla
44f496e679 style(OPS72): prettier nos arquivos de changelog (wrap da nota do importMap) 2026-08-20 02:12:39 +00:00
Francisco Solla
82e9ca6b70 fix(OPS72): restaura S3ClientUploadHandler no importMap (regeneração sem envs S3_* do E2E_PROD=1 — classe OPS69)
O pnpm build do run e2e local em prod mode regenerou o importMap sem as envs S3_*,
dropping o handler do storage S3 (o P0 OPS69). Regenerado com envs dummy — diff de
+2 linhas idêntico ao estado fixado.
2026-08-20 02:12:39 +00:00
Francisco Solla
b3261c0dc3 refactor(OPS72): fixes do /simplify — gates e2e do ci-pr apertados para selected; docs alinhadas
- ci-pr.yml: infra e2e (cache/install/build-for-e2e + DB prep) só quando selected — diff high-risk não queima minutos à toa; comentários corrigidos
- engineering-standards.mdc + TESTING.md: política OPS72 (era OPS59/ci.yml stale)
- execution-pipeline/agent-work-issue: mecanismo real da #72 (CI roda famílias em paralelo, não sequencial) + ressalva do diff high-risk no pool
- changelog/impl plan: verificação verdadeira (suíte full local + triagem dos flakes)
2026-08-20 02:12:39 +00:00
Francisco Solla
fb7fc83c56 feat(OPS72): e2e local afetado discricionário na skill; CI de PR só blast radius (nunca full)
- ci-pr.yml: step e2e full removido; selected = único modo no PR (diff high-risk não roda e2e — espelho local + deploy verify cobrem)
- skills work-issue/agent-work-issue + execution-pipeline: passo e2e local afetado (discricionário) + limitação #72 documentada
- gate-ci.mjs: mensagens informativas (texto-only)
- docs AGENTS/AGENT-OPS/agent-pr-workflow.mdc + changelog OPS44
2026-08-20 02:12:39 +00:00
Francisco Solla
e504491dd8 fix(OPS71-FLIP): flip pós-merge silencioso no GitHub — PAT no arm do auto-merge, dispatch de recuperação, close da Issue, retry 410
Root cause (Issue #119): auto-merge armado com GITHUB_TOKEN mergea como
github-actions[bot] e o anti-recursion do GitHub nunca cria runs para o
evento closed — os flips pós-merge (issue-done / plan-issue-ready) não
rodavam em silêncio (PR #746). Arm agora usa AUTOMERGE_PAT (fail-closed);
workflow_dispatch de recuperação nos dois flips; forgejo-issue-transition
fecha a Issue (PATCH state=closed); forgejo-api retenta 410 (proxy respondeu
antes da origem) e loga corpo nginx de forma compacta.
2026-08-19 22:45:29 -03:00
Francisco Solla
6cf5ea5885 docs(OPS71-INFRA): runner do GitHub instalado no homeserver — runbook + changelog (Issue #113) 2026-08-20 00:58:40 +00:00
Francisco Solla
5a1b285d9a plan(OPS71-INFRA): impl plan — runner self-hosted do GitHub no homeserver (Issue #113) 2026-08-20 00:58:40 +00:00
Francisco Solla
02c1e4f36b feat(OPS71): Fase 2 — remover arquivos do fluxo Forgejo (workflows/scripts/specs) pós-validação do GitHub Actions
14 arquivos removidos: .forgejo/workflows/* (6), forgejo-pr-automerge.mjs,
forgejo-dispatch.mjs, ci-classify-production.mjs, lib/dockerignore.mjs,
lib/branch-protection.mjs + 3 specs órfãs. Consumidores ajustados:
test-affected-core (HIGH_RISK_EXACT), ciSkipInvariants (re-ancorado no
deploy.yml dispatch-only — deploy nunca automático), comentários com
referência morta (gate-ci, github-pr-automerge, agent-pr-ready-automerge).
Docs: AGENTS.md, runbook (rollback via git history), README (era GitHub).
Tracker intocado (forgejo-api/agent-*/issue-transition ficam).
2026-08-20 00:20:10 +00:00
Francisco Solla
3ea16243ca style(S11): prettier no rascunho UI do plano 2026-08-19 23:52:59 +00:00
Francisco Solla
851ac3941b plan(S11): feed do Instagram configurado não aparece na home pública — intenção + rascunho UI do painel de status 2026-08-19 23:52:59 +00:00
Francisco Solla
21a8e39fe2 plan(OPS73): deploy do fix OPS69 para produção — admin segue em branco (Related #114) 2026-08-19 23:48:48 +00:00
Francisco Solla
f5862c9ba3 fix(OPS71): ciClassifyProduction hermético — env GIT_* limpa + assert do scratch repo (não polui o worktree externo) 2026-08-19 23:07:34 +00:00
Francisco Solla
0901d60d72 fix(OPS71): literal do required check = nome do check-run (checks) + docs (pin PR #742) 2026-08-19 23:07:34 +00:00
Francisco Solla
29ad4ba3de fix(OPS71): FORGEJO_API_URL explícito nos flips — GITHUB_SERVER_URL do Actions resolvia base errado (410) 2026-08-19 23:07:34 +00:00
Francisco Solla
d612dce6bb fix(OPS71): services Postgres por porta publicada no localhost (jobs hosted rodam na VM, não na rede do job) 2026-08-19 19:17:19 -03:00
Francisco Solla
5ec5368ef6 diag(OPS71): DNS do service postgres-int no GitHub Actions 2026-08-19 19:17:19 -03:00
Francisco Solla
8820a4427f fix(OPS71): pins do forgejoApi determinísticos sob GITHUB_SERVER_URL do GitHub Actions 2026-08-19 19:17:19 -03:00
Francisco Solla
fcfc9b22d0 fix(OPS71): GITHUB_TOKEN explícito no safety net via github.token 2026-08-19 19:17:19 -03:00
Francisco Solla
4bf6086caa fix(OPS71): parse de --body-file no github-pr.mjs 2026-08-19 19:17:19 -03:00
Francisco Solla
24a867dfc3 feat(OPS71): CI/PR/deploy no GitHub Actions — tracker de Issues permanece no Forgejo (Closes #97) 2026-08-19 19:17:19 -03:00
Francisco Solla
693d2e481b chore(S7): entrada no changelog agregado (OPS44) 2026-08-19 19:39:09 +00:00
Francisco Solla
cd3f3e2a06 test(S7): pins e2e endurecidos — contrato de borda completo e capa de borda a borda medida 2026-08-19 19:39:09 +00:00
Francisco Solla
4a3c3b709c feat(S7): cards 'Acompanhe de perto' sem raio, borda, sombra ou chip; capa de borda a borda (Closes #90) 2026-08-19 19:39:09 +00:00
Francisco Solla
3b33a59a9d plans(OPS71/OPS72): CI volta ao GitHub Actions com tracker no Forgejo + e2e local afetado 2026-08-19 19:27:21 +00:00
Francisco Solla
d8d85de7be docs(S9,S10): planos de intenção — captura de novidades na home + pixel Meta na página de campanha 2026-08-19 18:58:23 +00:00
Francisco Solla
484ed4a424 style(S8): prettier no rascunho UI 2026-08-19 18:57:01 +00:00
Francisco Solla
bf193edf0d docs(S8): plano de intenção — seção de vídeo da história na home de campanha 2026-08-19 18:57:01 +00:00
Francisco Solla
2f47d8f321 style: prettier no rascunho UI do S7
All checks were successful
CI (PR) / checks (pull_request) Successful in 1m25s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 1m33s
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 13s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Successful in 12s
2026-08-19 15:51:55 -03:00
Francisco Solla
3c1c922fe2 plan(S7): cards 'Acompanhe de perto' sem raio, imagem de borda a borda, chips removidos (Related #90) 2026-08-19 15:50:53 -03:00
fbfbfb1329 Merge pull request 'S4 — Compartilhar conteúdos da home no WhatsApp' (#86) from S4-compartilhar-conteudos-da-home-no-whatsapp into main 2026-08-19 16:26:43 +00:00
Francisco Solla
39fb3b47f0 fix(OPS62-followup): âncora de relógio no fixture do municipalitiesWithoutUpdateTool — elimina o flake de ordenação por raiz
All checks were successful
CI (PR) / checks (pull_request) Successful in 3m24s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 3m36s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 14s
Causa raiz (reproduzida, refuta a hipótese da Issue): daysAgo() chamava
Date.now() por chamada; as duas daysAgo(40) de Beta/Alpha podiam cair em ms
diferentes sob carga, deixando Alpha estritamente mais novo — sortStale
ordenava por timestamp e o tie-break por nome nunca disparava (0.08% das
construções sem pausa; 100% com pausa de 1 ms; fixture ancorado: 0 em 2000).
Fix test-only: âncora fixtureNowMs no load do módulo (padrão prioritiesTool)
+ hoist do timestamp empatado (igualdade estrutural) + comentário.
Nada muda em produção — o sort real é determinístico sobre timestamps fixos.
Verificação: spec 30/30, unit 2405, int 791, tsc/lint/format/cycles verdes.
2026-08-19 13:07:30 -03:00
Francisco Solla
067d20357d chore: regenera agregado do changelog pós-rebase (OPS66/67/68 + S4)
Some checks failed
CI (PR) / checks (pull_request) Successful in 7m24s
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 7m28s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 13s
2026-08-19 12:52:18 -03:00
Francisco Solla
f35ac335aa style: prettier nos docs do S4 (changelog + plans) 2026-08-19 12:50:26 -03:00
Francisco Solla
8bc8900e9d feat(S4): compartilhar conteúdos da home no WhatsApp 2026-08-19 12:50:19 -03:00
Francisco Solla
7162c65e37 ops(OPS69): regenera importMap com o S3ClientUploadHandler (admin abria em branco em prod)
All checks were successful
CI (PR) / checks (pull_request) Successful in 8m36s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 8m49s
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 13s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
O importMap commitado ficou sem a entrada @payloadcms/storage-s3/client#S3ClientUploadHandler
desde o OPS52 (dabc00f4 removeu o handler do blob sem adicionar o do S3, porque o
generate:importmap rodou sem as envs S3_*). Com o plugin s3Storage condicional, sem as
envs o importMap sai consistente (dev/test) mas em produção (envs ativas) o admin falhava
ao montar a view — getFromImportMap: PayloadComponent not found in importMap — login nunca
renderizava. Fix: regenerar com as 4 S3_* dummy inline (loadEnvConfig do @next/env não
sobrescreve envs do processo; iterateConfig não toca DB) — diff de exatamente +2 linhas.
Smoke headless com S3 ativo: /admin/login renderiza, zero erros de console. Gates verdes
(tsc/lint/format/knip/cycles/unit+int 791/build). Sem migration/access/UI. Docs: nota no
AGENTS.md (generate:importmap precisa das S3_* enquanto o plugin for condicional) +
changelog. Guard de CI registrado como OPS70 (#87, depends #77).
2026-08-19 12:45:22 -03:00
Francisco Solla
ccfa60c1f2 fix(OPS64): pin do waitForChecks contra rollup mentiroso + docs — OPS62 eliminou o secundário estruturalmente
All checks were successful
CI (PR) / checks (pull_request) Successful in 3m5s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 4m40s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 13s
O sintoma primário da Issue (deadlock do waitForChecks no próprio pending)
já tinha sido entregue pelo OPS61. O secundário — o rollup `checks` reportava
SUCCESS com um shard de e2e vermelho porque o Forgejo 9.0.3 reporta o
resultado do ÚLTIMO shard como o parent de matrix no `needs` (runs 604/607/610;
o `needs.<job>.results` do GitHub não existe neste runner) — foi eliminado
estruturalmente pelo OPS62 (mergeado durante a execução): ci-pr.yml e ci.yml
viraram jobs únicos sequenciais, sem matrix/shard, e o status do job `checks`
já é o veredito honesto da cascata.

O que este item entrega: (a) teste-pino no waitForChecks (cenário run 607:
rollup verde + shard vermelho → o CLI LANÇA "Checks falharam" — nunca confia
no rollup sozinho; invariante de defesa válido e que pegaria qualquer matrix
que volte); (b) docs honestas (agent-pr-workflow.mdc, AGENT-OPS.md) com a
narrativa do parent de matrix e da eliminação estrutural pelo OPS62. O script
ci-rollup-check.mjs e os edits de workflow planejados foram descartados no
gate (redundantes pós-OPS62). Unit 2392 verdes; gates locais ok.
2026-08-19 12:11:41 -03:00
Francisco Solla
80062078b6 docs(OPS68): agregado do changelog com a entrada OPS68 (ficou fora do rebase)
O --ours no conflito do agregado (OPS66) deixou a entrada OPS68 fora do
commit; changelog:build regenera e o docs-guard do CI exige o agregado
commitado.
2026-08-19 13:33:05 +00:00
Francisco Solla
e7ec5c5242 docs(OPS68): reaplica fixes do AGENTS.md perdidos na resolução do rebase (OPS66)
O checkout --ours no conflito da L15 (gate + frase build-after-migrate do
OPS66) descartou os hunks limpos do rebase: Neon-refs da seção de DB
(header/at Neon/no Neon risk/use Neon), rationale WebAuthn host-agnóstico.
2026-08-19 13:33:05 +00:00
Francisco Solla
3ca2cbd438 docs(OPS68): reescreve docs canônicos da era GitHub/Vercel para Forgejo/homeserver
Parte 2 do OPS50 (fechamento): AGENT-OPS, README, roadmap (ponteiro),
AGENTS.md (refs Neon/job gate), rule agent-pr-workflow e 8 skills de
operação sem comandos gh (API/MCP + safety net) nem secrets Vercel —
fonte canônica única: git.solla.dev/fsolla/teqo.
2026-08-19 13:33:05 +00:00
Francisco Solla
cc6149191b ops(OPS67): retry com backoff nos fetchs do forgejo-api
Um fetch failed transitorio (rede/DNS/reset) matava o run do safety net
(agent-pr-ready-automerge) no meio da espera de checks. Retry no request()
do cliente: fetch reject retenta em qualquer metodo; body-drop em GET
retenta; 5xx (502/503/504) retenta so em GET (body cancelado antes do
retry); 4xx e body-drop em escrita falham fail-closed. 3 retries, base
300ms x2, jitter +-20%, console.warn pt-BR por retry; opcoes flat no
createApi (retries/backoffMs/jitter/sleepImpl). 12 specs unit novas.
2026-08-19 13:28:37 +00:00
Francisco Solla
8d33e89102 style: prettier — runbook/impl plan/unit test (OPS66)
All checks were successful
CI (PR) / checks (pull_request) Successful in 4m11s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 4m22s
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 15s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
2026-08-19 10:07:14 -03:00
Francisco Solla
228f2217c7 ops(OPS66): deploy — migrate antes do build do runner (deadlock de migrations em caminho estático) 2026-08-19 10:06:00 -03:00
Francisco Solla
9504c7ccf6 ops(OPS65): CI do main em janela de 30 min (gate .dockerignore fail-open) + matar agent-pool
All checks were successful
CI (PR) / checks (pull_request) Successful in 8m4s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 13m48s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 52m5s
- ci.yml: on push removido → schedule */30 + workflow_dispatch (fundido com a
  estrutura de job único sequencial do OPS62 X1)
- job gate (host, main-only, sem pnpm): revision do container rodando no
  homeserver (label org.opencontainers.image.revision — o compose pode mentir
  após rollback falho) + diff + classificador .dockerignore
- fail-open: revision desconhecida → suite roda (verde); incapaz de classificar
  → run vermelho (nunca blackout silencioso); deploy duplo-gated
  (needs: [checks, gate] + if explícito)
- deploy-homeserver.sh: guard 'already deployed' idempotente (mesma revision)
- agent-pool.yml removido; pool dormente (144 pnpm install/dia no tick */10)
- specs: dockerignoreMatch, ciClassifyProduction (incl. git-diff com repo
  scratch e exit codes), pins ciSkipInvariants/deployScript; HIGH_RISK_EXACT
- docs: runbook (janela/gate/verificação ao vivo/falhas), AGENTS.md,
  AGENT-OPS.md (tabela X1 fundida), skills pool dormente, changelog OPS65
- impl plan aprovado; intenção marcada entregue
2026-08-18 21:08:12 -03:00
Francisco Solla
4522fe4b74 ci: retry — pool de redes Docker do runner esgotado (infra); redes órfãs podadas
Some checks failed
CI (PR) / checks (pull_request) Successful in 9m40s
PR Ready + auto-merge / ready-automerge (pull_request) Successful in 9m50s
Agent pool supervisor / tick (pull_request) Successful in 31s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 12s
CI / checks (push) Successful in 10m12s
CI / deploy homeserver (teqo-1313) (push) Failing after 19m57s
2026-08-18 20:51:39 -03:00
Francisco Solla
46038d5a6a fix(e2e S3): goto da home com URL cache-busting no describe da seção de conteúdos
Some checks failed
CI (PR) / checks (pull_request) Failing after 1s
PR Ready + auto-merge / ready-automerge (pull_request) Failing after 15m30s
O poll (request.get) convergia no HTML fresco, mas o page.goto servia a
cópia stale do cache heurístico do Chromium (ISR s-maxage sem max-age)
quando a regeneração pós-bust ainda não tinha completado — flake medido no
CI (YT snapshot da S2, 2 flaky) e no prod-mode local (IG snapshot 3/3
retries). cache:'no-cache' não existe nos tipos do Playwright 1.58 e reload
reduz mas não elimina a janela. URL única (?e2e=<ts>) erra todas as
entradas de cache (HTTP + router do Next) e a página sempre vem fresca do
servidor; prod-mode local 9/9 × 2.
2026-08-18 20:30:10 -03:00
Francisco Solla
dd61cb3985 style: prettier no changelog agregado (pós-rebase S6+S3) 2026-08-18 20:30:10 -03:00