Skip to content

v0.4.0

Release Date: 2026-05-24

Highlights

  • Importance & Priority: Static importance weights with dynamic P0-P3 priority calculation based on maturity gaps
  • Priority Framework: Organize capabilities into tiered groups (Existential/Critical/Strategic/Enhancement)
  • Overlay System: External modules can inject display data (badges, tooltips) into renderers
  • Interactive HTML: Status and maturity filters with badge display

Added

Importance Field

Capabilities, layers, and categories now have an importance field for static weighting:

{
  "id": "sast",
  "name": "SAST",
  "importance": "critical",
  "order": 1
}
Level Weight Description
critical 4 Essential "-ilities" (security, availability)
high 3 High business impact
medium 2 Standard importance (default)
low 1 Nice-to-have

Dynamic Priority (P0-P3)

Calculate dynamic priority from importance and maturity gap:

// Priority = Importance Weight × (Target Level - Current Level)
priority := capstack.CalculatePriority("critical", 1, 3) // Returns "P0" (4 × 2 = 8)
priority := capstack.CalculatePriority("medium", 2, 3)   // Returns "P2" (2 × 1 = 2)
Score Priority Action
≥8 P0 Immediate action required
≥4 P1 High priority improvement
≥2 P2 Scheduled improvement
<2 P3 Low priority enhancement

Priority Framework

Organize capabilities into priority tiers:

{
  "priorityFramework": {
    "title": "Capability Priorities",
    "tiers": [
      {
        "id": "tier-1",
        "name": "Tier 1",
        "orderRange": {"min": 1, "max": 5},
        "orders": "Existential",
        "focus": ["Security", "Availability", "Compliance"]
      }
    ]
  }
}

Capability Sorting

Multiple sort methods available:

cs.SortCapabilities(capstack.SortByOrder)      // By explicit Order field
cs.SortCapabilities(capstack.SortByImportance) // By importance weight
cs.SortCapabilities(capstack.SortByStatus)     // By lifecycle status

// Get sorted copy
sorted := cs.SortedCapabilities(capstack.SortByName)

Overlay Provider

External modules can inject display data:

overlays := render.OverlayProvider{
    "sast": {
        BadgeText:    "M3",
        BadgeColor:   "#22c55e",
        TooltipExtra: "Target: M4 by Q3",
    },
}

opts := render.DefaultD2Options()
opts.Overlays = overlays
render.RenderD2(doc, opts)

Interactive HTML Filters

HTML output now includes:

  • Status filter checkboxes (Operational, Implemented, In Progress, Planned, Deprecated)
  • Maturity level filters (M1-M5) when overlays are present
  • Select All / Clear All buttons
  • Badge display for capabilities with overlay data

Refactored

CLI Package Extraction

CLI commands moved from cmd/capstack/ to reusable cli/ package:

// Embed in another CLI
import "github.com/grokify/prism-capability/cli"

rootCmd.AddCommand(cli.ValidateCmd)
rootCmd.AddCommand(cli.RenderCmd)

Dependencies

Dependency Version
github.com/grokify/prism-core v0.1.0
github.com/spf13/cobra v1.10.2

Compatibility

  • Go 1.24+
  • Fully backward compatible with v0.3.0 documents (new fields are optional)