From 1f88c33b5eb7d93d661415b546911038a3d5482f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:39:43 +0000 Subject: [PATCH 1/6] Initial plan From 924155ed86b5cbf18ead83018f8beb4714df85d4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 17:43:09 +0000 Subject: [PATCH 2/6] BUG-2: Fix empty slos:[] when slo_type=error_rate in generate_slo_manifest Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- CHANGELOG.md | 11 +++++++++++ cli/scaffold_sre.py | 22 ++++++++++++++++++++++ tests/test_comprehensive.py | 10 ---------- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c938353..790f870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [0.4.2] - 2026-03-18 + +### Fixed +- **`scaffold sre` empty `slos: []` when `--slo-type error_rate`** — `generate_slo_manifest()` in + `cli/scaffold_sre.py` had no branch for the `error_rate` SLO type, leaving `slo.yaml` with an + empty `slos: []` list. Sloth/OpenSLO tooling therefore received no SLO objectives. A dedicated + `error_rate` SLO entry (with matching SLI queries and alerting config) is now generated when + `--slo-type error_rate` is specified. + +--- + ## [0.4.1] - 2026-03-17 ### Changed diff --git a/cli/scaffold_sre.py b/cli/scaffold_sre.py index 2e41f74..51da1ff 100644 --- a/cli/scaffold_sre.py +++ b/cli/scaffold_sre.py @@ -347,6 +347,28 @@ def generate_slo_manifest(args): }, }) + if args.slo_type in ("error_rate",): + slos.append({ + "name": "error_rate", + "description": f"{name} error rate SLO — error rate stays below {round(100 - args.slo_target, 4)}%", + "objective": args.slo_target, + "sli": { + "events": { + "error_query": f"rate(http_requests_total{{job=\"{name}\",status=~\"(5..)\"}}[{{{{.window}}}}])", + "total_query": f"rate(http_requests_total{{job=\"{name}\"}}[{{{{.window}}}}])", + } + }, + "alerting": { + "name": f"{name.title()}ErrorRateSLO", + "labels": {"team": args.team}, + "annotations": { + "runbook": f"https://wiki.example.com/runbooks/{name}/error-rate", + }, + "page_alert": {"labels": {"severity": "critical"}}, + "ticket_alert": {"labels": {"severity": "warning"}}, + }, + }) + if args.slo_type in ("latency", "all"): slos.append({ "name": "latency", diff --git a/tests/test_comprehensive.py b/tests/test_comprehensive.py index 9f2ef05..1b08ab9 100644 --- a/tests/test_comprehensive.py +++ b/tests/test_comprehensive.py @@ -854,16 +854,6 @@ def test_slo_manifest_latency_entry(self): slo_names = [s["name"] for s in manifest["slos"]] assert "latency" in slo_names - # BUG-2: error_rate SLO type produces empty slos list in manifest - @pytest.mark.xfail( - strict=True, - reason=( - "BUG-2: generate_slo_manifest() only checks for 'availability' and " - "'latency' slo_type values. When slo_type='error_rate', neither " - "condition matches so the slos list is empty. An error_rate SLO " - "entry should be generated for slo_type='error_rate'." - ), - ) def test_slo_manifest_error_rate_bug(self): """ BUG-2: When slo_type='error_rate', generate_slo_manifest() should From 8996ac45ba5055dade98a50fbf17964a9ef68801 Mon Sep 17 00:00:00 2001 From: Saravanan Gnanaguru Date: Thu, 19 Mar 2026 17:56:36 +0530 Subject: [PATCH 3/6] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- cli/scaffold_sre.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/scaffold_sre.py b/cli/scaffold_sre.py index 51da1ff..6f406d0 100644 --- a/cli/scaffold_sre.py +++ b/cli/scaffold_sre.py @@ -347,7 +347,7 @@ def generate_slo_manifest(args): }, }) - if args.slo_type in ("error_rate",): + if args.slo_type in ("error_rate", "all"): slos.append({ "name": "error_rate", "description": f"{name} error rate SLO — error rate stays below {round(100 - args.slo_target, 4)}%", From b654ab2356d23303d37d409a596e781698c0d7be Mon Sep 17 00:00:00 2001 From: Saravanan Gnanaguru Date: Thu, 19 Mar 2026 17:57:08 +0530 Subject: [PATCH 4/6] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- tests/test_comprehensive.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_comprehensive.py b/tests/test_comprehensive.py index 1b08ab9..821870f 100644 --- a/tests/test_comprehensive.py +++ b/tests/test_comprehensive.py @@ -858,7 +858,7 @@ def test_slo_manifest_error_rate_bug(self): """ BUG-2: When slo_type='error_rate', generate_slo_manifest() should return at least one SLO entry capturing the error rate objective, - but currently returns an empty slos list. + and that entry should have name == 'error_rate'. """ args = _sre_args(slo_type="error_rate") manifest = scaffold_sre.generate_slo_manifest(args) @@ -867,6 +867,8 @@ def test_slo_manifest_error_rate_bug(self): "Expected at least one SLO entry for error_rate type, " "got empty list." ) + slo_names = [s["name"] for s in manifest["slos"]] + assert "error_rate" in slo_names def test_slo_manifest_all_type_has_both_slos(self): args = _sre_args(slo_type="all") From 4aceec59d5bcb897c1d95a02a2a566531b454ec3 Mon Sep 17 00:00:00 2001 From: Saravanan Gnanaguru Date: Thu, 19 Mar 2026 17:58:18 +0530 Subject: [PATCH 5/6] Bump version to 0.4.2 CLI version bump --- cli/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/__version__.py b/cli/__version__.py index 961ae71..c454892 100644 --- a/cli/__version__.py +++ b/cli/__version__.py @@ -1,3 +1,3 @@ """Single source of truth for the devopsos package version.""" -__version__ = "0.4.1" +__version__ = "0.4.2" From d434cc3976afdf0992e19e9f26a1f833cbc36550 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 12:31:50 +0000 Subject: [PATCH 6/6] Fix: assert error_rate in all-type SLO manifest test Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- tests/test_comprehensive.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_comprehensive.py b/tests/test_comprehensive.py index 821870f..67b0712 100644 --- a/tests/test_comprehensive.py +++ b/tests/test_comprehensive.py @@ -876,6 +876,7 @@ def test_slo_manifest_all_type_has_both_slos(self): slo_names = [s["name"] for s in manifest["slos"]] assert "availability" in slo_names assert "latency" in slo_names + assert "error_rate" in slo_names def test_alertmanager_config_slack_receiver(self): args = _sre_args(slack_channel="#platform-alerts")