Skip to content

v0.14.0

Release Date: 2026-06-07

Highlights

  • Strategic Planning Canvases: 7 canvas types for opportunity discovery and product planning
  • Multi-Format Rendering: D2, SVG, Mermaid, and Lit/JSON output formats
  • Prioritization Models: RICE and Kano scoring for feature prioritization
  • Dependency Updates: Migration to priority-frameworks and structured-evaluation v0.7.0

Overview

v0.14.0 introduces strategic planning canvas types following industry-standard frameworks from Osterwalder (BMC), Torres (OST), Patton (Opportunity Canvas), Cagan/SVPG (Opportunity Assessment), Efimov (Feature Canvas), and Gothelf (Lean UX Canvas). Each canvas supports multiple output formats for integration with documentation, diagrams, and web applications.

New Features

Strategic Planning Canvases

Canvas Framework Description
BMC Business Model Canvas (Osterwalder) 9-block business model visualization
OST Opportunity Solution Tree (Torres) Tree structure for outcome-driven discovery
Opportunity Opportunity Canvas (Patton) 9-block opportunity assessment
OpportunityAssessment SVPG (Cagan) 10-question go/no-go evaluation
OpportunitySpec Merged Patton + Cagan 12-box discovery + business case
Feature Feature Canvas (Efimov) Feature definition and validation
LeanUX Lean UX Canvas (Gothelf) Hypothesis-driven product design
import (
    "github.com/grokify/prism-roadmap/canvas"
    "github.com/grokify/prism-roadmap/canvas/render"
)

// Create an Opportunity Solution Tree
ost := canvas.NewOpportunitySolutionTree("ost-1", "User Onboarding")
ost.Outcome = canvas.OSTOutcome{
    ID:          "O1",
    Description: "Increase activation to 60%",
    Opportunities: []canvas.OSTOpportunity{
        {
            ID:          "OP1",
            Description: "Users don't understand value prop",
            Solutions: []canvas.OSTSolution{
                {ID: "S1", Description: "Interactive tutorial"},
            },
        },
    },
}

// Render to D2
c := canvas.NewOST(ost)
d2Output, _ := render.Render(c, render.FormatD2, render.OSTOptions())

Multi-Format Rendering

Format Extension Description
d2 .d2 D2 diagram language text
d2svg .svg D2 rendered to SVG (via d2 CLI)
mermaid .mmd Mermaid diagram syntax
lit .json Lit component JSON data
// Render to different formats
d2Text, _ := render.Render(c, render.FormatD2, opts)
svg, _ := render.Render(c, render.FormatD2SVG, opts)
mermaid, _ := render.Render(c, render.FormatMermaid, opts)
litJSON, _ := render.Render(c, render.FormatLit, opts)

RICE and Kano Prioritization

import "github.com/grokify/prism-roadmap/prioritization"

// RICE scoring
rice := prioritization.RICEScore{
    Reach:      1000,    // Users affected
    Impact:     2,       // 0.25, 0.5, 1, 2, 3
    Confidence: 0.8,     // 0-1
    Effort:     5,       // Person-weeks
}
score := rice.Score() // (1000 * 2 * 0.8) / 5 = 320

// Kano categorization
kano := prioritization.KanoCategory("performance")
// Categories: basic, performance, excitement, indifferent, reverse

Canvas Templates and Rubrics

The templates/ and rubrics/ directories include assets for LLM-assisted workflows:

  • templates/opportunity-spec.md - OpportunitySpec markdown template
  • rubrics/opportunity-spec.rubric.yaml - LLM-as-Judge evaluation criteria

Dependency Changes

structured-evaluation v0.7.0

Upgraded to structured-evaluation v0.7.0 which includes:

  • Report Validation: rubric.ValidateReport() for correctness checking
  • Lint Command: sevaluation lint report.json --strict
  • Enum Constraints: JSON Schema with strict enum validation
import "github.com/plexusone/structured-evaluation/rubric"

// Validate generated reports
result := rubric.ValidateReport(report)
if !result.Valid {
    for _, issue := range result.Issues {
        fmt.Printf("[%s] %s: %s\n", issue.Severity, issue.Path, issue.Message)
    }
}

priority-frameworks

Migrated Priority and MoSCoW types to the shared priority-frameworks library:

import "github.com/grokify/priority-frameworks"

// Priority levels
priority := priorityframeworks.PriorityCritical

// MoSCoW categories
moscow := priorityframeworks.MoSCoWMust

Migration Guide

Package Rename: evaluation → rubric

If you were using the evaluation integration:

// Before (v0.13.0)
import "github.com/plexusone/structured-evaluation/evaluation"
report := prd.ScoreToEvaluationReport(doc, filename)

// After (v0.14.0)
import "github.com/plexusone/structured-evaluation/rubric"
report := prd.ScoreToRubric(doc, filename)

Priority Types

If you were using Priority or MoSCoW types directly:

// Before
priority := prd.PriorityCritical

// After (type alias, no change needed in most cases)
// The types are now aliased from priority-frameworks

Examples

See examples/canvas/ for complete canvas examples with rendered outputs:

  • D2 diagrams (.d2)
  • SVG renders (.svg)
  • Mermaid diagrams (.mmd)
  • HTML visualizations (.html)

Documentation

Full Changelog

See CHANGELOG.md for the complete list of changes.