Skip to content
Campus Alert Archive

Provenance & Standards

How the archive earns its credibility

How a US campus alert gets from a 911 dispatcher’s console into this archive, and the rules that govern every step.

Pipeline

How a case enters the archive

  1. DiscoveryA new incident is identified via official alert archives, branded X/Twitter handles, student newspapers, local TV coverage, Clery Annual Security Reports, or after-action reviews. Both fresh and historical cases are eligible.
  2. VerificationDate, institution, location, casualty counts, and timeline are cross-checked against at least two independent sources before any JSON is written. Building names, street names, and timezones are confirmed against the institution's own materials.
  3. AuthorshipThe case file is composed: alert text reproduced verbatim from the strongest available source, every claim in the context and summary fields paired with an inline source link, every alert tagged with its channel, type, and an honest isVerbatimConfirmed flag.
  4. ValidationEvery file passes through scripts/validate-cases.mjs, which enforces schema integrity, character-count parity, chronological ordering, slug uniqueness, and ISO date formatting. Cases failing any required rule are rejected before merge.
  5. PublicationOn merge to main, the static site rebuilds and the case is live at a permanent URL. The full JSON remains in the open repository so any reader can audit the underlying data.

Editorial standards

Non-negotiable rules

Five rules govern every case in this archive. They are reproduced verbatim from the project's editorial guide and any case that violates one is corrected or removed.

  1. 01
    Preserve all typos.“shots fire” stays as “shots fire.” Typos are authenticity markers.
  2. 02
    Every annotation must be specific to that message.Never generic observations.
  3. 03
    Confidence ratings must be honest.HIGH = verbatim from official source. MEDIUM = from reliable secondary. LOW = partial/reconstructed.
  4. 04
    Prefer SMS versions over email versions when both exist.SMS reflects the constraint environment.
  5. 05
    Alert timestamps must be chronologically ordered.Sequence 1 before sequence 2 before sequence 3. An alert cannot precede the incident it describes. The validator enforces this.

Data collection

Every case in this archive originates from publicly available sources. No case is fabricated, extrapolated, or composited from multiple incidents. Each case documents a single incident at a single institution with one or more alert messages reproduced verbatim from their original source.

Sources include official university alert archives, institutional social media accounts (primarily Twitter/X), student newspaper reporting, local media coverage, Clery Act Annual Security Reports, and after-action reviews. Source attribution is recorded at the alert level and the case level.

Verbatim fidelity

Our goal is to capture every alert in its exact, original wording. When we can confirm that wording from a primary source, we reproduce it exactly as sent, down to the typos, the odd capitalization, and the formatting quirks, because those details are evidence. When UNLV sent “shots fire” instead of “shots fired” during the December 2023 shooting, that was not an error for us to correct. It is the record of someone typing as fast as they could while a shooting was underway.

Cleaning up alert text would destroy the evidence of how humans actually communicate when lives are at stake.

Not every case has reached that bar yet. Where the exact transmitted text has not been recovered, the alert is reconstructed from reporting and clearly labeled as such, with an honest confidence rating. Tracking down and verifying the true verbatim wording is continuous, ongoing work: since July 2026 it is a dedicated recovery workstream (described under who does what) that visits official alert archives, transcribes the transmitted text exactly, and logs every confirmation in a hash-verified evidence ledger before it can be published.

Confidence ratings

Every case carries a confidence rating that tells you, up front, how reliable its source material is:

HIGHVerbatim text confirmed from an official institutional source: alert archive page, official social media account, or screenshot with clear provenance.
MEDIUMText sourced from reliable secondary reporting: student newspapers, established local media, or academic after-action reviews that quote alert text directly.

There is no LOW tier here: this edition includes only cases with at least one alert confirmed word for word, and it never displays paraphrased or reconstructed alert text. Where a message’s exact wording is not confirmed, the timeline shows a note that a message was sent, with a link to the source, instead of any text at all.


The Clery Act framework

The Clery Act (20 U.S.C. § 1092(f)) and its implementing regulations (34 CFR § 668.46) require all Title IV institutions to issue two distinct types of alerts:

Emergency Notifications (§ 668.46(g))

Required for any significant emergency or dangerous situation involving an immediate threat to health or safety on campus. Can be targeted to specific segments of the campus community. Must be issued “without delay” unless doing so would compromise efforts to contain the emergency.

Timely Warnings (§ 668.46(e))

Required for Clery Act crimes that pose a continuing threat to students and employees. Must reach the entire campus community. Crimes covered include murder, sexual assault, robbery, aggravated assault, burglary, motor vehicle theft, and arson.

Each case is classified under one of these categories, plus “advisory” for non-Clery discretionary notifications, “missing-student” for HEOA 2008 cases, and “test” for drills. Classification is based on incident type and apparent institutional intent, not on whether the institution correctly identified the legal obligation.

The distinction matters when reading across cases: the two categories carry different legal expectations. An emergency notification must go out “without delay” once an immediate threat is confirmed, while a timely warning follows a crime report on a slower, report-driven clock. Message timing, audience, and content therefore should not be pooled across categories as if they answered the same obligation; every case page and the search filters carry the category label so readers can keep them apart.

Annotations

Every alert message includes analytical annotations: observations about language choices, timing, channel selection, compliance implications, or comparison to other cases. Annotations must be specific to the individual message, not generic observations about the incident. An annotation like “Uses Run-Hide-Fight protocol language” is acceptable only if accompanied by specifics: which formulation, how it compares to the standard, what it reveals about the institution's approach.

Validation

Before publication, every case has to pass a strict rule set:

  • Valid JSON structure with all required fields present
  • No duplicate case IDs or URL slugs
  • At least one alert message per case
  • At least one source per case
  • Sequential alert numbering, chronologically consistent
  • Character counts match verbatim text length
  • Valid ISO 8601 timestamps with timezone offsets
  • Two-letter state codes
  • Slug format compliance (lowercase alphanumeric with hyphens)

Cases that fail validation on any required field are rejected. Cases with warnings (short headlines, missing annotations, character-count mismatches within tolerance) are flagged for review but not blocked.

Message Anatomy analysis

Beyond the verbatim record, every confirmed first-burst alert is coded for the six evidence-based elements of an effective warning message: the source (who is sending it), the hazard (what the threat is), the location (where it is), the guidance (the protective action to take), the time (when the message applies), and the impact (what the hazard could do). The core five come from public-warning science, including the work of Mileti and Sorensen, the CDC Crisis and Emergency Risk Communication framework, and FEMA IPAWS and WEA content guidance; the sixth, impact, was added on the recommendation of Dr. Jeannette Sutton, one of the field's foremost warning researchers, whose work on the content of Wireless Emergency Alerts informs the Impact definition used here (her research program and practitioner resources are introduced on the Message Anatomy page).

The coding is not keyword matching. Each alert is read in full and judged, element by element, by 25 independent AI passes, each recording a verdict and a written justification. The base corpus was coded by Claude Opus 4.8 and the July 2026 gap-fill by Claude Sonnet 5; alerts that become eligible later are coded by the same 25-pass method with the coding model recorded on each entry. The headline result for an element is the majority vote across those 25 passes. A further arbitrator pass then reviews all 25 reads and writes a final one-to-two sentence synthesis for each element.

This is exploratory research. The codings are AI-generated and are not human-reviewed, so they should be read as systematic AI judgments with visible reasoning rather than validated ground truth. The analysis is shown interactively on the Message Anatomy page and is included in the data exports: the consensus and arbitrator assessment are folded into the “Everything” export on each coded case's first alert row, and the full element-coded dataset (consensus, per-element vote counts, and all 25 per-pass reads) is downloadable on its own.

Growing the archive: who adds new cases and policies

As of July 2026, growing the archive (researching and writing new cases, researching and writing new campus alert-and-warning policies, and fact-checking what is already published) is owned by Claude Sonnet 5. Sonnet 5 works the same pipeline described above (Discovery → Verification → Authorship → Validation → Publication), typically running several parallel research agents per session, each gated by scripts/validate-cases.mjs and scripts/validate-policies.mjs before anything is committed.

OpenAI Codex, a separate non-Claude agent, contributes to this same effort in small bounded batches under CODEX.md and docs/codex-work-packets/. Codex proposes its batches as pull requests; Claude Sonnet 5 reviews and merges them, holding Codex’s work to the identical validator-enforced quality bar as its own.

Recovering the exact transmitted wording of alerts is a separate, dedicated workstream owned since July 2026 by SuperGrok Heavy (xAI), which runs with an unrestricted browser and visits official university alert archives directly. Its rules are strict by design: an alert may be marked verbatim-confirmed only when the complete transmitted text is visible at a specific public URL, transcribed exactly (typos preserved), and every confirmation is recorded in an append-only evidence ledger carrying the source URL, an archived snapshot attempt, and a cryptographic hash of the exact text. A machine gate ( scripts/validate-grok-contribution.mjs) cross-checks every claimed confirmation against that ledger before a contribution can merge, and Claude Fable 5 supervises the workstream: it sets weekly priorities, regenerates the worklist, and spot-audits recovered text against the cited sources. When recovered evidence shows a previously confirmed text was wrong, the entry is corrected or demoted to reconstructed status; those reversals are logged the same way and treated as first-class work.

The analytics layer

The archive’s cross-corpus analytics layer is owned by Claude Fable 5, a newer Anthropic model than the ones that compile the corpus. The division of labor is deliberate and disclosed: content growth (researching and writing new cases and policies) is led by Claude Sonnet 5, who also reviews and merges the batches OpenAI Codex contributes; Claude Opus 4.8 and Claude Sonnet 5 produce the per-alert message-element coding; Fable 5 designed and maintains the computation layer that reads across all of it, and authored the interpretation.

The same standard applies as everywhere else on this site: the analysis is AI-generated and not human-reviewed. It is presented so that a skeptical reader never has to take a conclusion on faith: recompute any figure from the raw data export and it should match; if it does not, the finding is wrong and the maintainer wants to know.

Institutional diversity

The archive aims for coverage across every institution type and region, and all cases are treated and weighted equally. Some institution types (community colleges, HBCUs, tribal colleges, institutions in US territories, small liberal arts colleges) are systematically underrepresented in public archives due to archival practices, not crime rates. Gaps in coverage are tracked and reported. If an institution type or geographic region is missing from this archive, that is a gap in the public record, not an indicator of safety.

Data schema

The complete data schema is defined in TypeScript and enforced at build time. Key structures:

CaseStudy {
  id:          string       // YYYY-MM-DD-institution-slug
  slug:        string       // URL-safe routing slug
  institution: Institution  // name, state, type, alertSystem
  incident:    Incident     // date, type, cleryCategory, headline, summary
  alerts:      Alert[]      // verbatim messages with annotations
  sources:     Source[]     // attributed provenance
  confidence:  high | medium | low
  tags:        string[]
}

Export field reference

The downloadable exports flatten the case files into tables. The default research export is at the alert grain: one row per alert message, with case-level fields repeated on every row.

Alert grain (one row per alert message)

caseId
Stable case identifier (YYYY-MM-DD-institution-slug).
date
Incident date, YYYY-MM-DD.
institution
Full official institution name.
shortName
Common abbreviation, e.g. UNLV.
state
Two-letter state or territory code.
institutionType
Institution category (public-r1, hbcu, community-college, …).
incidentType
Incident classification (active-shooter, bomb-threat, …).
cleryCategory
Clery classification: emergency-notification, timely-warning, or advisory.
resolution
How the incident resolved, where recorded.
headline
The case's editorial headline.
alertSequence
1-based order of this message within the case.
alertType
initial, update, all-clear, follow-up, or correction.
channel
Delivery channel (sms, email, twitter-x, sirens, …).
timestamp
ISO 8601 carrying the campus UTC offset; the local fields are the campus wall-clock reading.
timestampApprox
Honest prose fallback when no exact send time is known.
verbatimText
The exact alert text, typos preserved.
isVerbatimConfirmed
TRUE = confirmed exact wording from the cited source; FALSE = reconstruction from coverage.
characterCount
Exact length of verbatimText.
alertSourceDescription
Short label for where this alert's text came from.
alertSourceUrl
Direct URL to the source of this alert's text.
caseConfidence
Case-level confidence rating: high, medium, or low.
caseUrl
Permanent URL of the case page in this archive.

“Everything” adds

alertAnnotations
The archive's editorial annotations for that message, joined with " | " in flat formats; JSON exports carry the full array.
incidentSummary
The case's 2-4 sentence summary.
incidentOutcome
Outcome of the incident, where recorded.
responseTimeMinutes
Minutes from incident start to first alert.
context
The case's narrative context.
keyFindings
The case's key analytical findings.
tags
Freeform case tags.
alertSystemName
The institution's branded alert system, e.g. RebelSAFE.
alertPlatform
Underlying vendor platform, where known.
enrollment
Approximate enrollment, where recorded.
allSources
Every case-level source with title and URL.
dateAdded
Date the case entered the archive.
lastUpdated
Date the case was last revised.

Dataset wrapper & integrity notes

The full-dataset download at /data/cases.json wraps the case records in a small envelope: generatedAt (ISO build timestamp), version (the dataset version, e.g. 2026.07), source (the site URL), count (number of cases), license (reuse terms), and cases[] (the full canonical case objects). Per-case canonical records (byte-for-byte copies of the repository files) live at /data/case/<slug>.json. A machine-readable codebook documenting every export column lives at /codebook.json.

Confidence semantics, in one line each: high = verbatim from an official source; medium = reliable secondary sourcing; low = substantially reconstructed.

CSV only: cells beginning with =, +, @, or a tab are prefixed with a single quote (') to prevent spreadsheet formula injection. JSON artifacts are never altered.

Flat formats (CSV, Excel, HTML, PDF) pipe-join multi-value fields such as annotations; JSON exports preserve the underlying arrays.

How to cite

Every case page carries a “Cite this case” card with a plain citation, a copyable BibTeX entry, and a download of the case's canonical JSON record. To cite the whole archive, use the versioned citation on the Dataset page, which also carries every download and the license. One caveat: the alert text itself remains the work of the issuing institution, and this archive is a secondary source. Where the original wording matters to your argument, cite the institutional source recorded on the alert as well.

For mission and funding context, see the about page.