From 3dd2ef25776cea445698c300f4634dd1203fe8ef Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 17 Feb 2026 12:10:36 -0700 Subject: [PATCH] Refactor sprint 35 score clamping for architecture compliance --- editor/src/CanaryPromotionJudge.h | 4 +- editor/src/ComplianceOperationalReadiness.h | 4 +- editor/src/DeploymentPromotionGate.h | 5 +-- editor/src/ScoreClampUtil.h | 7 ++++ editor/src/Sprint35OperationalReadiness.h | 4 +- progress.md | 45 +++++++++++++++++++++ 6 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 editor/src/ScoreClampUtil.h diff --git a/editor/src/CanaryPromotionJudge.h b/editor/src/CanaryPromotionJudge.h index 202e193..817729b 100644 --- a/editor/src/CanaryPromotionJudge.h +++ b/editor/src/CanaryPromotionJudge.h @@ -5,6 +5,7 @@ #include #include +#include "ScoreClampUtil.h" #include "ValidationErrorUtil.h" struct CanaryAssessment { @@ -55,8 +56,7 @@ public: if (a.latencyP95Ms > 300) score += (a.latencyP95Ms - 300) / 5; if (a.errorBudgetBurn > 100) score += (a.errorBudgetBurn - 100) / 2; if (a.manualOverride) score = 0; - if (score > 100) return 100; - return score; + return clampToPercent(score); } int promotableCount() const { diff --git a/editor/src/ComplianceOperationalReadiness.h b/editor/src/ComplianceOperationalReadiness.h index 63ca704..130e92f 100644 --- a/editor/src/ComplianceOperationalReadiness.h +++ b/editor/src/ComplianceOperationalReadiness.h @@ -1,10 +1,10 @@ #pragma once // Step 603: Compliance Operational Readiness -#include #include #include +#include "ScoreClampUtil.h" #include "ValidationErrorUtil.h" struct ComplianceReadinessSnapshot { @@ -37,7 +37,7 @@ public: s.approvedExceptions * 2 - s.expiringSoon * 3 - s.openRunbooks * 4; - return std::max(0, std::min(100, score)); + return clampToPercent(score); } static std::vector blockingFindings(const ComplianceReadinessSnapshot& s) { diff --git a/editor/src/DeploymentPromotionGate.h b/editor/src/DeploymentPromotionGate.h index 7cace5d..717b477 100644 --- a/editor/src/DeploymentPromotionGate.h +++ b/editor/src/DeploymentPromotionGate.h @@ -5,6 +5,7 @@ #include #include +#include "ScoreClampUtil.h" #include "ValidationErrorUtil.h" struct EnvironmentGateState { @@ -56,9 +57,7 @@ public: int score = (state.passedChecks * 100) / state.requiredChecks; score += state.manualApprovals * 5; score -= state.blockingIssues * 20; - if (score < 0) return 0; - if (score > 100) return 100; - return score; + return clampToPercent(score); } std::vector blockedEnvironments() const { diff --git a/editor/src/ScoreClampUtil.h b/editor/src/ScoreClampUtil.h new file mode 100644 index 0000000..3c773c9 --- /dev/null +++ b/editor/src/ScoreClampUtil.h @@ -0,0 +1,7 @@ +#pragma once + +inline int clampToPercent(int value) { + if (value < 0) return 0; + if (value > 100) return 100; + return value; +} diff --git a/editor/src/Sprint35OperationalReadiness.h b/editor/src/Sprint35OperationalReadiness.h index cac0c44..194240e 100644 --- a/editor/src/Sprint35OperationalReadiness.h +++ b/editor/src/Sprint35OperationalReadiness.h @@ -1,10 +1,10 @@ #pragma once // Step 613: Sprint 35 Operational Readiness -#include #include #include +#include "ScoreClampUtil.h" #include "ValidationErrorUtil.h" struct Sprint35ReadinessInput { @@ -35,7 +35,7 @@ public: score -= in.onCallCoverageGaps; score -= in.blockedCanaries * 15; score -= in.incompletePostmortems * 10; - return std::max(0, std::min(100, score)); + return clampToPercent(score); } static std::vector blockers(const Sprint35ReadinessInput& in) { diff --git a/progress.md b/progress.md index 54b3c23..35b228c 100644 --- a/progress.md +++ b/progress.md @@ -12010,3 +12010,48 @@ freeze, dependency, coverage, canary, and postmortem signals. - `editor/src/Sprint35OperationalReadiness.h` within header-size limit (`54` <= `600`) - `editor/tests/step613_test.cpp` within test-file size guidance (`134` lines) - Header-only architecture and naming conventions remain aligned with `ARCHITECTURE.md` + +## Sprint 35 Refactor Pass (Architecture Compliance) +**Status:** PASS + +Completed the end-of-sprint refactor and architecture audit for Steps 604-613. +The refactor extracted duplicated score-clamp logic into one shared utility +while preserving behavior. + +**Files added:** +- `editor/src/ScoreClampUtil.h` - shared `clampToPercent()` helper for all + sprint scoring modules. + +**Files modified:** +- `editor/src/DeploymentPromotionGate.h` +- `editor/src/ComplianceOperationalReadiness.h` +- `editor/src/CanaryPromotionJudge.h` +- `editor/src/Sprint35OperationalReadiness.h` + +**Refactor result:** +- Removed repeated manual score clamp branches in sprint modules. +- Kept modules header-only and maintained existing public APIs. +- Preserved runtime behavior; all step tests remained green. + +**Verification run (full sprint matrix):** +- `cmake -S editor -B editor/build-native` - PASS +- `cmake --build editor/build-native --target step604_test step605_test step606_test step607_test step608_test step609_test step610_test step611_test step612_test step613_test` - PASS +- `./editor/build-native/step604_test` - PASS (12/12) +- `./editor/build-native/step605_test` - PASS (12/12) +- `./editor/build-native/step606_test` - PASS (12/12) +- `./editor/build-native/step607_test` - PASS (12/12) +- `./editor/build-native/step608_test` - PASS (12/12) +- `./editor/build-native/step609_test` - PASS (12/12) +- `./editor/build-native/step610_test` - PASS (12/12) +- `./editor/build-native/step611_test` - PASS (12/12) +- `./editor/build-native/step612_test` - PASS (12/12) +- `./editor/build-native/step613_test` - PASS (12/12) +- Sprint 35 matrix total: **120/120 passing** + +**Architecture gate check:** +- `editor/src/ScoreClampUtil.h` (`7` <= `600`) +- `editor/src/DeploymentPromotionGate.h` (`75` <= `600`) +- `editor/src/ComplianceOperationalReadiness.h` (`58` <= `600`) +- `editor/src/CanaryPromotionJudge.h` (`72` <= `600`) +- `editor/src/Sprint35OperationalReadiness.h` (`54` <= `600`) +- Naming conventions and header-only module constraints remain aligned with `ARCHITECTURE.md`.