ci: keep proof job names API-verifiable (#541)

Issue: #541
User-Visible: no
This commit is contained in:
Sergey Matyunin
2026-09-13 10:07:04 +03:00
parent a8ae5a45e1
commit fdb0d0743d
7 changed files with 10 additions and 6 deletions
+1 -1
View File
@@ -47,7 +47,7 @@ jobs:
# запись «job независимый: краснеет сам и не роняет остальные» продолжает
# действовать — на уровне шагов, с той же гранулярностью в логе.
preflight:
name: "Предполётные проверки: документация, провенанс, процесс"
name: "Предполёт: документация, провенанс, процесс"
runs-on: ubuntu-latest
# `actions: read` — чтение списка прогонов Validate (#388), `issues: read` —
# проверка 8 процессного гейта. Права перечислены явно, потому что job
+1 -1
View File
@@ -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 }],
+1 -1
View File
@@ -11,7 +11,7 @@ export const SHA = 'a'.repeat(40);
export const TREE = 'b'.repeat(40);
const names = {
preflight: 'Предполётные проверки: документация, провенанс, процесс',
preflight: 'Предполёт: документация, провенанс, процесс',
changes: 'Классификация изменённых файлов',
reuse: 'Переиспользование: это дерево уже проверено',
frontend: 'Фронтенд: типы, юниты, мутанты, синхрон бандла',
+1 -1
View File
@@ -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('Фронтенд: типы, юниты, мутанты, синхрон бандла'),
+1 -1
View File
@@ -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): затронутые свидетели краснеют`)),
+1 -1
View File
@@ -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' },
];
+4
View File
@@ -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');