survey-analytics — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited survey-analytics (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.
This skill analyzes survey results.
It does not generate survey HTML. It consumes:
Take a validated survey schema plus answers and produce:
Before analyzing, read:
../../specs/analytics-input.md../../specs/answer-storage.md../../specs/submission-api.md./references/metrics-model.md./references/report-shape.md./docs/OUTPUTS.mdPreferred input:
Also acceptable:
Do not stop at a prose-only analysis when local file execution is available.
Use the executable pipeline:
python3 <survey-analytics-root>/tools/analyze_survey_results.py \
--schema /absolute/path/to/schema.json \
--answers /absolute/path/to/answers.json \
--out-dir /absolute/path/to/output-dirWhen the user wants specific cross-question analysis, pass a config file:
python3 <survey-analytics-root>/tools/analyze_survey_results.py \
--schema /absolute/path/to/schema.json \
--answers /absolute/path/to/answers.json \
--cross-config /absolute/path/to/cross-config.json \
--out-dir /absolute/path/to/output-dirThe script generates:
<name>.analysis.xlsx<name>.analysis.json<name>.analysis.mdIf the user only asks for insights and does not want files, you may summarize the generated report instead of returning file contents.
surveyIdThe workbook should include at least:
OverviewResponsesQuestion SummaryCross TabsFinish SentimentExtra AnalysisInsightsThe flattened response table should use:
radio: option distribution column chartcheckbox: option selection frequency column chartinput: no forced chart; keep a readable sample table insteadscore: score distribution chart and average scorenps: score distribution chart plus promoter/passive/detractor band summaryFor free-text fields, the skill should distinguish between:
Only feedback/opinion text should receive:
高度满意满意中性不满强烈不满Do not run sentiment analysis on fields that are clearly for information collection, such as:
These fields may still appear in the flattened workbook, but they should not drive sentiment findings.
Default cross analysis should prefer:
radio vs scoreradio vs npsradio vs checkboxend_surveyextra attribution dimensions such as utm_source / campaign vs finish-path and text sentimentIf the user explicitly names segment questions or wants tighter control, create a cross config JSON with this shape:
{
"pairs": [
{
"segmentQuestionId": "radio-205152",
"metricQuestionId": "score-205160"
}
]
}Only those pairs should be generated when a cross config is provided.
When the user wants explicit control over which text fields receive theme/sentiment analysis, pass:
python3 <survey-analytics-root>/tools/analyze_survey_results.py \
--schema /absolute/path/to/schema.json \
--answers /absolute/path/to/answers.json \
--analysis-config /absolute/path/to/analysis-config.json \
--out-dir /absolute/path/to/output-dirExample:
{
"textAnalysis": {
"includeQuestionIds": ["checkbox-205170"],
"excludeQuestionIds": ["input-205179"],
"includeLabels": ["补充说明", "其他"],
"excludeLabels": ["姓名", "手机号", "联系方式"]
}
}Rules:
excludeQuestionIds or excludeLabels, do not analyze its sentimentincludeQuestionIds or includeLabels matches, do analyze itReturn:
Keep the analysis decision-useful.
Do not dump raw counts without interpretation. Do not make causal claims unless the data supports them.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.