diff --git a/docs/governance/006_INDEX_CI_RULES.MD b/docs/governance/006_INDEX_CI_RULES.MD new file mode 100644 index 00000000..29851163 --- /dev/null +++ b/docs/governance/006_INDEX_CI_RULES.MD @@ -0,0 +1,10 @@ +# CI Policy Rules + + +| rule_id | file | +| --- | --- | +| `CI-ARTIFACT-000` | `tools/ci/policies/rules/artifact_contract.yaml` | +| `CI-DOCS-000` | `tools/ci/policies/rules/docs_drift.yaml` | +| `CI-NAMING-000` | `tools/ci/policies/rules/naming_snt.yaml` | +| `CI-SHELL-000` | `tools/ci/policies/rules/shell_safety.yaml` | +| `CI-VERSION-000` | `tools/ci/policies/rules/versioning_svt.yaml` | diff --git a/tools/ci/checks/PolicyRunner/Program.cs b/tools/ci/checks/PolicyRunner/Program.cs index 699aa723..f3543b05 100644 --- a/tools/ci/checks/PolicyRunner/Program.cs +++ b/tools/ci/checks/PolicyRunner/Program.cs @@ -939,7 +939,7 @@ static bool IsConfiguredBinaryPath(string path, IReadOnlyList configured var unknownRootKeys = root.Children.Keys .OfType() .Select(static x => x.Value ?? string.Empty) - .Where(key => key is not ("rules_schema_version" or "rules")) + .Where(key => key is not ("rule_id" or "rules_schema_version" or "rules")) .OrderBy(static x => x, StringComparer.Ordinal) .ToList(); if (unknownRootKeys.Count > 0) diff --git a/tools/ci/policies/rules/artifact_contract.yaml b/tools/ci/policies/rules/artifact_contract.yaml index 4dcdea04..e6e8f13f 100644 --- a/tools/ci/policies/rules/artifact_contract.yaml +++ b/tools/ci/policies/rules/artifact_contract.yaml @@ -1,3 +1,4 @@ +rule_id: CI-ARTIFACT-000 rules_schema_version: 1 rules: - rule_id: CI-ARTIFACT-001 diff --git a/tools/ci/policies/rules/docs_drift.yaml b/tools/ci/policies/rules/docs_drift.yaml index 2469118e..22f1852d 100644 --- a/tools/ci/policies/rules/docs_drift.yaml +++ b/tools/ci/policies/rules/docs_drift.yaml @@ -1,3 +1,4 @@ +rule_id: CI-DOCS-000 rules_schema_version: 1 rules: - rule_id: CI-DOCS-001 diff --git a/tools/ci/policies/rules/naming_snt.yaml b/tools/ci/policies/rules/naming_snt.yaml index 5a90dc19..92028028 100644 --- a/tools/ci/policies/rules/naming_snt.yaml +++ b/tools/ci/policies/rules/naming_snt.yaml @@ -1,3 +1,4 @@ +rule_id: CI-NAMING-000 rules_schema_version: 1 rules: - rule_id: CI-NAMING-001 diff --git a/tools/ci/policies/rules/shell_safety.yaml b/tools/ci/policies/rules/shell_safety.yaml index 29078b12..ad848fdf 100644 --- a/tools/ci/policies/rules/shell_safety.yaml +++ b/tools/ci/policies/rules/shell_safety.yaml @@ -1,3 +1,4 @@ +rule_id: CI-SHELL-000 rules_schema_version: 1 rules: - rule_id: CI-SHELL-001 diff --git a/tools/ci/policies/rules/versioning_svt.yaml b/tools/ci/policies/rules/versioning_svt.yaml index e1f6d4db..de40a1d1 100644 --- a/tools/ci/policies/rules/versioning_svt.yaml +++ b/tools/ci/policies/rules/versioning_svt.yaml @@ -1,3 +1,4 @@ +rule_id: CI-VERSION-000 rules_schema_version: 1 rules: - rule_id: CI-VERSION-001 diff --git a/tools/ci/policies/schema/rules.schema.json b/tools/ci/policies/schema/rules.schema.json index 02471d78..ba5a1206 100644 --- a/tools/ci/policies/schema/rules.schema.json +++ b/tools/ci/policies/schema/rules.schema.json @@ -3,8 +3,16 @@ "$id": "tools/ci/policies/schema/rules.schema.json", "type": "object", "additionalProperties": false, - "required": ["rules_schema_version", "rules"], + "required": [ + "rules_schema_version", + "rules" + ], "properties": { + "rule_id": { + "type": "string", + "description": "Rule collection identifier (file-level). Optional.", + "pattern": "^CI-[A-Z0-9_-]+-[0-9]{3}$" + }, "rules_schema_version": { "type": "integer", "const": 1 @@ -15,7 +23,15 @@ "items": { "type": "object", "additionalProperties": false, - "required": ["rule_id", "policy_type", "severity", "title", "description", "applies_to", "params"], + "required": [ + "rule_id", + "policy_type", + "severity", + "title", + "description", + "applies_to", + "params" + ], "properties": { "rule_id": { "type": "string", @@ -36,7 +52,10 @@ }, "severity": { "type": "string", - "enum": ["warn", "fail"] + "enum": [ + "warn", + "fail" + ] }, "title": { "type": "string",