diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 822bc6ab..6d4017ae 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -217,6 +217,7 @@ jobs: fi git diff --cached --quiet || git commit -m "chore(docs): regenera bloco derivado (autofix)" \ -m "Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão." \ + -m "Agent: csbrasil-bot (autofix)" \ -m "Signed-off-by: csbrasil-bot " git push origin "HEAD:$HEAD_REF" gh pr comment "$PR_NUMBER" --repo "$REPO" --body \ diff --git a/.github/workflows/preview-bot.yml b/.github/workflows/preview-bot.yml index 24c5ded9..bf1bb97d 100644 --- a/.github/workflows/preview-bot.yml +++ b/.github/workflows/preview-bot.yml @@ -29,11 +29,6 @@ jobs: # O job `preview` abaixo só dispara em `labeled` com esta etiqueta. Ela nunca foi # criada no repositório, então o caminho inteiro era código morto: o bot pedia um # rótulo que ninguém tinha como aplicar. Criar aqui é o que liga o mecanismo. - - name: garante a etiqueta que autoriza o preview - env: - GH_TOKEN: ${{ github.token }} - run: python3 scripts/ci/ensure_labels.py preview-autorizado - - name: classifica o diff sem executar código do fork env: GH_TOKEN: ${{ github.token }} diff --git a/docs/docs/colaborar.md b/docs/docs/colaborar.md index 1f0322ef..2d5b3e07 100644 --- a/docs/docs/colaborar.md +++ b/docs/docs/colaborar.md @@ -14,7 +14,7 @@ O número abaixo não é retórica, e não é escrito à mão: sai de `git short {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Emerson Garrido`, `Ruben`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. +**11 identidades de autoria humana** assinam commit no histórico **desta branch**: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. O resto dos commits é assinado por agentes de IA. Branch não é repositório: quem contribuiu num ramo que esta branch não contém **não aparece aqui**. > Bloco gerado por `node tools/gen-docs.mjs`. Fonte: `git shortlog -sn --no-merges (descontando autores que são agentes)` diff --git a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md index 2106b06f..ad72a3a1 100644 --- a/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md +++ b/docs/i18n/en/docusaurus-plugin-content-docs/current/colaborar.md @@ -17,7 +17,7 @@ The number below is not rhetoric, and it is not hand-written: it comes from `git {/* BEGIN:GERADO:pessoas — não edite à mão, rode `npm run docs` */} -**11 human author identities** sign commits in this branch: `ruben-cytonic`, `Emerson Garrido`, `Ruben`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. Automated identities are excluded. A Git author name is not necessarily one unique person. +**11 human author identities** sign commits in this branch: `ruben-cytonic`, `Ruben`, `Emerson Garrido`, `rubenmarcus`, `Ruben Marcus`, `William Oliveira`, `Juan Versolato Lopes`, `daeeseD`, `matheusgb`, `Maná Soares`, `daltonfontes`. Automated identities are excluded. A Git author name is not necessarily one unique person. > Block generated by `node tools/gen-docs.mjs`. Source: `git shortlog -sn --no-merges (descontando autores que são agentes)` diff --git a/tools/eval/autofix-check.mjs b/tools/eval/autofix-check.mjs index ec57c443..c60da58a 100644 --- a/tools/eval/autofix-check.mjs +++ b/tools/eval/autofix-check.mjs @@ -17,6 +17,10 @@ workflow pode chamar `gh pr merge`. O `csbrasil-bot-automerge` chamava, e era a única coisa que um bot daqui fazia sozinho — justamente a que não devia. Ele agora aplica `pronto-pra-merge` e o botão continua humano. + AF7 · todo commit que o bot faz carrega os trailers que o CI cobra de humano: + `Agent:` (agente_check) e `Signed-off-by:` (dco_check). Sem eles o bot conserta + o PR e reprova o mesmo PR no passo seguinte - foi o que aconteceu no primeiro + disparo real, em 22/08. AF6 · o autofix acorda quando a MAIN anda, não só quando o PR se mexe. Foram 9 releases em 20 horas e cada um reabre conflito em todo PR aberto; sem o gatilho de push o bot só conserta quem empurra commit — ou seja, nunca @@ -40,6 +44,7 @@ const MUTANTES = { 'automerge-volta': 'AF4', 'resolve-conflito-de-codigo': 'AF5', 'sem-varredura-pos-release': 'AF6', + 'commit-sem-trailer': 'AF7', }; if (MUT && !MUTANTES[MUT]) { console.error(`mutante desconhecido: ${MUT}`); process.exit(2); } @@ -109,6 +114,14 @@ if (resolveConflito) { } } +/* ---- AF7: os commits do bot levam os trailers que o CI cobra ---- */ +if (MUT === 'commit-sem-trailer') wf = wf.replace(/\n\s*-m "Agent: csbrasil-bot \(autofix\)" \\/g, ''); +const commits = [...wf.matchAll(/git commit[\s\S]{0,600}?(?=\n\s{0,10}[a-z-]+:|\n\s*$)/g)].map((m) => m[0]); +for (const c of commits) { + if (!/Agent:/.test(c)) falhas.push('AF7 um `git commit` do bot não leva o trailer `Agent:` — o agente_check reprova o PR que ele acabou de consertar'); + if (!/Signed-off-by:/.test(c)) falhas.push('AF7 um `git commit` do bot não leva `Signed-off-by:` — o dco reprova o PR que ele acabou de consertar'); +} + /* ---- AF6: a varredura pós-release existe e enxerga quem ficou para trás ---- */ if (MUT === 'sem-varredura-pos-release') wf = wf.replace(/\n push:\n branches: \[main\]/, ''); const temPush = /^\s{2}push:\n\s{4}branches: \[main\]/m.test(wf);