489 lines
19 KiB
JSON
489 lines
19 KiB
JSON
{
|
|
"schemaVersion": 1,
|
|
"providerAdapter": ".gitea/workflows/quality-gates.yml",
|
|
"stages": {
|
|
"merge": {
|
|
"readiness": "MERGE_READY",
|
|
"needs": null,
|
|
"gates": [
|
|
"FE-GATE-001",
|
|
"FE-GATE-002",
|
|
"FE-GATE-003",
|
|
"FE-GATE-004",
|
|
"FE-GATE-005",
|
|
"FE-GATE-006",
|
|
"FE-GATE-007",
|
|
"FE-GATE-008",
|
|
"FE-GATE-009",
|
|
"FE-GATE-010",
|
|
"FE-GATE-011",
|
|
"FE-GATE-013",
|
|
"FE-GATE-020"
|
|
]
|
|
},
|
|
"release": {
|
|
"readiness": "RELEASE_READY",
|
|
"needs": "merge",
|
|
"gates": [
|
|
"FE-GATE-012",
|
|
"FE-GATE-014",
|
|
"FE-GATE-015",
|
|
"FE-GATE-019",
|
|
"FE-GATE-026"
|
|
]
|
|
},
|
|
"production": {
|
|
"readiness": "PROD_PROMOTION_READY",
|
|
"needs": "release",
|
|
"gates": [
|
|
"FE-GATE-016",
|
|
"FE-GATE-021",
|
|
"FE-GATE-022",
|
|
"FE-GATE-023",
|
|
"FE-GATE-024",
|
|
"FE-GATE-025"
|
|
]
|
|
},
|
|
"field": {
|
|
"readiness": "FIELD_SLO_READY",
|
|
"needs": "production",
|
|
"gates": ["FE-GATE-018"]
|
|
},
|
|
"documentation": {
|
|
"readiness": "DOCUMENTATION_READY",
|
|
"needs": null,
|
|
"gates": ["FE-GATE-017"]
|
|
}
|
|
},
|
|
"gates": {
|
|
"FE-GATE-001": {
|
|
"name": "manifest-lockfile",
|
|
"steps": [
|
|
{ "script": "verify:lockfile", "expect": "pass" },
|
|
{ "script": "check:frozen-lockfile:fixture", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/install.txt",
|
|
"evidence": ["artifacts/quality/install.txt"],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-002": {
|
|
"name": "lint",
|
|
"steps": [{ "script": "lint", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/lint.txt",
|
|
"evidence": ["artifacts/quality/lint.txt"],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-003": {
|
|
"name": "typecheck",
|
|
"steps": [
|
|
{ "script": "check:types", "expect": "pass" },
|
|
{ "script": "check:types:recipes", "expect": "pass" },
|
|
{ "script": "check:types:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2322:" },
|
|
{ "script": "check:types:fixture:ts-port", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2322:" },
|
|
{ "script": "check:types:fixture:ts-result", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2339:" },
|
|
{ "script": "check:types:fixture:application-output", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2322:" },
|
|
{ "script": "check:types:fixture:application-input", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2739:" },
|
|
{ "script": "check:types:fixture:feature-input", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2345:" },
|
|
{ "script": "check:types:fixture:failure-kind", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2322:" },
|
|
{ "script": "check:types:fixture:reference-operation", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2345:" },
|
|
{ "script": "check:types:fixture:async-overlay", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2322:" },
|
|
{ "script": "check:types:fixture:route-runtime", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2353:" },
|
|
{ "script": "check:types:fixture:page-action", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS1360:" },
|
|
{ "script": "check:types:fixture:icon-button", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2741:" },
|
|
{ "script": "check:types:fixture:i18n-key", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2345:" },
|
|
{ "script": "check:types:fixture:i18n-params", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "error TS2554:" },
|
|
{ "script": "check:types:fixture:diagnostics", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "UNKNOWN_DIAGNOSTIC_EVENT" }
|
|
],
|
|
"logPath": "artifacts/quality/check-types.txt",
|
|
"evidence": ["artifacts/quality/check-types.txt"],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-004": {
|
|
"name": "runtime-schema",
|
|
"steps": [{ "script": "test:runtime-schema", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-004.txt",
|
|
"evidence": ["artifacts/tests/runtime-schema.xml"],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-005": {
|
|
"name": "unit",
|
|
"steps": [
|
|
{ "script": "test:unit", "expect": "pass" },
|
|
{ "script": "test:coverage", "expect": "pass" },
|
|
{ "script": "check:coverage:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "Risk coverage failed:" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-005.txt",
|
|
"evidence": [
|
|
"artifacts/tests/unit.xml",
|
|
"artifacts/tests/coverage.xml",
|
|
"artifacts/tests/coverage/coverage-summary.json",
|
|
"artifacts/quality/risk-coverage.json",
|
|
"artifacts/quality/risk-coverage-fixture.json"
|
|
],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-006": {
|
|
"name": "component",
|
|
"steps": [{ "script": "test:component", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-006.txt",
|
|
"evidence": ["artifacts/tests/component.xml"],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-007": {
|
|
"name": "integration",
|
|
"steps": [
|
|
{ "script": "test:integration", "expect": "pass" },
|
|
{ "script": "test:reference-feature", "expect": "pass" },
|
|
{ "script": "test:recipes", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-007.txt",
|
|
"evidence": [
|
|
"artifacts/tests/integration.xml",
|
|
"artifacts/tests/reference-feature.xml",
|
|
"artifacts/tests/optional-recipes.xml"
|
|
],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-008": {
|
|
"name": "e2e",
|
|
"steps": [
|
|
{ "script": "test:e2e", "expect": "pass" },
|
|
{ "script": "test:browser-capabilities", "expect": "pass" },
|
|
{
|
|
"script": "verify:browser-capability-evidence",
|
|
"expect": "pass"
|
|
},
|
|
{ "script": "test:storybook", "expect": "pass" },
|
|
{ "script": "test:visual", "expect": "pass" },
|
|
{ "script": "check:test-evidence", "expect": "pass" },
|
|
{ "script": "check:test-evidence:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "Test evidence failed:" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-008.txt",
|
|
"evidence": [
|
|
"artifacts/tests/e2e/report/index.html",
|
|
"artifacts/tests/e2e/results.xml",
|
|
"artifacts/tests/browser-capabilities/report/index.html",
|
|
"artifacts/tests/browser-capabilities/results.xml",
|
|
"artifacts/tests/storybook/report/index.html",
|
|
"artifacts/tests/storybook/results.xml",
|
|
"artifacts/tests/visual/report/index.html",
|
|
"artifacts/tests/visual/results.xml",
|
|
"artifacts/quality/test-evidence.json",
|
|
"artifacts/quality/test-evidence-fixture.json"
|
|
],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-009": {
|
|
"name": "accessibility",
|
|
"steps": [
|
|
{ "script": "test:a11y", "expect": "pass" },
|
|
{ "script": "review:a11y-manual", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-009.txt",
|
|
"evidence": [
|
|
"artifacts/tests/a11y.json",
|
|
"artifacts/tests/a11y-manual/APP_HOME.md",
|
|
"artifacts/tests/a11y-manual/EXAMPLES_UI.md",
|
|
"artifacts/tests/a11y-manual/EXAMPLES_STATES.md",
|
|
"artifacts/tests/a11y-manual/EXAMPLES_AUTH.md",
|
|
"artifacts/tests/a11y-manual/REFERENCE_RESOURCE_LIST.md",
|
|
"artifacts/tests/a11y-manual/NOT_FOUND.md",
|
|
"artifacts/tests/a11y-manual/report.json"
|
|
],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-010": {
|
|
"name": "architecture",
|
|
"steps": [
|
|
{ "script": "check:architecture", "expect": "pass" },
|
|
{ "script": "check:design-system", "expect": "pass" },
|
|
{ "script": "check:design-system:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "Design system contract failed:" },
|
|
{ "script": "check:i18n", "expect": "pass" },
|
|
{ "script": "check:i18n:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "I18n contract failed:" },
|
|
{ "script": "check:diagnostics", "expect": "pass" },
|
|
{ "script": "check:diagnostics:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "Diagnostics contract failed:" },
|
|
{ "script": "check:browser-file-storage-boundaries", "expect": "pass" },
|
|
{ "script": "check:realtime-boundaries", "expect": "pass" },
|
|
{ "script": "check:realtime-boundaries:fixture", "expect": "pass" },
|
|
{ "script": "check:optional-recipes:source", "expect": "pass" },
|
|
{ "script": "check:optional-recipe-fixtures", "expect": "pass" },
|
|
{ "script": "check:registries", "expect": "pass" },
|
|
{
|
|
"script": "check:registries:compatibility-fixtures",
|
|
"expect": "pass"
|
|
},
|
|
{ "script": "check:registries:baseline-fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "registry baseline approval digest mismatch:" },
|
|
{ "script": "check:registries:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "duplicates id=duplicate" },
|
|
{ "script": "check:routes:fixture", "expect": "fail", "expectedExitCode": 1, "expectedDiagnosticId": "duplicates routeId=DUPLICATE" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-010.txt",
|
|
"evidence": [
|
|
"artifacts/quality/dependency-report.json",
|
|
"artifacts/quality/design-system.json",
|
|
"artifacts/quality/design-system-fixture.json",
|
|
"artifacts/quality/i18n.json",
|
|
"artifacts/quality/i18n-fixture.json",
|
|
"artifacts/quality/diagnostics.json",
|
|
"artifacts/quality/diagnostics-fixture.json",
|
|
"artifacts/quality/realtime-boundaries.json",
|
|
"artifacts/quality/optional-recipes.json",
|
|
"artifacts/quality/optional-recipe-fixtures.json",
|
|
"artifacts/quality/registries.json",
|
|
"artifacts/quality/registry-compatibility-fixtures.json",
|
|
"artifacts/quality/registry-baseline-fixture.json",
|
|
"artifacts/quality/registry-fixture.json",
|
|
"artifacts/quality/route-registry-fixture.json"
|
|
],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-011": {
|
|
"name": "build",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{ "script": "build:storybook", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-011.txt",
|
|
"evidence": [
|
|
"artifacts/release/build-manifest.json",
|
|
"artifacts/release/runtime-config.schema.json",
|
|
"artifacts/storybook/static/index.html"
|
|
],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-012": {
|
|
"name": "bundle",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{ "script": "check:bundle", "expect": "pass" },
|
|
{ "script": "check:optional-recipes", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-012.txt",
|
|
"evidence": [
|
|
"artifacts/performance/bundle.json",
|
|
"artifacts/quality/optional-recipes.json"
|
|
],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-013": {
|
|
"name": "security",
|
|
"steps": [
|
|
{ "script": "verify:reproducible-build", "expect": "pass" },
|
|
{ "script": "build:release", "expect": "pass" },
|
|
{ "script": "verify:supply-chain", "expect": "pass" },
|
|
{ "script": "check:supply-chain:fixtures", "expect": "pass" },
|
|
{
|
|
"script": "check:supply-chain:provider-fixtures",
|
|
"expect": "pass"
|
|
},
|
|
{ "script": "check:security:fixtures", "expect": "pass" },
|
|
{ "script": "check:browser-security", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-013.txt",
|
|
"evidence": [
|
|
"artifacts/security/scan.sarif",
|
|
"artifacts/release/dependency-inventory.json",
|
|
"artifacts/release/sbom.cdx.json",
|
|
"artifacts/release/provenance.json",
|
|
"artifacts/release/reproducible-build.json",
|
|
"artifacts/security/dependency-diff.json",
|
|
"artifacts/security/license-report.json",
|
|
"artifacts/security/vulnerability-report.json",
|
|
"artifacts/security/supply-chain-verification.json",
|
|
"artifacts/security/supply-chain-coherence.json",
|
|
"artifacts/security/supply-chain-fixtures.json",
|
|
"artifacts/security/supply-chain-provider-fixtures.json"
|
|
],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-014": {
|
|
"name": "config-compatibility",
|
|
"steps": [{ "script": "verify:compatibility", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-014.txt",
|
|
"evidence": ["artifacts/release/compatibility.json"],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-015": {
|
|
"name": "release-coherence",
|
|
"steps": [
|
|
{ "script": "build:release", "expect": "pass" },
|
|
{ "script": "verify:release", "expect": "pass" },
|
|
{ "script": "verify:supply-chain:promotion", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-015.txt",
|
|
"evidence": [
|
|
"artifacts/release/verification.json",
|
|
"artifacts/security/promotion-verification.json"
|
|
],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-016": {
|
|
"name": "rollback-drill",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{
|
|
"script": "drill:runbook",
|
|
"args": ["--", "FE-RB-005"],
|
|
"expect": "pass"
|
|
}
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-016.txt",
|
|
"evidence": [
|
|
"artifacts/runbooks/FE-RB-005/record.json"
|
|
],
|
|
"retentionClass": "prod-drill"
|
|
},
|
|
"FE-GATE-017": {
|
|
"name": "diagram-review",
|
|
"steps": [{ "script": "verify:documentation", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-017.txt",
|
|
"evidence": ["artifacts/quality/documentation-review.json"],
|
|
"retentionClass": "documentation"
|
|
},
|
|
"FE-GATE-018": {
|
|
"name": "field-web-vitals",
|
|
"requiresEnvironment": [
|
|
"FIELD_WEB_VITALS_INPUT",
|
|
"MIN_ELIGIBLE_SAMPLES"
|
|
],
|
|
"steps": [
|
|
{ "script": "collect:web-vitals-evidence", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-018.txt",
|
|
"evidence": ["artifacts/performance/field-web-vitals.json"],
|
|
"retentionClass": "field"
|
|
},
|
|
"FE-GATE-019": {
|
|
"name": "hosting-header",
|
|
"requiresEnvironment": ["HOSTING_BASE_URL"],
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{ "script": "verify:hosting-headers", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-019.txt",
|
|
"evidence": ["artifacts/release/hosting-headers.json"],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-020": {
|
|
"name": "removability",
|
|
"steps": [
|
|
{ "script": "test:sample-removal", "expect": "pass" },
|
|
{ "script": "test:optional-recipe-removal", "expect": "pass" },
|
|
{
|
|
"script": "test:browser-file-storage-removal",
|
|
"expect": "pass"
|
|
},
|
|
{
|
|
"script": "test:realtime-removal",
|
|
"expect": "pass"
|
|
}
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-020.txt",
|
|
"evidence": [
|
|
"artifacts/tests/sample-removal.xml",
|
|
"artifacts/tests/optional-recipe-removal.xml",
|
|
"artifacts/tests/browser-file-storage-runtime-removal.xml",
|
|
"artifacts/tests/realtime-runtime-removal.xml"
|
|
],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-021": {
|
|
"name": "runbook-boot-config",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{
|
|
"script": "drill:runbook",
|
|
"args": ["--", "FE-RB-001"],
|
|
"expect": "pass"
|
|
}
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-021.txt",
|
|
"evidence": [
|
|
"artifacts/runbooks/FE-RB-001/record.json"
|
|
],
|
|
"retentionClass": "prod-drill"
|
|
},
|
|
"FE-GATE-022": {
|
|
"name": "runbook-chunk-mismatch",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{
|
|
"script": "drill:runbook",
|
|
"args": ["--", "FE-RB-002"],
|
|
"expect": "pass"
|
|
}
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-022.txt",
|
|
"evidence": [
|
|
"artifacts/runbooks/FE-RB-002/record.json"
|
|
],
|
|
"retentionClass": "prod-drill"
|
|
},
|
|
"FE-GATE-023": {
|
|
"name": "runbook-api-degradation",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{
|
|
"script": "drill:runbook",
|
|
"args": ["--", "FE-RB-003"],
|
|
"expect": "pass"
|
|
}
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-023.txt",
|
|
"evidence": [
|
|
"artifacts/runbooks/FE-RB-003/record.json"
|
|
],
|
|
"retentionClass": "prod-drill"
|
|
},
|
|
"FE-GATE-024": {
|
|
"name": "runbook-telemetry",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{
|
|
"script": "drill:runbook",
|
|
"args": ["--", "FE-RB-004"],
|
|
"expect": "pass"
|
|
}
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-024.txt",
|
|
"evidence": [
|
|
"artifacts/runbooks/FE-RB-004/record.json"
|
|
],
|
|
"retentionClass": "prod-drill"
|
|
},
|
|
"FE-GATE-025": {
|
|
"name": "runbook-release-rollback",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{
|
|
"script": "drill:runbook",
|
|
"args": ["--", "FE-RB-005"],
|
|
"expect": "pass"
|
|
}
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-025.txt",
|
|
"evidence": [
|
|
"artifacts/runbooks/FE-RB-005/record.json"
|
|
],
|
|
"retentionClass": "prod-drill"
|
|
},
|
|
"FE-GATE-026": {
|
|
"name": "lab-performance",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{ "script": "test:performance", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-026.txt",
|
|
"evidence": ["artifacts/performance/lab.json"],
|
|
"retentionClass": "release-coherence"
|
|
}
|
|
},
|
|
"retention": {
|
|
"durationStatus": "UNSUPPORTED_PENDING_ORGANIZATION_POLICY",
|
|
"merge-cycle": "at least through pull-request readiness decision",
|
|
"release-coherence": "at least until the next release is promoted",
|
|
"prod-drill": "at least until the next production promotion decision",
|
|
"field": "through the 28-day window and aggregation",
|
|
"documentation": "through documentation readiness review"
|
|
}
|
|
}
|