All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
action.yml: a composite GitHub Action that runs the CLI over a file, a directory, or a glob and annotates each finding on the file it came from. Inputs arepath,resolve, andfail-on; counts are published as step outputs, includingunverifiable-count. Nothing is installed and nothing is fetched: the package has no runtime dependencies, so the action runs the checked-out source offPYTHONPATH, andactions/setup-pythonis pinned to a commit SHA. The exit codes are the CLI's own, with two additions that refuse to pass silently: apathmatching no file is exit 2, and an unreadable document is exit 2 even when every other document is clean.tests/test_action_runner.pyand a CI self-test prove the gate fails on a catalog with a required property removed.
test_every_action_is_pinned_to_a_full_commit_shanow exempts auses: ./reference to this repository's own action, which is checked out at the commit that runs it and has no SHA to pin. The exemption is not a hole: such a reference must resolve to anaction.ymlin this repository.
- An
index-has-keyconstraint whose index no evaluatedindexconstraint builds no longer reports its references as unresolved. NIST populates two such indexes with constraints whose targets carry predicates outside the parsed Metapath subset, so the index is never built and every lookup missed; the references were reported as ERROR against documents that were correct. They are now UNVERIFIABLE and name the index. Measured effect on the 2026-08-15 survey: 29 false ERRORs removed, every one verified by hand against the document first. The imports-withheld run is unaffected, so the 2026-08-14 evidence stands unchanged. - Both findings write-ups reported all eleven
CONSTRAINT_CARDINALITYfindings as ERROR. One is: the run recorded ten of them at WARNING, because they fire onoscal-back-matter-resource-base64-rlink-cardinality, which NIST declares atlevel="WARNING". Their ERROR columns therefore summed to ten findings more than the runs recorded, against named organizations' documents. Both tables now give every code at the severity it was recorded at, and cover all twelve codes rather than eight, so the per-severity sums are the run's own.tests/test_findings_evidence.pyhad pinned the mistake in place by taking each count from the evidence and the word ERROR from nowhere; it now sums the table by severity and checks it against the recorded severity totals. make syncnow runsuv lock --checkbeforeuv sync --frozen.--frozeninstalls fromuv.lockwithout readingpyproject.tomland exits 0 on a lock that no longer matches the manifest, so it was never the lockfile-drift gate it looked like. Measured on a scratch project with a deliberately stale lock.
-
docs/findings/2026-08-15-imports-supplied-survey.mdand its evidence JSON: the same 52 documents re-run with their imports located and supplied. 5,216 of the first run's 5,501 UNVERIFIABLE references resolved to something that exists, 178 resolved to nothing, and 107 still cannot be settled. All four FedRAMP rev 5 baselines went from 2,787 unanswerable control references to zero errors. -
tools/survey.pyfetches the documents named in a target's--resolvecolumn, in one pass before validation, recording their provenance separately undersupporting. A supporting document is never counted as a surveyed document. Findings located inside one are named by its URL rather than by a cache path, so the evidence is reproducible on any machine. -
A generated "Evaluated, but reading an index that is never built" section in
docs/CONSTRAINT-COVERAGE.md, and a break-the-gate test asserting the non-firing direction. -
tests/test_findings_evidence.pynow recomputes both runs' headline numbers, and recomputes the delta table between them from the two evidence files rather than trusting it. -
Data cards under
docs/data/for both ingest sources, anddocs/incidents/with the postmortem convention. The README conformance table now covers all fifteen portfolio standards, states Observability as applying at the library/CLI tier rather than not at all, and names the gaps it has not closed. -
Initial version of the deterministic OSCAL structural validator: model detection across all eight OSCAL roots, a schema-guided document walk, datatype conformance from the schema's own declared patterns, document-wide UUID uniqueness, identifier reference resolution across a document's effective data model, and a rule citation with source URL and retrieval date on every finding, in both text and JSON output.
-
Evaluation of NIST's published Metaschema constraint layer:
is-unique,indexuniqueness,index-has-keycross-references, andhas-cardinality, read out of the vendored*_metaschema_RESOLVED.xmlmodules and reported at the severity NIST declares on each constraint. 78 of the 340 published constraints are evaluated; the other 262 are listed with reasons indocs/CONSTRAINT-COVERAGE.md, which is generated from the vendored files and guarded by a test. -
--resolve, which supplies imported catalogs and profiles from local files so that a reference can be answered definitely rather than reported UNVERIFIABLE. Nothing is ever fetched. -
Vendored, unmodified OSCAL 1.2.3 schema and metaschema snapshots with provenance and SHA-256 hashes recorded in
src/oscal_validate/vendor/SOURCES.mdand enforced bytests/test_vendor_integrity.py. -
Break-the-gate suite (
tests/test_break_the_gate.py), byte-level determinism suite (tests/test_determinism.py), and a no-network suite (tests/test_offline_guarantee.py) that removessocketand runs the validator anyway. -
docs/findings/2026-08-14-published-oscal-survey.mdand its evidence JSON: the validator run over 52 published OSCAL documents from NIST, FedRAMP, and four third-party publishers, with the survey harness (tools/survey.py) and target list committed so the run is reproducible. Thirteen carried at least one ERROR finding; every one was verified by hand before publication. -
Portfolio standards conformance kit: CI running the same
make verifygate as local development, Semgrep and full-history TruffleHog scanning workflows, Dependabot updates, pre-commit hooks, CODEOWNERS,SECURITY.md,CONTRIBUTING.md,CITATION.cff, an ADR log underdocs/adr/, an i18n declaration, responsible-tech audit notes, and a standards and metrics ledger (docs/ROADMAP.md).