Replace all project-local .cursor/ path references with .agents/ across rules, skills, environment config, hooks, and ignore files. Keep Cursor editor paths (~/.cursor/, window.cursor, CURSOR_API_KEY) and vendored Impeccable editor-hook paths unchanged.
5.7 KiB
Desbloquear PR #50 — fix migration-lock + spec homeSearchLeaderships seed-proof
Status: entregue (2026-07-30 — executado em sessão única, fora do fluxo agent:register, a pedido do humano) Atualizado em: 2026-07-30 Issue: — Priority: P0 Model: kimi-k2.7-code Impeccable: A — N/A (sem superfície UI) Appetite: ~0,5 dia eng; 1 workflow step + 1 repair de spec int + watch de CI Responsável: —
Dados → decisão → apresentação
Dados: N/A — repair de CI/teste, sem superfície de dados.
Contexto
O PR #50 (agent/B53-busca-global-demandas, Issue #7, B53) está MERGEABLE mas BLOCKED com dois checks vermelhos (run 30558184687):
migration-lockFAIL — duas causas de infra empilhadas no job em.github/workflows/ci-pr.yml: (a)gh pr list --json number,filessemactions/checkout@v4→failed to run git: fatal: not a git repository; (b) com o checkout,GraphQL: Resource not accessible by integration (repository.pullRequests)→ oGITHUB_TOKENpadrão precisa depermissions: pull-requests: readexplícita. Todo PR falhava esse job.checksFAIL —tests/int/homeSearchLeaderships.int.spec.ts:87:expected [ 1, 168, 169 ] to deeply equal [ 168, 169 ]. O spec consulta'Lider'e asserta o conjunto global exato; em ci-pr,pnpm db:seed:minimalroda antes do int e semeiaSeed Liderança Um(scripts/lib/seed-minimal-manifest.mjs:103) — word-startLiderançacasaLider. Emci.yml(main) não háseed:minimal, então o defeito só aparece no ci-pr: todo PR futuro contrastageestá bloqueado, não só o #50. O spec de Demandas do próprio PR (tests/int/homeSearchDemands.int.spec.ts:76) já usa o padrão correto: token únicofixtures.value('scope-demanda').
Decisão de produto (2026-07-30, brief do lote CI): done = PR #50 mergeado em stage com CI verde, não "feature implementada".
Objetivos
gh pr checks 50todo verde e merge automático emstageefetivado.migration-lockvolta a exercer a regra real (≤1 PR tocando schema) em vez de falhar por infra.homeSearchLeaderships.int.spec.tsfica seed-proof: passa com e semdb:seed:minimalno banco.- Sem migration, sem schema, sem mudança de comportamento de produto.
Decisões travadas
- Fix do spec no padrão token-único, não filtro-por-ids nem exclusão do seed. O padrão
fixtures.value(...)já existe no spec irmão (demandas) e mantém a asserção de conjunto exato (que pega regressão de escopo). Rejeitado: filtrar o resultado aos ids criados pela fixture (enfraquece a asserção de escopo do coordinator); remover as lideranças doseed-minimal-manifest(o contrato do DB mínimo — pinado portests/unit/seedMinimalManifest.unit.spec.ts— existe para int specs que dependem de seed; quebraria outros consumidores). - Fix do
migration-lock=actions/checkout@v4+permissions: { contents: read, pull-requests: read }no job. As duas causas foram confirmadas em runs consecutivos (log do run 30561456683: GraphQL permission error após o checkout). Rejeitado: token dedicado/PAT (GITHUB_TOKEN com grant explícito é o padrão e não adiciona secret). - Fix vai na branch do próprio PR #50 (
agent/B53-busca-global-demandas), não em branch separada: a política "CI vermelho = seu problema" (OPS7) começa valendo aqui. Rejeitado: PR separado de infra primeiro (duplo round-trip de CI; o #50 já é o PR afetado e estáMERGEABLE).
Questões em aberto
- O spec
homeSearchStateDeputies/homeSearchAdvisorsetc. têm o mesmo padrão frágil? Opções: A) auditar e corrigir todos neste PR | B) corrigir só o que falha e registrar o resto como débito. Recomendação: A se o audit mostrar o mesmo padrão de nome fixo + assert global (grep portoEqual([emhomeSearch*.int.spec.ts) — custo marginal dentro do appetite, evita o próximo bloqueio; senão B.
Abordagem proposta
Componentes:
.github/workflows/ci-pr.yml— jobmigration-lock: inserir- uses: actions/checkout@v4como primeiro step.tests/int/homeSearchLeaderships.int.spec.ts— trocar nomes fixos (Lider Cairu,Lider Feira,Zeca Pagodinho,Maria Silva) por tokens únicos viafixtures.value(...)e usar o token como query (espelhandohomeSearchDemands.int.spec.ts:76-94); manter asserts de conjunto exato.- Audit grep —
rg "toEqual\(\[" tests/int/homeSearch*.int.spec.tspara a questão em aberto acima.
Sem migration, sem collection, sem server action.
Dependências
Nenhuma de outro plano. Reusa installCampaignFixtures (tests/helpers/campaignFixtures.ts) e o padrão fixtures.value já existente.
Não escopo
- Refatoração estrutural do ci-pr (jobs paralelos) → OPS4.
- Affected tests / manifesto e2e → OPS5.
- Pre-push hooks → OPS6. Política de agente em docs → OPS7 (texto novo; a prática vale neste PR).
Rabbit holes
- "Já que toco o workflow, paralelizo logo". Explode OPS4 dentro do P0 e atrasa o desbloqueio. Mitigação: diff do workflow limitado ao step de checkout.
- Investigar por que
ci-stagesmoke não pegou isso. O smoke roda contra Neon com subset curado; a falha é do ambiente mínimo. Mitigação: registrar observação no plano OPS4, não investigar aqui.
Adiado com gatilho
Nenhum neste item.
Referências
- GitHub Issue #7 (B53), PR #50, run 30558184687 (logs das duas falhas)
.github/workflows/ci-pr.yml— jobmigration-locktests/int/homeSearchLeaderships.int.spec.ts+tests/int/homeSearchDemands.int.spec.ts(padrão-alvo)scripts/lib/seed-minimal-manifest.mjs—MINIMAL_LEADERSHIPS.agents/skills/work-issue/SKILL.md— Passo 6 (acompanhar checks até o merge)