-
Notifications
You must be signed in to change notification settings - Fork 0
Changelog
All notable changes to SPARC are documented here. Versions follow semantic versioning. Links reference the risk-sentinel/sparc repository. Full release notes (with verification evidence) live on each version's GitHub release page.
A correctness and integrity release. The through-line: SPARC could produce documents that were not valid OSCAL, and only find out much later — or never. Each fix moves the failure to the point of entry, and none of them fills a gap by inventing content.
-
Every OSCAL XML export was schema-invalid (#827) — the converter emitted children in JSON key order while each OSCAL assembly is an
xs:sequencewith a mandated order, so all seven document types failed their XSD. Ordering was the first of five defects, all the same mistake of treating a per-type schema fact as global: attributes (nameis an attribute of<prop>but an element of<party>), markup-line vs markup-multiline prose,xs:simpleContenttext values, and array naming. The ordering table is now generated from the same XSDs the validator uses, with a drift spec so it cannot rot. - The ATO package (#828, #829) — the manifest was built from the boundary's associations while the archive was built from exports that could fail, so a failed export was skipped silently while the manifest went on naming the missing file. Both now derive from the same results and cannot disagree; omissions are stated with their reason. The package also ships JSON, YAML and XML instead of JSON only, each validated against the schema matching its serialization.
-
POA&M integrity (#832, #840) —
PoamRiskvalidated onlyuuid, and HDF aggregation wrote findings with no OSCALtarget, so a single aggregation run made the whole POA&M non-exportable. Both are now validated at the point of entry. Adeadlineis required as a SPARC rule: a POA&M with no time commitment is not a plan. Nothing is defaulted or synthesised — pre-existing rows are found withbin/rails sparc:poam:audit_risks/audit_findings, which deliberately offer no auto-fix. -
sar_from_hdfreturned schema-invalid OSCAL unchecked (#831) — a consumer got a200and a document no OSCAL tool would accept. It now validates first and answers 502 when the upstream converter output does not conform. - A forgotten password was unrecoverable (#841) — no admin reset, no self-service flow, and the change screen requires the current password. Admins can now issue a temporary password (works with no outbound mail; the user must replace it at first sign-in) or an emailed one-time link. The same release stops the break-glass admin credential drifting out of sync with Secrets Manager.
-
RDS connection from
DB_CREDENTIALS(#834) —DATABASE_URLis rendered at deploy time and pins the password, so rotations did nothing until the next redeploy. SPARC now reads the structured secret at boot, so a rotated password takes effect on the next task restart with no IaC change. Database credentials are also redacted from logs by default. See Configuration.
Behaviour changes: sar_from_hdf answers 502 until a fixed hdf-libs is pinned (mitre/hdf-libs#184); POA&M imports reject incomplete risks and findings; incomplete pre-existing POA&M rows are unsaveable until completed; the ATO package contains 3x the files.
Restores smart-card sign-in, which failed on every browser despite a working card, and supersedes the v1.15.0 image (published unsigned when its build stopped before the signing step).
- PIV/CAC login (#824) — the client certificate forwarded by the TLS proxy was rejected as unreadable, so users who selected their certificate and entered their PIN were told "No smart card certificate was presented". The certificate is now reassembled from the forwarded header regardless of how the proxy encodes it (URL-escaped, header-folded, or with the PEM markers stripped), and diagnostics record the certificate's shape only — never the certificate itself.
-
Consent banner persistence — acceptance is remembered for the browser session. Re-firing on every page load was interposing between the certificate-bearing request and
/auth/piv, which is what made PIV login impossible; session scope keeps the AC-8 notice without breaking authentication.
v1.15.0 -- HDF Aggregation: Re-occurrence Lifecycle + Amendment Approval + Document Aggregation (2026-07-26)
Extends HDF triage from a per-scan worklist into an audit-ready, ATO-integrated flow. Scans are tied to the component they assessed, kept as history with a re-occurrence lifecycle, gated by an approval + ODP-validity flow, and folded into the boundary's assessment documents.
-
Audit-ready scan history + re-occurrence lifecycle (#811) — each ingest records its Target / CDEF and Scope (target-specific vs boundary-wide), and findings are kept per-scan-run as history (
currentflag) rather than overwritten. Every finding carries a lifecycle status — new / carried_forward / re_failed (failing again at worse severity) / expired / superseded — computed against the prior current scan. The triage board defaults to the current scan with an Include history toggle, a Component column, lifecycle badges, and a re-failed banner. -
Amendment approval + ODP validity (#809) — a disposition is a proposed amendment that only suppresses a finding once approved (by an admin or a role granted the new
amendment.approvepermission) and within its validity window. The window comes from the boundary profile's ODP, else a new admin Remediation Timelines SLA table (baseline × NIST criticality → days); an active POA&M for the control means no expiry. Amendments record both decider and approver. -
Aggregate into SSP / SAP / SAR / POA&M (#809) — an Aggregate action (sync or async job) maps findings to controls via their HDF
tags.nist, writes a non-destructivehdf_scan_resultannotation on SSP/SAP/SAR controls, and opens POA&M items for un-suppressed failures. -
Signed HDF package export (#809) — a single HMAC-SHA256 signed bundle (amendments + findings + dispositions), keyed from
SPARC_HASH, that a consumer can archive or feed downstream. FullApi::V1surface for every new action. See User Guide: HDF Amendment Triage.
Turn raw scanner output into auditable disposition decisions. SPARC becomes the translation engine + human-in-the-loop UI between a tenant's scanners and their CI security gate.
-
HDF ingest + triage + amendments export (#447) — upload scanner findings in Heimdall Data Format (single scan or a
saf convertbundle), triage each failed control into one of the seven HDF v3.4.0 override kinds (falsePositive / waiver / poam / vendorDependency / inherited / riskAdjustment / operationalRequirement) with an evidence / POA&M / attestation / risk-assessment linkage and provenance hash, then export a deterministic per-boundary HDF Amendments document your CI applies withhdf amend applybefore itssaf validate thresholdgate. Ingest is idempotent by(boundary, control_id)so dispositions survive re-scans; the export validates itself viahdf amend verify. The #244 severity policy is enforced (no waiver/downgrade on CRITICAL). New modelsScanRun/ScannerFinding/FindingDisposition/RiskAssessment; fullApi::V1surface + a boundary-scoped triage UI. See User Guide: HDF Amendment Triage. - Follow-on — aggregating consumer HDF evidence + amendments into SSP / SAP / SAR / POA&M is tracked in #809.
SPARC's first app-native multi-factor authentication — phishing-resistant and DoD-ready. A FIDO2 security key or a CAC/PIV smart card + PIN is now a complete, single-step login.
-
FIDO2 / WebAuthn passwordless sign-in (#779) — register a security key (YubiKey, Feitian, Token2, platform authenticators) with a PIN and sign in with no password; possession + knowledge in one ceremony satisfies MFA on its own. Authenticator-agnostic, usernameless with an email-first fallback; lockout recovery is an admin key-reset (no self-service codes by design). Enable with
SPARC_FIDO2_ENABLED. See Authentication and MFA and User Guide: Security Keys. -
PIV / CAC smart-card sign-in (#779) — accepts a DoD PIV/CAC certificate, delivering NIST IA-2(12) "Acceptance of PIV Credentials". The mTLS handshake + DoD PKI validation happen at the gateway (ALB/nginx, sparc-iac#559); SPARC consumes the validated cert, maps the EDIPI/email to a user, and fails closed unless the gateway attests verification. Enable with
SPARC_ENABLE_PIV. - FIDO U2F — covered for free via WebAuthn back-compat (non-resident second factor).
Hardening release. SPARC can now run in a locked-down enterprise or DoD environment (private CAs, a mandated TLS egress proxy, a verified LDAPS directory) without weakening any verification — closing the three gaps found by the v1.12.2 outbound-TLS audit.
-
LDAP verifies the directory server certificate (#773) —
simple_tls/start_tlsnow verify withVERIFY_PEERby default (previouslyVERIFY_NONE, leaving bind credentials MITM-open). Supply the directory CA viaSPARC_LDAP_CA_FILEor the container trust store;SPARC_LDAP_TLS_VERIFY=falseis an env-gated, loudly-logged opt-out for legacy internal directories. -
Custom / private-CA container trust (#774) — trust a private, corporate-proxy, or DoD-PKI CA via a runtime mount (
SPARC_EXTRA_CA_CERTS, default/rails/certs) or a build-time bake (certs/→update-ca-trust). Folds into the OpenSSL trust store so every outbound client benefits (Net::HTTP, AWS SDK, and the LDAP default store); public CAs stay trusted. -
Proxy-aware outbound HTTP (#775) — all outbound calls honor
HTTPS_PROXY/HTTP_PROXY/NO_PROXYscheme-strictly via a sharedSparcHttpclient.
A feature + fix patch release bundling eight PRs. Highlights:
-
Evidence API (#756) — evidence is fully manageable over REST (create, update, file-upload, associate with controls); document-scoped control links drive OSCAL back-matter via the durable
/artifacts/:uuidresolver. Uploads guarded by an executable-signature deny-list + size cap (SI-10);collected_at/collected_byserver-recorded (AU-10). See API Reference §Evidence. -
hdf-cli 3.2.0 → 3.4.1 (#764) — moves the HDF↔OSCAL bridge off two silent data-corruption defects (fabricated POA&M expiry dates; conversion-time-stamped SARs) and drops the obsolete
baselinesinjection. POA&M inputs to the amendments path now requirerisks[].deadline. -
Boundary & organization management (#770) — configurable environments (
SPARC_ENVIRONMENTS_LIST, six RMF defaults); a unified boundary Personnel Roster (admin-assigned + legacy memberships, AC-3); organization↔boundary association with an org-admin/instance-admin authorization matrix (AC-3/AC-6); and three UI fixes (CDEF filter on the environment form, uniform clickable Artifact Summary tiles, boundary-scoped artifact management). See RBAC and Configuration. - SonarCloud reliability (#762) — 9 fixes (keyboard-operable summary chips, no page-scroll on Space, table row headers, bounded STIG-parser regex); remaining findings triaged FP/won't-fix.
- Admin: Create User (#755) over the shared provisioning service.
-
Security & deps —
rails-html-sanitizer1.7.1 remediates an XSS advisory (GHSA-cj75-f6xr-r4g7, #767); the scanner-findings audit was reconciled against the UBI9 prod image (#777); GH Actions + AWS SDK bumps (#768/#769).
Production hotfix for the v1.12.0 UBI9 image. Fixes HTTP 500 on all full-layout pages (including /login) whenever SPARC_HEADER_TEXT (the rules-of-behavior header) — or any operator env var rendered into a page, including the consent banner — contained non-ASCII characters. Root cause: UBI9 minimal ships no UTF-8 locale, so Ruby tags ENV[] values as BINARY (ASCII-8BIT) and rendering them into the UTF-8 layout raised Encoding::CompatibilityError; the prior Debian base set LANG=C.UTF-8 implicitly, masking it. Adds LANG/LC_ALL=C.UTF-8 to both build stages plus a build-time guard asserting Encoding.default_external == UTF-8 so it can't silently regress (#750). Release notes.
Migrates the production image from Debian ruby:slim to Red Hat UBI9 (Iron Bank / DISA-aligned), compiling Ruby + jemalloc from source and retiring the recurring Debian perl/glibc CVE-disposition treadmill (#742). Multi-arch (amd64 + arm64), signed and SBOM-attested. Known issue (fixed in v1.12.1): non-ASCII header/banner text returns HTTP 500 on this image. Release notes.
Security release. Enforces boundary-scoped access across SSP, SAR, SAP, POA&M, Evidence, and CDEF — authenticated users only see and act on documents in the authorization boundaries they can access; global (nil-boundary) documents remain open. The web UI now enforces the same rules as the API via BoundaryScopedDocument (NIST AC-3) (#738, #739). Adds evidence validity guards (system-recorded UTC provenance), SSP metadata enrichment sourced from canonical SPARC locations (#737), and supply-chain/scan tooling hardening (#743). Release notes.
Public-surface hardening plus the SonarCloud code-quality remediation and a large accessibility pass; no database migrations. One behavior change (opt-out via config): the Controls layer is now gated behind authentication, secure-by-default — Control Catalogs, Baselines, and Mappings are no longer public. A new SPARC_PUBLIC_CATALOGS flag (default false) lets deployments that front SPARC with their own network auth opt back into public sharing (#726, NIST AC-3). Release notes.
Feature + hardening release. Adds bulk ODP (Organization-Defined Parameter) import for baselines/profiles — upload values as JSON / YAML / XML and preview a non-destructive diff (changed / unchanged / unknown / invalid) before applying, via POST /api/v1/profile_documents/:id/parameters/import/{preview,confirm}. Includes artifact-lifecycle and CSP hardening. Release notes.
Maintenance release. Standardizes internal control-field naming to neutral, OSCAL-aligned identifiers for closer alignment with the OSCAL standard. A transparent data migration updates existing records automatically on deploy — no operator action required. Release notes.
Minor release. Adds a configurable site-wide environment header bar to label a deployment and its rules-of-use, via SPARC_HEADER_TEXT / SPARC_HEADER_TEXT_COLOR / SPARC_HEADER_HIGHLIGHT_COLOR (WCAG-passing defaults; operator colors honored as-is) (#682). Also adds durable artifact references and document index search. Release notes.
Cleanup on v1.9.0. Restores OSCAL POA&M generation under hdf-cli 3.2.0 via the new POST /api/v1/oscal/poam_from_amendments endpoint (hdf convert --from hdf-amendments --to oscal-poam) — the supported replacement for the removed direct hdf → oscal-poam converter (#663). Ships as a full API-first surface (shared service + audit event + request/contract specs + INVENTORY/Postman entries), plus security remediations and an accessibility fix. Release notes.
Minor release. Adds a document review & approval workflow — a new Approvable model, review queue, and BaselineReviewService / DocumentApprovalService, gated by SPARC_REQUIRE_DOCUMENT_APPROVAL (default off, so existing publish flows are unchanged until an org opts in) (#640, #630–634). Also adds authoritative sources & federation — add/import an authoritative source, plus a release-validation gate (API-coverage + nav CSP sweep) (#657, #646). Release notes.
First release since v1.8.6. Bundles a container CVE-baseline remediation (openssl patch, Ruby default-gem CVE pins, oauth2 bump; #621), an org-wide SCA SBOM producer that emits CycloneDX to S3 on push-to-main + daily via the shared container-build-sign workflows (#619), and a fix for API-created documents stuck in pending — metadata-only API creates now resolve to completed, with a new StuckDocumentReaperJob failing genuinely-stalled parses (#618). Release notes.
Accessibility + test-infrastructure release. Ships the Section 508 / WCAG 2.1 AA burndown (#599, #602): a WORM (Write-Once, Read-Many) color architecture where semantic helper keys and single-source .sparc-status / .sparc-heading components own all contrast — views carry no badge/heading hex. 0 axe color-contrast / select-name / label / meta-refresh violations across the 20 core pages in both light and dark themes. Adds the UI Test Net (#572): Layer 2 Playwright post-deploy smoke and Layer 3 axe-core accessibility ratchet. Dependency patches incl. puma 8.0.1 → 8.0.2 (PROXY-protocol-v1 injection hardening, #601). Release notes.
Patch release. Restores SSO login in Chromium browsers — the global CSP form-action 'self' was blocking the OmniAuth → IdP redirect (Chromium enforces form-action on every redirect hop; Firefox does not), so login now relaxes form-action to the configured IdP origins only (#593). Adds database-enforced case-insensitive email uniqueness via a functional UNIQUE index on LOWER(email), plus two base-image perl CVE dispositions. Release notes.
Closes #573 (Layer 2 prerequisite of the UI-testing umbrella #572). Adds POST /api/v1/sessions/from_token, which exchanges a SPARC API Bearer token (or OIDC JWT) for a Rails session cookie so headless test runners (Playwright, Cypress, Chromium) can drive the UI as an authenticated user without scraping the login form. Release notes.
Architectural fix removing the deploy kill-loop class of bug. Any ActiveRecord::Migration marked include DeferredDataMigration registers at db:migrate time (fast — no data work) and runs its body post-boot via an in-Puma Solid Queue job. The container binds its port and passes ECS health checks within seconds even on multi-minute data migrations. Release notes.
Production hotfix. back_matter_resources.uuid carries a global unique index, but v1.8.0's promotion stored the source OSCAL uuid directly as BMR.uuid — two documents legitimately referencing the same source uuid (common across SSP/SAR/SAP/CDEF for shared NIST 800-53 references) crashed the second INSERT mid-migration. Resolves the Uuid has already been taken deploy failure. Release notes.
Production hotfix. The v1.7.0 CSP (#514) enforced script-src with no 'unsafe-inline'; the login page's tab switching used inline onclick= handlers (not nonce-exempt), so users with both local + OIDC/LDAP enabled could not click the Okta/LDAP tabs. Tab handlers moved to nonce'd scripts. Also captures login_failure reason codes. Release notes.
Minor release. Every CDEF mutation now funnels through CdefMutationService, which validates the post-mutation OSCAL against the NIST component-definition v1.1.2 schema before the transaction commits — an invalid result is rejected pre-commit instead of silently persisting. OSCAL back-matter is promoted out of the legacy import_metadata["back_matter"] stash to first-class BackMatterResource rows across SSP / SAR / SAP / Profile / POA&M, with BackMatterResourceChange audit rows on mutation. Bundles #498, #581, #582, #583, #584. Release notes.
Patch release closing the last two API contract-drift bugs from the #433 test suite. The authorization_boundaries controller and every nested controller under it now accept either an id or a slug in the URL (#574), plus RBAC permission-gating fixes. Release notes.
Patch release fixing five prod drift bugs surfaced by the #433 content-style tests. Notably, five #update endpoints (cdef_documents, control_catalogs, control_mappings, profile_documents, and the SSP/SAR/SAP/POA&M document base) now return the detailed serialization so callers can read-after-write to confirm a change (#555). Release notes.
Patch release. Api::V1::BaseController#paginate now reads params[:items] / params[:per_page] (previously ignored, so every index returned the default) with a clamp at MAX_PAGINATION_LIMIT = 200 to block ?items=999999 DoS attempts (#549). Includes a processing-banner fix and a critical CI workflow fix that unblocks image publication. Release notes.
Patch release covering three prod issues surfaced during #433 API testing against sparc.risk-sentinel.org. Headline: recovers the cloned_from_id column on cdef_documents (lost on databases that crossed the #470 squash boundary), fixing a 500 on every /api/v1/cdef_documents verb (#537). Release notes.
Two-line deploy hotfix (#495). v1.6.5 added new converters seed sections but did not bump SeedRunner::CURRENT_VERSIONS["converters"], so production deploys skipped the section and the new aws_config_to_nist Converter never appeared. Bumps converters 1.2.0 → 1.3.0. Release notes.
Cleans up the v1.6.4 AWS Labs bootstrap initializer (ApplicationRecord autoload NameError + 3×-per-boot firing, #492) and splits the v1.6.4 composite AWS converter into two first-class converters (aws_config_to_nist, aws_security_hub_to_nist) that operators can refresh independently from the converter management page (#494). Release notes.
Patch release delivering the operator-facing half of AWS Labs CDEF runtime ingestion (#466). A new initializer enqueues AwsLabsCdefRefreshJob on the first boot where SPARC_AWS_LABS_CDEF_ENABLED=true and no AWS-Labs rows exist, so tenants don't wait for the weekly tick (#487). Bundles a faraday security bump and a thruster patch. Release notes.
Legal-terms harmonization. The top-level LICENSE is now Apache License 2.0, matching what NOTICE, THIRD_PARTY_NOTICES.md, the component dispositions, and the LICENSES/ texts had assumed since v1.6.0 — chosen for its express patent grant and NOTICE provision (#483). Ships alongside the #481 unmapped-component triage. Release notes.
No new app features — the infrastructure of supply-chain transparency. Consolidates three CycloneDX SBOMs into a canonical license inventory (license-inventory.json / .md), adds declarative license-policy.yml + per-component license-dispositions.yml (policy-as-code), enables Trivy --scanners license, and removes the only GPL-3.0 runtime dependency (#472). Release notes.
Maintenance + capability release. Adds Grype SBOM vulnerability scanning consuming the CycloneDX SBOMs (SARIF + HDF, #461), hardens HDF normalization (Node 22 pin + cdxgen JSON SBOM, #463), and clears the dependency-bump backlog with the second migration squash. Release notes.
v1.6.0 -- HDF ↔ OSCAL Translation Bridge, CMS Attestation Export & OSCAL Export Hardening (2026-05-08)
Minor release. Ships the #449 HDF ↔ OSCAL translation bridge — three stateless API endpoints that let tenant compliance pipelines move scan data between the HDF and OSCAL ecosystems without managing the hdf CLI on their side. Bundled with #440 CMS attestation export, #451 OSCAL export schema-validation hardening + uniform error UX, and #453 OSCAL schemas baked into the container (decouples runtime validation from NIST GitHub availability — multi-version validation now works air-gapped). No breaking changes; existing deployments upgrade in place.
Full release notes (with verification evidence) live on the v1.6.0 GitHub release page.
-
HDF ↔ OSCAL translation bridge (#449) — three new authenticated endpoints under
/api/v1/:-
POST oscal/sar_from_hdf— HDF results → OSCAL Assessment Results -
POST oscal/poam_from_hdf— HDF results → OSCAL Plan of Action and Milestones -
POST hdf/amendments_from_oscal_poam— OSCAL POA&M → HDF Amendments JSON (round-tripped throughhdf amend verifybefore serving)
-
-
Optional Evidence back-matter enrichment — pass
?authorization_boundary_id=Nto either OSCAL emission endpoint and SPARC merges the boundary's Evidence + Attestation records into the OSCAL output asback-matter.resources[](with control-id, attestation provenance, and rlinks). Requiresevidence.readon the boundary. -
hdfbinary baked into the SPARC container —bin/install-hdf.shprovisions MITRE hdf-libs v3.1.0 from GitHub releases, SHA-256 verified againstchecksums.txt. Same script used by the security_gate CI job; bumpingHDF_LIBS_VERSIONupdates both surfaces. -
CMS attestation JSON export (#440) —
Api::V1::AttestationsController#exportemits SPARC attestations in the canonical CMS / SAF CLI 6-field schema, denormalized one record per linked control_id. Newfrequency+statuscolumns onattestationsalign SPARC with the upstream pattern without forking the internal model.
-
app/services/hdf_runner.rb— Ruby subprocess wrapper centralizing allhdfCLI invocations (convert / validate / info / stats / amend_verify / amend_apply / version) with structured error class -
app/services/hdf_oscal_translation_service.rb— three translation flows + back-matter enrichment helpers -
app/controllers/api/v1/translations_controller.rb— public REST surface for the translation bridge -
app/services/cms_attestation_export_service.rb— emits CMS attestation JSON (one record per linked control) -
app/controllers/api/v1/attestations_controller.rb— fills the existing UI-only API gap; CRUD +:export -
bin/install-hdf.sh— single source of truth for hdf-cli install (Dockerfile + CI + local dev) -
docs/compliance/hdf-oscal-bridge-demo.md— pipeline-only curl demo for the translation surface
-
Dockerfilebakes the verifiedhdfbinary into/usr/local/bin/via the bootstrap stage (no curl/gnupg in the production image) -
.github/workflows/security.ymlsecurity_gate now usesbin/install-hdf.shinstead of an inline curl-tar block -
app/models/attestation.rbgainsfrequency+statuscolumns and inclusion validators -
attestationsUI form gains frequency + status selects - NIST mapping (CA-2, CA-7, RA-3, SI-2) updated for the new translation surface and CMS export
-
OSCAL export schema-validation leak —
OscalMetadata#build_oscal_metadatawas merging the entiremetadata_extrablob into OSCAL output. ProgressTrackable'sprocessing_stage/processing_message/processing_*_atkeys leaked into metadata and tripped schema validation. Switched toslice(*METADATA_EXTRA_KEYS)allowlist — covers every document type that includes the concern. Version-agnostic. -
YAML/XML download 500s —
download_yaml/download_xmlacross CDEF, SSP, SAR, POAM, Profile, SAP, and Catalog now rescueOscalValidationErrorand redirect with a flash message that includes the?skip_validation=1escape hatch, matching the existingdownload_oscalUX. -
Inconsistent error UX across views — six index views (CDEF, SSP, SAR, POAM, Profile, SAP) replaced their inline plain-link export dropdowns with the shared
_oscal_export_dropdownpartial. The Stimulus controller's newconnect()hook reads?oscal_validation_failed=1&oscal_format=…from the redirected show page and auto-opens the validation modal so direct-URL hits land in the same modal as dropdown clicks. Every human-facing path → same modal, same specific errors.
-
OSCAL schemas baked into the container — new
oscal:bundle_schemasrake task downloads all 5 supported versions (1.1.1 / 1.1.2 / 1.1.3 / 1.2.0 / 1.2.1) × 8 document types from NIST GitHub release assets at Docker build time and writes them tolib/oscal_schemas_bundle/v<version>/<file>plus amanifest.jsonwith SHA-256 checksums.oscal:seed_schemasextended with three-tier fallback: bundle (offline, checksum-verified) → NIST GitHub fetch → legacy disk fallback. Air-gapped deployments validate against all 5 versions without runtime network dependency. -
Two pre-existing bugs fixed in passing:
OscalSchema::NIST_SCHEMA_URL_TEMPLATEwas pointing at araw.githubusercontent.com/.../json/schema/...path that NIST never published — every fetch was 404'ing and silently falling back to disk; only v1.1.2 was ever loaded into the DB. URL corrected to the GitHub release-asset path.DOCUMENT_TYPE_MAPhadoscal_component-definition_schema.jsonfor component-definition; NIST publishes it asoscal_component_schema.json— corrected to match the validator'sSCHEMA_MAP.
-
add_frequency_and_status_to_attestations— addsfrequency(string, nullable) +status(string, default"passed", NOT NULL) + index onstatus. Backwards-compatible; existing rows default topassed.
-
bundle exec rspec— 2150+ examples, 0 failures, 2 pending (real-binary integration specs gated onhdfbeing on PATH) -
bundle exec rubocop— clean on changed files -
bundle exec brakeman— clean (2 ignored, 0 active) - HDF binary install script verified against MITRE release SHA-256
- OSCAL schema bundle verified end-to-end: 37 schemas downloaded, 37 SHA-256 verified at seed time, 37 loaded into the DB
Minor release. Ships the comprehensive Python pytest API test suite (#413, PR #432 — 247 tests across 18 modules covering every documented endpoint), completes the GitHub org migration to risk-sentinel (#430), and absorbs a wave of dependency security patches and bumps. No breaking changes to SPARC user-visible behavior — existing deployments upgrade in place.
Full release notes (with verification evidence and audit context) on the v1.5.0 GitHub release page.
-
Python pytest API test suite — 247 tests, 18 modules, all 95 endpoints covered. Lives at
tests/api/. (#413, PR #432) -
GitHub org migration —
Rebel-Raiders/sparc→risk-sentinel/sparc. Workflows, cosign identity regex, cross-repo dispatch, docs, wiki, compliance CDEFs all retargeted. (#430, PR #434) -
Security patches —
net-imapSTARTTLS-stripping (GHSA-vcgp-9326-pqcp) + CRLF injection (GHSA-75xq-5h9v-w6px, GHSA-hm49-wcqc-g2xg) (PR #438);erbdefense-in-depth againstMarshal.loadof attacker-controlled ERB instances (PR #410). -
jwtmajor bump — 2.10.2 → 3.1.2. SPARC's JWT consumer surface verified compatible (only one file uses the gem); new regression spec covers happy + rejection paths. (PR #289)
- Python pytest suite at
tests/api/— request-level contract coverage for every documented endpoint, parametrized for the three auth modes (#413) - API documentation review — Phase 1 closed: 100% endpoint doc coverage, Postman collection now covers all 95 endpoints (#413, PR #427, PR #428, PR #429, PR #431)
- API procedure document — review-and-automated-testing workflow at
docs/api/SPARC-API-Review-and-Automated-Testing-Procedure.md - OIDC JWT decode regression spec — closes the test-coverage gap for the live JWT happy path (PR #289)
-
.github/CODEOWNERS— admin review required for non-admin PRs (#435)
- Repository now lives at
https://github.com/risk-sentinel/sparc. All cross-repo references in workflows (cosign identity regex,repository_dispatchtarget), app code, docs, wiki, and OSCAL CDEFremarksretargeted (#430) - Implementation plan reorganized — Phase 12 (post-migration test/CI hardening + federation follow-ups) added with priority-ordered backlog (PR #439)
-
net-imap0.6.3 → 0.6.4 (PR #438)- GHSA-vcgp-9326-pqcp — STARTTLS stripping (MITM could silently prevent TLS upgrade)
- GHSA-75xq-5h9v-w6px, GHSA-hm49-wcqc-g2xg — CRLF / command / argument injection
-
erb6.0.2 → 6.0.4 (PR #410) — defense-in-depth: prohibitdef_methodon marshal-loaded ERB instances; release-tooling and packaging fixes -
jwt2.10.2 → 3.1.2 (PR #289) — major version bump; the v3 line requires explicit algorithm on JWK verify (SPARC already passesalgorithms: ["RS256"]), enforces RSA ≥2048 bits (Okta JWKS already meets this), and stricter base64 (RFC 4648). Audit found one consumer (app/controllers/concerns/api_authentication.rb); new spec covers a real RS256 token through the full decode path
-
aws-sdk-s31.219.0 → 1.220.0 -
aws-sdk-rds1.310.0 → 1.311.0 -
bootsnap1.23.0 → 1.24.1 -
faker3.6.1 → 3.8.0 -
rubyzip3.2.2 → 3.3.0 (in-major; only behavioral change in 3.3.0 isZip::InputStreamIO-compat refactor — SPARC consumers unaffected) -
aws-sdk-core3.244.0 → 3.246.0,aws-sdk-kms1.123.0 → 1.124.0,aws-partitions1.1237.0 → 1.1244.0 (transitive)
(PR #437 bundled the application-direct deps in this group.)
Full RSpec on the merged dependency state: 2076 examples, 0 failures. bundle exec rubocop clean.
The entries below predate SPARC's adoption of the public v1.x release line. The
(unreleased)items (2026-03) and thev2.x–v3.xversions were the project's earlier internal numbering. They are retained verbatim for traceability; their functionality is present in the current v1.x releases above.
-
OSCAL XML catalog import — full support for OSCAL 1.x XML serialization format alongside existing JSON and legacy SCAP XML imports; correctly parses
<param>,<select>,<choice>,<label>, and<guideline>elements into the sameparams_datastructure as JSON imports (Issue #162) - Parameter suggestion badges — profile control edit form now shows clickable catalog-defined choices as quick-pick badges above the text input for selection-type parameters; users can click to fill or type custom values (Issue #162)
- Selection info in profile show view — read-only parameter display now shows available catalog options for selection-type parameters
- CatalogImportService specs — 29 new tests covering OSCAL XML format detection, parameter extraction (label, select/choice, guideline, props), enhancement recursion, and JSON regression
- Home screen cards grouped by OSCAL layers — Controls (blue), Implementation (green), Assessment (orange), and Environments (purple) with section headers and colored accent bars (Issue #164)
- Control Mapping card added to home screen under Controls Layer
- Stat tiles redesigned with horizontal OSCAL layer labels — replaced vertical truncated text badges with full horizontal labels (CONTROLS, IMPLEMENTATION, ASSESSMENT, ENVIRONMENTS) above each metric group; each group wrapped in a color-coded container with accent border and tinted background (Issue #164)
- Unique family & control counts — Families and Controls tiles now show distinct counts across all catalogs instead of total rows
- Login page OSCAL diagram updated to include Mapping Model in the Controls Layer
- Login page branding upsized — SPARC logo enlarged from 72px/88px to 96px/120px (mobile/desktop), Welcome heading upgraded from h4 to h3, and description text set to standard body size
- Heatmap card click filtering — clicking anywhere on a heatmap family card body now filters by that family, not just badges/links (Issue #159)
- Family group visibility — empty family groups are hidden when heatmap filter is active
- Profile show page — controls grouped by collapsible NIST families with Expand/Collapse All buttons; catalog sub-parts shown as nested implementation statements
- NIST catalog fixture files — Rev 4 (XML, YAML) and Rev 5 (JSON, YAML) catalog fixtures for test coverage
- Family-level control selection — "Create Profile from Catalog" page now groups controls by family in collapsible accordions with family-level select/deselect checkboxes, tri-state indicators, and expand/collapse all (Issue #151)
- Baseline auto-select — choosing a baseline level (LOW, MODERATE, HIGH) auto-checks all controls matching that impact level via a dedicated server endpoint, keeping baseline logic server-side
- Manage Controls page — existing catalog-linked profiles now have a "Manage Controls" button to bulk add/remove controls with parameter inheritance from the source catalog
-
Stimulus controller —
family_selector_controller.jsreplaces inline vanilla JS with proper Hotwire architecture; supports both dynamic (create) and server-rendered (manage) modes -
profile_controls_bulk_updatedaudit event action for tracking bulk control changes
-
Stable document UUID — dedicated
uuidcolumn on all six OSCAL document tables (SSP, SAR, CDEF, SAP, POAM, Profile), auto-generated by Postgresgen_random_uuid(). OSCAL imports preserve the source document UUID. Exports use the stable column value instead of generating a random UUID each time. (Issue #147) -
OSCAL back-matter support — every exported OSCAL document now includes a
back-mattersection with a SPARC-identifying resource (title, description, rlink to app URL) for auditor traceability -
Centralized back-matter logic —
OscalMetadataconcern providesbuild_oscal_back_matterandsparc_back_matter_resourcemethods, eliminating duplicate implementations across export services - Round-trip back-matter fidelity — imported back-matter resources are fully preserved and merged with the SPARC resource on export; Profile parser no longer strips resource fields
-
Parser consistency — all six JSON parsers now store both
uuidandback_matterinimport_metadata(SAP and CDEF parsers were previously missing these) - Missing
cdef_document_imported,poam_document_imported, andprofile_document_importedaudit event actions added toAuditEventwhitelist
-
User UUID — immutable UUID column for audit traceability, auto-generated by Postgres
gen_random_uuid()(Issue #146) -
Soft-delete (deactivate) — admin can deactivate users instead of hard-deleting; records
deleted_attimestamp andinactive_reasonfor audit trails - Reactivate with force password reset — admin checkbox to require password change on reactivation
-
Password expiration — local-auth users are forced to change password after configurable
SPARC_PASSWORD_EXPIRY_DAYS(default 30); OAuth/SSO users are exempt -
Automatic inactivity deactivation —
InactivityCheckJobdeactivates users who haven't signed in withinSPARC_INACTIVITY_DAYS(default 30) -
SPARC_INACTIVITY_DAYSandSPARC_PASSWORD_EXPIRY_DAYSenvironment variables for user lifecycle configuration - Admin user show page displays UUID, password changed date, deactivation details, and 3-way status badge (success/warning/danger)
- Deactivated users see a specific "account has been deactivated" message at login (not generic "invalid")
- Missing
organization_*audit event actions added toAuditEventwhitelist
- Organization entity with UUID-based audit traceability — organizations own authorization boundaries and serve as the parent grouping unit (Issue #145, Issue #137)
- Admin CRUD interface for organizations with search, status filtering, and pagination
- Organization membership management with senior-official-pattern roles (Org Admin, Head of Agency, CIO, CISO, Risk Executive, etc.)
- Soft-delete via deactivate/reactivate — organizations are never hard-deleted, preserving UUID for audit trails
- Authorization boundaries now link to a parent organization (
organization_idforeign key) -
SPARC_ORG_*environment variables for configuring the default organization name, description, address, and contact info - Default organization seeded with admin user as org_admin
- Dashboard section cards now have consistent OSCAL-layer-colored borders — Controls (blue), Implementation (green), Assessment (orange), Boundaries (purple) — with uniform hover effect (Issue #152)
- "Auth Boundaries" navbar link upgraded to dropdown showing the user's assigned boundaries with status badges and quick navigation; admins see all boundaries (Issue #153)
- Catalog-level OSCAL parameter definitions (
params) extracted and stored during catalog import asparams_dataJSONB column oncatalog_controls(Issue #143) - Control family show view displays parameter badges and expandable parameter details (ID, label, constraint/choices)
- Catalog control edit form with editable parameter labels for organization-specific customization
- OSCAL catalog export now emits
paramsarray on controls when present - Profile "Create from Catalog" inherits parameter definitions from the catalog (not empty)
- Per-parameter value editing in profile control form with save-your-work support
- Publish action on profiles generates a fully-resolved OSCAL catalog merging catalog data with profile modifications (priority, parameter values)
- Resolved catalog download available after publish via Export dropdown
-
OscalResolvedProfileCatalogServicefor building resolved profile catalogs
- Delete buttons across all index views now work with Turbo (changed
link_to method: :deletetobutton_towithturbo_confirm) - Profiles index table fits viewport without horizontal scrolling (fixed-layout table with truncated names)
- Re-seed catalogs (
bin/rails db:seed) to populateparams_dataon existing catalog controls - Run migration for new
resolved_catalog_jsoncolumn onprofile_documents
- Removed duplicate
error_messagecolumn addition fromAddOscalSspEntitiesmigration that causeddocker compose up --buildto fail on existing Postgres volumes (Issue #140)
- Removed aggregate compliance heatmap from home page -- document-level heatmaps remain on individual SSP, SAR, CDEF, SAP, and Profile pages (Issue #136)
- Renamed "Boundaries & Components" section to "Environments & Components" on authorization boundary show page for clearer terminology (Issue #136)
- Rebranded "Project" to "Authorization Boundary" throughout the application -- models, controllers, views, routes, database schema, and documentation now align with NIST RMF / FedRAMP terminology (Issue #124)
- Renamed database tables
projectstoauthorization_boundaries,project_membershipstoauthorization_boundary_memberships - Renamed all
project_idforeign key columns toauthorization_boundary_id - Updated role scope from
projecttoauthorization_boundary - Updated permission keys from
projects.*toauthorization_boundaries.* - Added
docs/groups_users/mindmap.mdcapturing Organization to Authorization Boundary to OSCAL Artifacts hierarchy
- Enforce HTTPS-only traffic with HSTS preload, subdomains, and 1-year max-age (Issue #106)
- Health-check endpoint
/upexcluded from SSL redirect for container probes (ALB, Kubernetes) - Security headers middleware:
X-Content-Type-Options,X-Frame-Options,Referrer-Policy,Permissions-Policy,X-Permitted-Cross-Domain-Policies - Content Security Policy enabled in report-only mode (Bootstrap CDN allowlisted)
- Centralized version constant in
SparcConfig::VERSION— no longer hardcoded in layouts - HTTPS enforcement and security headers test coverage
- Removed hardcoded "Expected Format" tables from SSP and SAR upload pages (Issue #129)
- Replaced with concise import notes referencing data mapping definitions (
lib/data_mappings/) - OSCAL files (JSON, XML, YAML) noted as auto-detected with no mapping required
- Full OSCAL tri-format support: import and export JSON, YAML, and XML for all six document types (Issue #120)
- Six new YAML parser services (SSP, SAR, POAM, Profile, CDEF, SAP) using delegation pattern to avoid logic duplication
- New SAP XML parser service (
SapXmlParserService) completing XML import coverage for all document types - OSCAL export format conversion via
OscalExportFormatService(JSON to YAML/XML) - OSCAL JSON-to-XML converter (
OscalJsonToXmlConverter) with Nokogiri XML::Builder and OSCAL namespace - XSD schema validation for XML exports via
Nokogiri::XML::Schemawith 7 OSCAL XSD schemas - Format auto-detection service (
OscalFormatDetectionService) with extension and content sniffing - Bootstrap 5 split-button dropdown for OSCAL export format selection across all document views
- Upload forms updated to accept
.yamland.ymlextensions - Fixed pre-existing bug in
CdefJsonParserService#parse_oscal_cdef(wrong method call for batch insert)
- Comprehensive audit logging with approximately 80 tracked actions across 16 categories (PR #121, Issue #101)
- Polymorphic subject tracking (
subject_type/subject_id) for resource-level traceability - Admin audit log UI at
/admin/audit_logswith filtering, detail views, and CSV export -
Auditablecontroller concern providing a DRYaudit_loghelper method - Structured JSON logging to
Rails.logger.infofor integration with CloudWatch/Datadog (PR #122) - Fixed silent audit failures in
ControlMappingsController - Authorization failure logging for security monitoring
- Redesigned navbar with OSCAL layer dropdowns organized by function:
- Controls (blue) -- Catalogs, Baselines, Control Mappings
- Implementation (green) -- SSP, CDEF
- Assessment (orange) -- SAP, SAR, POA&M
- User avatar system with upload and remove functionality
- Version badge displayed in the navbar
- PR #118 -- Control Mapping Models
- Fixed user dropdown menu not opening after Turbo navigation (PR #117, Issue #116)
- Full OSCAL/RMF/FedRAMP role coverage with 29 roles (PR #115)
- Restricted catalog and baseline editing to Policy Manager and Instance Admin (Issue #99)
- Summary tiles across all main sections for at-a-glance status (Issue #103)
- Added SPARC SME and Evidence Integration Engineer roles (Issue #96)
- Rebranded "Controls Implementation" to "System Security Plan" throughout the application (PR #113, Issue #97)
- User administration screen with search, suspend, and reactivate capabilities (Issue #93)
- Role administration with permission matrix editing (Issue #94)
- Authorization boundary administration with member and role management (Issue #92)
- PR #112
- Local email/password authentication conforming to NIST SP 800-63B (Issue #70)
- OAuth support for GitHub and GitLab (Issue #34)
- OIDC support for Okta, Keycloak, and generic providers (Issue #33, Issue #35)
- LDAP authentication with bind-and-search pattern
- RBAC system with 29 seeded roles and 20 permission keys
- Login page restructure with OSCAL overview (Issue #90, Issue #102)
- Fixed local login and admin password reset flow (Issue #91)
- PR #73, PR #104, PR #105
- Dark mode fixes for consistent theming (Issue #47)
- Bug fixes for SSP viewing and inline editing (Issue #41, Issue #42)
- Bootstrap 5.3 adoption for modern responsive layout (Issue #51)
- Interactive heat maps for control status visualization (Issue #81)
- Dashboard aggregate heatmap across all documents (Issue #83)
- Full OSCAL schema uplift for all artifact types (Issue #58)
- OSCAL schema validation against official NIST schemas (Issue #45)
- OSCAL metadata management and inheritance (Issue #52)
- Vendor-neutral data mapping schema (Issue #54)
Getting Started
User Guides
- User Guides (index)
- Getting Oriented
- Authorization Boundaries
- Control Catalogs & Baselines
- Converters & Imports
- System Security Plans (SSP)
- Component Definitions (CDEF)
- Security Assessment Plan (SAP)
- Security Assessment Results (SAR)
- POA&M
- Evidence & Attestations
- HDF Amendment Triage
- Compliance Library
- Security Keys & Smart Cards
- Administration
Documentation
- RBAC (Role-Based Access Control)
- Data Isolation
- Screens & UI
- Core Functions & Features
- Framework Mapping
- Integrations
- Architecture
- API Reference
Reference
Links