17 KiB
| name | overview | todos | isProject | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Paradigm parallel agents | GitHub + Cursor only: Issues/PR/Actions; agents claim→PR→stage with minimal DB; stage = Neon prod snapshot (restricted); main/prod só via promote humano com CI; miss→guardrail progressivo. |
|
false |
HISTÓRICO (2026-08-23): plano de intenção pré-main (2026-07-30) do desenho stage/Neon do paradigma de agentes paralelos — nunca implementado nessa forma (todos ainda
pending). O paradigma vigente vive em docs/AGENT-OPS.md ("operação do paradigma de agentes paralelos"): agentes entregam direto emmain, deploy manual porworkflow_dispatch, ladder de 2 ambientes (mínimo + prod), sem smoke stage. O corpo abaixo preserva referências mortas da era stage/Neon como registro histórico:
scripts/refresh-stage.mjs(deletado 2026-08-01)- Neon/stage (
STAGE_DATABASE_URL, branch gitstage,ci-stage.yml)- job
migration-lock(removido 2026-08-12)gh pr create --base stage,pnpm agent:promoteNada aqui é instrução corrente.
Teqo ops: só GitHub + Cursor
Norte (nesta ordem)
- Simplicidade — zero Linear/Jira/Notion; zero board em markdown mutável; poucos comandos.
- Cursor Cloud readiness — clone +
gh+ Postgres efêmero + seed mínimo bastam; always-on magro. - Agent autonomy — claim → implement → PR para
stage→ parar; promote amain/prod é humano. - Guardrails programáticos progressivos — miss → Issue → harvest → teste/ESLint em CI.
- Test ladder seguro — agentes e PRs nunca tocam prod nem o clone cheio do stage; só o DB mínimo versionado.
Stack exclusiva:
| Papel | Onde |
|---|---|
| Spec + status + deps + miss + prio | GitHub Issues |
| Integração contínua de features | Branch stage + PRs |
| Produção | Branch main → Vercel prod (só promote humano) |
| Qualidade | GitHub Actions (DB conforme o alvo) |
| Execução | Cursor (Cloud/local) |
| Doctrine | Repo (kernels) |
flowchart LR
Claim[agent:claim] --> Feat[feature branch]
Feat --> PR[PR → stage]
PR --> CIPR[CI + DB mínimo]
CIPR -->|merge| Stage[stage]
Stage --> CIStage[CI + DB stage clone]
Stage -->|humano agent:promote| Main[main / prod]
Main --> CIMain[CI green obrigatório]
Diagnóstico curto
Paralelismo hoje esbarra em roadmap/plans/ship-to-main/gate local; testes int dependem de teqo_test local sem um seed mínimo documentado e obrigatório pós-migration; não há stage entre feature e prod.
Ambientes de dados (test ladder)
Três bancos, papéis distintos — não misturar:
| Ambiente | Conteúdo | Quem usa |
|---|---|---|
Mínimo (teqo_test / service CI) |
Schema migrado + seed sintético pequeno, sem PII real | Agentes, Cloud, CI de PR → stage |
Stage (Neon teqo_stage ou branch Neon) |
Clone 100% de prod, renovado periodicamente | Só CI pós-merge em stage + humanos em smoke controlado |
| Prod (Neon prod) | Real | Deploy Vercel a partir de main apenas |
Invariante de agente/Cloud: nunca DATABASE_URL de stage/prod; nunca ALLOW_REMOTE_DB salvo promote/refresh humano documentado. Guards existentes (assert-local-database, guard-dev-db) permanecem; stage CI usa secret só no runner GHA.
DB mínimo — script canônico
Entrega da Onda 0: pnpm db:seed:minimal (ex. scripts/seed-minimal.mjs), idempotente (upsert por slug/phone).
Conteúdo inicial (ajustável à medida que o contrato de testes muda):
Consentkeys estáveis:lideranca-autopreenchimento,apoiador-cadastro,apoiador-intencao-voto,whatsapp-inscricao(richText mínimo).campaignUser: 1 coordinator, 1 advisor, 1 candidate, 1 leader (phones/emails sintéticos).municipality: 3–5 municípios (ex.: Salvador ZE 1, Camaçari, + 2 outros) — não as 435; fixtures de teste usam catálogo estático quando precisam de todas.organization,stateDeputy: 1 cada.leadership,supporter: 2–3 sintéticos (phones+551199999999X).campaignGoals: global default.- Artefatos TSE/
electionAggregates: já commitados — não seed.
Não importa TSE completo / posts de produção / planilha de projeção inteira — artefatos estáticos e fixtures de teste já cobrem o que for imutável. Documentado em docs/AGENT-OPS.md + docs/TESTING.md.
Contrato de toda tarefa (skill + checklist de PR):
- Se a entrega adiciona migration, collection, Consent key, dado obrigatório para boot, ou quebra o seed → atualizar
db:seed:minimalno mesmo PR. - CI do PR falha se
migrate+seed:minimal+test:intnão passam — o seed é parte do gate, não “doc opcional”. agent:file-missse alguém mergeou schema sem seed (padrão → guardrail: convention test que o script exporta uma lista de keys/collections pinned, ou smoke job dedicado).
Bootstrap agente/Cloud:
pnpm db:start # ou service no environment.json
pnpm migrate
pnpm db:seed:minimal
pnpm test:unit # fast gate local
# int completo = CI do PR (ou local opcional)
Stage — snapshot de prod (Neon)
- DB stage = Neon branch criada a partir do snapshot de prod (PII incluída). Acesso restrito: apenas maintainers + CI stage. Agentes/Cloud nunca recebem essa URL.
- Refresh = criar nova Neon branch + atualizar
STAGE_DATABASE_URL(não tentar DELETE/INSERT de dados reais). Script:scripts/refresh-stage.mjs(humano /workflow_dispatchmanual). - Branch git
stage(protegida): único alvo de merge dos agentes. Auto-merge habilitado no repo + regra de branch (PR para stage mergeia sozinho quando CI verde). - CI stage usa GitHub Environment
stagecomSTAGE_DATABASE_URL. - Vercel: preview da branch
stagena Onda 0 (project staging ou preview branch).
Fluxo git: feature → stage → main
| Passo | Quem | Regra |
|---|---|---|
PR feature → stage |
Agente (gh pr create --base stage) |
CI PR green (DB mínimo) |
Merge em stage |
Automático quando CI PR green | NUNCA roda pnpm build (migra prod). CI stage = migrate + int (+ opcional e2e smoke) contra STAGE_DATABASE_URL. Fecha Issue / unblock deps. |
stage → main |
Só humano: pnpm agent:promote --i-am-human, confirmação explícita em sessão de agente, ou workflow_dispatch manual |
Requer CI stage green + CI do PR promote green (service Postgres + build). Antes: rebase/merge de main em stage se divergiu. |
main → prod |
Vercel no push de main |
Como hoje; migrate no build. |
Agente default: para no merge a stage. Promote não é autónomo.
ship-to-main local morre. pnpm agent:promote:
- Cria PR
stage→main(ou fast-forward controlado). - Exige confirmação humana / flag
--i-am-human. - Não roda em Automation sem aprovação.
Close Issue + unblock: no merge em stage (desbloqueia paralelos). Label opcional in-prod quando promote mergeia.
docs/plans/<slug>.md: plan snapshot só para Issue nova — nunca recriar plans históricos no merge (quebra links já em docs/roadmap.md e PRs antigos).
Se main divergir de stage (hotfix em main), promove exige antes: merge/rebase de main em stage + CI stage green novamente.
CI por alvo (GitHub Actions)
Substituir/ampliar .github/workflows/ci.yml em jobs claros:
A) PR feature → stage (DB mínimo)
Workflow: .github/workflows/ci-pr.yml (ou job em ci.yml).
- Service
postgres:17-alpine→teqo_test. pnpm install→ lint → format → typecheck → knip → cycles →test:unit.pnpm migrate→pnpm db:seed:minimal→test:int.pnpm build(mesmo service;DATABASE_URLlocal).- Check: ≤1 PR aberto tocando
src/migrations/|payload-types.ts(job própriomigration-lock).
B) Merge em stage (CI stage)
Workflow: .github/workflows/ci-stage.yml (trigger push: branches: [stage]).
environment: stage+STAGE_DATABASE_URL.pnpm migrate(contra stage; nuncapnpm build— build migra prod).test:int(+ opcional e2e smoke contra preview) semdb:seed:minimal— dados = snapshot prod.- Falha → bloqueia promote (status check em
main).
C) PR stage → main (promote)
Workflow: .github/workflows/ci-promote.yml (PR base main).
- Service Postgres +
migrate+seed:minimal+int+build(igual PR feature). - Requer último CI stage green.
- Branch protection
main: só PR a partir destage, review humano, checks required.
E2e pesado: nightly em stage ou label run:e2e; não bloqueia autonomy do PR mínimo.
Fast gate local do agente (antes do push): lint + typecheck + unit (+ opcional migrate && seed:minimal && test:int se tocou schema). Int completo / build = CI.
Superfície de comandos
| Comando | Faz |
|---|---|
pnpm agent:claim |
Fila ready+unblocked por prio → in-progress + brief |
pnpm agent:register |
Cria Issue (spec + prio) |
pnpm agent:prioritize |
Reajusta prio |
pnpm agent:file-miss |
Issue kind:agent-miss/defect |
pnpm agent:promote --i-am-human |
Humano: PR stage→main + merge se CI green; recusa se main divergiu de stage sem rebase |
pnpm db:seed:minimal |
DB mínimo para agentes/CI PR |
pnpm db:refresh:stage |
Humano/CI manual: nova Neon branch stage + atualiza secret (não roda em agente) |
Labels: estado ready|in-progress|blocked|done; kind:*; prio:P0…P3; needs:migration|consent; requirements-changed.
Prioridade / claim: inalterados (banda + score; dry-run = fila).
Autonomia do agente
boot → claim → implementar
→ (se schema) atualizar db:seed:minimal
→ fast gate
→ gh pr create --base stage (Closes #N)
→ PARAR
Proibido ao agente sem ordem humana explícita: merge/promote para main, apontar stage/prod DB, refresh prod→stage, editar vercel.json regions, rodar pnpm build em CI stage.
Cloud env: gh autenticado (Cursor GitHub integration); sem secrets de stage/prod.
Cursor Cloud readiness
| Item | Ação |
|---|---|
| Contexto | Fatiar AGENTS; kernels PRODUCT/DESIGN/CUSTOMER; .agentignore |
| Env | Compose Postgres + migrate + db:seed:minimal |
| Hooks | Paths relativos |
| Regra | PR base stage; nunca Neon; 1 Issue/run |
| Brief | stdout do claim |
Guardrails progressivos
Igual: file-miss → harvest → PR com codebaseConventions/ESLint → ledger docs/GUARDRAILS.md. Incluir padrão “migration sem atualizar seed:minimal”.
Ondas
Onda 0 — Fundação test + GitHub
- Remover Codeberg de todo o projeto (
package.jsonhomepage/repository/bugs,AGENTS.md,docs/TECH-DEBT.md,.github/workflows/ci.ymlheader, qualquer doc). GitHub é a única casa. db:seed:minimal(script + conteúdo + docs + CI PR).- CI PR (
.github/workflows/ci-pr.yml): service → migrate → seed:minimal → int → build. - Branch
stage+ protection (auto-merge habilitado) +ci-stage.yml(stage DB, sem build). - Stage DB (Neon prod snapshot) + runbook refresh semanal.
- Vercel preview para branch
stagena Onda 0. - Labels/prio + scripts
claim|register|prioritize|file-miss|promote+ seed Issues (body = plan atual,dependsdo roadmap). - Contexto Cursor:
AGENT-OPS.md, fatiar AGENTS, kernels,.agentignore, Cloud env (Compose+seed:minimal), hooks portáteis, standards fast-gate, PR template. - README cheatsheet — seção curta no topo do
README.mdpara humanos: fluxo em 5 linhas, comandospnpm agent:*, labels, o que o agente faz sozinho vs o que exige humano, links paraAGENT-OPS.md/CI/skills. Não duplicar o setup local — só a operação agentic.
Ordenar: 0 primeiro (limpa base), depois 1/2, depois 3/4/5, depois 6/7/8.
Onda 1 — Autonomy
- Skills → PR base
stage; Automationrequirements-changed; matar ship-to-main. - Contrato de PR: seed atualizado se schema mudou (PR template checkbox + CI smoke).
Onda 2 — Stage ops + aprendizado
- Runbook/script
refresh-stage(workflow_dispatch, só maintainers). - Harvest guardrails; compile-roadmap opcional; Vercel staging preview se ainda não existir.
Não muda
- Guards “nunca Neon” para agentes; invariantes Payload; serializers;
gru1. - Prod continua só via
main; o que muda é quemainsó recebe promote humano desdestage.
Sucesso
- Agente valida com
migrate+seed:minimal(+ CI PR); nunca precisa do dataset de prod. - Toda migration que quebra o mínimo falha CI até o seed ser ajustado no mesmo PR.
- Features land em
stage;main/prod só viaagent:promotehumano com CI stage + PR green. - Stage DB = Neon prod snapshot; agentes não usam esse DB; refresh é nova branch + swap de secret.
- CI stage nunca roda
pnpm build(migra prod); build só em PR feature/promote. - Codeberg fora de tudo; GitHub único remote/casa.
- README tem cheatsheet de operação agentic para humanos.
- Claim por prioridade; specs em Issues; miss→guardrail; always-on < ~15k tokens.