fai-azure-resource-visualizer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fai-azure-resource-visualizer (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.
Generate visual topology diagrams from Azure resource configurations.
from azure.mgmt.resourcegraph import ResourceGraphClient
from azure.mgmt.resourcegraph.models import QueryRequest
from azure.identity import DefaultAzureCredential
def generate_topology(subscription_id: str, resource_group: str) -> str:
client = ResourceGraphClient(DefaultAzureCredential())
query = QueryRequest(
query=f"""Resources
| where resourceGroup == '{resource_group}'
| project name, type, id, dependsOn=properties.dependencies
| order by type""",
subscriptions=[subscription_id],
)
resources = client.resources(query).data
lines = ["graph TB"]
type_icons = {
"microsoft.web/sites": "🌐",
"microsoft.cognitiveservices/accounts": "🧠",
"microsoft.search/searchservices": "🔍",
"microsoft.storage/storageaccounts": "📦",
"microsoft.keyvault/vaults": "🔐",
"microsoft.cache/redis": "⚡",
}
for r in resources:
icon = type_icons.get(r["type"].lower(), "📌")
short_type = r["type"].split("/")[-1]
lines.append(f' {r["name"]}["{icon} {r["name"]}\n({short_type})"]')
return "\n".join(lines)# Export resource list as starting point for manual diagram
az resource list --resource-group $RG \
--query "[].{Name:name, Type:type, Location:location}" -o table
# Export network topology
az network watcher show-topology --resource-group $RG -o json > topology.jsongraph TB
api["🌐 api-app\n(sites)"]
oai["🧠 oai-prod\n(accounts)"]
search["🔍 search-prod\n(searchServices)"]
storage["📦 docs-store\n(storageAccounts)"]
kv["🔐 kv-prod\n(vaults)"]
api --> oai
api --> search
api --> kv
search --> storagedef annotate_cost(resources: list[dict], cost_data: dict) -> list[dict]:
"""Add cost tier to each resource for visual heatmap."""
for r in resources:
monthly = cost_data.get(r["name"], 0)
if monthly > 500:
r["cost_tier"] = "🔴 HIGH"
elif monthly > 100:
r["cost_tier"] = "🟡 MEDIUM"
else:
r["cost_tier"] = "🟢 LOW"
return resources| Issue | Cause | Fix |
|---|---|---|
| Diagram too cluttered | Too many resources in one view | Filter by type or group by subnet |
| Missing dependencies | ARM doesn't track all runtime deps | Add manual edges for app→service connections |
| Stale diagram | Generated once, never updated | Regenerate in CI on infra changes |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.