{"id":51009075,"url":"https://github.com/wan-huiyan/dashboard-audit-toolkit","last_synced_at":"2026-06-21T00:30:35.049Z","repository":{"id":360970666,"uuid":"1232815914","full_name":"wan-huiyan/dashboard-audit-toolkit","owner":"wan-huiyan","description":"Synchronous Claude Code toolkit for auditing live data dashboards end-to-end — parallel cluster agents methodology + the most common fix-shape + single-metric depth audit + the squash-merge gotcha. Sister to wan-huiyan/overnight-workflows.","archived":false,"fork":false,"pushed_at":"2026-05-15T22:09:28.000Z","size":25,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-28T17:27:09.008Z","etag":null,"topics":["claude-code","claude-code-plugin","claude-code-skill","dashboard-audit","data-dashboard","fact-checking","language-audit","parallel-agents"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wan-huiyan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T09:52:42.000Z","updated_at":"2026-05-15T22:09:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wan-huiyan/dashboard-audit-toolkit","commit_stats":null,"previous_names":["wan-huiyan/dashboard-audit-toolkit"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/wan-huiyan/dashboard-audit-toolkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fdashboard-audit-toolkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fdashboard-audit-toolkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fdashboard-audit-toolkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fdashboard-audit-toolkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wan-huiyan","download_url":"https://codeload.github.com/wan-huiyan/dashboard-audit-toolkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wan-huiyan%2Fdashboard-audit-toolkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34590213,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","claude-code-plugin","claude-code-skill","dashboard-audit","data-dashboard","fact-checking","language-audit","parallel-agents"],"created_at":"2026-06-21T00:30:34.460Z","updated_at":"2026-06-21T00:30:35.040Z","avatar_url":"https://github.com/wan-huiyan.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dashboard Audit Toolkit\n\nA synchronous toolkit of four [Claude Code](https://claude.com/claude-code) skills for **auditing a live data dashboard end-to-end and shipping the fixes** in a single ~30–45-minute round, without overnight runs or autonomous loops.\n\n[![license](https://img.shields.io/github/license/wan-huiyan/dashboard-audit-toolkit)](LICENSE)\n[![last commit](https://img.shields.io/github/last-commit/wan-huiyan/dashboard-audit-toolkit)](https://github.com/wan-huiyan/dashboard-audit-toolkit/commits)\n[![Claude Code](https://img.shields.io/badge/Claude_Code-plugin-orange)](https://claude.com/claude-code)\n\n## The four plugins\n\n| Plugin | Role |\n|---|---|\n| [**whole-dashboard-factcheck-via-parallel-cluster-agents**](plugins/whole-dashboard-factcheck-via-parallel-cluster-agents/) | The methodology spine. Cluster a 6+ page dashboard by audience-purpose (3–4 clusters), dispatch one research subagent per cluster, synthesise into a single audit report with TL;DR + per-page detail + \"what's solid\" credibility anchor. |\n| [**template-hardcoded-literal-vs-existing-payload**](plugins/template-hardcoded-literal-vs-existing-payload/) | The most common fix-shape produced by the audit: the page renders `~930` while the backend payload (which has been correct for months) says `94`. Diagnostic + zero-data-pipeline-change fix. |\n| [**dashboard-metric-label-vs-sql-definition**](plugins/dashboard-metric-label-vs-sql-definition/) | Single-metric depth audit. When a stakeholder pushes back on what a KPI \"means,\" read the SQL — not the rendered label, the variable name, or the column alias. |\n| [**gh-squash-merge-closes-only-one-issue**](plugins/gh-squash-merge-closes-only-one-issue/) | Operational gotcha when running the audit→issues→fix-bundles flow at scale: GitHub squash-merge auto-closes only ONE issue per PR. Path A prevents; Path B recovers. |\n\nThese skills are designed as a set. The methodology spine generates the audit; the fix-shape skill resolves most of what it finds; the depth audit handles single-metric pushbacks; and the GitHub gotcha makes shipping the fixes mechanical.\n\n## When to reach for this toolkit\n\n- You have a **live data dashboard** (BigQuery, Postgres, JSON cache, baked-payload table) with **6+ user-facing pages** and a stated voice/persona doc.\n- A **leadership review, client demo, or Phase 2 hand-over** is approaching, and you want confidence the rendered numbers match the source database AND the language lands for the stated audiences.\n- You can sit synchronously for **30–45 minutes** of audit + a few hours of follow-up fixes — this is NOT an overnight workflow.\n\nIf your situation is different, see **Related repos** below.\n\n## Why use these\n\nA naive \"review this dashboard\" prompt produces a generic-sounding bullet list that misses the load-bearing problems. The most common failure modes:\n\n- **Hardcoded literals next to correct payloads.** The template renders `~930 students` next to a baked payload that says `cohort_size=94`. Counselors export \"930 to call\" and Salesforce shows 94. Silent. No error. No broken build.\n- **Display labels diverge from SQL definitions.** \"Active Students\" sounds like \"students with recent activity\" but the SQL is `COUNT(*) FROM predictions WHERE scoring_date = MAX(scoring_date) AND term_suppressed IS NULL` — i.e. \"rows in today's scoring run, post-suppression.\" Two different things.\n- **Audit shipped, but issues stay open.** PR squash-merges with `Closes #447, #448, #449, #450`. Only `#447` closes. Three confused minutes later, you realise GitHub's parser binds one keyword to one issue.\n- **Single-agent shallow coverage.** Asking one agent to cover 14 pages produces shallow output and runs out of context. Asking page-by-page synchronously takes hours.\n\nThese plugins encode the patterns that fix each of these — extracted from real audits that caught real cohort-size and language errors before they reached real stakeholders.\n\n## Core patterns (shared across the toolkit)\n\n### 1. Cluster split by audience-purpose\n\nDon't cluster by URL prefix. Cluster by **what each page is for** — typically `Headline / executive`, `Operational / action surfaces`, `Library / methodology / explorer`. Three clusters is the sweet spot for 12–16 pages; four for larger surfaces.\n\n### 2. Diagnostic table schema\n\nThe load-bearing artefact is a per-page table:\n\n| Element | Source | Claimed | Actual (DB) | Verdict |\n|---|---|---|---|---|\n| ... | payload-derived / hardcoded / mock-data / route-computed | what page renders | what BQ says | ✅ / ⚠️ / ❌ |\n\nThis schema makes mismatches scannable AND makes \"what to fix first\" mechanical. Reused across all four plugins.\n\n### 3. Audit → issues → fix-bundles flow\n\nShip the audit doc as **PR-1 (report-only, docs label)** so it lands fast. File **one GitHub issue per P0 item** with labels at creation. Bundle fixes into **2–4 PRs** by *kind* (wiring fixes, jargon cleanup, copy edits) — not one mega-PR and not N mini-PRs. Each fix PR closes its bundle of issues with one keyword per issue (`Closes #X. Closes #Y.` — never `Closes #X, #Y`).\n\n### 4. Fix in the consumer, not the producer\n\nThe most common fact-check finding produced by this audit is **the consumer never connected to a correct producer**. Don't reach for the bake / data pipeline / source-of-truth table. Add a `{{ variable }}` accessor in the template, thread it through the route handler, and ship in 30 LoC.\n\n### 5. Read the SQL, not the label\n\nWhen a stakeholder pushes back on what a KPI means, open the query. Quote the aggregation (`COUNT(*)`, `SUM`) and the **complete** `WHERE` clause. Both shape the meaning. Note every UI toggle that silently re-parametrises the count.\n\n### 6. \"What's solid\" credibility anchor\n\nPure-negative reports erode trust in the audit's calibration. Always include a \"What's solid\" section (\"baked KPIs match BQ exactly\", \"diagnostics floor logic correct\", \"AI Insights numbers are arithmetically right — only the labels are wrong\") so the negative finds land credibly.\n\n## Installation\n\n```bash\n# Add the marketplace\n/plugin marketplace add wan-huiyan/dashboard-audit-toolkit\n\n# Install one or all four plugins\n/plugin install whole-dashboard-factcheck-via-parallel-cluster-agents@wan-huiyan-dashboard-audit-toolkit\n/plugin install template-hardcoded-literal-vs-existing-payload@wan-huiyan-dashboard-audit-toolkit\n/plugin install dashboard-metric-label-vs-sql-definition@wan-huiyan-dashboard-audit-toolkit\n/plugin install gh-squash-merge-closes-only-one-issue@wan-huiyan-dashboard-audit-toolkit\n```\n\nOr clone directly:\n\n```bash\ngit clone https://github.com/wan-huiyan/dashboard-audit-toolkit.git\ncp -R dashboard-audit-toolkit/plugins/whole-dashboard-factcheck-via-parallel-cluster-agents ~/.claude/skills/\ncp -R dashboard-audit-toolkit/plugins/template-hardcoded-literal-vs-existing-payload ~/.claude/skills/\ncp -R dashboard-audit-toolkit/plugins/dashboard-metric-label-vs-sql-definition ~/.claude/skills/\ncp -R dashboard-audit-toolkit/plugins/gh-squash-merge-closes-only-one-issue ~/.claude/skills/\n```\n\n## Quick start\n\n\u003e \"Review this dashboard end-to-end. Fact-check the rendered numbers against the BigQuery payload table, and audit the language for `PRODUCT.md`'s two stated audiences. Three clusters: headline / operational / library. Report only — I'll triage what to fix.\"\n\nThe methodology-spine plugin will:\n\n1. Map the user-facing routes + payload table + source-of-truth tables.\n2. Cluster pages by audience-purpose (3–4 clusters).\n3. Dispatch one research subagent per cluster in parallel — same prompt template, same diagnostic-table output schema.\n4. Synthesise into a single Markdown audit report at `docs/reviews/\u003cdate\u003e_\u003cproduct\u003e_factcheck_language_audit.md`.\n\nOnce you triage, the other three plugins handle most of what the audit surfaces:\n\n- Most fact-check P0s → `template-hardcoded-literal-vs-existing-payload`\n- Stakeholder pushback on what a metric \"means\" → `dashboard-metric-label-vs-sql-definition`\n- Issues that won't close after fix-PRs merge → `gh-squash-merge-closes-only-one-issue`\n\n## Related repos\n\nThis toolkit is for **synchronous** audits — one ~30–45 min round of parallel cluster agents, with you in the loop. For different shapes:\n\n- **Autonomous overnight runs** — [`wan-huiyan/overnight-workflows`](https://github.com/wan-huiyan/overnight-workflows). Two sister plugins:\n  - `overnight-review-client-delivery` — you already have a client deliverable that needs polishing + quality-gating before a morning hand-off. 8-agent review panel.\n  - `overnight-insight-discovery` — generate a client-facing insight brief from scratch, surfacing funnel leaks and surprise patterns from data.\n- **Per-instance SHAP waterfall + post-hoc calibrator** — [`wan-huiyan/shap-waterfall-calibrator-skill`](https://github.com/wan-huiyan/shap-waterfall-calibrator-skill). One of the more common per-instance explainability bugs an audit will surface: the chart's Final bar disagrees with the score chip beside it, and the \"rescale to fit\" fix introduces sign-flip artifacts on a different slice of instances. The correct fix (point-by-point calibration of the cumulative path) and the SHAP-maintainer caveats.\n- **Single-page sanitize for client send** — `client-readiness-pass-on-rendered-html` (separate skill, not in this toolkit). Different shape: one page (or a small subset) inside an internal-flavored generated site, sanitised so it can be sent directly to a non-technical client without rebuilding the generator.\n- **Plan / requirements docs** — `document-review` (separate skill). Persona-agent review of plans/requirements rather than cluster agents over a live product.\n- **Adversarial debate on a design** — `agent-review-panel` (separate skill). Multi-agent debate with a Supreme Judge.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwan-huiyan%2Fdashboard-audit-toolkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwan-huiyan%2Fdashboard-audit-toolkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwan-huiyan%2Fdashboard-audit-toolkit/lists"}