skills/artefact-audit/SKILL.md
{{ ๐๐๐ }} Audit a topic and render an actionable, status-grouped HTML findings artefact.
npx skillsauth add jasonwarrenuk/goblin-mode Artefacts: Create AuditInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Audit a topic and render the findings as a self-contained, actionable HTML page: findings grouped by delivery status, ranked by severity, each verified before it ships. Uses the visual-explainer plugin's rendering patterns.
The output is the audit artefact this skill was distilled from: a masthead + KPI row, findings grouped into collapsible To do / In progress / Done sections, severity shown on both a chip and the colour of each finding number, a severity/type filter bar, and a refuted section that keeps the audit falsifiable.
$ARGUMENTS (auto-detect).json file (matches something like *.json and the file exists) โ render-only mode. Load it as the findings dataset and skip to Step 3. Expected shape is documented in Step 2.Analyse the topic and produce a findings dataset. Read the relevant docs and code first; for a broad or uncertain scope, fan out parallel read-only searches (an Explore subagent per area) before drawing conclusions. For a genuinely large or adversarial audit, a Workflow (multi-lens find โ dedupe โ adversarial verify โ completeness critic) produces a far stronger set; use it when the topic warrants the cost.
Each finding must carry:
id โ stable integer, assigned once, never reusedtitle โ one sentence stating the defectcategory โ one of correction (the source says something false/stale), issue (a real problem), improvement (reduces risk/effort), enhancement (valuable addition currently missing)severity โ high | medium | lowevidence โ file:line references, quoted text, or command output; no speculation as factfile_refs โ array of repo-relative paths (with optional :line)recommendation โ a single concrete action, not a themeanchor โ 2-4 word imperative label for the action (e.g. "Split the gate")theme โ a short grouping label (secondary axis, shown as a card tag)confidence โ high | medium | low from the verification passstatus โ to_do | in_progress | done (see below)outcome_note โ one sentence on what was done, or why it is where it isverify_notes โ what a skeptic checked and found; corrections to the finding's own evidence belong hereVerify before including. For each candidate finding, check its evidence actually holds against the current tree and history. Default to dropping it if the evidence is ambiguous. Keep the dropped ones in a refuted list (title + why) so the artefact is honest about what did not survive.
Status semantics (be honest; status reflects reality, not intention):
done โ the fix was applied in this passin_progress โ initiated but pending external action, or only partly applied (say which part in outcome_note)to_do โ left as a recommendation, or genuine future workWrite the dataset to {project_root}/docs/artefacts/audit-{slug}.json so the render is reproducible and can be re-run in render-only mode. Then gate it before any HTML: python3 "$HOME"/.claude/library/scripts/validate_audit_findings.py {dataset}.json must exit 0 (it checks required fields, enum values, id uniqueness, count consistency and the dash ban). Fix the dataset on failure โ never render an invalid one. Render-only mode (Step 1) runs the same gate on the supplied file. Structure:
{
"meta": {
"topic": "โฆ", "document": "โฆ", "generated": "YYYY-MM-DD",
"method": "how the findings were produced",
"counts": {"confirmed": N, "refuted": N,
"by_severity": {"high": N, "medium": N, "low": N},
"by_category": {"correction": N, "issue": N, "improvement": N, "enhancement": N}},
"applied": {"date": "YYYY-MM-DD", "done": N, "in_progress": N, "to_do": N}
},
"findings": [ { โฆfields aboveโฆ } ],
"refuted": [ {"title": "โฆ", "notes": "โฆ"} ]
}
Resolve the installed path with Glob:
~/.claude/plugins/cache/visual-explainer-marketplace/visual-explainer/*/
Read references/css-patterns.md (depth tiers, collapsible pattern, overflow protection) and references/libraries.md (font pairings, palette guidance) before writing any HTML.
Blueprint / editorial, dark and light. Define a :root with a @media (prefers-color-scheme: dark) counterpart. Semantic CSS custom properties only; never hard-code a hex in a component.
linear-gradient grid lines at low opacity) in dark; warm off-white in light.--high red, --medium amber, --low green. Status accents: --done green, --progress blue, --todo amber. Category accents distinct from all of the above.mkdir -p {project_root}/docs/artefacts
Write to {project_root}/docs/artefacts/audit-{slug}.html, self-contained (embedded CSS + JS, only Google Fonts external).
method line (N confirmed ยท N refuted).backdrop-filter blur. Severity buttons (All / High / Medium / Low) and type buttons (Corrections / Issues / Improvements / Enhancements). Active button tints to the severity colour.<details> blocks in order To do (open), In progress (open), Done (collapsed, no open). Each summary shows the label, a count, and a right-aligned severity tally. Inside, a responsive card grid (minmax(340px, 1fr)), findings sorted by severity then id. An empty To-do section shows a short "nothing outstanding" note rather than vanishing.data-sev via a rule like .finding[data-sev="high"] .finding__num{color:var(--high)} โ this is the second severity signal alongside the chip. Right-aligned badges: a severity chip, a category badge, and a theme chip.<code> spans; convert `backticks` and strip any orphan).outcome_note.<details> holding the recommendation (led by a โถ {anchor} label), the file-ref chips, the evidence, and the verification note.data-sev, data-cat, data-status for the filter JS.Vanilla, inline. Buttons toggle a .hidden class on findings by data-sev or data-cat; status blocks whose visible-finding count drops to zero hide themselves (and auto-open when a non-all filter is active); a #noresults line shows when nothing matches.
Prefer writing the HTML directly. If the finding set is large, it is acceptable to drive a short Python generator (loop the dataset into card markup, escaping with html.escape and converting backticks to <code>) to avoid hand-escaping errors, then write the single output file. Do not leave a generator script behind as an artefact; the deliverable is the HTML (and the dataset JSON from Step 2).
Before opening:
article, details, div, script, style)id is unique; all findings presentopen, Done collapseddata-sev rule present for high/medium/low)var(--x) resolves to a definition; light and dark both intentionalmin-width: 0; overflow-wrap on long text; refs wrap#statuses, .finding, .statusblock, #noresults)Run a quick static check (a few lines of Python: tag counts, id uniqueness, var() vs definitions, data-status tallies) rather than trusting a visual scan.
open {project_root}/docs/artefacts/audit-{slug}.html
Report:
tools
{{ ๐ซ๐ซ๐ซ }} Rebuild roadmap-system.zip, the distributable snapshot of the roadmap tooling (scripts, HTML template, conventions reference, and every roadmap-touching skill, including this one).
tools
--- name: "Suggest: Task" description: "{{ ๐ซ๐ซ๐ซ }} Suggest the next logical task โ grounded in the roadmap's pre-vetted ready-set when one exists, codebase analysis otherwise" when_to_use: "When you don't know what to work on next and want a grounded recommendation rather than picking arbitrarily." model: haiku effort: low disable-model-invocation: true allowed-tools: ["Read", "Glob", "Grep", "Bash(python3:*)", "Bash(npm:*)", "Bash(bun:*)", "Bash(pnpm:*)", "Bash(deno:*)"] argument-hint: [named
development
{{ ๐๐๐ }} Convert an old simple-style roadmap (single Markdown, four statuses, <a name> anchors, roadmaps.json pointer registry) into the rich phase-array format (roadmaps.json source of truth + PHASE task list + prose overview).
data-ai
{{ ฦฦฦ }} Create a pull request to main โ wordy or shiny (with screenshots), ready-for-review or draft