PRISM Score
The PRISM score is a composite health metric (0.0-1.0) that combines maturity levels, metric performance, and customer awareness into a single actionable number.
Score Formula
CellScore = (MaturityWeight × MaturityScore) + (PerformanceWeight × PerformanceScore)
BaseScore = Σ(CellScore × Weight) / Σ(Weight)
Overall = BaseScore × AwarenessScore
Score Components
1. Maturity Score (per cell)
The maturity score for each domain/stage cell:
| Level | Score |
|---|---|
| 1 (Reactive) | 0.2 |
| 2 (Basic) | 0.4 |
| 3 (Defined) | 0.6 |
| 4 (Managed) | 0.8 |
| 5 (Optimizing) | 1.0 |
2. Performance Score (per cell)
Average ProgressToTarget() for metrics in each cell:
Where ProgressToTarget() returns:
- For
higher_better:min(current/target, 1.0) - For
lower_better:min(target/current, 1.0)(if current > 0)
3. Cell Score
Combined maturity and performance:
4. Base Score
Weighted average across all cells:
Where Weight = DomainWeight × StageWeight
5. Awareness Multiplier
Final score adjusted by customer awareness:
Default Weights
Component Weights
| Component | Default Weight |
|---|---|
| Maturity | 40% |
| Performance | 60% |
Stage Weights
| Stage | Weight | Rationale |
|---|---|---|
| Design | 15% | Foundation, less frequent |
| Build | 20% | High automation potential |
| Test | 15% | Validation before production |
| Runtime | 30% | Live system health (highest) |
| Response | 20% | Recovery capability |
Domain Weights
| Domain | Weight |
|---|---|
| Security | 50% |
| Operations | 50% |
Score Interpretation
| Score Range | Level | Description |
|---|---|---|
| ≥ 0.90 | Elite | Industry-leading practices |
| ≥ 0.75 | Strong | Well-managed, proactive approach |
| ≥ 0.50 | Medium | Adequate, room for improvement |
| ≥ 0.25 | Weak | Significant gaps to address |
| < 0.25 | Critical | Immediate attention required |
Example Calculation
Setup
- 2 domains × 5 stages = 10 cells
- Security/Build: Maturity L4 (0.8), Performance 0.85
- Operations/Runtime: Maturity L4 (0.8), Performance 0.95
Cell Score: Security/Build
Cell Score: Operations/Runtime
Base Score (simplified)
Customizing Weights
config := &prism.ScoreConfig{
// Emphasize performance over maturity
MaturityWeight: 0.3,
PerformanceWeight: 0.7,
// Emphasize runtime and response
StageWeights: map[string]float64{
"design": 0.10,
"build": 0.15,
"test": 0.15,
"runtime": 0.35,
"response": 0.25,
},
// Emphasize security
DomainWeights: map[string]float64{
"security": 0.6,
"operations": 0.4,
},
}
score := doc.CalculatePRISMScore(config, nil)
Weight Normalization
Cell weights are calculated as:
The final score divides by total weight, which normalizes the result. This means:
- Domain weights only affect score when domains have different coverage
- To make domain weights meaningful, have different numbers of metrics per domain
Using the Score
Basic Usage
score := doc.CalculatePRISMScore(nil, nil)
fmt.Printf("PRISM Score: %.1f%% (%s)\n",
score.Overall*100, score.Interpretation)
Detailed Breakdown
score := doc.CalculatePRISMScore(nil, nil)
fmt.Printf("Overall: %.1f%%\n", score.Overall*100)
fmt.Printf("Base Score: %.1f%%\n", score.BaseScore*100)
fmt.Printf("Security: %.1f%%\n", score.SecurityScore*100)
fmt.Printf("Operations: %.1f%%\n", score.OperationsScore*100)
for _, cs := range score.CellScores {
fmt.Printf(" %s/%s: %.1f%% (weight: %.2f)\n",
cs.Domain, cs.Stage, cs.CellScore*100, cs.Weight)
}
Health Status
health := score.GetHealthStatus()
fmt.Printf("Level: %s\n", health.Level)
fmt.Printf("Color: %s\n", health.Color)
fmt.Printf("Description: %s\n", health.Description)
CLI Usage
# Basic score
prism score prism.json
# Detailed breakdown
prism score prism.json --detailed
# JSON output for automation
prism score prism.json --json
Score Trends
Track PRISM score over time to measure improvement:
| Period | Score | Level |
|---|---|---|
| Q1 2024 | 0.52 | Medium |
| Q2 2024 | 0.61 | Medium |
| Q3 2024 | 0.72 | Medium |
| Q4 2024 | 0.78 | Strong |