plugins/research/skills/best-practices-audit/SKILL.md
Research-grounded validation of a target (file, directory, or topic) against external best practices and vendor docs. Produces a cited, evidence-grounded comparison.
npx skillsauth add jmagly/aiwg best-practices-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.
Validate a target — a file, directory, or freeform topic — against current external best practices, vendor documentation, and practitioner discussion. Produce a cited, evidence-grounded comparison report.
This is the research-grounded validation pattern from #929: it institutionalizes the practice of validating against fresh internet sources rather than the model's training-cutoff priors. The improvement is real only when retrieved sources have good signal, so the skill enforces citation guardrails and confidence honesty rather than fabricating breadth.
<target> (required): file path, directory, freeform topic, or issue ref--focus <area>: security | performance | accessibility | licensing | api-design | testing | docs | ops | compliance | … (open vocabulary)--framework <name>: bias toward a named stack (React, Kubernetes, FastAPI, …)--standard <name>: align to a named standard (OWASP, SOC2, WCAG 2.2, NIST 800-53, …)--recency <window>: default 18 months. Tighten for fast-moving domains, widen for compliance/legal--depth quick|standard|deep: research effort budget (default standard)--sources <list>: restrict to: vendor-docs, standards-bodies, practitioner-blogs, conference-talks, academic, github-discussions--exclude <list>: e.g. exclude SEO-spam domains--cite-threshold <N>: minimum distinct sources before a finding is reported (default 2)--dissent: actively surface practitioner disagreement, not just consensus--validate: re-validate existing claims in the target rather than generating new ones--output <path>: where to write the report (CLI handler computes the default)The CLI handler at src/cli/handlers/best-practices-audit.ts parses flags
and computes the output path; this skill receives a fully-formed prompt and
runs the research pipeline.
--focus and --framework filter which claims are
in scope. --validate switches to claim re-verification mode (no
generative findings).Before fan-out, discover any installed framework's kind: research contributors
that match the project. The discovery convention is described in ADR-023; the
runtime authority is src/contributors/discover.ts and the discovery loop
matches the algorithm there.
Read .aiwg/frameworks/registry.json. For each registered framework id,
check for <source-path>/research/contributor.md under
agentic/code/frameworks/, agentic/code/addons/, or agentic/code/extensions/
(first match wins per ADR-023 §Layout).
Walk .aiwg/contributors/research/*.md for project-local research
contributors.
For each candidate, parse YAML frontmatter and validate against the
kind: research schema (published at
agentic/code/frameworks/research-complete/skills/best-practices-audit/contributor.schema.json).
Run each contributor's detect.glob against the project root. Skip contributors
whose detection produces fewer than detect.minCount matches — installed
but unused frameworks do not pollute the audit.
For each in-use research contributor, fold its frontmatter into the research plan:
focus_areas — intersect with the user's --focus flag if present.
If --focus is omitted, use the contributor's full focus list. Multiple
contributors' areas merge with union semantics.sources.preferred and sources.exclude — add to the audit's
allow / block lists. The user's --sources and --exclude flags take
precedence; contributor preferences fill in defaults the user did not
specify.recency_default_months — used as the per-contributor default
when --recency is not set. When multiple contributors disagree, pick
the shorter window (more conservative — fresher sources are a
stronger guarantee than older sources).Stamp origin: <framework-id> on every finding sourced through that
contributor's expanded plan. Findings sourced from the generic path
(no contributor) get origin: generic. Project-local research
contributors stamp origin: project-local.
No regression when no contributors are present. If discovery returns zero in-use contributors, fall through to the bare generic path described in #943 — same behavior as before this issue's wiring landed.
When validate-metadata is available, the schema enforces correctness at deploy time. At audit time, this step trusts validated frontmatter; a contributor that fails parsing or validation is logged and skipped per ADR-023 §Failure mode.
Dispatch research per claim/focus area using the AIWG research-complete agents, expanded by any contributor configurations from Step 1.5. Reuse existing capabilities — do not implement parallel research machinery.
Available capabilities (load-on-demand from research-complete):
find-sources — discover candidate sources via vendor docs, standards
bodies, practitioner channelsresearch-acquire — fetch and process candidate documentsresearch-quality — apply GRADE quality scoringcitation-guard — block fabricated citationsresearch-query — query the local research corpus when one is presentIf media-curator and the marketing kit are also installed, dispatch them
for web-scraping cross-references where appropriate (e.g. practitioner
blog comparisons).
Concurrency rule per AIWG context-budget: the agent should issue parallel research tasks where independent (different focus areas, different claims), but not multiplex the same claim into N redundant subagents.
For each candidate source returned by research:
--sources allow-list and --exclude block-list.citation-guard to verify the source is real and retrievable
(URL reachable, content present at the cited location, not a 404 or
redirect to unrelated content).research-quality — score each source as
high / moderate / low.--recency window — sources older than the window are demoted
one quality level.--guidance to do so.For each claim:
--cite-threshold distinct sources support the claim's
alignment-or-divergence assessment, downgrade the finding to "weak
signal" rather than dropping it silently. Users need to see when
the corpus didn't support a strong conclusion — that is itself a
finding.--dissent, also extract dissenting voices: who argues the other
way, where, and on what grounds. Surface these as a labeled section,
not a footnote.Write to the output path computed by the CLI handler. Structure per #929 §5:
# Best-Practices Audit: <target>
**Generated**: YYYY-MM-DD
**Focus**: <flags or 'all'>
**Depth**: <flag>
**Cite threshold**: <N>
## Executive Summary
<2–4 sentences: what's aligned, what's misaligned, overall confidence>
## Findings
### Finding 1: <claim or decision under review>
- **Current state in project**: <quote/paraphrase with file:line if available>
- **Current industry practice**: <summary>
- **Alignment**: ALIGNED | PARTIAL | DIVERGES | CONTESTED | WEAK SIGNAL
- **Confidence**: high | moderate | low
- **Evidence**:
- [S1] <source title> — <vendor/standards body/blog>, <date>, <url>
- [S2] ...
- **Recommendation**: <specific change or 'keep as-is, well-justified by
current practice'>
(repeat per claim)
## Dissenting Views / Open Debates
<where practitioners disagree and why — empty section is acceptable when
nothing surfaced; do not invent dissent>
## Sources
Full bibliography with retrieval dates. Every source cited above must
appear here with full provenance. No citation appears in Findings without
appearing in Sources.
## Methodology Notes
- Research depth: <quick|standard|deep>
- Recency window: <window>
- Sources excluded: <list, including domains blocked by --exclude>
- Sources unavailable: <list, with reason — e.g. paywalled, 404>
These are non-negotiable. Failure to meet any of these breaks the audit's core value proposition.
citation-guard
enforces this; if citation-guard is unavailable, the audit must
surface that fact in Methodology Notes and downgrade overall confidence.(no external citation verified) so the reader knows what's grounded vs what's not.--validate mode never generates new findings. It only re-checks
claims already present in the target. If a claim's supporting source
is no longer reachable or has changed, the audit reports that the
claim is now unverified, not that there's a new claim to make.data-ai
Report which research-corpus radar sidecars are overdue for refresh. Computes staleness (days since last refresh vs the cadence window) for every radar, sorted most-overdue-first. Runs via `aiwg corpus radar-status`.
data-ai
Aggregate research-corpus radar sidecars into a corpus or per-cluster freshness report — totals, overdue count, per-cluster / per-GRADE / per-trajectory breakdowns, an overdue table, and per-radar rationale snippets. Runs via `aiwg corpus radar-report`.
testing
Scaffold radar/freshness sidecars for research-corpus REFs. Pulls title/authors from the citation sidecar and GRADE from the analysis doc, defaults the refresh cadence from GRADE and the cluster from a corpus-local map, and stamps documentation/radar/REF-XXX-radar.md. Runs via `aiwg corpus radar-init`.
data-ai
Compute an entity's publication trajectory — per-year paper counts, topic drift, hot-streak detection (≥3 consecutive A-grade years), and career phase. Runs via `aiwg corpus profile-temporal`.