{ "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" } }