surface-audit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited surface-audit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Cross-check the live server surface against every hard-coded count in the repo's documentation.
The 2026-04-10→04-24 retro showed multiple self-audit sessions spending significant grep budget verifying doc claims like "10 skills", "66 stable + 60 experimental = 126 tools", "123 tools". This skill does that walk in one pass so agents get an authoritative drift report without polluting the transcript.
Call mcp__roslyn__server_info. Record from the response:
surface.tools.stable, surface.tools.experimental, surface.registered.toolssurface.resources.stable, surface.resources.experimental, surface.registered.resourcessurface.prompts.stable, surface.prompts.experimental, surface.registered.promptsversion, catalogVersion, surface.registered.parityOkGlob skills/*/SKILL.md — the count is the live skill count. Record as shippedSkills.
Glob .claude/skills/*/SKILL.md — these are the repo-local override skills (not shipped). Record as maintainerSkills. Report the totals but DO NOT compare against shipped-skill count claims (they're separate surfaces).
Grep for patterns that match surface count claims. Regex list (case-insensitive):
[0-9]+\s*(stable|experimental)?\s*(tools?|resources?|prompts?|skills?)Scope the grep to:
README.mddocs/**/*.mdai_docs/**/*.md (skip ai_docs/archive/** and ai_docs/reports/** — historical snapshots, drift expected)CHANGELOG.md — ONLY the ## [Unreleased] section; shipped version sections are frozen history.claude-plugin/plugin.json + .claude-plugin/marketplace.json — description stringsFor each hit, capture: file, line, the exact claim text, the claimed count.
Produce a table:
| Claim source | Claim text (excerpt) | Claimed | Live | Drift |
|---|---|---|---|---|
docs/setup.md:42 | "107 stable tools and 54 experimental" | 107 / 54 | 107 / 54 | ok |
README.md:18 | "over 150 Roslyn-powered tools" | 150 | 161 | ok (+11 live, claim is conservative) |
ai_docs/references/tool-usage.md:9 | "...10 shipped skills..." | 10 | 12 | drift +2 |
Drift categories:
ok — claim exactly matches or is a conservative lower bound (e.g. "over N" where live > N)drift +N / drift -N — claim is stale; report the deltaunverifiable — claim is about a category we can't measure from server_info or globs (e.g. "dozens of diagnostics"). Flag but don't count as drift.Output order:
Skills are shipped (and maintainer-local) product surface that compose MCP tools into guided workflows. A broken tool reference in any SKILL.md breaks every plugin user. This static audit lane verifies each discovered skill against the live catalog. (Formerly Phase 16b of the /mcp-server-stress audit prompt; relocated here because it is a static-catalog check, not a server-execution check.)
The discovery surface is the union of two filesystem trees — both must be walked, and the live directories are the source of truth:
Glob skills/*/SKILL.md — shipped skills (plugin consumers see these).Glob .claude/skills/*/SKILL.md — maintainer-local skills (this repo only; not shipped).Do NOT rely on a hand-maintained skill list — it drifts.
name matches the directory name; description is non-empty and accurate.mcp__roslyn__<tool> reference from the SKILL.md body and any prompts/*.md siblings. Cross-check each against the live catalog from Step 1's server_info / roslyn://server/catalog capture. Any reference to a renamed/removed tool is a P2 FAIL — record it in the audit table and the suggested-next-steps section.Skills are not rows in roslyn://server/catalog; this audit is a quality/contract check, not a tier-promotion pipeline.
Each skill row gets one of: pass, flag, fail. A fail requires at least one tool reference that does not resolve to the live catalog or a missing/empty frontmatter field.
Append one row per discovered SKILL.md:
| Skill | Tree | frontmatter_ok | tool_refs_valid (invalid_count) | tag | Notes |
|---|---|---|---|---|---|
surface-audit | .claude/skills | yes | yes (0) | pass | |
example-shipped | skills | yes | no (2) | fail | references removed old_tool_name, another_old |
Before closing the report, confirm:
skills/ tree is absent in a non-Roslyn-Backed-MCP repo checkout), is that recorded as blocked — <tree> not accessible rather than silently dropped?## [1.x.y] CHANGELOG sections. Frozen history is expected to drift from live./mcp-server-stress's lane (server-execution audit). This skill is the static-surface lane.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.