/diamond-render
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
Claude Code
$ npx -y skills add haabe/mycelium --skill diamond-render --agent claude-code
Codex
$ npx skills add haabe/mycelium --skill diamond-render -a codex -y
Cursor
$ npx skills add haabe/mycelium --skill diamond-render -a cursor -y
Gemini CLI
$ npx skills add haabe/mycelium --skill diamond-render -a gemini-cli -y
GitHub Copilot
$ npx skills add haabe/mycelium --skill diamond-render -a github-copilot -y
OpenCode
$ npx skills add haabe/mycelium --skill diamond-render -a opencode -y
Windsurf
$ npx skills add haabe/mycelium --skill diamond-render -a windsurf -y
SKILL.md
diamond-render.SKILL.mdname: 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
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)
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 gat
Read more
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
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)
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 gat
Mycelium won't make your idea good. It keeps you and your agent honest about whether it is, from first idea to market. Built on Claude Code, where the gates are structural. The files and skills port to opencode, Codex and Cursor. Outcome over output.
Other skills on mycelium.
More skills from other plugins.
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
ask-matt
Ask which skill or flow fits your situation. A router over the skills in this repo.
Questions about diamond-render.
- Which coding agents can use diamond-render?
- diamond-render installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

