Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsBlogPro
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Authors
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges
  • Chrome Extension
  • Skill Manager

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

ProTermsPrivacyRefunds
Back to skills

Declarative Visualization

ASecurity

Author a Vega-Lite / Deneb / SVG spec for a stated intent on any surface (web vega-embed, react-vega, Evidence, Observable, Power BI Deneb, Tableau extension/SVG, SVG-in-DAX). Six-step method: pick grammar → bind data → encode → wire interactivity → test null/empty → verify via render loop. Ships a surface-agnostic spec-patterns library. Mandatory security audit (no data.url, no remote loader, no SVG script) enforced by lint.py (Gate 101). Complements the visual-feedback-loop (render referee)...

7 stars
0 votes
0 copies
0 views
Added 9/23/2026
ai-agentspythongoreactexpresstestingapisecurity

Works with

api

Security Analysis

A100/100

Pro scans all 8 files and shows the line behind each finding

Scanned 9/23/2026

$npx -y skills add mcorbett51090/RavenClaude --skill declarative-visualization --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Declarative Visualization?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Declarative Visualization
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mcorbett51090-declarative-visualization/badge)](https://www.skillsdirectory.com/skills/mcorbett51090-declarative-visualization)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
Files
SKILL.md
---
name: declarative-visualization
description: "Author a Vega-Lite / Deneb / SVG spec for a stated intent on any surface (web vega-embed, react-vega, Evidence, Observable, Power BI Deneb, Tableau extension/SVG, SVG-in-DAX). Six-step method: pick grammar → bind data → encode → wire interactivity → test null/empty → verify via render loop. Ships a surface-agnostic spec-patterns library. Mandatory security audit (no data.url, no remote loader, no SVG script) enforced by lint.py (Gate 101). Complements the visual-feedback-loop (render referee) and pbir-layout-engine (coordinate linter). NOT for coordinate/layout arithmetic (pbir-layout-engine) or render-loop orchestration (visual-feedback-loop)."
---

# Skill: declarative-visualization

## What this is

A **method + runnable linter** for authoring Vega-Lite, Vega, Deneb, and SVG specs
on any surface — web, Power BI, Tableau, or standalone SVG. It is the spec-authoring
layer beneath every visualization agent; usable standalone to build and validate a
chart spec without invoking an agent.

The conceptual canon (when to use which grammar, the surface→delivery map, the full
security model) lives in
[`../../knowledge/declarative-visualization.md`](../../knowledge/declarative-visualization.md).
This SKILL is the operating reference for the method and the runnable linter.

## The six-step method

1. **Pick the grammar.** Vega-Lite first (concise, portable). Escalate to full Vega
   only when a required mark or transform is absent. Use Deneb only for Power BI;
   SVG only for non-chart visuals or SVG-in-DAX.

2. **Bind data per surface.** Always use `data.name` + dummy `values` for local
   testing. Never use `data.url` in committed specs (security rule). Wire the real
   data source in the host app (JS `view.change()`, Deneb field mapping, etc.) after
   the spec passes the linter and the render check.

3. **Encode.** Map fields to channels (`x`, `y`, `color`, `size`, `opacity`,
   `tooltip`). For small-multiples: use `facet`. For overlays: use `layer`. The
   spec-patterns library ([`spec-patterns/`](spec-patterns/)) provides starter
   templates for the most common chart types.

4. **Wire interactivity** (where needed). For web: Vega-Lite `params` / `select`.
   For Deneb/Power BI: the `powerbi` cross-filter expression. For Tableau: the
   Extension API datasource hook.

5. **Test null / empty data.** Replace `data.values` with `[]` and confirm the
   chart degrades cleanly (empty state message, not a blank visual).

6. **Verify via the render loop.** Run
   [`../visual-feedback-loop/driver.py`](../visual-feedback-loop/SKILL.md) for a
   pass/fail verdict. For Power BI PBIR: also run
   [`../pbir-layout-engine/lint.py`](../pbir-layout-engine/SKILL.md) for coordinate
   facts. The render loop is the schema check — a spec that renders without error is
   schema-valid; a spec that does not render is not.

## Mandatory security audit

Before committing any spec or template, run the linter:

```
python3 plugins/ravenclaude-core/skills/declarative-visualization/lint.py <spec.json>
```

Exit 0 = clean. Exit 1 = security violation (reject the spec and fix the offending
key). Exit 2 = I/O or path error.

**The four forbidden patterns (exit 1):**

| Pattern | Why forbidden |
|---|---|
| `data.url` (string value) | Spec fetches from a remote URL at render — SSRF vector |
| `transform.lookup` with a `from.data` that has a `url` key | Same as above, via transform |
| `loader` key anywhere in the spec (custom loader override) | Redirects all relative URL resolution |
| SVG `<script>` element or `on*` attribute | Script injection |

Any PR adding or modifying a file under `spec-patterns/` routes through
`ravenclaude-core/security-reviewer` (invariant — this is load-bearing, not a
suggestion).

## Spec-patterns library

The templates under [`spec-patterns/`](spec-patterns/) are the six most common
surface-agnostic chart types. Each:

- Uses `data: {"name": "source"}` + a `values` dummy for local test.
- Is valid JSON (passes `python3 -m json.tool`).
- Passes `lint.py` with exit 0.
- Includes a `description` field stating its intent.

| Template | File | Chart type |
|---|---|---|
| Diverging bar | `diverging-bar.json` | Positive/negative bars around a zero axis |
| Dumbbell | `dumbbell.json` | Start–end comparison per category |
| Small-multiples facet | `small-multiples-facet.json` | Faceted grid of line/bar charts |
| Heatmap | `heatmap.json` | x×y grid colored by value |
| Sparkline strip | `sparkline-strip.json` | Row-per-series compact line mini-charts |
| Annotated line | `annotated-line.json` | Line + text mark at notable points |

## Proven by Gate 101

[`scripts/audit-gates.sh`](../../../../scripts/audit-gates.sh) Gate 101 + the
fixtures under
[`tests/fixtures/declarative-viz/`](../../../../tests/fixtures/declarative-viz/)
are the bidirectional floor: a mutant template with `data.url` must fail (exit 1),
and the clean templates must pass (exit 0). Both halves are asserted.

## Output contract

When authoring a spec for a user, emit:

1. The spec JSON (in a fenced ` ```json ` block).
2. The `lint.py` verdict (`exit 0` or the violation that was fixed).
3. The render loop result if a browser tool was available.
4. The null/empty state confirmation.

Use the Structured Output Protocol block per
[`../structured-output/SKILL.md`](../structured-output/SKILL.md) when handing off
to another agent.

Attribution

mcorbett51090mcorbett51090
View sourceSee grades on GitHubMore from mcorbett51090 →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Caveman

Terse caveman voice: answer first, fluff gone, every technical fact kept. Use for /caveman, "caveman mode", "talk like caveman", "be brief", "less tokens". Stays on until "stop caveman" or "normal mode".

1100021 votes

Hyperplan

Adversarial multi-agent planning skill. Self-orchestrates 5 hostile category members (unspecified-low, unspecified-high, deep, ultrabrain, artistry) via team-mode for ruthless cross-critique debate, distills only the defensible insights, then MANDATORILY hands the distilled insight bundle to the `plan` agent for executable plan formalization. Use when planning needs maximum rigor and surfacing of weak assumptions, blind spots, and over-engineering. Triggers: 'hyperplan', 'hpp', '/hyperplan', ...

698431 votes

Writing Skills

Create and manage Claude Code skills in HASH repository following Anthropic best practices. Use when creating new skills, modifying skill-rules.json, understanding trigger patterns, working with hooks, debugging skill activation, or implementing progressive disclosure. Covers skill structure, YAML frontmatter, trigger types (keywords, intent patterns), UserPromptSubmit hook, and the 500-line rule. Includes validation and debugging with SKILL_DEBUG. Examples include rust-error-stack, cargo-dep...

3931 votes

Mcp Code Execution

Routes multi-tool workflows through MCP servers for large datasets and pipelines. Use when Bash tool overhead is limiting throughput on data-heavy tasks.

3421 votes

catchup

Recovers the conversation and failed tool calls of a previous Codex, Amp, Claude Code, Antigravity, Cline, Copilot CLI, Cursor, DeepSeek Harness, Grok Build, Kimi, OpenCode, Pi Agent, or ZCode session. Use when the user says "catch up", "what did the last session do", "get me up to speed", "I switched agents", asks to recover/summarize a previous session before continuing, or asks to diagnose or report a catchup failure. Do NOT use for the current conversation, git history, or any non-agent log.

741 votes
View all in ai-agents →