deploy-content-moderation — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited deploy-content-moderation (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.
az account showaz bicep versionaz bicep lint -f infra/main.bicep
az bicep build -f infra/main.bicepVerify resources:
az deployment group create \
--resource-group $RESOURCE_GROUP \
--template-file infra/main.bicep \
--parameters infra/parameters.json| Category | Severity Scale | Default Threshold | Action |
|---|---|---|---|
| Hate | 0-6 | ≥ 4 (Medium) | Block |
| Violence | 0-6 | ≥ 4 (Medium) | Block |
| SelfHarm | 0-6 | ≥ 2 (Low) | Block + alert |
| Sexual | 0-6 | ≥ 4 (Medium) | Block |
Severity levels: 0 (Safe) → 2 (Low) → 4 (Medium) → 6 (High) Configure per use case: consumer-facing apps use stricter thresholds (≥ 2), internal tools can use moderate (≥ 4).
# Create blocklist
python scripts/create_blocklist.py --name "company-terms" --terms blocklists/company-terms.txt
# Create competitor blocklist
python scripts/create_blocklist.py --name "competitor-names" --terms blocklists/competitors.txt# Dual moderation: check BOTH user input AND model output
# Input → Content Safety → LLM → Content Safety → Output
# Input moderation (before sending to LLM)
input_result = content_safety_client.analyze_text(
AnalyzeTextOptions(text=user_input, categories=[...], blocklist_names=["company-terms"])
)
if input_result.hate_result.severity >= threshold:
return "I can't help with that request."
# Output moderation (before returning to user)
output_result = content_safety_client.analyze_text(
AnalyzeTextOptions(text=llm_response, categories=[...])
)python scripts/test_moderation.py --text "Normal business query" --expect pass
python scripts/test_moderation.py --text "Harmful content example" --expect block
python scripts/test_blocklist.py --term "CompetitorName" --expect block
python scripts/test_image.py --image samples/safe_image.jpg --expect pass| Issue | Cause | Fix |
|---|---|---|
| Everything blocked | Threshold too low (≥ 0) | Set threshold ≥ 2 for Low, ≥ 4 for Medium |
| Nothing blocked | Threshold too high (6) | Lower to ≥ 4 for standard, ≥ 2 for strict |
| Blocklist not working | Terms not uploaded | Verify blocklist exists via API |
| High latency (>500ms) | Large text input | Chunk text to 1000 chars max per call |
| Image moderation fails | Unsupported format | Convert to JPEG/PNG, resize under 4MB |
| False positives on names | Name matches blocklist | Use context-aware custom categories instead |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.