Proof of State

What was true, as of a time you can name.

An assessor names a date three months back and asks what your environment was on that day. Dashboards overwrite themselves, and activity logs record that something changed, not what everything was. This layer keeps the record of the moment itself, and a second party can check it without our help.

In one paragraph

Proof of state is a point-in-time record of cloud configuration, taken from the cloud provider APIs, content hashed with SHA3-256, chained to the previous record, retained seven years, and regenerable to any timestamp a second party picks. It answers what was true in the environment on a date somebody else names, not what is true now.

POINT-IN-TIME STATESnapshot / 2026-08-31 02:14:31 UTC
SEALED
RESOURCES42,184
CONTROL LINKS1,084
DECLARED GAPS01
  1. Provider state capturedRaw cloud response retained
    Recorded
  2. Scope attachedBoundary and control mappings recorded
    Recorded
  3. Record sealedSHA3-256 chained to prior state
    Recorded
Illustrative flow · reduced motion

An assessor names a date three months back. Produce the configuration.

Q1Can you produce the configuration of your environment as of a date someone else picks, or only as of today?

The request is ordinary. An assessor names a date three months back and asks what your environment was on that day: which storage accounts enforced encryption at rest, which network paths were open, which identities held which roles, and inside which declared boundary each resource sat. The date is theirs, not yours. That is the whole difficulty.

Dashboards overwrite themselves. A console renders current state, and current state is the one thing nobody asked about. Activity logs record that something changed, not what everything was at a moment. Screenshots preserve whatever someone thought to capture, on the day they thought to capture it. When the date arrives from outside, none of these reconstruct the moment. They reconstruct your best story about it.

Proof of State is the record of the moment itself: point-in-time captures of resource configuration, taken from the cloud provider APIs, content hashed, chained, and kept. As of stops being a reconstruction project and becomes a parameter you pass.

State is the first of three proofs. Proof of Change records what altered the estate and under what authority. Proof of Agency records what your machines were allowed to do before they did it. All three commit to the same evidence base.

What we actually record

One record per resource, per capture, whether the capture ran on schedule or a change triggered it. The claim is not a sentence about the resource; it is the raw provider response underneath, hashed. The field names below are the real ones.

resource.id
The full provider path of the resource this record is about: the identifier the cloud API resolves, not a friendly name someone typed into a spreadsheet.
control.mapping
The control statements this state bears on, stored on the record. One encryption setting can evidence NIST 800-171 3.13.16 and 800-53 SC-28 at once, and the mapping is written down, not implied.
asset.scope
The declared boundary the resource sits in: CUI enclave, environment, production class. Scoping arguments get settled by this field instead of by the meeting.
state.proof
The raw cloud API response that grounds the claim, stored verbatim. If a narrative and this payload ever disagree, the payload wins.
content.hash
SHA3-256 digest of the record content. Anyone holding the record can recompute it; a matching digest means unaltered content, with no trust in us required.
captured.at
UTC timestamp of the capture. Every claim in the evidence base reads as of this field, not as of whenever someone last looked.
retention
Seven years, append-only JSONL. A record is never updated in place; newer state is a new record, chained after the old one.
regenerable.to
Any historical timestamp inside retention. The assessor picks the date; the evidence base rebuilds the environment as of that date from the records written then.
The PolicyCortex evidence system: registered collectors and artifacts grouped by control, each artifact with source, resource path, capture time, size, and SHA hash
Collectors writing hashed artifacts per control: the record family above, as it lands. Illustrative demo data; the interface is real.
state-492118.jsonlone state record, formatted for reading; values illustrative, field names real
# storage account encryption at rest, as of a date the assessor named
record           state-2026-05-14-492118
captured.at      2026-05-14T03:10:22Z
resource.id      /subscriptions/1e6f4c9a/resourceGroups/rg-cui-prod
                 /providers/Microsoft.Storage/storageAccounts/stcuiprod01
control.mapping  800-171 3.13.16  800-53 SC-28  CMMC SC.L2-3.13.16
asset.scope      cui-enclave/production
state.proof      raw provider response, stored verbatim
    encryption.keySource                        Microsoft.Keyvault
    encryption.requireInfrastructureEncryption  true
    supportsHttpsTrafficOnly                    true
    minimumTlsVersion                           TLS1_2
content.hash     sha3:5b19d4a3c7e2
chain.prev       sha3:f04a11c89bd3
scope.declared   2 of 2 connected subscriptions observed, no gap this interval
retention        seven years (until 2033-05-14)
regenerable.to   any timestamp since first capture
as-of scrubberthe assessor picks the date, not us

as of 2026-08-30, assembled from the environment, not from memory.

state-2026-08-30-492963.jsonlrecord on chain
resource                stor-prod-eastus-04
control                 SC-28
encryption.at_rest      enabled
tls.min_version         TLS1_2
public_network_access   Disabled
captured_at             2026-08-30T02:47:33Z
content.hash            sha3:7e50d1a4b98c
chain.prev              sha3:0b64f7e2a1c9

Illustrative records. The shape is real; the values are sample data.

How the record is verified

Each state record is content hashed with SHA3-256 and carries the digest of the record before it, so every line commits to the entire history above it. The log is append-only: a correction is a new record, never an edit. Alter one record, anywhere, at any time, and every digest after it stops recomputing. Verification is a recomputation, not an assertion: run the chain from the first record forward and it returns one of two answers, intact, or the sequence number of the first record that breaks.

A second party can do that recomputation without our help. The records, the digests, and the chain rule are everything required: no PolicyCortex account, no API of ours in the loop, no trust in the operator whose environment is being examined. Retention is seven years, and because the log is a chain rather than a table, producing the environment as of any date is a replay, not an archaeology project.

The documents assessors ask for are projections of this record, not parallel artifacts maintained by hand. SSP, POA&M, and SAR generate from one implementation record, and the package exports as OSCAL 1.1.2. The same record ships in assessor handoff shape for the eMASS and C3PAO exchange, and in program-office shapes for federal environments. The document is never the source. The chain is.

How the chain is constructed and where it lives inside your tenant is covered in the architecture. There is no telemetry pipeline to PolicyCortex servers and no egress of evidence. Verification works precisely because nothing about it depends on us.

chain verificationIllustrative replay
Output complete
$ pcx verify state as-of=2026-05-14
records       492118
recomputed    492118
head          sha3:2f8ce1a90b47
gaps          1 declared (interval and reason on record)
result        INTACT

$ pcx verify state   (same log after one record edited in place)
result        BROKEN at seq 310442
note          every digest from 310443 onward fails to recompute

two runs of the same command. Demonstration only; no commands are executed.

What this layer does not do

gap-000841.jsonlabsence is a record, not a smaller number
record        gap-2026-05-02-000841
scope         subscription sb-eng-sandbox
interval      2026-05-02T11:40:00Z to 2026-05-02T14:05:31Z
reason        collector credential expired; rotated 14:05:31Z
effect        no state records for this scope in this interval
declared      true
chain.prev    sha3:77b3f0a2d941

Where it maps

State evidence files under continuous monitoring, with the audit family governing how the records themselves are protected. The mapping is quiet on purpose: the record is the product, and the rows below are where assessors expect to find it.

NIST 800-53
CA-7 continuous monitoring grounded in point-in-time records, with the AU family covering how those records are protected, retained, and reviewed.
NIST 800-171 / CMMC Level 2
One evidence base for the 110 requirements: state records handed to your assessor as generated evidence with the raw payload attached.
FedRAMP 20x
Machine-readable by construction. State and control mappings export as OSCAL 1.1.2 rather than as documents transcribed from screenshots.
MITRE ATT&CK
Configuration tampering becomes detectable because expected state is on record: an unexplained delta from the last capture anchors the detection.
The PolicyCortex control implementation table: CMMC Level 2 controls by family with implementation status and evidence counts
The 110-requirement table where state evidence files, control by control. Illustrative demo data; the interface is real.

Reconstruct the state a reviewer actually asks for.

Request Access