Tableau plan
Skill laviDrori0702/tableau-dashboard-creator-skill/skills/tableau-plan
Produces the strict DASHBOARD-PLAN.md for the tableau-dashboard-plugin workflow — the complete blueprint tableau-mock and tableau-build build against. Decides screen size here (so slot sizing is correct downstream), lays out a grid of named slots, and assigns every KPI, chart, filter, and interaction a stable id that later steps reference. Reads DATA-MODEL.md (field names) and, if present, PRD.md and DESIGN-TOKENS.md; proposes extra KPIs and patterns beyond the literal request. Use when the user wants to plan the dashboard, lay out KPIs/charts/filters, or when tableau-route reports plan is next. Step 5 of 8 in the workflow.From its SKILL.md
npx -y skills add laviDrori0702/tableau-dashboard-creator-skill --skill tableau-planAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 20 stars20 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.1 KB, as published. Nobody here has run it
tableau-plan
Step 5 of 8, and non-skippable. It turns the request and the data model into a
strict, complete DASHBOARD-PLAN.md — the single blueprint tableau-mock (the HTML
demo) and, downstream, tableau-build (the .twb) build against. The plan is
deliberately strict so the mock can never silently drop a requirement: screen size,
the layout grid, and every element/filter/interaction are pinned down here, each with a
stable id that later steps reference.
| Reads | Required: DATA-MODEL.md (from data) — the real field names to plan against. Optional (enrich, never block): PRD.md (from intake; falls back to root DASHBOARD-REQUEST.md, then the scaffold/ demo) and DESIGN-TOKENS.md (from brand; absent ⇒ neutral styling). |
| Writes | DASHBOARD-PLAN.md at the project root (latest approved truth; overwritten in place). |
| STATE.md update | Sets plan = approved; flips every downstream approved step (mock/spec/build) to stale on a re-run (CONTRACT.md §4.2). |
| Entry gate | Refuses to run until data is resolved and DATA-MODEL.md exists (CONTRACT.md §4.1). |
| Next step | tableau-mock (or tableau-route to confirm). |
The mechanical guarantees — the entry gate, the strict-schema check (required sections,
stable unique ids, shared interaction vocabulary), and the STATE.md transition — live in
plan.py, this skill's executable mirror of the contract. Your job is the judgment part:
designing a layout that fits the request and the screen, mapping elements to real fields,
and proposing extra value beyond what was asked. Run the script at the points below;
do not hand-edit STATE.md.
How to run
-
Precheck. From the project directory, run:
python "${CLAUDE_SKILL_DIR}/scripts/plan.py" precheck "<project-dir>"(Use
python3ifpythonis unavailable.) If it prints[BLOCKED], relay the reason and stop — the analyst must runtableau-datafirst (plan needsDATA-MODEL.md). Otherwise note its signals: whether aDASHBOARD-PLAN.mdalready exists (refine vs overwrite), the requirements source (PRD.md, the raw request, thescaffold/demo, or none), and whetherDESIGN-TOKENS.mdis present. -
Refine vs overwrite. If precheck reports a
DASHBOARD-PLAN.mdalready exists, use AskUserQuestion to offer Refine (keep its ids/structure, update values) or Overwrite (author fresh). Never silently overwrite the analyst's plan — its ids are referenced by any mock/spec/build already built. -
Read the inputs. Always read
DATA-MODEL.mdfor the exact field names and types (use them verbatim in thecolumnscells). Read the requirements source precheck reported for what to build; if it was thescaffold/demo, say so (you're demoing, not using a real request). IfDESIGN-TOKENS.mdis present, let it inform layout density and sizing; if absent, plan for neutral styling. -
Decide the screen size first. Pick
mode(fixed / range / automatic) and the designdimensions, and record the rationale (primary device / embed target). Every slot size is relative to this canvas, so it is decided here, not in the mock. -
Author
DASHBOARD-PLAN.md. Write (orEdit, when refining) the plan at the project root usingreferences/DASHBOARD-PLAN-TEMPLATE.mdas the structure. It must contain every required section:section what goes there ## Screen SizeMode + design dimensions + rationale. ## Layout GridNamed slots with position + size (the slotids elements reference).## ElementsPer-element table id | type | columns | slot | size— every KPI and chart.## Filtersid | field | control type | scope | default— every filter (a singlenonerow if there are none).## Interactionsid | interaction | source | target | detail— theinteractionterm must come from the shared vocabulary below.Plus the recommended
## Summaryand## Suggestions(and optional## Data Gaps).Stable ids are the contract. Give every KPI, chart, filter, and interaction a short, stable, unique id (e.g.
kpi-revenue,chart-trend,flt-region,int-region-filter). Later steps reference these — don't renumber them on a refine. -
Propose extra value. Beyond the literal request, suggest additional KPIs and interesting patterns the data supports (a discount-impact view, a segment mix, a target-vs-actual delta) in
## Suggestions. Surface anything the request wants that the data cannot support under## Data Gaps— better visible here than dropped in the mock. -
Self-check, then present. Validate the draft before showing it:
python "${CLAUDE_SKILL_DIR}/scripts/plan.py" validate "<project-dir>"If it prints
[INVALID], fix the named sections/ids/terms and re-run. When it prints[OK], present the plan to the analyst for approval. -
Commit — only after the analyst approves:
python "${CLAUDE_SKILL_DIR}/scripts/plan.py" commit "<project-dir>"Commit re-validates the plan (plan is non-skippable, so it only ever sets
approved). If it prints[REFUSED], fix what it names and re-run. On success it recordsplan=approvedand reports any downstream steps it markedstale. Relay the summary and tell the analyst to open a fresh conversation and run the next step (tableau-mock, ortableau-routeto confirm).
Shared interactions vocabulary (CONTRACT.md §6)
The interaction column must use one of these intent-level terms, so plan → mock →
spec all mean the same thing. The Tableau construct is chosen later, in spec.
| term | meaning |
|---|---|
toggle panel | Show/hide a region of the dashboard on demand. |
swap view | Replace one chart with an alternative in the same slot (bar ⇄ line). |
drill | Move between levels of a hierarchy (year → quarter → month) in place. |
cross-filter | Selecting marks in one chart filters the others. |
highlight | Selecting marks highlights related marks elsewhere without filtering. |
parameter swap | A control changes a measure/dimension/threshold across the dashboard. |
If a requested interaction fits none of these, add the term to CONTRACT.md §6 first (with its intent and Tableau construct), then use it here — keep plan, mock, and spec aligned.
Notes
- Non-skippable. Unlike
intake/brand,plancannot be skipped — the mock and workbook have no blueprint without it.commitonly ever setsapproved. - Root file, no version bump.
DASHBOARD-PLAN.mdlives at the project root and is overwritten in place; re-running flips downstreamapprovedsteps tostale(CONTRACT.md §4.2/§4.3). It does not create a version directory. - Plan against real fields. The
columnscells must use the exact field names fromDATA-MODEL.md— that's how the mock and the.twbline up with the data, and how Replace Data Source swaps in live data later.
The full
STATE.mdschema and the ordering / staleness / versioning rules live inCONTRACT.mdat the repo root. This skill restates only its own slice;plan.pyis the executable mirror of the contract it enforces.