Three funnel hoppers of different sizes feeding one trough that tips onto a balance pan, whose beam carries a heavy counterweight and lifts a row of five rising bars, cut diagonally so the far bars and housing are drawn as ghosted outlines, with a sky-blue line running from the largest hopper along the beam into the tallest bar.
Other

CrimeStats

Pulls US city crime statistics from public sources (FBI crime data, city police data portals, state open-data portals, rate aggregators): rates per 100K, year-over-year trends, recent incidents and city comparisons, defaulting to a configured home city

04
Workflows
00
Tools
02
References
09
Triggers

Key Points

Not for people investigations

Inside the Skill

The thinking, frameworks, and architecture that distinguish this skill from a generic version of the same task.

Ideal State

  • The numbers are for the city the user meant: the named city verified by its state (and county and ZIP for the configured city), or the configured default city when none was named.
  • Every reported figure names its source and data year, and the answer flags the caveat that shapes it (source baselines that disagree, FBI lag, felony-only portal counts, partial incident feeds, small-city rate swings).
  • Rate answers carry, when available, the total, property, violent, burglary, robbery and vehicle theft rates per 100,000, the YoY change as a percentage, and the percentage above or below the national average, with absolute numbers alongside for small cities.
  • Each pull is saved as dated JSON under the Data Storage path, so a later run can compare against it.

Anti-criteria

  • Never reports or stores the names of people arrested, accused or involved in an incident: figures, offenses, dates and block-level locations only.

Intent Routing

Intent Trigger File
QuickStats "crime stats", "how safe is", "crime rate for" Intents/QuickStats.md
TrendAnalysis "crime trends", "getting worse", "increasing crime" Intents/TrendAnalysis.md
IncidentReport "recent incidents", "what happened", "police reports this week" Intents/IncidentReport.md
CompareRegion "compare", "vs", "safer than", "how does X compare" Intents/CompareRegion.md
File Read when
DataSources.md choosing or calling a source: URL patterns, the police-portal access patterns by type (CitizenRIMS, Socrata, ArcGIS, map-only), FBI and state DOJ access, the dated national averages
Setup.md first-time setup: filling Config.md, finding the police portal type, the optional FBI API key, a proof command

Data & Config

All city-specific values (default city, county, state, ZIP, neighboring cities, the local police portal URL, and the concrete per-city source URLs) live in the principal's own config, not in this skill. First-time setup and a proof command: Setup.md.

<configRoot>/LIFEOS/USER/CUSTOMIZATIONS/SKILLS/CrimeStats/Config.md configRoot is $CLAUDE_CONFIG_DIR when set, else ~/.claude.

Default city: when no city is specified, use default_city (with its state, ZIP, and population) from Config.md. If Config.md is absent or default_city is unset, ask which city and state to use, and point at Setup.md so the answer can become the default; never guess a city. Load Config.md for the local police portal, neighboring cities, and city-resolved source URLs whenever an intent needs them. Skill files stay generic and describe the procedure against "the configured city."

Neighboring cities for comparison: the neighboring_cities list in Config.md (or, for any other target city, geographically adjacent cities of similar size).

Data Storage

Historical data persists at: ~/.claude/LIFEOS/MEMORY/DATA/CrimeStats/. The directory does not exist on a fresh install, so every intent runs mkdir -p ~/.claude/LIFEOS/MEMORY/DATA/CrimeStats before its first write.

File naming: YYYY-MM-DD_{city}_{state}_{intent}.json

Example: 2026-03-22_springfield_xx_quickstats.json

Gotchas

  • Police-portal counts are not FBI counts. Each portal publishes whatever offenses the department chooses (CitizenRIMS, for example, lists felonies only), so read a dataset's offense list before comparing its totals with FBI UCR figures, which include all reported offenses.
  • Portal date parameters are vendor-specific. CitizenRIMS wants JS toDateString() form with the correct weekday ("Tue Mar 24 2026") and returns 500 on a wrong one; generate the string, never type it (DataSources.md Tier 0). Socrata and ArcGIS take ISO timestamps.
  • FBI annual data lags the calendar year by five to eight months. The national estimates arrive as a First Look around May and the full Reported Crimes in the Nation report around August of the following year; agency-level monthly data has been on the Crime Data Explorer since August 2025. Check the CDE for the latest year before saying a year of FBI data does not exist, and name the data year with every figure.
  • AreaVibes vs NeighborhoodScout vs CrimeGrade use different baselines. Rates can differ 10-40% across sources. Always cite the source.
  • SpotCrime incident data is not comprehensive. It only shows reported incidents from participating agencies. Absence of data != absence of crime.
  • Same-name-different-state confusion is common. Many US cities share a name across states. Always verify you're pulling the configured city in its state (county + ZIP in Config.md), not a same-named city elsewhere.
  • Crime mapping sites are often paywalled or bot-protected. NeighborhoodScout limits free access. Fall back to AreaVibes or CrimeGrade.
  • State DOJ open-data portals have agency-level data where the state publishes it, but the explorers are client-rendered apps — use the downloadable CSV datasets, not web scraping.
  • Per-capita rates swing wildly for small cities. Below roughly 100,000 residents (check population in Config.md or the census figure for a named city) a handful of incidents moves the rate noticeably. Always show absolute numbers alongside per-100K rates.

Examples

Example 1: Quick city snapshot

User: "What are the crime stats for my city?"  (or a named city + state)
-> QuickStats intent (default city from Config.md if none named)
-> Rates per 100K, % vs national and YoY change for each category, a safety grade and a one-line takeaway, sources cited

Example 2: Trend analysis

User: "Is violent crime going up here?"
-> TrendAnalysis intent
-> YoY table against neighboring cities, the state and the nation, plus a multi-year table when the data exists and 3-5 key findings

Example 3: Recent incidents

User: "What crimes were reported in my city this week?"
-> IncidentReport intent
-> Incident list with dates, locations, types, a count summary and any patterns

Example 4: Regional comparison

User: "How does my city compare to the neighboring one for crime?"
-> CompareRegion intent (neighbors from Config.md)
-> Side-by-side table of every metric with the national baseline, YoY trends, victimization risk, and the safest city named

Workflows & Routing · 4

Each workflow is one job the skill runs. The trigger phrases route your request to the right one — this is the skill's routing table.

  1. 01
    QuickStats Intents/QuickStats.md

    crime stats, how safe is, crime rate for

  2. 02
    TrendAnalysis Intents/TrendAnalysis.md

    crime trends, getting worse, increasing crime

  3. 03
    IncidentReport Intents/IncidentReport.md

    recent incidents, what happened, police reports this week

  4. 04
    CompareRegion Intents/CompareRegion.md

    compare, vs, safer than, how does X compare

How to Invoke

Say any of these to your DA and LifeOS activates the CrimeStats skill automatically:

  • "crime stats"
  • "crime rate"
  • "crime trends"
  • "violent crime"
  • "property crime"
  • "recent incidents"
  • "neighborhood safety"
  • "compare cities"
  • "is my city safe"

Or invoke explicitly:

Skill("CrimeStats")

References · 2

Auxiliary files the skill loads at runtime — frameworks, guides, configs.

  • DataSources
  • Setup

Want LifeOS to do this for you?

Install LifeOS on your machine — your DA gets the CrimeStats skill plus 96 others, all hooked into one Life OS.