CoolFace
Datasetpublic

ezesecops/rmf-ato-core

RMF/ATO Core Corpus What this is A curated corpus of current-revision NIST Risk Management Framework and authorization publications, plus a second tier of AI governance documents. Every row is source text — one control, one assessment objective, one RMF task, one AI RMF subcategory, one SSDF practice, one document section — carrying the identifiers a practitioner actually cites. It is built for retrieval and fine-tuning around authorization workflows: control… See the full description on the dataset page: https://huggingface.co/datasets/ezesecops/rmf-ato-core.

sourceHugging Facecc0-1.0updated 2mo agoView on Hugging Face
0likes21downloads
Dataset Card

RMF/ATO Core Corpus

What this is

A curated corpus of current-revision NIST Risk Management Framework and authorization publications, plus a second tier of AI governance documents. Every row is source text — one control, one assessment objective, one RMF task, one AI RMF subcategory, one SSDF practice, one document section — carrying the identifiers a practitioner actually cites. It is built for retrieval and fine-tuning around authorization workflows: control selection, SSP and assessment work, categorization, continuous monitoring, and the emerging AI governance overlay.

5,510 rows, 1.9 MB, single `train` split. No embeddings, no synthetic Q&A, no system prompts.

Why another NIST dataset

Existing NIST corpora are typically indiscriminate scrapes, and they share four failure modes. Each is prevented here by construction rather than by cleanup:

Failure modeHow it is prevented
Superseded-document contamination — 1989 guidance sitting beside current guidanceA manifest is the sole authority on scope. Every row traces to one manifest entry. Landing pages are checked for supersession at build time; SP 800-18 Rev 1 was found withdrawn during this build and replaced with Rev 2.
Fabricated control IDs — "control HA-25", "control WE-12", produced when a chunker turns any two capital letters near a number into an identifierA row may carry a control_id only if it came from OSCAL structured data, and the ID must match one of the 20 real SP 800-53 Rev 5 families. PDF-derived rows never carry a control ID, even where the prose names one. Both rules are executable checks, not conventions.
Baked-in prompts — "You are a cybersecurity expert…" prefixed to every rowRow text is source text. Validation rejects any row containing prompt scaffolding or unrendered template markers.
Embedding lock-in — precomputed vectors tying users to one modelText only. Bring your own embedding model.

The dataset is deliberately small. It is meant to be right, not exhaustive.

What's included

doc_iddocumentrevisiondatetierformat
SP-800-37r2Risk Management Framework for Information Systems and OrganizationsRev 22018-121PDF
SP-800-53r5Security and Privacy Controls for Information Systems and OrganizationsRev 5 (OSCAL 5.2.0)2020-091OSCAL
SP-800-53Ar5Assessing Security and Privacy ControlsRev 52022-011embedded in OSCAL
SP-800-53B-LOW/MODERATE/HIGH/PRIVACYControl BaselinesRev 5 (OSCAL 5.2.0)2020-101OSCAL
FIPS-199Standards for Security CategorizationInitial (in force)2004-021PDF
FIPS-200Minimum Security RequirementsInitial (in force)2006-031PDF
SP-800-60v1r1 / v2r1Mapping Information Types to Security Categories, Vols 1–2Rev 12008-081PDF
SP-800-18r2Developing Security, Privacy, and C-SCRM Plans for SystemsRev 22026-061PDF
SP-800-30r1Guide for Conducting Risk AssessmentsRev 12012-091PDF
SP-800-39Managing Information Security RiskInitial (in force)2011-031PDF
SP-800-137Information Security Continuous MonitoringInitial (in force)2011-091PDF
AI-100-1AI Risk Management Framework (AI RMF 1.0)1.02023-012PDF
AI-RMF-PLAYBOOKNIST AI RMF Playbookrolling2026-082JSON
SP-800-218Secure Software Development Framework (SSDF)1.12022-022PDF
SP-800-218ASSDF Community Profile for Generative AIInitial2024-072PDF

SP 800-53A content is extracted from the SP 800-53 Rev 5 OSCAL catalog's embedded assessment parts, not from a separate 53A file — NIST publishes no standalone 53A OSCAL artifact. Those rows are attributed to SP-800-53Ar5 and cite the catalog's hash.

Excluded

Superseded or withdrawn revisions (including 182 withdrawn SP 800-53 controls, each logged by name); NIST annual reports and workshop proceedings; pre-2010 legacy publications except FIPS 199/200, which remain in force; and draft publications. Also excluded from v1: CNSSI 1253 and DoD Instruction 8510.01, whose publishers block automated retrieval; and SP 800-60 Volume 2 Appendix E, which reproduces OMB memoranda and legislative provisions as wide reference tables — source material for the impact determinations rather than guidance, and it extracts as citation soup.

Schema

One row = one chunk.

fieldtypenotes
idstringDeterministic and human-readable: {doc_id}/{chunk_type}/{slug}, e.g. SP-800-53r5/control/ac-2. Oversized rows split into (part n). Stable across versions, so diffs are meaningful.
textstringSource text. Normalized whitespace, paragraph breaks preserved. 80–8,000 chars.
doc_idstringMatches a manifest entry.
doc_titlestringFrom the manifest.
revisionstringFrom the manifest; names the exact OSCAL content release where applicable.
pub_datestringYYYY-MM or YYYY.
tierint321 = RMF/ATO core, 2 = AI governance.
chunk_typestringcontrol, control_enhancement, control_discussion, assessment_objective, assessment_method, baseline, section, task, ai_rmf_subcategory, ssdf_practice, definition, table.
control_idstring or nullLowercase OSCAL form (ac-2, ac-2.3). Null for every PDF-derived row.
section_pathstring or nullWhere it sits: AC > AC-2 > Discussion, CHAPTER THREE > TASK P-1, SSDF Practices > PO > PO.1 > PO.1.1.
source_urlstringThe retrieved artifact's URL.
sha256_sourcestringHash of the exact artifact the row came from.

Rows by chunk type

chunk_typerowschunk_typerows
assessment_method1,014ai_rmf_subcategory154
assessment_objective1,014ssdf_practice94
control_discussion999task47
control_enhancement714baseline4
control300table1
section872
definition297

The 297 definition rows come from five glossaries: SP 800-37r2 (178), SP 800-137 (101), FIPS 199 (13), SP 800-18r2 (3) and FIPS 200 (2). The two large ones mark their entries typographically rather than with punctuation — SP 800-37 sets terms in bold, SP 800-137 marks each entry with a smaller bracketed source line — so both are read from the font, not from a TERM: pattern.

Example rows

json
{
  "id": "SP-800-53r5/control_enhancement/ac-2.3",
  "text": "AC-2(3) Account Management | Disable Accounts\nFamily: Access Control (AC) > AC-2 Account Management\n\nDisable accounts within [Assignment: organization-defined time period] when the accounts:\n(a) Have expired;\n(b) Are no longer associated with a user or individual;\n(c) Are in violation of organizational policy; or\n(d) Have been inactive for [Assignment: organization-defined time period].",
  "doc_id": "SP-800-53r5",
  "revision": "Rev 5 (OSCAL content version 5.2.0)",
  "tier": 1,
  "chunk_type": "control_enhancement",
  "control_id": "ac-2.3",
  "section_path": "AC > AC-2 > AC-2(3)"
}
json
{
  "id": "AI-100-1/ai_rmf_subcategory/govern-1.1",
  "text": "GOVERN 1.1: Legal and regulatory requirements involving AI are understood, managed, and documented.",
  "doc_id": "AI-100-1",
  "revision": "1.0",
  "tier": 2,
  "chunk_type": "ai_rmf_subcategory",
  "control_id": null,
  "section_path": "AI RMF Core > Govern > GOVERN 1.1"
}

Note the ODP rendering: {{ insert: param, ac-02_odp.01 }} in the OSCAL source becomes [Assignment: organization-defined …] / [Selection; one or more: …], the convention SP 800-53 itself prints. No template marker survives into any row.

How it was built

01 verify → 02 fetch → 03 parse OSCAL → 04 parse PDF → 05 chunk → 06 validate → 07 export

Each stage is an independently runnable, idempotent script. Source, tests, and the full rejection log live in the GitHub repository: <https://github.com/ezesecops/rmf-ato-core>

1,131 rows were rejected across the pipeline, every one recorded with a rule and a reason in rejections.jsonl. Rejected content is logged, never silently dropped.

rulerowswhat it is
section_too_short449layout fragments; their text survives, merged into neighbouring sections
withdrawn_control182SP 800-53 controls marked withdrawn in OSCAL
excluded_appendix161SP 800-60 Vol 2 Appendix E — OMB memoranda and legal-provision tables
midsentence_fragment97sections beginning mid-sentence (see Limitations)
duplicate_task_stub96RMF task identifiers repeated in summary tables and contents
trailing_furniture36stub sections with no sibling to merge into
bibliography_entry29reference-list entries: citation apparatus, no guidance
duplicate_information_type_stub26SP 800-60 information-type identifiers repeated in contents
length_bounds19text outside the length bounds for its chunk type
empty_discussion15SP 800-53 discussions whose whole content is "None."
front_matter8title pages, forewords, signature blocks, contents
block_too_short / definition_too_short10identifier blocks and glossary entries that extracted as fragments
near_dupe3text identical to an earlier row; the later row loses

Three review passes shaped this log after the pipeline first ran end to end. The first added the supply-chain rules that reject reference entries, running-header remnants and mid-sentence fragments. The second showed those rules were discarding rows that had real guidance underneath a damaged first line, so the pipeline now repairs what it can — a running-header remnant or a leading citation tag over substantive text is stripped and the row is published, and rows are only rejected when nothing substantive remains. The third recovered content the rules had been hiding: SP 800-137's glossary became 101 definition rows, and decorative drop caps stopped being read as headings. running_header_fragment rejected 101 rows before that repair step existed and rejects none now.

Provenance & integrity

Every artifact was retrieved once, hashed, and recorded. provenance.json ships with the dataset.

doc_idrevisionretrievedbytessha256 (first 16)
AI-100-11.02026-08-081,946,1277576edb531d98488…
AI-RMF-PLAYBOOKrolling2026-08-08413,720aecbee3d3c882081…
FIPS-199Initial (in force)2026-08-0880,35673d19f05f71e30f3…
FIPS-200Initial (in force)2026-08-08218,892107a9b9cdc8eccf3…
SP-800-137Initial (in force)2026-08-08986,9162d1c0bf459f5e1bf…
SP-800-18r2Rev 22026-08-081,313,448640f9124469f285f…
SP-800-2181.12026-08-08739,891617746e553a9e2da…
SP-800-218AInitial2026-08-08650,661e088c8bc75716824…
SP-800-30r1Rev 12026-08-08826,897f214087f0bdb3593…
SP-800-37r2Rev 22026-08-082,270,3274f75e1136bb905a6…
SP-800-39Initial (in force)2026-08-081,228,127cf680760d171fc59…
SP-800-53B-HIGHRev 5 (OSCAL 5.2.0)2026-08-0812,49260576970caef91b2…
SP-800-53B-LOWRev 5 (OSCAL 5.2.0)2026-08-087,2348fd206017c8d718b…
SP-800-53B-MODERATERev 5 (OSCAL 5.2.0)2026-08-0810,4989030dbf1f1316994…
SP-800-53B-PRIVACYRev 5 (OSCAL 5.2.0)2026-08-086,0647e650c4397ad633e…
SP-800-53r5Rev 5 (OSCAL 5.2.0)2026-08-0810,442,03701f37cf90ea99d92…
SP-800-60v1r1Vol 1 Rev 12026-08-08338,3296f13f57f11697efc…
SP-800-60v2r1Vol 2 Rev 12026-08-081,193,4360b4c5128b39a90f1…

SP-800-53Ar5 rows cite the SP-800-53r5 catalog hash, because that is the artifact they were extracted from.

Limitations

  • —PDF section coverage is partial and best-effort. Layout is not structure. Per-unit rows (controls, tasks, subcategories, practices, definitions) are high-confidence; section rows are the residue of heading detection. Content loss to furniture stripping is under 1% for most documents and about 8% for SP 800-218, whose bold bullet lists and two-line headings fragment worst.
  • —Assessment objectives and methods are one row per control, not per leaf clause. A single determination statement ("account managers are assigned;") is not retrievable on its own. This keeps the corpus at ~5.5k coherent rows rather than ~13k fragments.
  • —About 97 mid-sentence fragments were rejected rather than published. PDF page breaks, footnote interleaving and multi-column layout sometimes hand the extractor a passage that starts partway through a sentence (transparent the risk perceptions that organizations routinely use…). Those rows are dropped under midsentence_fragment and logged with the text that was discarded. Two consequences worth knowing: a small amount of real guidance — mostly in SP 800-30r1 and SP 800-37r2 — is missing from the corpus, and section coverage of those documents is therefore not continuous. Repairing the fragments would mean stitching text across page boundaries, which risks joining passages that were never adjacent; dropping them was the more conservative choice.
  • —CNSSI 1253 and DoDI 8510.01 are absent from v1 — cnss.gov and esd.whs.mil block scripted retrieval, and their control tables were out of scope for v1 regardless.
  • —SP 800-60 Volume 2 Appendix E is absent (see exclusions). The information-type entries it supports — 113 D.x rows — are present.
  • —The AI RMF Playbook is a rolling web resource. Its rows reflect the version retrieved on the date above and will drift as NIST updates it.
  • —Nineteen rows fell outside the length bounds and were rejected: one AI RMF subcategory (MAP 1.5, which the Playbook carries in full), two FIPS 199 glossary terms, and sixteen one-line glossary cross-references of the form "See authorization boundary."
  • —This corpus reflects publications as of the build date. NIST revises documents, sometimes without notice — SP 800-18 Rev 1 was withdrawn six weeks before this build. Re-run the pipeline rather than assuming currency.
  • —Not legal or compliance advice. These are reference texts; authorization decisions belong to the authorizing official.

License

Source documents are works of the United States Government and are in the public domain under 17 U.S.C. § 105. No copyright is claimed in them. The compilation, curation, manifest, and derived structure are released under CC0 1.0 Universal.

Maintainer & citation

Maintained by [@ezesecops](https://github.com/ezesecops) — <https://ezesecops.com>

bibtex
@misc{rmf_ato_core_2026,
  author       = {Anene, Ebubeze},
  title        = {RMF/ATO Core Corpus: a curated, provenance-tracked NIST RMF and AI governance dataset},
  year         = {2026},
  publisher    = {Hugging Face},
  howpublished = {\url{https://huggingface.co/datasets/ezesecops/rmf-ato-core}},
  note         = {Built 2026-08-08 from current-revision NIST publications}
}

Found a bad row? That is the most useful thing you can report. Open an issue at <https://github.com/ezesecops/rmf-ato-core/issues> with the row id — every row traces back through sha256_source to the exact artifact it came from, so problems are reproducible.