358 lines
12 KiB
JSON
358 lines
12 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" }],
|
|
"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:fixture", "expect": "fail" },
|
|
{ "script": "check:types:fixture:ts-port", "expect": "fail" },
|
|
{ "script": "check:types:fixture:ts-result", "expect": "fail" },
|
|
{ "script": "check:types:fixture:application-output", "expect": "fail" },
|
|
{ "script": "check:types:fixture:application-input", "expect": "fail" }
|
|
],
|
|
"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" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-005.txt",
|
|
"evidence": ["artifacts/tests/unit.xml"],
|
|
"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" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-007.txt",
|
|
"evidence": ["artifacts/tests/integration.xml"],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-008": {
|
|
"name": "e2e",
|
|
"steps": [{ "script": "test:e2e", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-008.txt",
|
|
"evidence": ["artifacts/tests/e2e/report/index.html"],
|
|
"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/SAMPLE_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:registries", "expect": "pass" },
|
|
{ "script": "check:registries:fixture", "expect": "fail" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-010.txt",
|
|
"evidence": [
|
|
"artifacts/quality/dependency-report.json",
|
|
"artifacts/quality/registries.json",
|
|
"artifacts/quality/registry-fixture.json"
|
|
],
|
|
"retentionClass": "merge-cycle"
|
|
},
|
|
"FE-GATE-011": {
|
|
"name": "build",
|
|
"steps": [{ "script": "build", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-011.txt",
|
|
"evidence": ["artifacts/release/build-manifest.json"],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-012": {
|
|
"name": "bundle",
|
|
"steps": [
|
|
{ "script": "build", "expect": "pass" },
|
|
{ "script": "check:bundle", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-012.txt",
|
|
"evidence": ["artifacts/performance/bundle.json"],
|
|
"retentionClass": "release-coherence"
|
|
},
|
|
"FE-GATE-013": {
|
|
"name": "security",
|
|
"steps": [
|
|
{ "script": "build:release", "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/security/dependency-diff.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", "expect": "pass" },
|
|
{ "script": "verify:release", "expect": "pass" }
|
|
],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-015.txt",
|
|
"evidence": ["artifacts/release/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/local-release/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": "sample-removal",
|
|
"steps": [{ "script": "test:sample-removal", "expect": "pass" }],
|
|
"logPath": "artifacts/quality/gates/FE-GATE-020.txt",
|
|
"evidence": ["artifacts/tests/sample-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/local-release/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/local-release/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/local-release/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/local-release/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/local-release/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"
|
|
}
|
|
}
|