Evidence Factory
Evidence Factory is a worked demonstration I built at GitLab Public Sector and published as a group of its own, of how a continuous Authority to Operate evidence pipeline for NIST SP 800-53 controls can run without leaving GitLab. It is seven public projects under one group: a driver, a policy plane, a governed CI/CD Catalog, three consumer workloads seeded at three adoption phases, and a landing page that is the guided way in. Read it, walk it, then rebuild the pattern in your own namespace: it is not a product to install.
I built it for the community of practitioners working toward continuous ATO, converging the primitives GitLab already carries, pipeline execution policies, a governed catalog, external status checks and controls, into one worked pattern rather than a scatter of features each team assembles alone. The idea underneath is that a control’s posture can be a byproduct of the pipeline a team already runs, rather than a document assembled once at assessment time, serving both audiences from the same run: a developer wants to know whether this merge request is blocked and which control blocked it, and an assessor wants to know what the current posture is and which artifacts back it. I seeded the three consumer repos on the same report, cutover, enforce ladder egress uses for its own conformance contract.
Two properties make the loop hold. The evidence stage is not something a consumer opts into: a pipeline execution policy in quality-control force-injects conformance-stage.yml into every tagged project, invisible and uneditable from the consumer’s own repository, and what actually blocks the merge is a separate mechanism, a GitLab external status check. The verdict and the evidence behind it are kept apart on purpose, too: factory assess writes one mutable verdict per control, which the Compliance Center reads through an external control, while the evidence is the set of files named in each consumer’s boe.yaml and versioned by git, so asking what the posture is right now and what it was in March are different questions, answered by different systems. Each consumer also carries one deliberately planted gap against a real control ID, which is why container and ci-component run red on main by design.
It’s one continuously refreshed input to a Security Assessment Report, not an authorization package on its own.