Skip to content

v0.5.0 Release Notes

Release Date: 2026-05-10

Highlights

  • BREAKING: Model/State Separation - PRISM Maturity Model (definition) is now separate from PRISM Maturity State (tracking)
  • Temporal SLO Windows - Support for 7d, 30d, 90d, quarterly, and annual SLO tracking
  • Hybrid Metrics - Qualitative/quantitative criteria with measurement type classification
  • Dashboard Dual-Read - Backward compatibility support during migration

Breaking Changes

This release introduces a fundamental architectural change to how maturity data is structured.

Assessment Data Removed from Models

The assessments field has been removed from maturity model files. State tracking now uses separate PRISM Maturity State documents.

Before (v0.4.0):

{
  "metadata": { "name": "Operations Maturity" },
  "domains": { ... },
  "assessments": {
    "operations": {
      "currentLevel": 3,
      "targetLevel": 4,
      "criteriaValues": { ... }
    }
  }
}

After (v0.5.0):

Maturity Model (model.json):

{
  "metadata": { "name": "Operations Maturity" },
  "domains": { ... }
}

Maturity State (state-q2-2026.json):

{
  "$schema": "https://github.com/grokify/prism/schema/prism.schema.json",
  "metadata": {
    "name": "Operations Maturity State Q2 2026",
    "maturityModelRef": "operations-maturity-model"
  },
  "domains": {
    "operations": {
      "currentLevel": 3,
      "targetLevel": 4,
      "slis": {
        "metric-runtime-p99": {
          "windows": {
            "30d": { "current": 180, "target": 200 },
            "90d": { "current": 175, "target": 200 }
          }
        }
      }
    }
  }
}

Deprecated Types

The following types are deprecated and will be removed in a future release:

  • Spec.Assessments field
  • DomainAssessment type

Added

QualitativeState Type

New type for tracking qualitative progression states:

type QualitativeState struct {
    ID          string `json:"id"`
    Label       string `json:"label"`
    Description string `json:"description,omitempty"`
    Order       int    `json:"order"`
}

Standard qualitative states: none, adhoc, tracked, measured, alerting, optimized

Measurement Type Constants

const (
    MeasurementTypeQuantitative = "quantitative"
    MeasurementTypeQualitative  = "qualitative"
    MeasurementTypeHybrid       = "hybrid"
)

SLI Measurement Fields

SLIs now support hybrid measurement types:

{
  "slis": {
    "security-scanning": {
      "id": "security-scanning",
      "name": "Security Scanning",
      "measurementType": "hybrid",
      "qualitativeStates": [
        { "id": "none", "label": "None", "order": 0 },
        { "id": "adhoc", "label": "Ad-hoc", "order": 1 },
        { "id": "tracked", "label": "Tracked", "order": 2 },
        { "id": "measured", "label": "Measured", "order": 3 }
      ]
    }
  }
}

SLI Helper Methods

  • GetMeasurementType() - Returns the measurement type (defaults to quantitative)
  • GetQualitativeStates() - Returns defined qualitative states
  • IsQuantitative() - True if measurement type is quantitative
  • IsQualitative() - True if measurement type is qualitative
  • IsHybrid() - True if measurement type is hybrid

Dashboard Dual-Read Support

The dashboard generator now supports reading state from a separate document:

gen := dashboard.NewGenerator(spec)
gen.WithStateDocument(stateDoc)

Temporal Window Support

State documents support multiple time windows for SLO tracking:

{
  "windows": {
    "7d": { "current": 99.95, "target": 99.9 },
    "30d": { "current": 99.92, "target": 99.9 },
    "90d": { "current": 99.88, "target": 99.9 },
    "quarterly": { "current": 99.85, "target": 99.9 },
    "annual": { "current": 99.80, "target": 99.9 }
  }
}

New Example Files

  • examples/maturity-state/operations/state-q2-2026.json
  • examples/maturity-state/organization/state-q1-2026.json
  • examples/maturity-state/security/state-q2-2026.json

Changed

  • XLSX generator handles nil assessments gracefully
  • Dashboard generator supports reading state from separate documents

Documentation

  • docs/design/REFACTOR_MATURITY_STATE.md - Architecture for model/state separation
  • Updated examples/README.md with new directory structure

Migration Guide

Step 1: Extract Assessments

Extract the assessments section from your maturity model files into separate state files.

Step 2: Add Metadata Reference

Add maturityModelRef to state document metadata to link back to the model.

Step 3: Update Dashboard Code

If using the dashboard generator, add the state document:

// Before
gen := dashboard.NewGenerator(spec)

// After
gen := dashboard.NewGenerator(spec)
gen.WithStateDocument(stateDoc)

Step 4: Use Temporal Windows

Consider migrating to temporal windows for historical SLO tracking.

See Also