refresh-site-examples — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited refresh-site-examples (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 real, source-backed examples for the site/index.html landing page. Examples are stored in site/examples.json and fetched at runtime by site/carousel.js. SQL is highlighted by site/sql-highlight.js.
Every number, statistic, and finding on the site MUST be verified by querying real data. Hallucinations = mistrust. This is the #1 rule.
Each example is an object in the array:
{
"tag": "Time series",
"question": "Natural language question a person would ask?",
"answer": "Narrative of what the tool does — dataset name, resource count, analysis technique.",
"punchline": "The bold finding, verified by real query.",
"sources": [
{
"title": "Exact Dataset Title from get_dataset_info",
"url": "https://data.ontario.ca/dataset/{slug}",
"org": "Organization Name from get_dataset_info"
}
],
"hood": {
"steps": [
{ "tool": "search_datasets", "description": "dataset_id_first_8_chars" },
{ "tool": "download_resource", "description": "17 CSVs" },
{ "tool": "query_cached", "description": "" }
],
"sql": "SELECT col_name,\n SUM(TRY_CAST(other_col AS INTEGER)) AS total\nFROM table_name\nGROUP BY col_name\nORDER BY total DESC"
},
"followup": {
"question": "Follow-up question?",
"answer": "Follow-up narrative.",
"punchline": "Follow-up finding (if verified).",
"sources": [{ "title": "...", "url": "...", "org": "..." }]
}
}| Field | Type | Required | Notes |
|---|---|---|---|
tag | string | yes | One of: "Time series", "Cross-dataset", "Geospatial", "Investigation", "Scale callout" |
question | string | yes | Natural-language question |
answer | string | yes | Narrative (no HTML — plain text only) |
punchline | string | yes | Bold finding, verified by query (no HTML) |
sources | array | yes | At least one {title, url, org} |
sources[].title | string | yes | Exact title from get_dataset_info |
sources[].url | string | yes | Portal dataset URL — e.g. https://data.ontario.ca/dataset/{slug} or https://ckan0.cf.opendata.inter.prod-toronto.ca/dataset/{slug} |
sources[].org | string | yes | Exact organization from get_dataset_info |
hood | object | yes | Under-the-hood section |
hood.steps | array | yes | At least one {tool, description} |
hood.steps[].tool | string | yes | MCP tool name |
hood.steps[].description | string | no | Annotation (dataset ID, count, etc.) |
hood.sql | string | yes | Plain SQL string — highlighted at runtime by sql-highlight.js |
followup | object | no | Optional nested follow-up |
carousel.js fetches examples.json at runtime, builds carousel cards, and injects into .carousel-tracksql-highlight.js auto-highlights SQL keywords (bold), functions, strings (italic), numbers, and comments (italic) using Dracula color schemedisplay:none) and is shown after rendering<span> tags needed — write plain SQL in the hood.sql fieldChoose 6 topics. Aim for variety across tag types:
For each topic, use the ontario-data MCP tools. You can search across portals:
portal= to narrow (e.g. portal="toronto")Collect for each dataset:
get_dataset_info)https://{portal-base-url}/dataset/{slug} — use the slug, NOT the UUID. For Ontario: https://data.ontario.ca/dataset/{slug}. For Toronto: https://ckan0.cf.opendata.inter.prod-toronto.ca/dataset/{slug}. For Ottawa: https://open.ottawa.ca/datasets/{slug}.get_dataset_info)Good questions are:
Bad questions: "Show me data about X" (too vague), "Query the Y table" (too technical)
Before writing any narrative, you MUST query the actual data. This is non-negotiable.
For each example:
Common data gotchas:
TotalEV vs Total EV)TRY_CAST(col AS DOUBLE)"No. of Exceedances" may hold counts per row — SUM() not COUNT(*)query_cached — use LIKE patternssql_query (remote) hits 429 rate limits — prefer download_resource + query_cached (local)For each example, create an object matching the schema above. Key rules:
answer and punchline are separate fields — no HTML in eitherhood.sql is a plain SQL string with \n for newlines — no <span> tags{tool, description} — description is free text (dataset ID, count, format)Before writing the JSON to the page, check every example:
sources[].url is a valid portal dataset URL (e.g. https://data.ontario.ca/dataset/..., https://ckan0.cf.opendata.inter.prod-toronto.ca/dataset/..., or https://open.ottawa.ca/datasets/...)<span>, <strong>, or other HTML in hood.sqlIf any check fails, fix the issue before writing.
Use the Write tool to overwrite site/examples.json with the full array. Do NOT touch site/index.html or any other files — the carousel renderer fetches examples.json at runtime.
Tool names for hood.steps[].tool:
Discovery: search_datasets, list_portals, list_organizations, list_topics, find_related_datasets Metadata: get_dataset_info, list_resources, get_resource_schema, compare_datasets Retrieval: download_resource, cache_info, cache_manage, refresh_cache Querying: query_resource, sql_query, query_cached, preview_data Quality: check_data_quality, check_freshness, profile_data Geospatial: load_geodata, spatial_query, list_geo_datasets
Before finishing, verify:
COUNT(*) vs SUM(quantity_column) — verified which is correct for each datasetget_resource_schema returnedJSON.parse)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.