From fdb0d0743d2e5a806197ee93b1cd52e2d8ced996 Mon Sep 17 00:00:00 2001 From: Sergey Matyunin Date: Sun, 13 Sep 2026 08:21:05 +0300 Subject: [PATCH] ci: keep proof job names API-verifiable (#541) Issue: #541 User-Visible: no --- .github/workflows/validate.yml | 2 +- scripts/ci-proof.mjs | 2 +- test/ci-proof.test.mjs | 2 +- test/merge-candidate.test.mjs | 2 +- test/release-gate.test.mjs | 2 +- test/validate-gate.test.mjs | 2 +- test/validate-workflow.test.mjs | 4 ++++ 7 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index a629a0f7..895ae938 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -47,7 +47,7 @@ jobs: # запись «job независимый: краснеет сам и не роняет остальные» продолжает # действовать — на уровне шагов, с той же гранулярностью в логе. preflight: - name: "Предполётные проверки: документация, провенанс, процесс" + name: "Предполёт: документация, провенанс, процесс" runs-on: ubuntu-latest # `actions: read` — чтение списка прогонов Validate (#388), `issues: read` — # проверка 8 процессного гейта. Права перечислены явно, потому что job diff --git a/scripts/ci-proof.mjs b/scripts/ci-proof.mjs index 98d9af2b..951d850e 100644 --- a/scripts/ci-proof.mjs +++ b/scripts/ci-proof.mjs @@ -21,7 +21,7 @@ export const CI_PROOF_POLICIES = Object.freeze({ }); const JOB_RULES = Object.freeze({ - preflight: [{ exact: 'Предполётные проверки: документация, провенанс, процесс', count: 1 }], + preflight: [{ exact: 'Предполёт: документация, провенанс, процесс', count: 1 }], changes: [{ exact: 'Классификация изменённых файлов', count: 1 }], reuse: [{ exact: 'Переиспользование: это дерево уже проверено', count: 1 }], frontend: [{ exact: 'Фронтенд: типы, юниты, мутанты, синхрон бандла', count: 1 }], diff --git a/test/ci-proof.test.mjs b/test/ci-proof.test.mjs index a71d13b0..0f49e236 100644 --- a/test/ci-proof.test.mjs +++ b/test/ci-proof.test.mjs @@ -11,7 +11,7 @@ export const SHA = 'a'.repeat(40); export const TREE = 'b'.repeat(40); const names = { - preflight: 'Предполётные проверки: документация, провенанс, процесс', + preflight: 'Предполёт: документация, провенанс, процесс', changes: 'Классификация изменённых файлов', reuse: 'Переиспользование: это дерево уже проверено', frontend: 'Фронтенд: типы, юниты, мутанты, синхрон бандла', diff --git a/test/merge-candidate.test.mjs b/test/merge-candidate.test.mjs index 75f1d01d..2fd25eb8 100755 --- a/test/merge-candidate.test.mjs +++ b/test/merge-candidate.test.mjs @@ -24,7 +24,7 @@ const mergeProofContext = (row, sha, tree) => { }); const success = (name) => ({ name, conclusion: 'success' }); return { proof, reuseRuns: new Map(), jobs: [ - success('Предполётные проверки: документация, провенанс, процесс'), + success('Предполёт: документация, провенанс, процесс'), success('Классификация изменённых файлов'), success('Переиспользование: это дерево уже проверено'), success('Фронтенд: типы, юниты, мутанты, синхрон бандла'), diff --git a/test/release-gate.test.mjs b/test/release-gate.test.mjs index 126c4637..e2a3d460 100644 --- a/test/release-gate.test.mjs +++ b/test/release-gate.test.mjs @@ -23,7 +23,7 @@ const proofContext = ({ id, full = true, conclusion = 'success' }) => { }; const proof = buildCiProof({ candidateSha: SHA, candidateTree: TREE, runId: id, attempt: 1, event: 'workflow_dispatch', needs }); const jobs = [ - greenJob('Предполётные проверки: документация, провенанс, процесс'), + greenJob('Предполёт: документация, провенанс, процесс'), greenJob('Классификация изменённых файлов'), greenJob('Переиспользование: это дерево уже проверено'), greenJob('Фронтенд: типы, юниты, мутанты, синхрон бандла'), ...Array.from({ length: 6 }, (_, i) => greenJob(`Мутанты по диффу (${i + 1}/6): затронутые свидетели краснеют`)), diff --git a/test/validate-gate.test.mjs b/test/validate-gate.test.mjs index cad05dd6..1ce3553e 100755 --- a/test/validate-gate.test.mjs +++ b/test/validate-gate.test.mjs @@ -12,7 +12,7 @@ const TREE = 'b'.repeat(40); const MUTANT_JOBS = [1, 2, 3, 4, 5, 6].map((n) => ({ name: `Мутанты по диффу (${n}/6): затронутые свидетели краснеют`, conclusion: 'success' })); const OTHER_JOBS = [{ name: 'Фронтенд: типы, юниты, мутанты, синхрон бандла', conclusion: 'success' }]; const BASE_JOBS = [ - { name: 'Предполётные проверки: документация, провенанс, процесс', conclusion: 'success' }, + { name: 'Предполёт: документация, провенанс, процесс', conclusion: 'success' }, { name: 'Классификация изменённых файлов', conclusion: 'success' }, { name: 'Переиспользование: это дерево уже проверено', conclusion: 'success' }, ]; diff --git a/test/validate-workflow.test.mjs b/test/validate-workflow.test.mjs index 1a5d4e03..8a017e63 100644 --- a/test/validate-workflow.test.mjs +++ b/test/validate-workflow.test.mjs @@ -456,6 +456,10 @@ test('журнал свидетелей changed_mutants: rerun продолжа test('#541: Validate всегда публикует proof точной попытки, а reuse раскрывает источник', () => { const workflow = read('validate.yml'); + const preflightName = workflow.match(/\n preflight:\n name: "([^"]+)"/)?.[1]; + assert.equal(preflightName, 'Предполёт: документация, провенанс, процесс'); + assert.ok(Buffer.byteLength(preflightName, 'utf8') <= 100, + 'GitHub Jobs API truncates job names longer than 100 UTF-8 bytes'); assert.doesNotMatch(workflow, /with:\s*\{[^\n]*\$\{\{/, 'GitHub does not parse an unquoted expression inside a YAML flow mapping'); const proofAt = workflow.indexOf('\n proof:\n');