diff --git a/.github/workflows/mutation-gate.yml b/.github/workflows/mutation-gate.yml index bf15a931..ce66d331 100644 --- a/.github/workflows/mutation-gate.yml +++ b/.github/workflows/mutation-gate.yml @@ -133,7 +133,7 @@ jobs: --write-evidence=artifacts/mutation-shard-${{ matrix.shard }}/evidence.json \ --sha=${{ needs.material.outputs.sha }} \ --tree=${{ needs.material.outputs.tree }} \ - --workflow-sha=${{ github.sha }} \ + --workflow-sha=${{ github.workflow_sha }} \ --run-id=${{ github.run_id }} --run-attempt=${{ github.run_attempt }} \ --shard=${{ matrix.shard }} --shards=4 - name: Сохранить лог и identity шарда @@ -155,7 +155,9 @@ jobs: steps: - uses: actions/checkout@v7 with: - ref: ${{ github.sha }} + # CLI отчётчика принадлежит зафиксированному material. В main лежит + # только workflow и может не быть dev-версии scripts/**. + ref: ${{ needs.material.outputs.sha }} - uses: actions/setup-node@v7 with: node-version: 22 @@ -170,7 +172,7 @@ jobs: --logs=artifacts/mutation-logs --shards=4 \ --sha=${{ needs.material.outputs.sha }} \ --tree=${{ needs.material.outputs.tree }} \ - --workflow-sha=${{ github.sha }} \ + --workflow-sha=${{ github.workflow_sha }} \ --run-id=${{ github.run_id }} --run-attempt=${{ github.run_attempt }} # Адресат у отказа (#472). Только по расписанию: ручной dispatch остаётся @@ -191,9 +193,9 @@ jobs: steps: - uses: actions/checkout@v7 with: - # Код отчётчика берётся из того же workflow revision, а не из - # успевшего сдвинуться dev. Проверяемый material передаётся отдельно. - ref: ${{ github.sha }} + # Не перечитываем moving dev: код отчётчика берётся из уже + # зафиксированного material. В стабильном main dev-скриптов нет. + ref: ${{ needs.material.outputs.sha }} - uses: actions/setup-node@v7 with: node-version: 22 @@ -213,7 +215,7 @@ jobs: --require-evidence --logs=artifacts/mutation-logs --shards=4 \ --sha=${{ needs.material.outputs.sha }} \ --tree=${{ needs.material.outputs.tree }} \ - --workflow-sha=${{ github.sha }} \ + --workflow-sha=${{ github.workflow_sha }} \ --run-id=${{ github.run_id }} --run-attempt=${{ github.run_attempt }} \ --run-url="$RUN_URL" --ref=${{ needs.material.outputs.ref }} \ --body-out=artifacts/mutation-report.md \ diff --git a/test/mutation-gate.test.mjs b/test/mutation-gate.test.mjs index ffebd069..8e045e5e 100644 --- a/test/mutation-gate.test.mjs +++ b/test/mutation-gate.test.mjs @@ -303,13 +303,17 @@ test('#549: агрегатор требует четыре evidence одного const evidence = mutationWorkflow.slice(mutationWorkflow.indexOf(' evidence:'), mutationWorkflow.indexOf(' report:')); const report = mutationWorkflow.slice(mutationWorkflow.indexOf('\n report:\n')); assert.match(evidence, /--verify-only/); + assert.match(evidence, /ref: \$\{\{ needs\.material\.outputs\.sha \}\}/); assert.match(evidence, /--sha=\$\{\{ needs\.material\.outputs\.sha \}\}/); assert.match(evidence, /--tree=\$\{\{ needs\.material\.outputs\.tree \}\}/); + assert.match(evidence, /--workflow-sha=\$\{\{ github\.workflow_sha \}\}/); assert.match(evidence, /--run-id=\$\{\{ github\.run_id \}\} --run-attempt=\$\{\{ github\.run_attempt \}\}/); assert.match(report, /--require-evidence/); - assert.match(report, /ref: \$\{\{ github\.sha \}\}/); + assert.match(report, /ref: \$\{\{ needs\.material\.outputs\.sha \}\}/); + assert.match(report, /--workflow-sha=\$\{\{ github\.workflow_sha \}\}/); assert.ok(!report.includes('git rev-parse HEAD')); assert.ok(!report.includes('ref: dev')); + assert.ok(!report.includes('ref: ${{ github.sha }}'), 'main может не содержать dev-CLI отчётчика'); }); test('#472 AC6: повторный отказ дописывает открытое issue, а не создаёт второе', () => {