Skip to content

Report Rendering

Structured Evaluation provides multiple renderers for displaying reports in different formats.

Available Renderers

Package Format Use Case
render/terminal ANSI terminal CLI output with colors
render/markdown Markdown Documentation, GitHub
render/detailed Detailed terminal Verbose CLI output
render/box ASCII box format Deterministic TUI output

Terminal Renderer

ANSI-colored output with UTF8 icons:

import "github.com/plexusone/structured-evaluation/render/terminal"

renderer := terminal.New(os.Stdout)
err := renderer.Render(report)

Output Example

┌───────────────────────────────────────────────────────────────────────────┐
│ EVALUATION REPORT: requirements.md                                        │
├───────────────────────────────────────────────────────────────────────────┤
│ Results:  2 pass, 1 partial, 1 fail                                       │
│ Decision: CONDITIONAL (1 Critical, 0 High, 2 Medium)                      │
├───────────────────────────────────────────────────────────────────────────┤
│ RESULTS BY CATEGORY                                                       │
├───────────────────────────────────────────────────────────────────────────┤
│   problem_definition     🟢 PASS     Clear problem with measurable impact │
│   user_stories           🟡 PARTIAL  Some lack acceptance criteria        │
│   success_metrics        🔴 FAIL     No quantitative metrics defined      │
│   scope_definition       🟢 PASS     Clear boundaries established         │
├───────────────────────────────────────────────────────────────────────────┤
│ ⚠️ PRD-REVIEW CONDITIONAL (2/4 categories passed)                         │
└───────────────────────────────────────────────────────────────────────────┘

Color Options

// Disable colors (e.g., for piping)
renderer := terminal.New(os.Stdout, terminal.WithNoColor())

// Custom width
renderer := terminal.New(os.Stdout, terminal.WithWidth(100))

Markdown Renderer

Generates Markdown suitable for documentation or GitHub:

import "github.com/plexusone/structured-evaluation/render/markdown"

renderer := markdown.New(os.Stdout)
err := renderer.Render(report)

Output Example

## Evaluation Report: requirements.md

### Summary

**Overall Decision: CONDITIONAL** ⚠️

| Metric | Value |
|--------|-------|
| Categories | 2 pass, 1 partial, 1 fail |
| Findings | 1 critical, 0 high, 2 medium |
| Decision | Conditional |

---

### Category Results

| Category | Score | Reasoning |
|----------|-------|-----------|
| problem_definition | 🟢 PASS | Clear problem with measurable impact |
| user_stories | 🟡 PARTIAL | Some lack acceptance criteria |
| success_metrics | 🔴 FAIL | No quantitative metrics defined |

---

### Findings

#### 🔴 Critical

**Missing success metrics**
- Category: success_metrics
- The PRD does not define how success will be measured
- *Recommendation:* Add 2-3 quantitative KPIs with target values

Detailed Renderer

Verbose terminal output with full finding details:

import "github.com/plexusone/structured-evaluation/render/detailed"

renderer := detailed.NewTerminal(os.Stdout)
err := renderer.Render(report)

Box Renderer

ASCII box format for deterministic TUI output. Works with both evaluation (rubric) and summary reports.

Evaluation Reports

import "github.com/plexusone/structured-evaluation/render/box"

renderer := box.NewEvaluationRenderer(os.Stdout)
err := renderer.Render(&rubricReport)

Output Example

╔══════════════════════════════════════════════════════════════════════════╗
║                           EVALUATION REPORT                               ║
╠══════════════════════════════════════════════════════════════════════════╣
║                            ✅  PASS  ✅                                   ║
╠══════════════════════════════════════════════════════════════════════════╣
║ CATEGORY                   ST SCORE  DETAIL                               ║
╟──────────────────────────────────────────────────────────────────────────╢
║ problem_definition         🟢 pass   Clear problem statement              ║
║ user_stories               🟢 4/5    Good coverage of use cases           ║
║ success_metrics            🟡 partial Missing baseline metrics            ║
╠══════════════════════════════════════════════════════════════════════════╣
║ Categories: 2 pass, 1 partial, 0 fail                                     ║
║ Findings:   0 critical, 0 high, 1 medium, 0 low                           ║
╚══════════════════════════════════════════════════════════════════════════╝

Summary Reports

renderer := box.NewRenderer(os.Stdout)
err := renderer.Render(&summaryReport)

Output Example

╔══════════════════════════════════════════════════════════════════════════╗
║                    RELEASE VALIDATION: my-service v2.0.0                  ║
╠══════════════════════════════════════════════════════════════════════════╣
║ TESTING                                                                   ║
║   ✅ unit-tests         Coverage: 92%                                     ║
║   ✅ integration-tests  All 47 tests pass                                 ║
║   ⚠️ e2e-tests          2 flaky tests skipped                             ║
╠══════════════════════════════════════════════════════════════════════════╣
║ SECURITY                                                                  ║
║   ✅ sast               No critical findings                              ║
║   ✅ dependency-scan    All deps up to date                               ║
╠══════════════════════════════════════════════════════════════════════════╣
║                              ✅ GO FOR RELEASE                            ║
╚══════════════════════════════════════════════════════════════════════════╝

JSON Output

For programmatic use:

import "encoding/json"

output, err := json.MarshalIndent(&report, "", "  ")
if err != nil {
    return err
}
fmt.Println(string(output))

CLI Usage

# Terminal format (default)
sevaluation render report.json --format=terminal

# Markdown
sevaluation render report.json --format=markdown > report.md

# Detailed
sevaluation render report.json --format=detailed

# Box (for summary reports)
sevaluation render summary.json --format=box

# JSON
sevaluation render report.json --format=json

Writing to Files

file, err := os.Create("report.md")
if err != nil {
    return err
}
defer file.Close()

renderer := markdown.New(file)
return renderer.Render(report)

Custom Renderers

Implement the Renderer interface:

type Renderer interface {
    Render(report *rubric.Rubric) error
}

// Example: HTML renderer
type HTMLRenderer struct {
    w io.Writer
}

func (r *HTMLRenderer) Render(report *rubric.Rubric) error {
    // Generate HTML output
    tmpl := template.Must(template.ParseFiles("report.html"))
    return tmpl.Execute(r.w, report)
}

Next Steps