Skip to main content
skill CX Codex

diamond-render — Claude Code skill: diagram your decisions

Turns .claude/diamonds/active.yml into a picture of the decisions recorded so far, in order, plus the ones still ahead. Useful at the end of an assessment.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add haabe/mycelium --skill diamond-render -a claude-code
Open on GitHub

What diamond-render does

The skill reads .claude/diamonds/active.yml and lays out every recorded decision in the order it was made, dates included. Decisions sit under the mode the diamond was in: discovery up to commit_to_build, delivery after that. Steps not yet taken are marked (next).

A script does the drawing, not the model: ${CLAUDE_PLUGIN_ROOT}/scripts/render_diamonds.py. Mermaid stateDiagram-v2 is the default; ascii and json are also available. Flags --scale, --theme, --no-gates and --no-confidence change what ends up in the output. Two renders of the same record have to match, so nothing gets added by hand.

Everything here is read-only — active.yml, the decision log and any state stay as they are. The skill depends on the mycelium framework and will not run without active.yml present. markdown-table and markdown-list are not supported; the script fails on them. With no open diamond it prints No open diamond: run /mycelium:start. and exits 0.

What it helps with

  • see which decisions a project has recorded and in what order
  • split decisions into discovery and delivery phases
  • spot the steps that have not happened yet
  • check whether the diamonds file lags behind the decision log
  • get a Mermaid diagram of project state for docs

Example prompts for the agent

  • Render .claude/diamonds/active.yml as Mermaid
  • Show the decisions for all diamonds in ascii
  • Render it without gates and without confidence

How to install diamond-render

1Skills CLI (Vercel)

npx skills add haabe/mycelium --skill diamond-render -a claude-code

2Manually: put the files in place

~/.claude/skills/diamond-render/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/diamond-render/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about diamond-render

How do I install diamond-render in Claude Code?

Run npx skills add haabe/mycelium --skill diamond-render -a claude-code. The skill file lands at ~/.claude/skills/diamond-render/SKILL.md.

What does diamond-render do?

It reads .claude/diamonds/active.yml and draws each diamond's decisions in order, with dates, grouped by discovery and delivery mode. Decisions still to come are marked (next).

Which output formats are supported?

mermaid, ascii and json. markdown-table and markdown-list are not supported — a state diagram does not map to them, and the script exits with an error.

Source text

SKILL.md · MIT
---
name: diamond-render
description: Render `.claude/diamonds/active.yml` as the decisions each diamond has recorded, in order, grouped by mode (discovery, delivery). Read-only. Default format Mermaid stateDiagram-v2, drawn by a script. Recommended at the end of `/mycelium:diamond-assess` so every assessment closes with a visual state-of-play. See `${CLAUDE_PLUGIN_ROOT}/engine/render-conventions.md` for shared render fleet conventions.
metadata:
  instruction_budget: "40"
  framework_dependency: "mycelium"
  framework_dependency_note: "Reads .claude/diamonds/active.yml through ${CLAUDE_PLUGIN_ROOT}/scripts/render_diamonds.py. Standalone use will fail without active.yml present."
  identifier_exposure: "NONE"
---

# Diamond Render

Read-only render of `.claude/diamonds/active.yml`. First specialist of the render fleet (with
`/mycelium:ost-render`, `/mycelium:cycle-render` and the dispatcher `/mycelium:render`).

**What it draws (v0.309.0, stage 5d-3, founder ruling DL-1372 V4).** Each diamond as the decisions
it has recorded, in the order recorded, with their dates, under the mode the diamond was in when it
took them: discovery until `commit_to_build`, delivery after (DL-1368 S1). Then the decisions still
to come, marked `(next)`. A loop iterates by appending (DL-1373), so a second `start_experiment` is
drawn as its own step where it happened, and the position does not move back. An L0 is not a loop:
it states its purpose (`state_purpose`) and reviews it (`review`). Until v0.309.0 this skill asked
the agent to draw four phases with transition labels of its own; the record has been decisions
since v0.306.0, and the picture is now drawn from them by code.

## When NOT to use

- To record a decision (move a diamond on) → `/mycelium:diamond-progress`.
- To score gates against current evidence → `/mycelium:diamond-assess`.
- To start a new diamond → `/mycelium:start`.

## Identifier exposure

**Declared**: NONE

### Scope (canvas surfaces touched)

| Canvas file | Identifier-bearing fields | Frequency |
|---|---|---|
| `.claude/diamonds/active.yml` | none in current schema (v1) | n/a |

### Rationale

`diamonds/active.yml` holds decisions, dates, gate statuses, scale and confidence. No contributor
names, no participant fields, no identifier-bearing prose. Zero identifier exposure as of v0.40.0.

**Future-schema-change caveat**: if a future schema adds an identifier field (e.g., per-team diamond
ownership for multi-team Mycelium per the deferred Team Topologies adoption), this declaration
becomes false. The skill must then be re-declared `YES` or `MIXED`, consult the registry per
`engine/render-conventions.md#hard-rule-consent--privacy-gate`, and ship redaction fixtures. The
schema-versioning rule surfaces the schema_version mismatch at runtime as a forcing function for the
re-audit.

### Anon-label convention

Not applicable (NONE).

### Worked example

```
L3 Test: committed to build (delivery)  conf=0.4
================================================
  [discovery]
    * set_target 2026-09-03
    * start_experiment 2026-09-04
  [delivery]
    * commit_to_build 2026-09-04
    * start_experiment 2026-09-10
    . release (next)
    . close (next)
```

No identifiers anywhere in the output, regardless of audience.

### Fixture pointer

Not applicable. Check 43 forbids redaction fixtures on NONE-declared specialists (avoids the
"declares NONE but acts YES" drift). The behaviour is tested in `tests/python/test_render_diamonds.py`.

## Arguments

| Arg | Default | Values | Effect |
|---|---|---|---|
| `--format` | `mermaid` | `mermaid` \| `ascii` \| `json` | Output format. `markdown-table` and `markdown-list` are not supported (a state diagram does not map to them); the script fails loud per `engine/render-conventions.md#format-support-negotiation-global-rule`. |
| `--scale` | `active` | `L0`-`L5` \| `active` \| `all` | Which diamonds. `active` = the open ones (in `active_diamonds`, not closed, parked, killed, archived or retargeted, and no `close` recorded); `all` adds completed and archived. |
| `--theme` | `base` | `base` \| `dark` | `dark` is the WCAG-by-construction opt-in per `engine/render-conventions.md#wcag-aa-theme-convention`. |
| `--no-gates` | off | flag | Leave out each decision's gates and their status (ascii and json). Mermaid never draws them: it places a note on a nested state across the page. |
| `--no-confidence` | off | flag | Leave out the diamond's `confidence`. |

## Workflow

### Step 1: Draw it

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/render_diamonds.py" --project-dir . [--format ...] [--scale ...]
```

Show its output as it is. Do not redraw it by hand, rename decisions, or add states, gates or
values the record does not hold: two renders of one record must be the same picture. Exit 2 means a
format it does not draw, a scale with no diamond, or a diamonds file it cannot read; say which.

### Step 2: Staleness check

Per `engine/render-conventions.md#staleness-check-distinction`: compare the diamonds file's
canvas-state timestamp (`_meta.last_validated`, else top-level `last_updated:`) with the most recent
decision-log entry mentioning a drawn diamond. If the decision log is newer, put the staleness
warning above the render.

### Step 3: Validate the Mermaid (mermaid format)

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/render_diamonds.py" --project-dir . \
  | python3 "${CLAUDE_PLUGIN_ROOT}/scripts/validate_mermaid.py" -
```

It checks state-id consistency (F11) and WCAG AA contrast (F13); add `--cli` for a full parse when
`mmdc` is present. Exit 1: do not show the diagram; report the failure, which is a defect in the
script. Visual layout still needs a human eye, which is why the disclaimer stays.

### Step 4: Disclaimers

Per `engine/render-conventions.md`:

- **Lossy-on-export** (mermaid + ascii): dropped fields: each decision's `ruling` and `note`, the
  diamond's `progression_blockers`, `closes_on`, and the decision log's prose; mermaid also drops the
  gates.
- **Canonical disclaimer**: final block. `stateDiagram-v2` is stable; no beta warning.
- **mermaidchart.com handoff**: appended for `--format mermaid` only.

## Rules

1. **Read-only.** Never modify active.yml, the decision log, or any state.
2. **The script draws; the agent does not.** No hand-drawn variant, no renamed decision, no state or
   gate the record does not hold.
3. **Empty case**: no open diamond prints `No open diamond: run /mycelium:start.` and exits 0.
4. **`--as-of` is not offered.** The decision log records each decision's date, so a past state is
   the decisions dated on or before that day; this render does not filter by date yet, and it does
   not pretend to.

## Counter-Argument Check

Before showing it:

1. *"Is this the record, or has the diamonds file been edited since the last decision?"* Step 2 is
   the mechanical answer.
2. *"Am I drawing one diamond when the decision log mentions others?"* If `--scale active` drew one
   and the log names more, say: `Other diamonds in active.yml are closed or not open: --scale all
   draws them.`

## What this skill does NOT do

- Does NOT record a decision. That's `/mycelium:diamond-progress`.
- Does NOT score gates against current evidence. That's `/mycelium:diamond-assess`.
- Does NOT explain WHY a diamond is where it is. That lives in the decision log and the
  diamond-assess output.

## Recommend-not-invoke from `/mycelium:diamond-assess`

`/mycelium:diamond-assess` ends its decision output with:

```
> _Visualize the assessed state: run `/mycelium:diamond-render`. The canvas
> remains source of truth; this render is a snapshot._
```

NOT a silent sub-invocation. User retains one-hop control.

## Tests

`tests/python/test_render_diamonds.py`: a repeated decision drawn where it happened (DL-1373); a
`close` in the mode it is taken in; an L0 that states and reviews; `active` against `all`; the
Mermaid valid, with each state inside its mode (the first draft drew every decision outside it);
unsupported formats and scales failing loud; the empty case. Until v0.309.0 this section listed
seven fixtures under `tests/bash/fixtures/diamond-render/` that were never written.

## Theory citations

- Rother (Toyota Kata): a target condition and experiments toward it, the loop each level runs
  (DL-1366). Recording each experiment by appending, never editing, is this framework's ruling
  (DL-1373), not Rother's
- Cagan / Patton (dual-track): discovery and delivery as two modes running in parallel. Reading the
  switch off `commit_to_build` is this framework's (DL-1368 S1)
- Hick's Law (one recommended format default; explicit fail-loud on unsupported)
- WCAG 2.1 AA (contrast bar for human-audience rendering; `engine/render-conventions.md#wcag-aa-theme-convention`)

© haabe · MIT · haabe/mycelium

Similar skills

All skills for Agent setup: memory, context, orchestration →

From the same set14

mocked-persona-interview For solo and hobby projects where real user interviews are off the table: the skill runs interviews with invented personas and keeps them from becoming a rubber stamp for your own assumptions. CX Codex +1 ★ 47repo stars metrics-detect Scans the repo and sets up adapters for the metric sources your product actually uses, from GitHub to Stripe. Handy when the project predates this setup. CX Codex +1 ★ 47repo stars jtbd-map Splits customer work into functional, emotional and social jobs, then saves the map to a canvas file. CX Codex +1 ★ 47repo stars friction-log Drafts an honest write-up of where working with Mycelium felt confusing or slow. You edit it and decide whether it goes anywhere. CX Codex +1 ★ 47repo stars fan-out Spawns several subagents on one problem, then folds their findings into a single pick. Useful when two or more solutions compete and you need evidence, not a guess. CX Codex +1 ★ 47repo stars define-done Sets a measurable Definition of Done for a diamond: a change in behaviour that creates value, not a build list. Useful when work gets signed off on shipping alone. CX Codex +1 ★ 47repo stars count Reads your repository and prints one line: when the first source file landed, how many decisions came before it, how many sessions there were. Sends nothing anywhere. CX Codex +1 ★ 47repo stars canvas-sync Pulls and commits canvas state through git so every teammate works from the same product knowledge. Meant for the first and last minutes of a session. CX Codex +1 ★ 47repo stars

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor