workspace-health — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited workspace-health (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.
You are a Roslyn MCP status reporter. Your job is to probe the running server, enumerate loaded workspaces, surface degraded or stale state, and produce a compact go/no-go verdict that other skills (or the user) can act on.
$ARGUMENTS is an optional workspace ID. If provided, focus the report on that workspace (still include server-level state). If omitted, report on every loaded workspace.
This skill is the canonical entry point for server and workspace discovery — the other skills probe server_info / workspace_list internally; this skill surfaces that information directly to the user. If the tool list or workflow surface is unclear downstream, point users at `server_info`, the `server_catalog` resource (roslyn://server/catalog), or MCP prompt `discover_capabilities` with category all.
Clients that support MCP elicitation may auto-recover some missing workspaceId calls. When a registered read-only, non-destructive workspace-scoped tool is called without a required workspaceId, the server can ask for a .sln / .slnx / .csproj path, call workspace_load, then retry the original tool with the recovered workspaceId. workspaceId is a non-secret session identifier derived from the loaded workspace path; the server must not elicit credentials, tokens, passwords, API keys, authorization headers, or other sensitive values.
If the client does not support elicitation, or if the user declines the prompt, follow the manual workflow below: run workspace_list, choose a current id, or call workspace_load again on the workspace path.
Before running any mcp__roslyn__* tool call, probe the server once:
mcp__roslyn__server_info — confirm the response includes connection.state: "ready".connection.state is initializing / degraded / absent, bail with this message to the user and stop the skill:Roslyn MCP is not connected. This skill requires an active Roslyn MCP server. Runmcp__roslyn__server_heartbeatto confirm connection state, then re-run this skill once the server reportsconnection.state: "ready". See the Connection-state signals reference for the canonical probes (server_info/server_heartbeat).
connection.state is "ready", proceed with the rest of the workflow. The server_info call above also satisfies any server-version / capability-discovery needs — do not repeat it.Note: this skill's purpose is to report server/workspace status, so a failing precheck is itself the answer. Surface the failure as the final output (see Refusal conditions below) rather than silently aborting.
Execute these steps in order. Use the Roslyn MCP tools — do not shell out.
Before enumerating workspaces, determine whether the current working directory contains a C# project.
Glob tool to search the CWD for any file matching *.csproj, *.sln, or *.slnx (search non-recursively at CWD root first; a single hit is sufficient).applicable: truedetectedStack: "csharp"applicable: falsedetectedStack: "unknown".csproj, .sln, or .slnx) is not a sufficient signal — at least one of those three must be present.Emit applicable and detectedStack as the first two lines of the output report (before the Server section). These values are used in Step 3 to decide whether to emit the workspace-load hint.
server_info response from the precheck.connection.state, transport, and any build-time catalog metadata (tool count, capability flags).server_heartbeat once to confirm the transport is live and measure round-trip freshness.server_info reported.workspace_list to get every loaded workspace and its metadata (id, solution path, load time, warnings).$ARGUMENTS names a workspace ID, filter to just that entry but keep the count of the others for the summary.applicable from Step 0:applicable: false: suppress the "consider calling workspace_load" hint and instead emit: "CWD does not appear to be a C# repo (detectedStack: unknown). The workspace-health skill is most useful when a .sln or .csproj is present."applicable: true: retain the existing hint — emit "no workspaces loaded — consider calling workspace_load on a .sln / .slnx / .csproj".For each workspace in scope:
workspace_support_bundle with the workspaceId — record status, loaded path, readiness summary, drift status, capped change ledger, workspace/surface version, diagnostics totals, and nextActions.workspace_support_bundle as the preferred incident-diagnosis source. It is distinct from first-run readiness reporting and intentionally excludes source snippets.workspace_support_bundle is unavailable on this server build, fall back to workspace_status and then workspace_health with the same workspaceId; note the fallback in the report.For any workspace whose support bundle reports status other than clean (or when the user asked for a single-workspace deep check):
validate_workspace without runTests for a fast compile + analyzer snapshot.Skip this step for a broad multi-workspace sweep unless the user asked for depth — it is a heavier call.
Combine the server-level signals (Steps 1-2) with the per-workspace signals (Steps 3-5) using the rubric below to produce a single verdict line (go / caution / no-go) and a prioritized "next actions" list.
| Indicator | Meaning | Action |
|---|---|---|
connection.state = "ready" + heartbeat OK | Server is healthy and responsive | Proceed |
connection.state = "initializing" | Server is still coming up | Wait, re-run skill in a few seconds |
connection.state = "degraded" or heartbeat timeout | Transport or internal state is unhealthy | Investigate server logs; consider restart |
connection.state absent / server_info fails | Server is unreachable | Surface as output (see Refusal conditions) |
workspace_status.state = "ready" | Workspace usable | Proceed |
workspace_status.state = "loading" | Load in progress | Wait; re-probe |
workspace_status.state = "degraded" | Load completed with errors | Review load-time warnings; consider workspace_reload |
workspace_support_bundle.status = "clean" | Incident bundle found no stale/drift/diagnostic/change signal | Proceed |
workspace_support_bundle.status = "changed" | Session ledger has mutations | Run validate_recent_git_changes before handoff |
workspace_support_bundle.status = "stale" | Snapshot stale or drifted from disk | Run workspace_reload |
workspace_support_bundle.status = "attention-needed" | Readiness or diagnostics need inspection | Follow bundle nextActions |
| Stale workspace (solution files changed on disk after load) | On-disk drift | Reload with workspace_reload |
| Outstanding preview tokens | Unapplied preview sessions linger | Review the associated skill/flow; apply or discard |
validate_workspace reports errors | Compilation broken in memory | Hand off to analyze or explain-error skill |
Present a structured report:
## Workspace Health Report
applicable: {true|false}
detectedStack: {csharp|unknown}
### Server
- Version: {semver}
- Connection: {state}
- Transport: {transport} (heartbeat {latency-ms} ms)
- Catalog: {tool-count} tools, {capability-flags}
### Workspaces ({N} loaded)
{table: id, solution path, state, load-time warnings, outstanding preview tokens}
### Per-Workspace Detail
For each workspace in scope:
- **{id}** — {state}
- Projects: {count} Documents: {count}
- Last activity: {timestamp}
- Support bundle: {clean|changed|stale|attention-needed}; drift {reload|noop}; changes {returned}/{total}; diagnostics errors/warnings/info {counts}
- Validation (if Step 5 ran): {build pass/fail}, {errors}, {warnings}
### Verdict
{GO | CAUTION | NO-GO}: {one-line rationale}
### Suggested Next Actions
1. {actionable next step, e.g., "Run workspace_reload on {id} — solution files changed on disk"}
2. ...Keep the verdict line at the top of any chat-level summary so a caller skill can parse it quickly.
This skill does not refuse on transport failure — the whole point is to report state. Instead:
connection.state absent/degraded/initializing), emit the connectivity-failure report as the final output: server identity (to the extent known), "connection: {state-or-unreachable}", and the suggested remediation from the Status Rubric.workspace_list returns empty, emit a "no workspaces loaded" report with a suggestion to call workspace_load on a .sln / .slnx / .csproj.$ARGUMENTS workspace ID is not found in workspace_list, emit a "workspace not found" report with the list of actually-loaded IDs so the caller can retry.In every case, the user gets an actionable report — never a silent failure.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.