Tools · CLIN 0003 Cybersecurity & compliance
OSCAL Validator
PlannedCheck OSCAL catalogs, profiles and system security plans against the schema, locally.
This tool is planned. There is nothing to open yet. What follows is the plan, and it can change before the tool ships. The guide below covers the same job by hand in the meantime. Jump to the full specification.
What it will do
Open an OSCAL catalog, profile, component definition or system security plan. The tool checks that the file is well-formed and that it matches NIST’s schema for the OSCAL version named in its metadata, and lists each problem with its location. It cannot tell you whether the content describes your system accurately.
You bring
- An OSCAL file
You get
- Whether the file is well-formed and schema-valid
- Each error, with where in the file it is
Built from
Only material the government has officially released to the public. Where the rules live shows how to find and cite each one.
Do it by hand today
- STIGs, OSCAL and SBOMs · Checking an OSCAL fileThree machine-readable formats that security compliance work runs on: what each one is, what is inside the file and how to check one.
True of every tool
- Free and open source.
- No paid tier, no ads, and the code is public.
- Runs in your browser.
- What you type or open is not sent anywhere.
- No tracking.
- No accounts, cookies or analytics.
- Shows its sources.
- Each result names the rule it rests on, so you can check it.
- Says what it does not do.
- It is an aid for your own work, not professional advice.
What happens to what you type shows how to confirm this yourself, and Check a tool’s answer is the method for verifying a result.
Want it sooner?
Requests decide what is built first. Say what you would use it for, and what you do by hand today.
Issues are public. Leave out real contract data, real rates and anything controlled. How to write a useful request.
Specification · draft
How it is meant to work, in detail
The inputs, the logic, the checks the tool has to pass and the worked examples it is tested against. It is a draft, and the tool is built from it, so it can change until the tool ships.
3 min readLast revised November 2026Source of this specification
Overview & Role#
The OSCAL Validator (slug: oscal-validator, CLIN 0003 — Cybersecurity & compliance, template family validator) is a static, browser-only tool that checks Open Security Controls Assessment Language (OSCAL) JSON documents locally without sending system security plans or assessment data to a remote server. It separates validation into three distinct stages—well-formedness, official NIST schema conformance, and internal reference integrity—so engineers know exactly why a file passes or fails.
Scope boundaries:
- Validates OSCAL JSON documents locally against bundled NIST OSCAL JSON schemas.
- Does not fetch remote profiles, catalogs, or external
hreftargets over the network (blocked byconnect-src 'self'). - Does not determine whether an OSCAL System Security Plan (SSP) accurately describes a real-world system; a file can be schema-valid and still factually wrong.
Governing Regulations & Sources#
- NIST OSCAL (Open Security Controls Assessment Language) at pages.nist.gov/OSCAL/: Official JSON Schemas and model definitions across all three OSCAL layers:
- Controls layer:
catalog,profile - Implementation layer:
component-definition,system-security-plan - Assessment layer:
assessment-plan,assessment-results,plan-of-action-and-milestones
- Controls layer:
- RFC 8259 (JSON Data Interchange Format) and JSON Schema specifications used by the bundled NIST OSCAL schema releases.
Inputs, Processing Logic & Outputs#
Inputs
- OSCAL document: Local
.jsonfile upload (FileReader) or pasted JSON text. - Bundled sample fixtures: Built-in synthetic
catalog,profile, andsystem-security-plansamples for offline testing. - Optional version override: Defaults to auto-detecting
metadata.oscal-versionfrom the document; allows selecting from bundled NIST OSCAL schema versions (e.g.,1.0.4,1.1.2,1.1.3).
Deterministic Three-Stage Processing Logic
- Stage 1 — Well-formedness check:
- Parses input with
JSON.parse(). - If parsing fails, reports the syntax error message and position and halts Stages 2 and 3.
- Parses input with
- Stage 2 — Schema-valid check:
- Detects the root OSCAL model property (
catalog,profile,component-definition,system-security-plan,assessment-plan,assessment-results, orplan-of-action-and-milestones) and readsmetadata.oscal-version. - Selects the exact bundled NIST OSCAL JSON Schema for that
oscal-version. If the version is not bundled, fails closed with an explicit unsupported-version error rather than validating against a mismatched schema. - Runs the deterministic schema validator and collects every violation with its JSON Pointer path (e.g.,
#/system-security-plan/metadata/last-modified) and schema keyword.
- Detects the root OSCAL model property (
- Stage 3 — Reference & meaningful integrity checks:
- Verifies that
uuidfields match UUID syntax and checks for duplicate UUIDs within the document. - Verifies that internal fragment references (
#uuid) inimport-profile,link, orrlinkresolve to an existinguuidinback-matter.resourcesor the document's own elements. - Flags external
http://orhttps://hrefreferences asinfo: external reference not fetched offlineso users know external links were not resolved. - Checks presence of key metadata fields (
title,last-modified,version,oscal-version).
- Verifies that
Outputs
- Three-stage status summary: Pass/Fail/Skipped badges for Stage 1 (Well-Formed), Stage 2 (Schema-Valid), and Stage 3 (References Checked).
- Detected document header: Model type,
oscal-version, documentuuid, andmetadata.title. - Diagnostics table: Severity (
error|warning|info), Stage (1|2|3), JSON Pointer path, and message. - Exportable validation report: Downloadable JSON or Markdown summary generated client-side.
Clean-Room & 5-Condition QA Requirements#
- Browser-only execution: JSON parsing, schema validation, and reference checks run entirely in browser memory with zero backend APIs.
- Strict Content Security Policy: Enforces
default-src 'self',connect-src 'self', andform-action 'none'so sensitive SSPs, assessment results, and POA&Ms never leave the user's workstation. - Zero tracking or accounts: Zero login walls, analytics, cookies, or remote schema fetches.
- Offline operation: Official NIST OSCAL JSON schemas and synthetic test fixtures are bundled inside the static repository; validation works with the network disconnected.
- Clean-room & data hygiene: Bundled samples are synthetic/public only. Reminds users that real SSPs and assessment results may be CUI and should only be opened on approved systems (linking to What happens to what you type), and includes MIT
LICENSEand NIST OSCAL citations.
Worked Example & Verification#
Worked Example (Minimal Synthetic system-security-plan):
- Valid fixture: A synthetic
system-security-planJSON withoscal-version: "1.1.2", valid UUIDv4 identifiers, requiredmetadata,import-profile,system-characteristics,system-implementation, andcontrol-implementation→ passes Stage 1, Stage 2, and Stage 3 with0errors. - Stage 1 failure: Trailing comma added to
metadata→ Stage 1 fails with JSON syntax error; Stages 2 and 3 are markedskipped. - Stage 2 failure:
metadata.last-modifiedremoved → Stage 1 passes; Stage 2 fails with missing required propertylast-modifiedat#/system-security-plan/metadata. - Stage 3 failure/warning:
import-profile.hrefset to#00000000-0000-4000-8000-000000000099when no matching resource exists → Stage 1 and Stage 2 pass; Stage 3 reports an unresolved internal reference error.