fix: complete TechLog migration evidence
This commit is contained in:
@@ -5,6 +5,7 @@ import path from "node:path";
|
||||
import { z } from "zod";
|
||||
|
||||
import { PROMOTION_FORMULA } from "../../src/application/policies/promotion-readiness.ts";
|
||||
import { MANUAL_A11Y_ROUTE_IDS } from "../lib/manual-a11y-evidence.ts";
|
||||
import {
|
||||
RELEASE_CANDIDATE_EVIDENCE_PATHS,
|
||||
RELEASE_CANDIDATE_MANIFEST_PATH,
|
||||
@@ -442,7 +443,7 @@ export type LoadCiGateContractOptions = Readonly<{
|
||||
}>;
|
||||
|
||||
const CANONICAL_GATE_SHAPE_SHA256 =
|
||||
"a4a963d0b9deffb7a0a3d755bbbcb979d72610eb74751c3a2e5eca55251e12d4";
|
||||
"492331de6d07926b1cdb569824c8feaa761eef76b9ac782c0404d40797383ef0";
|
||||
|
||||
function canonicalGateShapeSha256(gates: CiGateContract["gates"]): string {
|
||||
const normalized = gates.map(
|
||||
@@ -481,8 +482,8 @@ function canonicalAuthorityBaselineFailures(contract: CiGateContract): string[]
|
||||
`command authority baseline must contain exactly 81 definitions and 93 references; received ${contract.commands.length} definitions and ${commandReferenceCount} references`,
|
||||
);
|
||||
}
|
||||
if (contract.artifacts.length !== 105) {
|
||||
failures.push(`artifact authority baseline must contain exactly 105 artifacts; received ${contract.artifacts.length}`);
|
||||
if (contract.artifacts.length !== 126) {
|
||||
failures.push(`artifact authority baseline must contain exactly 126 artifacts; received ${contract.artifacts.length}`);
|
||||
}
|
||||
if (contract.stages.length !== 5) {
|
||||
failures.push(`stage authority baseline must contain exactly 5 stages; received ${contract.stages.length}`);
|
||||
@@ -723,6 +724,44 @@ function validateContractSemantics(
|
||||
issue(`unknown retention class ${gate.retentionClassId} for ${gate.id}`);
|
||||
}
|
||||
}
|
||||
|
||||
const accessibilityGate = contract.gates.find(
|
||||
({ id: gateId }) => gateId === "FE-GATE-009",
|
||||
);
|
||||
const manualAccessibilityArtifacts = MANUAL_A11Y_ROUTE_IDS.map((routeId) => ({
|
||||
id: `artifact-artifacts-tests-a11y-manual-${routeId.replaceAll("_", "-")}-md`,
|
||||
path: `artifacts/tests/a11y-manual/${routeId}.md`,
|
||||
}));
|
||||
const expectedAccessibilityEvidenceArtifactIds = [
|
||||
"artifact-artifacts-tests-a11y-json",
|
||||
...manualAccessibilityArtifacts.map(({ id: artifactId }) => artifactId),
|
||||
"artifact-artifacts-tests-a11y-manual-report-json",
|
||||
];
|
||||
if (
|
||||
!accessibilityGate ||
|
||||
JSON.stringify(accessibilityGate.evidenceArtifactIds) !==
|
||||
JSON.stringify(expectedAccessibilityEvidenceArtifactIds)
|
||||
) {
|
||||
issue(
|
||||
"FE-GATE-009 manual accessibility evidence must exactly match the installed route scope",
|
||||
);
|
||||
}
|
||||
for (const expected of manualAccessibilityArtifacts) {
|
||||
const artifact = contract.artifacts.find(
|
||||
({ id: artifactId }) => artifactId === expected.id,
|
||||
);
|
||||
if (
|
||||
!artifact ||
|
||||
artifact.path !== expected.path ||
|
||||
artifact.schemaId !== "markdown" ||
|
||||
artifact.production !== "source-controlled"
|
||||
) {
|
||||
issue(
|
||||
`FE-GATE-009 manual accessibility artifact registration is invalid: ${expected.id}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const referencedRetentionClasses = new Set(
|
||||
contract.gates.map(({ retentionClassId }) => retentionClassId),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user