Skip to content

v0.10.0

Release Date: 2026-07-20

Highlights

  • Rich Weighted Criteria: categories can decompose into independently weighted sub-criteria with pass/partial/fail bands and concrete indicators
  • Score Thresholds: numeric pass/partial cutoffs (0-100) for weighted-score rubrics
  • YAML Authoring: rubric definitions carry yaml tags and parse directly into a RubricSet
  • RubricSet Definition Schema: rubricset.schema.json is generated and embedded for downstream tooling

Overview

v0.10.0 extends the rubric definition with a rich, weighted-criteria form so one category can be decomposed into independently scored parts, and makes rubric definitions first-class YAML documents against a single canonical schema. Every addition is optional and backward-compatible: categories scored via the existing Scale are unchanged.

This is the shared rubric spec consumed across the ecosystem (prism-roadmap, visionspec, pdlc), so downstream tools author and evaluate against one format.

New Features

Rich Weighted Criteria

A category can now carry Criteria — a list of weighted sub-criteria — instead of (or alongside) a flat Scale. Each criterion has pass/partial/fail bands, each with a description and concrete indicators:

cat := rubric.Category{
    ID:     "assumption_coverage",
    Name:   "Assumption Coverage",
    Weight: 25,
    Criteria: []rubric.Criterion{
        {
            ID:     "desirability",
            Name:   "Desirability",
            Weight: 25,
            Pass: rubric.CriterionLevel{
                Description: "Desirability assumptions are identified",
                Indicators:  []string{"customer demand cited", "willingness-to-pay evidence"},
            },
        },
    },
}

cat.IsComposite() // true when a category has weighted Criteria

New types: Criterion (ID, Name, Weight, Pass/Partial/Fail) and CriterionLevel (Description, Indicators). New helper: Category.IsComposite().

Score Thresholds

Weighted-score rubrics roll up to a 0-100 score; ScoreThresholds sets the numeric cutoffs on the rubric definition's pass criteria:

type ScoreThresholds struct {
    Pass    int `json:"pass"`    // score >= Pass passes
    Partial int `json:"partial"` // score >= Partial is partial
}
passCriteria:
  scoreThresholds: {pass: 80, partial: 60}

YAML Authoring

Rubric definition types now carry yaml struct tags mirroring their json tags, so a rubric authored as YAML parses directly into a RubricSet with the correct field names:

var rs rubric.RubricSet
_ = yaml.Unmarshal(data, &rs)

RubricSet Definition Schema

The generated RubricSet definition schema is embedded for downstream tooling:

import "github.com/plexusone/structured-evaluation/schema"

data := schema.RubricSetSchemaJSON // rubricset.schema.json

rubricset.schema.json is the definition schema (how a rubric is authored); rubric.schema.json remains the report schema (an evaluation result).

Backward Compatibility

All additions are optional. Categories scored via Scale, the existing report PassCriteria, and all report types are unchanged. Rubrics written for v0.9.0 continue to work without modification.

Commits

  • 47b4673 feat(rubric): add rich weighted-criteria rubric form
  • e1c58ae feat(rubric): add yaml tags to rubric definition types