Skip to content

v0.17.0

Release Date: 2026-08-15

Highlights

  • Optional MoSCoW on RoadmapItem: empty means "not yet prioritized" — enabling honest import of unprioritized items from external PM tools instead of a silent should_have default
  • OKR objective/key-result linking: RoadmapItem gains ObjectiveRefs/KeyResultRefs; RICEByObjective rolls up RICE-scored work per OKR objective, and UnlinkedScoredItems surfaces prioritized work not tied to any objective
  • v2mom and OST land in their canonical home: the v2mom family (vision, values, methods, obstacles, measures, alignment, summary) and the continuous-discovery opportunity-solution-tree template/rubric are now defined here, upstreamed from downstream local copies
  • Rubric format canonicalization: assumption-map, bmc, and discovery-snapshot migrate from an intermediate flat format to native structured-evaluation rich format
  • RICE validation hardening: unrecognized (non-empty) impact/confidence values are now rejected instead of silently falling back to a default multiplier

Overview

The motivating use case for the MoSCoW change is external-tool import: the omniroadmap ecosystem converts Aha!/ProductBoard/Jira Product Discovery records into RoadmapItems, and most imported items arrive without prioritization data. Rather than fabricating a default priority, they now stay honestly unprioritized and validate cleanly — triage happens later in prism-roadmap's own tooling (splan rmi update --moscow ..., the MCP update_rmi tool).

The OKR linking work answers a planning question the RICE scoring alone couldn't: "how much prioritized effort is actually backing each objective?" RICEByObjective joins RoadmapItem.ObjectiveRefs against okr.Objective and returns one rollup per objective — including objectives with zero linked items, so coverage gaps stay visible rather than silently omitted.

The v2mom/OST and rubric-format work upstream content and fixes that had previously been authored or reapplied downstream (in specification-workflow-spec and its consumers) as local, upstream-candidate copies — this release makes prism-roadmap the actual source of truth for that content again, closing the gap tools/prism-sync's local replace directive was standing in for.

Changes

MoSCoW optional on rmi.RoadmapItem

  • Validate() accepts an empty MoSCoW; invalid non-empty values are still rejected.
  • The moscow JSON field gains omitempty — unset serializes as absent, not as "".
  • IsActionable() continues to return false for unprioritized items (unchanged behavior; empty was already non-actionable).
  • Service.Create no longer defaults an empty MoSCoW to should_have — empty persists as unset. CLI behavior is unchangedsplan rmi create's --moscow flag still defaults to should_have; pass --moscow="" explicitly to create an unprioritized item.
  • prioritization.MoSCoWUnspecified names the zero value.

OKR objective/key-result linking

  • RoadmapItem.ObjectiveRefs/KeyResultRefs with AddObjectiveRef, AddKeyResultRef, SupportsObjective.
  • rmi.RICEByObjective(items, objectives) — one ObjectiveRICE per objective (ScoredCount, TotalRICE, MeanRICE, TopRICE), ordered by TotalRICE descending.
  • rmi.UnlinkedScoredItems(items) — RICE-scored items with no ObjectiveRefs.

RICE validation

  • ImpactLevel/ConfidenceLevel gain IsValid() and ParseImpactLevel()/ParseConfidenceLevel().
  • RICEScore.Validate() rejects a non-empty, unrecognized impact or confidence value instead of silently applying a default multiplier in Multiplier().

v2mom and OST templates/rubrics

New canonical templates and rubrics: v2mom-vision, v2mom-values, v2mom-methods, v2mom-obstacles, v2mom-measures, v2mom-alignment, v2mom-summary (template only — a rolled-up synthesis document, not independently rubric-scored), and the continuous-discovery ost (opportunity-solution-tree) template + rubric.

Rubric format canonicalization

assumption-map, bmc, and discovery-snapshot rubrics rewritten from the intermediate flat format (spec_type key, no id, no passCriteria) to native structured-evaluation rich format (id, passCriteria.maxFindingsSeverity).

Regenerated JSON schemas

Regeneration picked up pre-existing drift and the new fields above:

  • MarketSignal: idea_refs
  • RoadmapItem: objective_refs, key_result_refs

Dependencies

  • plexusone/structured-evaluation bumped to v0.14.0 (layered-rubric schema, needed for the rubric format work above).

Compatibility

Two breaking changes, both loosening/reshaping rather than removing capability:

  • rmi.RoadmapItem.Validate() no longer rejects an empty MoSCoW — code relying on Validate() to enforce MoSCoW presence needs an explicit check now.
  • The assumption-map, bmc, and discovery-snapshot rubric YAML files changed shape (spec_typeid, new passCriteria block). Any consumer parsing these files directly by the old flat shape needs to move to structured-evaluation's RubricSet.

Everything else in this release is additive. Existing JSON documents are otherwise unaffected (the schema never marked moscow as required).

Installation

go get github.com/grokify/prism-roadmap@v0.17.0