<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Compliance Evidence Automation | CodeYourCompliance]]></title><description><![CDATA[CodeYourCompliance explores compliance automation, replayable audit evidence, read-only evidence collection, policy-as-code, and evidence packages.]]></description><link>https://www.codeyourcompliance.com</link><image><url>https://substackcdn.com/image/fetch/$s_!yIEc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png</url><title>Compliance Evidence Automation | CodeYourCompliance</title><link>https://www.codeyourcompliance.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 16 Sep 2026 13:04:56 GMT</lastBuildDate><atom:link href="https://www.codeyourcompliance.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[CodeYourCompliance]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[codeyourcompliance@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[codeyourcompliance@substack.com]]></itunes:email><itunes:name><![CDATA[www.codeyourcompliance.com]]></itunes:name></itunes:owner><itunes:author><![CDATA[www.codeyourcompliance.com]]></itunes:author><googleplay:owner><![CDATA[codeyourcompliance@substack.com]]></googleplay:owner><googleplay:email><![CDATA[codeyourcompliance@substack.com]]></googleplay:email><googleplay:author><![CDATA[www.codeyourcompliance.com]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[An Empty Result Does Not Prove Absence]]></title><description><![CDATA[An empty API result does not always prove absence. See why collection outcomes must distinguish observed absence from failed observation before policy evaluation.]]></description><link>https://www.codeyourcompliance.com/p/an-empty-result-does-not-prove-absence</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/an-empty-result-does-not-prove-absence</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 14 Sep 2026 04:41:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yIEc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A collector queries a source for a configuration object, but nothing comes back.</p><p>It is easy to normalize that result immediately as:</p><pre><code><code>configured = false
</code></code></pre><p>Sometimes that is correct.</p><p>But sometimes the source was never successfully observed in the first place.</p><p>API timeouts, permission problems, incomplete pagination, an unstable or unreachable path between the collector and the source, or even a successful request that did not actually cover the full intended scope can all leave the pipeline with &#8220;no object returned.&#8221;</p><p>Those situations are not the same.</p><p>If their collection outcomes are collapsed too early, a failed observation can quietly become negative evidence.</p><h2>Two empty results that mean different things</h2><p>The latest CodeYourCompliance example models two collection attempts against the same synthetic target.</p><p>In the first scenario, we assume the collector successfully reached the intended source and scope. The query completed normally, the result set was complete, and no matching legacy TLS configuration object was found.</p><p>The modeled result is:</p><pre><code><code>collection_status = success
result_completeness = complete
observed_state = observed_absent
absence_assertion_supported = true
</code></code></pre><p>In the second scenario, the same intended query timed out before the source state was obtained:</p><pre><code><code>collection_status = failed
result_completeness = not_observed
observed_state = unobserved
absence_assertion_supported = false
</code></code></pre><p>Neither scenario returns a matching object.</p><p>Only the first supports an assertion that the object was absent.</p><p>They describe two different observation states, so normalization should not erase that difference.</p><h2>Absence is still an observation</h2><p>Negative evidence is easy to describe as &#8220;nothing was there.&#8221;</p><p>That is too loose.</p><p>To state that something was absent, the collection path still needs to show what was observed, where it was observed, how it was queried, and whether the observation actually completed.</p><p>Not seeing something and confirming its absence are different things.</p><p>A bounded absence statement might look like this:</p><pre><code><code>At timestamp T,
through query X,
against synthetic-endpoint-443,
no matching legacy TLS protocol configuration was observed.
</code></code></pre><p>That is not the same as:</p><pre><code><code>Legacy TLS is disabled.
</code></code></pre><p>The first statement describes an observation.</p><p>The second is already a configuration conclusion and may later become part of a control conclusion.</p><p>Moving from the first to the second may require more evidence or policy logic.</p><h2>HTTP 200 is not enough</h2><p>The first version of the synthetic example exposed an important problem during adversarial review.</p><p>It was too easy to read:</p><pre><code><code>HTTP 200
+ empty result
</code></code></pre><p>as sufficient proof that the object was absent.</p><p>That is too strong.</p><div class="callout-block" data-callout="true"><p>A successful request can still produce an incomplete observation.</p><p>The collector may have queried only the first page. </p><p>The authenticated account may not be able to see every object. </p><p>A filter may exclude the target. </p><p>The query may point to the wrong account, region, or namespace. Some APIs may even return an empty structure when a feature is unsupported.</p></div><p>These responses can look perfectly normal without proving that the intended observation was complete.</p><p>The revised synthetic example therefore makes several assumptions explicit. For the <code>observed_absent</code> scenario, we assume by construction that:</p><ul><li><p>the intended source is authoritative for the synthetic condition</p></li><li><p>the intended scope was covered</p></li><li><p>the query semantics are defined</p></li><li><p>pagination is complete</p></li><li><p>the collecting identity has sufficient visibility over the declared scope</p></li></ul><p>These are scenario assumptions.</p><p>They are not runtime validations.</p><p>The example therefore does not claim that:</p><pre><code><code>HTTP 200 + empty payload
</code></code></pre><p>generally means absence.</p><h2>Collection status belongs in the evidence chain</h2><p>The new <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/observed-absence-contract.md">Observed Absence Evidence Contract</a> keeps collection outcome separate from the later control result.</p><p>A minimum record can include:</p><pre><code><code>observation_outcome:
  source_ref:
  collection_method:
  collection_attempted:
  collection_status:
  query_semantics_ref:
  scope_ref:
  scope_reached:
  response_status:
  result_completeness:
  observed_state:
  absence_assertion_supported:
  failure_reason:
  observed_at_utc:
</code></code></pre><p>The point is not to preserve every transport detail.</p><p>The point is to stop materially different collection outcomes from being normalized into the same fact.</p><p>At minimum, the pipeline may need to distinguish states such as:</p><pre><code><code>present
observed_absent
unobserved
indeterminate
</code></code></pre><p><code>observed_absent</code> means the observation completed and the query semantics support an absence statement.</p><p><code>unobserved</code> means the intended source state was never successfully obtained.</p><p>A timeout belongs in the second state. It should not be converted into <code>false</code>.</p><h2>A failed observation should stay failed</h2><p>Suppose an API request times out.</p><p>The collector does know one thing: the collection attempt failed.</p><p>It does not know whether the configuration object exists.</p><p>A more defensible record is therefore:</p><pre><code><code>collection_status = failed
observed_state = unobserved
absence_assertion_supported = false
</code></code></pre><p>not:</p><pre><code><code>configured = false
</code></code></pre><p>This becomes important once the evidence reaches policy evaluation.</p><p>If <code>unobserved</code> is converted into <code>false</code>, downstream logic can no longer distinguish between:</p><pre><code><code>the condition was observed to be absent
</code></code></pre><p>and:</p><pre><code><code>we never successfully checked it
</code></code></pre><p>And that is how a collection problem quietly turns into a claim about the target state.</p><h2>This happens before evidence sufficiency</h2><p>Last week&#8217;s control-to-evidence mapping work asked whether all required proof inputs had been assembled before policy evaluation.</p><p>This week&#8217;s problem happens earlier.</p><p>Before the pipeline can ask whether the evidence set is complete, it first has to know what each collection attempt actually produced.</p><p>The path is closer to:</p><pre><code><code>source system
-&gt; collection attempt
-&gt; observation outcome
-&gt; raw evidence
-&gt; transformation
-&gt; normalized fact
-&gt; evidence admissibility
-&gt; evidence sufficiency
-&gt; policy evaluation
-&gt; control result
</code></code></pre><p>An <code>unobserved</code> outcome may eventually leave an evidence requirement unsatisfied.</p><p>An <code>observed_absent</code> outcome may itself become valid evidence for a particular requirement.</p><p>But those decisions should happen after the collection outcome has been preserved, not after both states have already been flattened into the same Boolean value.</p><h2>Observed absence still does not mean PASS</h2><p>There is another boundary.</p><p>Even when <code>observed_absent</code> is recorded correctly, it does not mean the control automatically passes.</p><p>Suppose the collector confirms that no legacy TLS configuration object was observed.</p><p>Whether that absence supports the control still depends on the control design, source authority, evidence mapping, and policy semantics.</p><p>The collection layer should make only the narrower statement it can support.</p><p>It should not make the final control decision.</p><p>For that reason, the <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/observed-absence">synthetic comparison</a> stops before control evaluation.</p><p>At that point it models only the observation outcome.</p><h2>Public reference artifacts</h2><p>The implementation references are available in the public CodeYourCompliance <code>evidence-validation-pipeline</code> repository:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/observed-absence-contract.md">Observed Absence Evidence Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/observed-absence">Observed Absence vs Collection Failure Example</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/current-implementation-status.md">Current Implementation Status</a></p></li></ul><p>The current artifact models collection-outcome semantics through synthetic examples.</p><p>It does not yet validate query semantics, pagination completeness, permission visibility, or source authority automatically.</p><p>It also does not determine whether an observed absence is sufficient to satisfy a real control requirement.</p><h2>Origin and scope</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong></p><p>Website: <a href="https://www.codeyourcompliance.com/">Compliance Evidence Automation | CodeYourCompliance</a></p><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation. This project does not provide legal, regulatory, audit, certification or compliance advice.</p><h2>Related reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/the-collector-is-part-of-the-evidence">The Collector Is Part of the Evidence</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed">Invalid Evidence Is Not a Failed Control</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/a-control-result-is-not-replayable">A Control Result Is Not Replayable Evidence</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Valid Evidence Is Not Sufficient Evidence]]></title><description><![CDATA[Valid evidence can still be incomplete for a control claim. See why control evaluation needs an explicit evidence requirement map before policy execution.]]></description><link>https://www.codeyourcompliance.com/p/valid-evidence-is-not-sufficient</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/valid-evidence-is-not-sufficient</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 07 Sep 2026 09:00:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yIEc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A control requires two pieces of evidence.</p><p>The first is present. Its schema is valid, integrity is verified, freshness is acceptable, and the required provenance is available.</p><p>The second is missing.</p><p>A pipeline that checks only the evidence it received may still continue to control evaluation. Every object in front of it looks valid, but the proof set is incomplete.</p><p>Nothing is wrong with the first evidence object. There is simply not enough evidence to support the declared control claim.</p><p>That is a different problem from invalid evidence.</p><h2>Admissibility applies to an evidence object</h2><p>The evidence-admissibility gate answers whether an individual object can be used.</p><p>For example:</p><pre><code><code>schema = valid
integrity = verified
freshness = fresh
provenance = present
</code></code></pre><p>Those checks say something about the quality of that object.</p><p>They do not establish that every evidence requirement for the control has been satisfied.</p><p>A control can therefore reach this state:</p><pre><code><code>present evidence = admissible
required evidence set = incomplete
control decision = blocked
control status = unknown
</code></code></pre><p>The missing evidence should remain missing. It should not be converted into either a pass or a failure.</p><p>This is the boundary introduced in the latest CodeYourCompliance artifact: object-level admissibility and evidence-set sufficiency are separate checks.</p><h2>A simple TLS example</h2><p>The public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/control-evidence-mapping">Control-to-Evidence Mapping Example</a> uses a synthetic TLS control.</p><p>The declared control requires two evidence types:</p><pre><code><code>tls_certificate_state
tls_runtime_protocol_state
</code></code></pre><p>In the complete scenario, both requirements are modeled as satisfied.</p><p>The resulting state is:</p><pre><code><code>evidence_set_status = complete
policy_evaluation_allowed = true
control_status = not_evaluated
</code></code></pre><p>The example deliberately stops before control evaluation. A complete evidence set means the downstream policy is allowed to run. It does not mean the control has passed.</p><p>The incomplete scenario contains certificate-state evidence but no runtime protocol-state evidence:</p><pre><code><code>evidence_set_status = incomplete
policy_evaluation_allowed = false
control_status = unknown
</code></code></pre><p>The certificate evidence remains usable. The absent protocol evidence does not become a failed control condition.</p><p>The examples are synthetic. They do not execute an admissibility gate, sufficiency gate, downstream control policy, or OPA. The recorded states are modeled scenario assertions used to make the boundary inspectable.</p><h2>The control needs an explicit evidence map</h2><p>The <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/control-evidence-mapping-contract.md">Control-to-Evidence Mapping Contract</a> records which evidence requirements belong to a control before policy evaluation starts.</p><p>A minimal structure includes:</p><pre><code><code>control_evidence_mapping:
  mapping_id:
  mapping_version:
  control_id:
  control_version:
  control_claim:
  evaluation_rule:
  evidence_requirements:
    - requirement_id:
      requirement_version:
      required:
      evidence_type:
      evidence_layer:
      minimum_objects:
      scope_ref:
      admissibility_required:
</code></code></pre><p>The useful part is the relationship between the control claim and its required proof inputs.</p><p>For each requirement, the assessment should be able to show what evidence type was expected, which scope it applied to, whether admissibility was required, and whether the requirement was actually satisfied.</p><p>Without that mapping, a pipeline can easily confuse:</p><pre><code><code>everything received was valid
</code></code></pre><p>with:</p><pre><code><code>everything required was received
</code></code></pre><p>Those statements are not equivalent.</p><h2>Missing evidence should stay unresolved</h2><p>Missing evidence is easy to mishandle because a binary control model wants a binary answer.</p><p>Consider an API timeout while collecting one required evidence type.</p><p>The timeout does not establish that the control condition failed. It establishes that the required observation was not obtained.</p><p>The state should remain explicit:</p><pre><code><code>required evidence missing
-&gt; evidence set incomplete
-&gt; control evaluation blocked
-&gt; control status unknown
</code></code></pre><p>This keeps collection failure separate from control failure.</p><p>The same applies when a source is unreachable, an expected object is absent, or the declared scope was only partially observed. Those conditions may require recollection or review, but they are not themselves proof that the target violated the control.</p><h2>The mapping is part of replay history</h2><p>The evidence map can change over time.</p><p>Suppose mapping version <code>0.1.0</code> requires certificate-state evidence only.</p><p>A later version adds runtime protocol-state evidence.</p><p>If an old assessment is replayed using the new mapping, it is being evaluated against a different proof requirement.</p><p>The historical path therefore includes more than evidence and policy:</p><pre><code><code>control claim
-&gt; evidence requirement map
-&gt; admissible evidence set
-&gt; policy input
-&gt; policy evaluation
-&gt; control result
</code></code></pre><p>Preserving the historical policy while discarding the historical evidence map still changes the question being replayed.</p><p>This is similar to policy versioning, but it occurs earlier in the pipeline. The evidence map determines what must exist before the policy is allowed to run.</p><h2>Sufficiency still does not prove control correctness</h2><p>A complete evidence set only proves completeness against the declared mapping.</p><p>The mapping itself may still be wrong.</p><p>It may omit an important evidence type. The declared scope may be too narrow. A requirement may point to an inappropriate source. A technically valid evidence object may not be the right proof for the claim being assessed.</p><p>The mapping therefore answers a limited question:</p><pre><code><code>Did the declared evidence requirements get satisfied?
</code></code></pre><p>It does not establish that those were the correct requirements.</p><p>That remains a control-design and review problem.</p><h2>Where this sits in the pipeline</h2><p>With this addition, the current evidence path becomes:</p><pre><code><code>source system
-&gt; collector
-&gt; raw observation
-&gt; transformation
-&gt; normalized fact
-&gt; evidence admissibility
-&gt; evidence sufficiency
-&gt; policy input
-&gt; policy evaluation
-&gt; control result
</code></code></pre><p>Previous artifacts dealt with whether evidence survives collection, transformation and evaluation with enough provenance to be replayed.</p><p>This artifact adds a different check before policy execution: whether the declared proof set is actually complete.</p><p>A valid evidence object can still be insufficient for the claim being made.</p><h2>MAS TRM-inspired means engineering interpretation</h2><p>This is not a claim that MAS TRM prescribes this mapping schema, the TLS example, an evidence-sufficiency gate, or OPA.</p><p>The engineering interpretation is narrower.</p><p>Before producing a control conclusion, the evidence package should preserve which proof inputs were required, which were present, which were admissible, and which remained missing.</p><p>Otherwise a valid piece of evidence can be used to support a conclusion that required more proof than the pipeline collected.</p><h2>Public reference artifacts</h2><p>The implementation references are available in the public CodeYourCompliance <code>evidence-validation-pipeline</code> repository:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/control-evidence-mapping-contract.md">Control-to-Evidence Mapping Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/control-evidence-mapping">Control-to-Evidence Mapping Synthetic Example</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence-admissibility-gate.md">Evidence Admissibility Gate</a></p></li></ul><p>The current artifact models evidence sufficiency through a contract and synthetic examples.</p><p>It does not yet implement automatic evidence-set assembly, repo-wide evidence-requirement schema enforcement, control-catalog version governance, or cryptographic binding of a mapping artifact to an assessment result.</p><h2>Origin and scope</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong></p><p>Website: <a href="https://www.codeyourcompliance.com/">Compliance Evidence Automation | CodeYourCompliance</a></p><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation. This project does not provide legal, regulatory, audit, certification or compliance advice.</p><h2>Related reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed">Invalid Evidence Is Not a Failed Control</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/a-control-result-is-not-replayable">A Control Result Is Not Replayable Evidence</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/from-evidence-principles-to-an-executable">From Evidence Principles to an Executable Control</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[A Changed Control Result Does Not Mean the System Changed]]></title><description><![CDATA[A PASS-to-FAIL change may come from policy semantics, not system state. See why policy versions, inputs, context and evaluation provenance must remain replayable.]]></description><link>https://www.codeyourcompliance.com/p/a-changed-control-result-does-not</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/a-changed-control-result-does-not</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 31 Aug 2026 16:16:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yIEc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A control passes in one assessment and fails in the next.</p><p>The usual explanation is that something changed in the target system. That is possible, but it is not the only explanation. The evidence may be unchanged. The normalized facts may be unchanged. The evaluation context may also be unchanged.</p><p>The policy may have changed instead.</p><p>If the assessment history preserves only:</p><pre><code><code>previous result: PASS
current result: FAIL
</code></code></pre><p>then the difference is visible, but its cause is not.</p><p>That becomes an evidence problem before it becomes a control problem.</p><h2>The result depends on the policy that produced it</h2><p>Policy-as-code makes evaluation repeatable. It does not make the result independent of the rule being evaluated.</p><p>The synthetic example in the public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/policy-evaluation-provenance">Policy Evaluation Provenance Example</a> keeps one policy input constant:</p><pre><code><code>days_to_expiry = 30
minimum_certificate_days_remaining = 30
</code></code></pre><p>Policy version <code>0.1.0</code> evaluates:</p><pre><code><code>days_to_expiry &gt;= minimum_certificate_days_remaining
</code></code></pre><p>The modeled result is <code>PASS</code>.</p><p>Policy version <code>0.2.0</code> evaluates:</p><pre><code><code>days_to_expiry &gt; minimum_certificate_days_remaining
</code></code></pre><p>The modeled result is <code>FAIL</code>.</p><p>The target-state identifier, normalized fact and evaluation context are held constant by construction. Only the policy semantics change.</p><p>The example does not prove that a real target remained unchanged between two assessments. It isolates one variable so that the decision difference can be attributed to the policy change inside the synthetic scenario.</p><p>The useful boundary is therefore narrower:</p><pre><code><code>same policy input
+ different policy semantics
-&gt; different decision

result difference alone
does not establish target-state change
</code></code></pre><p>A changed result needs more context before it can be called drift.</p><h2>Policy version is only one part of evaluation provenance</h2><p>Recording a field such as:</p><pre><code><code>policy_version = 0.2.0
</code></code></pre><p>is useful, but replay needs more than a version label.</p><p>The <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/policy-evaluation-provenance-contract.md">Policy Evaluation Provenance Contract</a> models the decision path with fields such as:</p><pre><code><code>evaluation:
  engine:
  engine_version:
  policy_id:
  policy_version:
  rule_id:
  rule_version:
  policy_artifact_ref:
  policy_artifact_sha256:
  policy_input_ref:
  policy_input_sha256:
  evaluation_context_ref:
  evaluation_context_sha256:
  implementation_version:
  evaluated_at_utc:
  decision_executed:
  result:
</code></code></pre><p>The point is not to collect metadata for its own sake.</p><p>A reviewer needs to know which policy artifact was evaluated, which input it consumed, which context was applied, which decision entry point ran, and which engine and surrounding implementation produced the result.</p><p>Without that information, a historical assessment can easily be replayed using today&#8217;s policy instead of the policy that produced the original decision.</p><p>The evidence may be the same. The replay is not.</p><h2>A policy hash does not establish policy authority</h2><p>The policy artifact can also be hashed.</p><p>That improves identity. A SHA256 digest can show which policy bytes were referenced by an evaluation record and whether the preserved artifact later changed.</p><p>It does not show whether those bytes should have been used.</p><p>This distinction matters:</p><pre><code><code>policy byte identity
!=
policy release authority
</code></code></pre><p>A digest does not prove that the policy was approved, current at the time of evaluation, applicable to the assessed scope, or released by an authorised control owner.</p><p>A replay package can therefore reproduce a decision against the wrong policy artifact with perfect integrity.</p><p>The replay is technically faithful. The policy selection may still be wrong.</p><p>Signed policy bundles, approval records and trusted policy-release provenance are separate concerns.</p><h2>Deterministic evaluation does not validate the policy</h2><p>OPA can evaluate the same input against the same Rego artifact and return the same result repeatedly.</p><p>That proves something useful: the identified evaluation path is deterministic.</p><p>It does not prove that the policy represents the correct control interpretation.</p><p>A threshold can be wrong. An exception may be missing. A rule may be valid for one system scope and unsuitable for another.</p><p>Evaluation provenance answers:</p><pre><code><code>What policy path produced this result?
</code></code></pre><p>It does not answer:</p><pre><code><code>Was this the correct policy for this control?
</code></code></pre><p>That judgment remains outside the policy engine.</p><h2>Replay has to preserve the historical decision path</h2><p>This repository already contains a bounded <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/replayable-tls-control">Replayable TLS Control</a>.</p><p>Its pipeline is:</p><pre><code><code>evidence schema
-&gt; context schema
-&gt; integrity
-&gt; freshness
-&gt; derived facts
-&gt; policy evaluation
-&gt; assessment result
</code></code></pre><p>That reference implementation records hashes for evidence, schemas, evaluation context and policy, together with implementation and runtime provenance.</p><p>The new policy-evaluation provenance artifact does not replace that implementation. It extracts one specific rule from it:</p><p>A historical control result should remain tied to the policy and evaluation path that produced it.</p><p>That makes this problem slightly different from the earlier question of whether a control result is replayable at all.</p><p>The first question is:</p><pre><code><code>Can I reproduce this result?
</code></code></pre><p>The next question is:</p><pre><code><code>Am I reproducing the historical decision,
or re-evaluating historical evidence
under a different policy?
</code></code></pre><p>Both operations may be useful.</p><p>They should not be confused.</p><h2>The decision path has more than one moving part</h2><p>Once collection, normalization and policy evaluation are separated, a changed assessment result can have several explanations:</p><pre><code><code>target changed
collector changed
transformation changed
policy input changed
evaluation context changed
policy changed
engine or implementation changed
</code></code></pre><p>A <code>PASS -&gt; FAIL</code> transition does not identify which one occurred.</p><p>The control result is the end of the pipeline. It is not a complete explanation of the pipeline.</p><h2>Public reference artifacts</h2><p>The implementation references are available in the public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline">CodeYourCompliance evidence-validation-pipeline</a>:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/policy-evaluation-provenance-contract.md">Policy Evaluation Provenance Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/policy-evaluation-provenance">Policy Evaluation Provenance Synthetic Example</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/replayable-tls-control">Replayable TLS Control</a></p></li></ul><p>The synthetic comparison does not claim to be an OPA runtime capture. The repository also does not yet implement signed policy bundles, trusted policy-release attestation or generic cross-policy regression testing.</p><p>Those remain separate implementation steps.</p><p>A control result is downstream of evidence, context and policy.</p><p>If the policy path disappears, part of the decision history disappears with it.</p><h2>Origin and scope</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong></p><p>Website: <a href="https://www.codeyourcompliance.com/">https://www.codeyourcompliance.com/</a></p><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation. This project does not provide legal, regulatory, audit, certification or compliance advice.</p><h2>Related reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/a-control-result-is-not-replayable">A Control Result Is Not Replayable Evidence</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed">Invalid Evidence Is Not a Failed Control</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/from-evidence-principles-to-an-executable">From Evidence Principles to an Executable Control</a></p></li></ul><p></p>]]></content:encoded></item><item><title><![CDATA[A Policy Is Not Evidence That an AI Agent Obeys It]]></title><description><![CDATA[A documented AI policy can show control design, but not control enforcement. Learn what execution evidence is needed to verify human approval, retries, failures, and bypass paths.]]></description><link>https://www.codeyourcompliance.com/p/a-policy-is-not-evidence-that-an</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/a-policy-is-not-evidence-that-an</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 31 Aug 2026 04:50:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6bc02b61-fd35-4931-8156-270f09b19195_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>AI Vendor Evidence Gap Notes #11</em></p><p>The first ten notes focused mainly on vendor claims and the evidence behind them.</p><p>There is another evidence problem once the documentation looks complete.</p><p>A vendor may have a policy, workflow diagram, product documentation, and configuration showing how an AI agent is expected to behave.</p><p>That does not show whether the control is enforced when the agent actually runs.</p><h3>Claim</h3><p>The documentation says:</p><blockquote><p>&#8220;High-risk actions require human approval.&#8221;</p></blockquote><p>The policy defines the requirement.</p><p>The workflow contains an approval step.</p><p>The product may provide a setting for it.</p><p>These are useful evidence of the intended control.</p><p>They do not show that every qualifying action is actually stopped and sent for approval.</p><h3>Why it sounds sufficient</h3><p>Policies and configuration are familiar review artifacts.</p><p>If the approval rule is documented and the feature is enabled, it is easy to record human oversight as an implemented control.</p><p>The problem is the execution path.</p><p>An agent may select tools, call APIs, retry failed actions, or reach the same result through a different sequence.</p><p>A reviewer therefore still needs to know:</p><ul><li><p>what triggers approval;</p></li><li><p>whether execution stops before the action;</p></li><li><p>what happens after rejection;</p></li><li><p>how retries are handled;</p></li><li><p>whether another tool path can avoid the trigger;</p></li><li><p>what happens if the approval mechanism fails;</p></li><li><p>whether the approval can be linked to the final action.</p></li></ul><p>Those questions cannot be answered by the policy alone.</p><h3>What it actually proves</h3><p>A policy can show that the control was defined.</p><p>Product documentation can show that an approval mechanism exists.</p><p>Configuration evidence can show that it was enabled.</p><p>These support control design and configuration.</p><p>Evidence of enforcement comes from somewhere else.</p><p>For example, an execution record could show:</p><p><strong>Trigger:</strong> The agent attempted an action requiring review.</p><p><strong>Pause:</strong> The action stopped before execution.</p><p><strong>Reviewer:</strong> The request was sent to an attributable reviewer.</p><p><strong>Decision:</strong> Approval or rejection was recorded.</p><p><strong>Execution:</strong> The action occurred only after approval.</p><p><strong>Trace:</strong> The approval event and final action can be linked.</p><p>That is evidence about what happened, not only what was supposed to happen.</p><h3>A public evidence example</h3><p>The <strong><a href="https://www.codeyourcompliance.com/">Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</a></strong> <a href="https://signal.codeyourcompliance.com/companies/decagon/?utm_source=chatgpt.com">Trust Signal profile for Decagon</a> shows the distinction at the public-evidence layer.</p><p>The profile identifies security and AI data-usage surfaces, along with enterprise evidence such as audit logs and AI guardrails. It also keeps an explicit boundary: those public security materials are review surfaces, not implementation verification.</p><p>That boundary becomes important for agent controls.</p><p>Trust Signal can help locate the documented evidence surface.</p><p>It cannot show, by itself, whether a guardrail or approval control was enforced in a particular execution.</p><h3>What it does not prove</h3><p>A documented approval control does not automatically establish:</p><p><strong>Trigger coverage.</strong> The rule may exist without showing that every relevant action is detected.</p><p><strong>Bypass resistance.</strong> Another tool or workflow may reach the same outcome without triggering approval.</p><p><strong>Failure behavior.</strong> Documentation may not explain what happens when the approval service fails or times out.</p><p><strong>Retry behavior.</strong> A rejected action may be attempted again through a different path.</p><p><strong>Sequence.</strong> An approval record is weak evidence if the action could occur before approval was captured.</p><p><strong>Version applicability.</strong> Evidence collected against one model, prompt, tool configuration, or agent version may not remain valid after those components change.</p><h3>Weak-answer pattern</h3><p>A common answer is:</p><blockquote><p>&#8220;Human approval is required for high-risk actions. See our policy and product documentation.&#8221;</p></blockquote><p>That may be enough to support the existence and design of the control.</p><p>The gap appears when the review stops there.</p><p>The buyer has evidence of the rule, but not yet evidence that the rule intercepted the relevant action during execution.</p><h3>Evidence request</h3><p>For controls that limit what an agent can do, ask for evidence from the execution path:</p><blockquote><p>Provide evidence showing how actions requiring human approval are identified, paused, presented for review, approved or rejected, and linked to the final execution record. Include rejected actions, retries, alternate paths, and approval-service failure where available.</p></blockquote><p>Useful evidence may include execution traces, approval logs, reviewer identity or role, timestamps, tool-call records, rejected-action records, failure tests, and bypass tests.</p><p>The purpose is not to collect more logs.</p><p>It is to connect the documented control to the behavior it is meant to constrain.</p><h3>Review note</h3><blockquote><p>Human approval is documented as a control for high-risk actions. The available evidence supports control design, but enforcement across triggering conditions, retries, alternate execution paths, and failure conditions has not yet been demonstrated.</p></blockquote><h3>Usage boundary</h3><p>Until enforcement evidence is available, a documented approval requirement should not be treated as proof that high-impact autonomous actions are consistently intercepted.</p><p>For higher-impact use cases, keep the agent within a boundary where failure or bypass of the approval step cannot independently create a consequential action.</p><p>The evidence question is no longer only:</p><p><strong>What does the policy say?</strong></p><p>It is also:</p><p><strong>What happened when the control was tested?</strong></p><h3>Boundary</h3><p>This material is for evidence structuring and review preparation.</p><p>The goal is to make the gap between documented controls and demonstrated behavior visible before those controls are relied upon.</p><p>#AIAssurance #AIGovernance #AIAgentTesting</p>]]></content:encoded></item><item><title><![CDATA[A Normalized Fact Is Not the Original Observation]]></title><description><![CDATA[Normalization changes evidence meaning. See why transformation rules, versions, inputs and outputs must remain traceable before policy evaluation.]]></description><link>https://www.codeyourcompliance.com/p/a-normalized-fact-is-not-the-original</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/a-normalized-fact-is-not-the-original</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Tue, 25 Aug 2026 13:34:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yIEc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A system returns:</p><pre><code><code>status = not_configured
</code></code></pre><p>A normalization layer turns that into:</p><pre><code><code>enabled = false
</code></code></pre><p>The second value is easier for a policy engine to consume.</p><p>It is also not what the system originally returned.</p><p>Someone decided that <code>not_configured</code> should mean <code>false</code>.</p><p>That decision happened before policy evaluation.</p><p>If the evidence package keeps only the normalized value, the interpretation disappears while its consequence survives.</p><p>That is the problem.</p><h2>Raw observation and normalized fact are different evidence layers</h2><p>Most systems do not produce evidence in the format a control policy wants.</p><p>Commands return text. APIs use vendor-specific fields. Configuration files use their own syntax. One source may say <code>enabled</code>, another <code>1</code>, another <code>active</code>.</p><p>Normalization is necessary.</p><p>A typical path looks like this:</p><pre><code><code>raw evidence
&#8594; normalized fact
&#8594; derived fact
&#8594; policy input
&#8594; policy result
</code></code></pre><p>The public CodeYourCompliance <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence_contract.md">Evidence Contract</a> already separates these layers.</p><p>The distinction is not about data formatting.</p><p>It is about where interpretation enters the evidence chain.</p><p>The raw observation records what the source returned.</p><p>The normalized fact records how the pipeline chose to represent it.</p><p>Those are related objects.</p><p>They are not the same object.</p><h2>The same observation can produce different facts</h2><p>The new public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/transformation-provenance">Transformation Provenance Example</a> isolates this problem.</p><p>The synthetic raw evidence is held constant:</p><pre><code><code>status = not_configured
</code></code></pre><p>Normalization version <code>0.1.0</code> applies this rule:</p><pre><code><code>MAP_NOT_CONFIGURED_TO_FALSE
</code></code></pre><p>and produces:</p><pre><code><code>enabled = false
state = resolved
</code></code></pre><p>Version <code>0.2.0</code> uses a different rule:</p><pre><code><code>PRESERVE_NOT_CONFIGURED_AS_UNKNOWN
</code></code></pre><p>and produces:</p><pre><code><code>enabled = null
state = unknown
</code></code></pre><p>Same raw observation.</p><p>Different transformation logic.</p><p>Different normalized fact.</p><p>The synthetic example deliberately holds the raw observation and target-state identifier constant so that only the transformation changes.</p><p>It does not establish which normalization rule is correct.</p><p>It establishes a narrower point:</p><pre><code><code>same raw observation
+ transformation difference
&#8594; normalized fact changed
&#8594; target-state change is not established
  by this difference alone
</code></code></pre><p>That boundary matters whenever normalized facts are later compared for drift or fed into policy evaluation.</p><h2>Transformation provenance should travel with the fact</h2><p>The public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/transformation-provenance-contract.md">Transformation Provenance Contract</a> records the minimum context needed to inspect that path.</p><p>The current pattern includes fields such as:</p><pre><code><code>transformation:
  name:
  version:
  rule_id:
  rule_version:
  input_ref:
  input_field:
  input_value:
  output_field:
  output_value:
  output_state:
  executed_at_utc:
</code></code></pre><p>This means a reviewer does not only see:</p><pre><code><code>enabled = false
</code></code></pre><p>They can also determine which raw observation was consumed, which rule performed the mapping, which implementation version ran, and what output it produced.</p><p>That is provenance.</p><p>It is not attestation.</p><h2>Transformation provenance is not transformation correctness</h2><p>A versioned rule can still be wrong.</p><p>A documented mapping can still be unsuitable for a particular control.</p><p>A normalizer can contain a bug.</p><p>Recording:</p><pre><code><code>rule_version = 0.2.0
</code></code></pre><p>does not prove that version <code>0.2.0</code> interpreted the source correctly.</p><p>It only makes that interpretation identifiable.</p><p>This is the same boundary discussed in <a href="https://www.codeyourcompliance.com/p/the-collector-is-part-of-the-evidence">The Collector Is Part of the Evidence</a>: preserving how something entered the evidence chain is different from proving that the mechanism was correct.</p><p>The collector can be wrong.</p><p>The transformation can be wrong.</p><p>Provenance gives the reviewer something concrete to challenge.</p><h2>Integrity does not solve the semantic problem</h2><p>Hashing solves another problem.</p><p>Suppose the pipeline records:</p><pre><code><code>source value:
not_configured

normalization:
not_configured &#8594; false

integrity:
verified
</code></code></pre><p>The integrity check can show that the normalized evidence object has not changed after sealing.</p><p>It cannot tell us whether <code>false</code> was the right interpretation in the first place.</p><p>A perfectly intact evidence package can preserve a bad transformation.</p><p>So these two claims need to remain separate:</p><pre><code><code>integrity verification
!=
semantic correctness
</code></code></pre><p>Hashing protects the preserved object.</p><p>Transformation provenance explains how that object acquired its meaning.</p><h2>Policy evaluation starts later than it looks</h2><p>OPA may receive a clean object such as:</p><pre><code><code>{
  "enabled": false
}
</code></code></pre><p>From OPA&#8217;s perspective, that input is simple.</p><p>From an evidence perspective, it already contains history.</p><p>A useful trace is closer to:</p><pre><code><code>control result
&#8594; policy input
&#8594; normalized fact
&#8594; transformation rule
&#8594; raw observation
&#8594; collector
&#8594; source system
</code></code></pre><p>This also connects to the admissibility boundary described in <a href="https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed">Invalid Evidence Is Not a Failed Control</a>.</p><p>The policy engine is not where the evidence story begins.</p><p>By the time evaluation starts, collection and interpretation have already happened.</p><p>If those steps disappear, the final result may still be deterministic while the path that produced its input is not inspectable.</p><h2>MAS TRM-inspired means engineering interpretation</h2><p>This is not a claim that MAS TRM requires transformation metadata, rule versions, normalization schemas, OPA, or this implementation pattern.</p><p>The engineering question is narrower:</p><p>Can a reviewer determine how a raw system observation became the fact that was actually evaluated?</p><p>If not, the pipeline preserves the control result more carefully than the interpretation that created its input.</p><h2>Public reference artifacts</h2><p>The transformation provenance boundary is implemented as a public engineering artifact in the <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline">codeyourcompliance/evidence-validation-pipeline</a> repository.</p><p>Main references:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/transformation-provenance-contract.md">Transformation Provenance Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/transformation-provenance">Transformation Provenance Synthetic Example</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence_contract.md">Evidence Contract</a></p></li></ul><p>The repository currently models transformation provenance through structured metadata and synthetic examples.</p><p>It does not yet cryptographically bind transformation or rule digests to normalized facts. It also does not implement automated transformation-version equivalence or regression testing, or repo-wide transformation provenance schema enforcement.</p><p>Those are separate implementation steps.</p><h2>Origin and scope</h2><p><strong>CodeYourCompliance</strong></p><p>Website: </p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:8847514,&quot;embedding_publication_id&quot;:8847514,&quot;name&quot;:&quot;Compliance Evidence Automation | CodeYourCompliance&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!yIEc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png&quot;,&quot;base_url&quot;:&quot;https://www.codeyourcompliance.com&quot;,&quot;hero_text&quot;:&quot;CodeYourCompliance explores compliance automation, replayable audit evidence, read-only evidence collection, policy-as-code, and evidence packages.&quot;,&quot;author_name&quot;:null,&quot;show_subscribe&quot;:true,&quot;logo_bg_color&quot;:&quot;#ffffff&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPublicationToDOMWithSubscribe"><div class="embedded-publication show-subscribe"><a class="embedded-publication-link-part" native="true" href="https://www.codeyourcompliance.com?utm_source=substack&amp;utm_campaign=publication_embed&amp;utm_medium=web&amp;embedding_publication_id=8847514"><img class="embedded-publication-logo" src="https://substackcdn.com/image/fetch/$s_!yIEc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">Compliance Evidence Automation | CodeYourCompliance</span><div class="embedded-publication-hero-text">CodeYourCompliance explores compliance automation, replayable audit evidence, read-only evidence collection, policy-as-code, and evidence packages.</div></a><form class="embedded-publication-subscribe" method="GET" action="https://www.codeyourcompliance.com/subscribe?embedding_publication_id=8847514"><input type="hidden" name="source" value="publication-embed"><input type="hidden" name="autoSubmit" value="true"><input type="email" class="email-input" name="email" placeholder="Type your email..."><input type="submit" class="button primary" value="Subscribe"></form></div></div><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation. This project does not provide legal, regulatory, audit, certification or compliance advice.</p><h2>Related reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/the-collector-is-part-of-the-evidence">The Collector Is Part of the Evidence</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed">Invalid Evidence Is Not a Failed Control</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/compliance-automation-starts-at-evidence">Compliance Automation Starts at Evidence</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[How to Build a Claim-Evidence Matrix for AI Procurement]]></title><description><![CDATA[Learn how to map AI vendor claims to evidence sources, identify gaps, and turn unresolved issues into buyer questions and usage boundaries.]]></description><link>https://www.codeyourcompliance.com/p/how-to-build-a-claim-evidence-matrix</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/how-to-build-a-claim-evidence-matrix</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Tue, 25 Aug 2026 12:39:33 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b0404d13-633b-44c9-9f1a-9a851ad5c260_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>AI Vendor Evidence Gap Notes #10</em></p><p>The first nine notes looked at different AI vendor claims: <a href="https://www.codeyourcompliance.com/p/vendor-says-it-does-not-train-on?utm_source=chatgpt.com">training use</a>, <a href="https://www.codeyourcompliance.com/p/a-trust-center-is-not-an-ai-vendor?utm_source=chatgpt.com">Trust Centers</a>, <a href="https://www.codeyourcompliance.com/p/why-soc-2-does-not-prove-the-ai-vendor?utm_source=chatgpt.com">SOC 2 scope</a>, <a href="https://www.codeyourcompliance.com/p/human-review-is-a-data-exposure-path?utm_source=chatgpt.com">human review</a>, subprocessors, retention, audit logs, data residency, and questionnaire answers.</p><p>The subjects were different.</p><p>The review problem was usually the same.</p><p>A vendor statement was available, but the supporting evidence was narrower than the statement suggested.</p><p>A claim-evidence matrix keeps that difference visible.</p><h3>Claim</h3><p>The review file says:</p><blockquote><p>&#8220;Vendor assessment completed.&#8221;</p></blockquote><p>The questionnaire has been returned.</p><p>The Trust Center, DPA, SOC 2 material, subprocessor information, and product documentation have been reviewed.</p><p>That shows that a review took place.</p><p>It does not show how individual claims were supported.</p><p>The file may still contain statements such as:</p><blockquote><p>Customer data is not used for training.</p><p>Human review is limited.</p><p>Data residency is supported.</p><p>Audit logs are available.</p></blockquote><p>Each statement may have a supporting source.</p><p>The question is what that source actually covers.</p><h3>Why it sounds sufficient</h3><p>Procurement reviews already collect a lot of material.</p><p>Adding another matrix can look like duplicate work.</p><p>The problem appears when answers and evidence are stored separately.</p><p>The questionnaire contains the claim.</p><p>The Trust Center contains one source.</p><p>The DPA may contain a stronger commitment.</p><p>Product documentation may narrow the feature scope.</p><p>A SOC 2 report may cover only part of the relevant environment.</p><p>If those relationships are not recorded, another reviewer has to reconstruct the reasoning later.</p><h3>What it actually proves</h3><p>A claim-evidence matrix records that relationship.</p><p>For each material claim, capture:</p><p><strong>Claim:</strong> What did the vendor state?</p><p><strong>Evidence source:</strong> What document or page supports it?</p><p><strong>Scope:</strong> Which product, plan, feature, region, and data type are covered?</p><p><strong>Exceptions:</strong> What sits outside the statement?</p><p><strong>Evidence date:</strong> When was the source checked?</p><p><strong>Evidence gap:</strong> What remains unresolved?</p><p><strong>Buyer question:</strong> What needs to be clarified next?</p><p><strong>Usage boundary:</strong> What should remain limited while the gap is open?</p><p>The useful sequence is:</p><p><strong>vendor claim &#8594; evidence source &#8594; scope &#8594; evidence gap &#8594; buyer question &#8594; usage boundary</strong></p><h3>A simple example</h3><p>Take:</p><blockquote><p>&#8220;We do not train on customer data.&#8221;</p></blockquote><p>The review should not stop at &#8220;No training.&#8221;</p><p>The matrix may show:</p><p><strong>Source:</strong> Enterprise data-use documentation.</p><p><strong>Scope:</strong> The statement applies to a defined commercial product.</p><p><strong>Exceptions:</strong> Support, abuse monitoring, human review, or opt-in workflows require separate checking.</p><p><strong>Evidence gap:</strong> Retention, logging, subprocessor handling, and deletion are not established by the training statement.</p><p><strong>Buyer question:</strong> Which sources establish those remaining data-handling boundaries?</p><p>The vendor answer has not changed.</p><p>The assumptions around it are now visible.</p><h3>A public evidence example</h3><p>The CodeYourCompliance <a href="https://signal.codeyourcompliance.com/companies/cohere/?utm_source=chatgpt.com">public evidence profile for Cohere</a> separates public evidence surfaces rather than treating the vendor name as one source.</p><p>That is useful for locating the source side of the review.</p><p>But the profile does not decide whether a particular claim is sufficient for a buyer&#8217;s product, plan, use case, data type, region, or contract.</p><p>The claim-evidence matrix performs that next step:</p><p><strong>evidence surface &#8594; claim &#8594; scope &#8594; remaining gap</strong></p><p>Trust Signal helps locate and structure public evidence.</p><p>The matrix records what that evidence can actually support in the review.</p><h3>What it does not prove</h3><p>The matrix does not prove that a vendor is low risk.</p><p>It does not make a source stronger than its scope.</p><p>A SOC 2 report can still leave the AI data path unclear.</p><p>A subprocessor list can identify third parties without showing actual routing.</p><p>A Trust Center can provide useful evidence without resolving the buyer&#8217;s use case.</p><p>The matrix records those limits.</p><p>It does not remove them.</p><h3>Weak-answer pattern</h3><p>A common review pattern is:</p><blockquote><p>Claim identified. Supporting document attached. Item closed.</p></blockquote><p>The document may be relevant, but the review file does not record:</p><ul><li><p>which part of the claim it supports;</p></li><li><p>which product or plan is covered;</p></li><li><p>whether exceptions exist;</p></li><li><p>whether another source is required;</p></li><li><p>when the evidence was checked.</p></li></ul><p>The result is a documentation package without a clear evidence chain.</p><h3>Evidence request</h3><p>For material claims, ask for the source and its boundary.</p><blockquote><p>For each material AI data-handling, security, privacy, logging, retention, subprocessor, residency, and human-access claim, identify the supporting source, applicable product and plan, covered data types, known exceptions, evidence date, and contractual basis where applicable.</p></blockquote><p>The goal is not more documents.</p><p>It is to identify which claims still lack usable evidence.</p><h3>Review note</h3><blockquote><p>Material vendor claims have been mapped to available supporting sources. Some remain partially evidenced because product scope, data-type coverage, exceptions, evidence freshness, or contractual applicability are incomplete.</p></blockquote><p>That is more useful than a spreadsheet containing only Yes, No, and See Trust Center.</p><h3>Usage boundary</h3><p>The matrix should always be read in context.</p><p>The same claim may support different use depending on the product, plan, data type, region, contract terms, and evidence date.</p><p>If the evidence supports only low-sensitivity internal use, record that.</p><p>If customer data requires stronger retention or subprocessor evidence, keep that limitation open.</p><p>A claim-evidence matrix is not a vendor score.</p><p>It is a dated record of what the available evidence supports and what remains unresolved.</p><p>The first nine notes focused on vendor statements and supporting sources.</p><p>The same question continues after documentation:</p><p><strong>What evidence shows that a documented control actually works as described?</strong></p><h3>Boundary</h3><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply if you want the sanitized sample claim-evidence matrix.</p><p>#AIVendorRiskAssessment #ThirdPartyRisk #AIGovernance</p>]]></content:encoded></item><item><title><![CDATA[The Collector Is Part of the Evidence]]></title><description><![CDATA[Collector provenance belongs in the evidence chain. See why collector version, method, parser and source must remain traceable before control evaluation.]]></description><link>https://www.codeyourcompliance.com/p/the-collector-is-part-of-the-evidence</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/the-collector-is-part-of-the-evidence</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 17 Aug 2026 15:43:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yIEc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Suppose an evidence package contains a TLS certificate expiry date, a timestamp and a valid integrity hash.</p><p>Six months later, someone reviews the assessment and asks how that expiry date was collected.</p><p>Was it read directly from the certificate file? Parsed from command output? Returned by an application API?</p><p>If the evidence package does not say, the value may still be intact, but part of its history is missing.</p><p>The collector is not just transport between a system and an evidence file. It is part of the chain that produced the observation.</p><h2>The same field can have different origins</h2><p>Take a field such as:</p><p><code>certificate_not_after</code></p><p>One collector might read a certificate file directly. Another might call <code>openssl</code> and parse stdout. Another might query an application endpoint.</p><p>The final value could be identical in all three cases.</p><p>That does not make the collection paths equivalent.</p><p>Each method depends on a different source and different interpretation logic. If only the normalized field is retained, those differences disappear.</p><p>This becomes more important when results change.</p><p>If yesterday&#8217;s collector reported one value and today&#8217;s collector reports another, the first question is not necessarily whether the target changed.</p><p>The collection path may have changed instead.</p><h2>Record the collector with the observation</h2><p>The current CodeYourCompliance evidence pattern records collector metadata with the observation:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;db28916c-2b6e-4292-9563-8ac04e3d308b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">{
  "collector": {
    "name": "ansible-readonly-tls-collector",
    "version": "0.1.0",
    "mode": "read_only",
    "method": "remote_command_and_file_read",
    "changed_target_system": false
  }
}</code></pre></div><p>The collector name identifies what produced the observation.</p><p>The version identifies which implementation was running.</p><p>The method records how the state was obtained.</p><p>The read-only fields record the intended collection boundary and whether collection changed the target.</p><p>The public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/collector-provenance-contract.md">Collector Provenance Contract</a> extends this with fields such as parser version and source reference.</p><p>None of these fields proves that the collector was correct.</p><p>They make the production path inspectable.</p><h2>Read-only does not solve provenance</h2><p>I have previously treated <a href="https://www.codeyourcompliance.com/p/read-only-collection-as-an-audit">read-only collection as an audit boundary</a>.</p><p>That boundary still matters.</p><p>A collector that repairs a system while collecting evidence mixes observation with remediation. Once that happens, it becomes harder to tell whether the recorded state existed before the collector touched the target.</p><p>But a collector can be read-only and still produce misleading evidence.</p><p>A parser can be wrong.</p><p>A configuration path can change.</p><p>A missing value can become <code>false</code> when it should remain <code>unknown</code>.</p><p>None of those problems requires a write operation.</p><p>Two questions therefore remain separate:</p><div class="callout-block" data-callout="true"><p><code>Did collection change the target?</code></p><p><code>How was the observation produced?</code></p></div><p>The first is about collection restraint.</p><p>The second is about provenance.</p><h2>Collector changes can look like system changes</h2><p>The public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/collector-provenance">collector provenance example</a> makes this problem explicit.</p><p>It contains two synthetic evidence objects for the same service and the same synthetic target-state identifier.</p><p>The first uses collector version <code>0.1.0</code>, reads the configured certificate file and records:</p><p><code>not_after = 2026-09-30T00:00:00Z</code></p><p>The second uses collector version <code>0.2.0</code>, performs a runtime TLS handshake and records:</p><p><code>not_after = 2026-10-15T00:00:00Z</code></p><p>The target-state identifier is deliberately held constant by the scenario.</p><p>The collector version, collection method, parser version and source reference change.</p><p>The example does not establish which observation is correct.</p><p>It establishes a narrower boundary:</p><div class="callout-block" data-callout="true"><p><code>observation difference</code></p><p><code>+ collector difference</code></p><p><code>!= automatic target drift</code></p></div><p>Before a difference is classified as system drift, the collection path needs to remain visible.</p><p>This is also why retaining only the final <code>PASS</code> or <code>FAIL</code> is weak. As discussed in <a href="https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed">Invalid Evidence Is Not a Failed Control</a>, a result only has meaning if the pipeline preserves how that result was reached.</p><h2>Normalization has the same problem</h2><p>Raw collection is often only the first step.</p><p>A command returns text. A parser extracts values. A normalization layer converts them into stable fields. A policy engine evaluates those fields.</p><p>The useful trace is closer to:</p><div class="callout-block" data-callout="true"><p><code>control result</code></p><p><code>&#8594; normalized fact</code></p><p><code>&#8594; collected observation</code></p><p><code>&#8594; collector + parser</code></p><p><code>&#8594; source reference</code></p><p><code>&#8594; source system</code></p></div><p>Not every implementation detail belongs in the final report.</p><p>But the evidence package should retain enough metadata to identify which collection and transformation path produced the evaluated fact.</p><p>Otherwise the policy side is visible while the collection side remains opaque.</p><h2>Provenance is not proof of correctness</h2><p>There is another boundary worth keeping clear.</p><p>Recording collector identity, version and method does not make the collector trustworthy.</p><p>A known collector can contain a bug.</p><p>A <code>read_only</code> attribute can be wrong.</p><p>A documented source can still be unsuitable for the control being evaluated.</p><p>Collector metadata provides a trail to inspect.</p><p>It does not validate that trail.</p><p>Structured provenance improves traceability. It does not turn implementation claims into facts.</p><h2>MAS TRM-inspired means engineering interpretation</h2><p>This is not a claim that MAS TRM requires Ansible, collector version fields, parser metadata or this evidence model.</p><p>The engineering interpretation is narrower.</p><blockquote><p>If system state is being turned into evidence for later control assessment, the collection path should not disappear once the normalized value has been produced.</p></blockquote><p>A reviewer should be able to determine what collected the observation, how it was collected, what source was used and which implementation version was involved.</p><p>If that information is missing, part of the evidence history is missing too.</p><h2>Public reference artifacts</h2><p>The collector provenance boundary described here is implemented as a public engineering artifact in the <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline">codeyourcompliance/evidence-validation-pipeline</a> repository.</p><p>Main references:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/collector-provenance-contract.md">Collector Provenance Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/collector-provenance">Collector Provenance Synthetic Example</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/minimal_evidence_object.json">Minimal Evidence Object</a></p></li></ul><p>The contract defines the provenance fields needed to keep collector identity, version, method, parser and source attached to an observation.</p><p>The synthetic example shows why an observation difference should not automatically be classified as target-state drift when the collector also changed.</p><p>The repository does not yet cryptographically bind collector implementation digests to evidence objects. It also does not implement automated collector-version equivalence testing.</p><p>Those remain separate implementation steps.</p><h2>Origin and scope</h2><p><strong>CodeYourCompliance</strong></p><p>Website: </p><div class="embedded-publication-wrap" data-attrs="{&quot;id&quot;:8847514,&quot;embedding_publication_id&quot;:8847514,&quot;name&quot;:&quot;Compliance Evidence Automation | CodeYourCompliance&quot;,&quot;logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!yIEc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png&quot;,&quot;base_url&quot;:&quot;https://www.codeyourcompliance.com&quot;,&quot;hero_text&quot;:&quot;CodeYourCompliance explores compliance automation, replayable audit evidence, read-only evidence collection, policy-as-code, and evidence packages.&quot;,&quot;author_name&quot;:null,&quot;show_subscribe&quot;:true,&quot;logo_bg_color&quot;:&quot;#ffffff&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPublicationToDOMWithSubscribe"><div class="embedded-publication show-subscribe"><a class="embedded-publication-link-part" native="true" href="https://www.codeyourcompliance.com?utm_source=substack&amp;utm_campaign=publication_embed&amp;utm_medium=web&amp;embedding_publication_id=8847514"><img class="embedded-publication-logo" src="https://substackcdn.com/image/fetch/$s_!yIEc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5cabd34-4bcf-4182-8a08-961d2b665a8d_1254x1254.png" width="56" height="56" style="background-color: rgb(255, 255, 255);"><span class="embedded-publication-name">Compliance Evidence Automation | CodeYourCompliance</span><div class="embedded-publication-hero-text">CodeYourCompliance explores compliance automation, replayable audit evidence, read-only evidence collection, policy-as-code, and evidence packages.</div></a><form class="embedded-publication-subscribe" method="GET" action="https://www.codeyourcompliance.com/subscribe?embedding_publication_id=8847514"><input type="hidden" name="source" value="publication-embed"><input type="hidden" name="autoSubmit" value="true"><input type="email" class="email-input" name="email" placeholder="Type your email..."><input type="submit" class="button primary" value="Subscribe"></form></div></div><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation. This project does not provide legal, regulatory, audit, certification or compliance advice.</p><h2>Related reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/read-only-collection-as-an-audit">Read-Only Collection as an Audit Boundary</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/compliance-automation-starts-at-evidence">Compliance Automation Starts at Evidence</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed">Invalid Evidence Is Not a Failed Control</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Vendor Questionnaires Fail When Claims Are Not Mapped to Sources]]></title><description><![CDATA[AI vendor questionnaires collect answers, but answers are not evidence. Map each claim to its source, scope, exceptions, evidence date, and contract boundary.]]></description><link>https://www.codeyourcompliance.com/p/vendor-questionnaires-fail-when-claims</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/vendor-questionnaires-fail-when-claims</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Thu, 13 Aug 2026 12:32:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bb467ddc-7c6e-4d3b-8a91-a824fe552848_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>AI Vendor Evidence Gap Notes #9</strong></em></p><p>A completed questionnaire can still leave the buyer without usable evidence.</p><p>AI vendor reviews often ask:</p><blockquote><p>&#8220;Do you use customer data for model training?&#8221;</p><p>&#8220;Do you support data residency?&#8221;</p><p>&#8220;Are audit logs available?&#8221;</p><p>&#8220;Do you maintain a subprocessor list?&#8221;</p></blockquote><p>The vendor answers.</p><p>The questionnaire is marked complete.</p><p>The review may still be incomplete.</p><p>The question is not only:</p><blockquote><p>Did the vendor answer?</p></blockquote><p>The better question is:</p><blockquote><p>What source supports the answer, what does that source cover, and what remains unresolved?</p></blockquote><p>A questionnaire collects statements.</p><p>An evidence review tests whether those statements support the buyer&#8217;s intended use.</p><h2>Claim</h2><p>The review file says:</p><blockquote><p>&#8220;Vendor questionnaire completed.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Vendor confirmed required controls are in place.&#8221;</p></blockquote><p>That establishes that the vendor responded.</p><p>It does not establish that the answers are evidence-complete.</p><h2>Why it sounds sufficient</h2><p>Questionnaires create structure.</p><p>They force buyers to ask about security, privacy, retention, subprocessors, model training, audit logs, data residency, and access controls.</p><p>That is useful.</p><p>The problem starts when the answer becomes the evidence.</p><p>A questionnaire may contain:</p><blockquote><p>No customer data is used for training.</p><p>SOC 2 Type II available.</p><p>Audit logs supported.</p><p>Data stored in the United States.</p><p>See Trust Center.</p></blockquote><p>Each answer may be accurate.</p><p>But none of them tells the buyer, by itself:</p><ul><li><p>which source supports it;</p></li><li><p>which product and plan it covers;</p></li><li><p>which data types are included;</p></li><li><p>which exceptions apply;</p></li><li><p>whether the evidence is current;</p></li><li><p>whether the commitment is contractual.</p></li></ul><p>The questionnaire records what the vendor said.</p><p>It does not automatically record what the buyer can rely on.</p><h2>What it actually proves</h2><p>A completed questionnaire may establish that the vendor responded to a defined set of questions and that relevant claims have been collected.</p><p>It can also identify areas that need follow-up.</p><p>It does not establish the strength or scope of the evidence behind each answer.</p><p>Consider:</p><blockquote><p><strong>Question:</strong> Do you use customer data for model training?</p><p><strong>Vendor answer:</strong> No.</p></blockquote><p>The review file still needs:</p><p><strong>Source:</strong> Where is that commitment written?</p><p><strong>Scope:</strong> Which product, plan, endpoint, or feature does it apply to?</p><p><strong>Data covered:</strong> Prompts, outputs, files, metadata, logs, or all customer content?</p><p><strong>Exceptions:</strong> Support, abuse monitoring, opt-in evaluation, or other workflows?</p><p><strong>Evidence date:</strong> When was the source checked?</p><p><strong>Contract boundary:</strong> Is this public documentation or part of the customer agreement?</p><p><strong>Gap:</strong> What remains unresolved?</p><p>That is the difference between an answer and an evidence record.</p><h2>A public evidence example</h2><p>The <a href="https://signal.codeyourcompliance.com/companies/cohere/">CodeYourCompliance public evidence profile for Cohere</a> shows how a vendor review can move beyond a questionnaire answer.</p><p>The profile separates public evidence surfaces rather than treating the company name as one source.</p><p>A response such as:</p><blockquote><p>&#8220;SOC 2 available.&#8221;</p></blockquote><p>or:</p><blockquote><p>&#8220;Customer data is not used for training.&#8221;</p></blockquote><p>still needs to be mapped to the specific source that supports it.</p><p>The reviewer then needs to check the product and plan scope, evidence date, data types covered, known exceptions, and whether a stronger contractual or customer-specific source is required.</p><p>The profile helps locate evidence surfaces.</p><p>It does not make the review conclusion.</p><p>That distinction matters.</p><p><strong>Questionnaire answer &#8594; evidence source &#8594; scope &#8594; evidence gap</strong></p><p>That is evidence conversion.</p><h2>What it does not prove</h2><p>A completed questionnaire does not automatically establish:</p><p><strong>Source strength.</strong> &#8220;Yes,&#8221; &#8220;No,&#8221; or &#8220;See Trust Center&#8221; does not show whether the source is contractual, audited, product documentation, marketing material, or unsupported.</p><p><strong>Product scope.</strong> A company-level answer may not apply to the exact product, plan, feature, endpoint, or integration.</p><p><strong>Data-path scope.</strong> A training answer does not establish retention. A residency answer does not establish processing location. A subprocessor answer does not establish routing.</p><p><strong>Freshness and exceptions.</strong> Supporting documents may change, and binary answers may hide support access, safety review, fallback providers, beta features, or configurable behaviour.</p><p><strong>Contract applicability.</strong> Public documentation may not create the same commitment as a DPA, order form, or product addendum.</p><p>None of these gaps means the vendor gave a false answer.</p><p>They mean the answer still needs evidence mapping.</p><h2>Weak-answer pattern</h2><p>This is the answer-without-source pattern.</p><p>The buyer asks:</p><blockquote><p>&#8220;Are audit logs available?&#8221;</p></blockquote><p>The vendor answers:</p><blockquote><p>&#8220;Yes.&#8221;</p></blockquote><p>The spreadsheet becomes green.</p><p>But the review file does not identify which events are logged, which plan is covered, how long logs are retained, whether customers can export them, or whether AI-specific activity is visible.</p><p>The questionnaire looks complete.</p><p>The evidence record is not.</p><h2>Evidence request</h2><p>Do not ask the vendor to complete another questionnaire.</p><p>Ask the vendor to support the existing answers.</p><blockquote><p>For each material AI, security, privacy, retention, logging, subprocessor, data-residency, and human-access claim, identify the supporting source, applicable product and plan, relevant data types, known exceptions, evidence date, and contractual basis where applicable.</p></blockquote><p>For higher-impact claims, ask:</p><ul><li><p>Does the source apply to the exact product and feature?</p></li><li><p>Which data types are explicitly covered?</p></li><li><p>Which exceptions exist?</p></li><li><p>Has the supporting evidence changed?</p></li><li><p>Is stronger private or customer-specific evidence required?</p></li></ul><p>The goal is not more questions.</p><p>The goal is claim-to-evidence mapping.</p><h2>Review note</h2><blockquote><p>The vendor completed the requested questionnaire, but several material responses have not yet been mapped to product-specific supporting evidence. Source strength, product and plan scope, data-type coverage, exceptions, evidence freshness, and contractual applicability remain incomplete for key AI data-handling claims.</p></blockquote><p>The questionnaire is complete.</p><p>The evidence mapping is not.</p><h2>Usage boundary</h2><p>Until material answers are mapped to evidence:</p><blockquote><p>Limit use to low-sensitivity internal or test data. Do not expand to customer-confidential data, regulated data, source code, employee records, autonomous actions, or externally relied-upon outputs where unsupported questionnaire answers would materially change the appropriate usage boundary.</p></blockquote><p>That is not approval.</p><p>That is review preparation.</p><p>The review unit remains:</p><p><strong>vendor + product + plan + use case + data type + region + contract terms + evidence date.</strong></p><p>A questionnaire can collect claims.</p><p>It cannot determine whether those claims are supported.</p><p>The useful sequence is:</p><p><strong>vendor answer &#8594; evidence source &#8594; scope &#8594; evidence gap &#8594; buyer question &#8594; usage boundary</strong></p><p>A completed questionnaire is an input.</p><p>It is not an evidence-complete review.</p><h2>Boundary</h2><p>This material is for evidence structuring and review preparation. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply if you want the sanitized sample evidence gap memo.</p><p>#AIVendorRiskAssessment #ThirdPartyRisk #AIGovernance</p>]]></content:encoded></item><item><title><![CDATA[Invalid Evidence Is Not a Failed Control]]></title><description><![CDATA[Invalid evidence should not become a failed control. See how evidence admissibility gates schema, integrity, freshness and context before policy evaluation.]]></description><link>https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/invalid-evidence-is-not-a-failed</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Sat, 08 Aug 2026 14:48:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_xQL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A collector runs against a system.</p><p>The collection partially fails.</p><p>The output file still exists.</p><p>A downstream policy engine reads the file, cannot find the expected field, and returns <code>fail</code>.</p><p>The report now says the control failed.</p><p>But the evidence may have failed instead.</p><p>That distinction has to survive the pipeline.</p><p>If it does not, compliance automation can manufacture control failures from collection failures, integrity failures, or invalid evaluation context.</p><p>The audit problem starts before the policy engine.</p><h2>A file is not automatically admissible evidence</h2><p>A common pipeline looks like this:</p><pre><code>collect
  &#8595;
evaluate
  &#8595;
pass / fail
  &#8595;
report</code></pre><p>The hidden assumption is that collection produced usable evidence.</p><p>That assumption is unsafe.</p><p>An artifact can exist while still being unusable. Its schema may be invalid, its integrity check may fail, its freshness window may have expired, or the evaluation context may be malformed.</p><p>None of those conditions proves that the control failed.</p><p>They mean the system lacks a defensible basis for a control decision.</p><p>That requires an explicit gate.</p><h2>Evidence admissibility is not control evaluation</h2><p>The pipeline should answer two different questions.</p><p>First:</p><blockquote><p>Is this evidence admissible for evaluation?</p></blockquote><p>Then:</p><blockquote><p>Does the observed condition satisfy the control policy?</p></blockquote><p>Those questions should not share the same result field.</p><p>The Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance reference implementation uses this sequence:</p><pre><code><em><strong>evidence schema gate
&#8594; context schema gate
&#8594; integrity gate
&#8594; freshness gate
&#8594; derived facts
&#8594; decision evaluation
&#8594; assessment result</strong></em></code></pre><p>If an earlier gate fails, the control decision does not execute.</p><p>The state remains:</p><pre><code><code>decision_executed = </code><span data-color="#0000ff" style="color: rgb(0, 0, 255);">false</span><code>
control_status = </code><span data-color="#0000ff" style="color: rgb(0, 0, 255);">unknown</span></code></pre><p>That is not a failed control.</p><p>It is a blocked decision.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_xQL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_xQL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 424w, https://substackcdn.com/image/fetch/$s_!_xQL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 848w, https://substackcdn.com/image/fetch/$s_!_xQL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 1272w, https://substackcdn.com/image/fetch/$s_!_xQL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_xQL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png" width="1122" height="1402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1402,&quot;width&quot;:1122,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:680821,&quot;alt&quot;:&quot;Flowchart showing evidence schema, context schema, integrity and freshness checks before an admissibility decision. If evidence is not admissible, decision execution is false and control status remains unknown. If admissible, control evaluation proceeds to pass or fail.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.codeyourcompliance.com/i/210352412?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Flowchart showing evidence schema, context schema, integrity and freshness checks before an admissibility decision. If evidence is not admissible, decision execution is false and control status remains unknown. If admissible, control evaluation proceeds to pass or fail." title="Flowchart showing evidence schema, context schema, integrity and freshness checks before an admissibility decision. If evidence is not admissible, decision execution is false and control status remains unknown. If admissible, control evaluation proceeds to pass or fail." srcset="https://substackcdn.com/image/fetch/$s_!_xQL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 424w, https://substackcdn.com/image/fetch/$s_!_xQL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 848w, https://substackcdn.com/image/fetch/$s_!_xQL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 1272w, https://substackcdn.com/image/fetch/$s_!_xQL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a1a5b9-5d84-48dd-a693-f37be335de69_1122x1402.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Evidence admissibility gate: invalid or stale evidence blocks control evaluation instead of producing a failed control result.</figcaption></figure></div><h2>Invalid evidence should stop the pipeline</h2><p>Take an integrity mismatch.</p><p>The evidence package no longer matches the sealed object the pipeline expected.</p><p>The wrong transition is:</p><pre><code><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">invalid_evidence
&#8594; control_status = fail</mark></code></pre><p>The correct transition is:</p><pre><code><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">invalid_evidence
&#8594; decision_executed = false
&#8594; control_status = unknown</mark><code>
</code></code></pre><p>The policy engine has nothing admissible to evaluate.</p><p>Returning <code>fail</code> would create a control conclusion that the evidence does not support.</p><p>The implementation rule is simple:</p><pre><code><code>No admissible evidence.
No control decision.</code></code></pre><h2>Stale evidence uses the same boundary</h2><p>Freshness is a different failure mode, but the same gate applies.</p><p>Evidence may still have a valid integrity hash and known provenance while being too old for the current evaluation window.</p><p>That evidence is not corrupt.</p><p>It is stale.</p><p>A freshness policy may classify it as <code>stale_evidence</code>, but that classification belongs to evidence admissibility.</p><p>It is not the downstream control decision.</p><p>This is why the public example separates:</p><pre><code><code>admissibility_evaluation</code></code></pre><p>from:</p><pre><code><code>control_decision</code></code></pre><p>The control decision remains unexecuted and <code>unknown</code>.</p><p>Evidence evaluation is not control evaluation.</p><h2>OPA is not the boundary</h2><p>OPA can evaluate either kind of policy.</p><p>A Rego freshness policy can decide whether evidence may proceed. A control policy decides whether admissible facts satisfy a declared condition.</p><p>The tool is not the point.</p><p>The stage is.</p><p>Those decisions should remain separate even if both are implemented in OPA.</p><h2>The state transition should be explicit</h2><p>The useful rule is not a longer list of statuses.</p><p>It is a prohibited transition.</p><p>This should never happen:</p><pre><code><code>invalid_evidence
&#8594; control_status = fail</code></code></pre><p>Neither should this:</p><pre><code><code>stale_evidence
&#8594; control_status = fail</code></code></pre><p>The allowed path is narrower:</p><pre><code><code>admissible evidence
&#8594; decision executed
&#8594; pass / fail</code></code></pre><p>Everything before that belongs to evidence qualification.</p><p><code>fail</code> means the control policy evaluated admissible evidence and found the condition unsatisfied.</p><p><code>unknown</code> means the pipeline could not reach that judgment.</p><h2>Reports should preserve the blocked decision</h2><p>A reporting layer should not translate every non-pass state into <code>non-compliant</code>.</p><p>It should preserve the failed gate, evidence status, whether the decision executed, and the control status.</p><p>Reports summarize a decision path.</p><p>They should not invent one.</p><h2>MAS TRM-inspired means engineering interpretation</h2><p>This is not a claim that MAS TRM prescribes this state machine, OPA, Rego, SHA256, or this implementation.</p><p>The engineering question is narrower:</p><blockquote><p>Can the evidence pipeline distinguish failure of the control from failure of the material used to assess it?</p></blockquote><p>If not, the final report may look deterministic while its underlying decision path is not.</p><p>A failed control is a control conclusion.</p><p>Invalid evidence is the absence of a defensible basis for that conclusion.</p><p>That is the boundary.</p><h2>Public reference artifacts</h2><p>The admissibility boundary described here is implemented in the public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline.git">codeyourcompliance/evidence-validation-pipeline</a> repository.</p><p>The main reference package is:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/replayable-tls-control">examples/replayable-tls-control</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence-admissibility-gate.md">docs/evidence-admissibility-gate.md</a></p></li></ul><p>The TLS example separates evidence validation from control decision evaluation. Schema validation, integrity verification, freshness checks and evaluation-context validation occur before the control decision.</p><p>If a gate fails, the decision does not execute. The result remains <code>unknown</code>, not <code>fail</code>.</p><p>These examples do not prove that the underlying system is compliant. They show whether the pipeline had a defensible basis to make a control decision at all.</p><p>They also stop before remediation. Certificate renewal, configuration changes and other corrective actions belong to a separate workflow with separate permissions and evidence.</p><h2>Origin and scope</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong></p><p>Website: <a href="https://www.codeyourcompliance.com/">https://www.codeyourcompliance.com/</a></p><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation. This project does not provide legal, regulatory, audit, certification or compliance advice.</p><h2>Related reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/from-evidence-principles-to-an-executable">From Evidence Principles to an Executable Control</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/why-audit-evidence-goes-stale">Why Audit Evidence Goes Stale</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Is This Remediation Evidence Actually Ready for Closure Consideration?]]></title><description><![CDATA[Review a synthetic remediation closure package, assess evidence sufficiency, and produce a workpaper, deficiency register, and closure-readiness memo.]]></description><link>https://www.codeyourcompliance.com/p/is-this-remediation-evidence-actually</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/is-this-remediation-evidence-actually</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Fri, 07 Aug 2026 15:54:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/535ff957-522c-4921-a246-3aaff78f55c0_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A remediation package contains a test result, monitoring records, approval history, and management representation.</p><p>The remediation owner says the work is complete.</p><p>There is evidence.</p><p>But does that evidence actually support the closure requirements?</p><p>That is the problem in the first <strong>Awesome GRC Workflows</strong> case.</p><h2>Evidence attached &#8800; requirement satisfied</h2><p>A document existing in the package tells you very little by itself.</p><p>Take a test result.</p><p>The useful questions are not:</p><blockquote><p>Is there a test document?</p></blockquote><p>They are:</p><blockquote><p>What requirement is this supposed to support?</p><p>What was actually tested?</p><p>When was it tested?</p><p>What does the result really establish?</p></blockquote><p>The same applies to other artifacts.</p><p>An evidence inventory may say a procedure exists.</p><p>That does not mean you have reviewed the procedure.</p><p>A management statement may provide context.</p><p>That does not turn it into independent verification.</p><p>A deployment record may show that a change happened.</p><p>That does not automatically prove sustained effectiveness.</p><p>The reviewer has to connect:</p><pre><code><code>requirement
&#8594; evidence
&#8594; limitation
&#8594; conclusion</code></code></pre><p>That is the work.</p><h2>The case</h2><p>In <strong>Remediation Evidence Closure Review</strong>, you act as an Evidence Review Analyst.</p><p>You receive a fictional remediation closure package containing documented requirements and multiple forms of synthetic evidence.</p><p>Your task is to review the submitted package and determine what the evidence can actually support.</p><p>You produce three deliverables:</p><ol><li><p>Evidence-to-requirement review workpaper</p></li><li><p>Evidence deficiency register</p></li><li><p>Closure-readiness memo</p></li></ol><p>This is not a quiz.</p><p>You have to inspect the records, identify gaps and contradictions, document what remains unresolved, and leave behind work another reviewer can follow.</p><h2>Recommendation &#8800; approval</h2><p>There is another boundary in the exercise.</p><p>You may analyze the evidence.</p><p>You may identify deficiencies.</p><p>You may request additional evidence.</p><p>You may prepare a closure-readiness recommendation.</p><p>You may not close the issue.</p><p>You may not accept residual risk.</p><p>You may not make legal determinations or execute remediation.</p><p>Correct analysis does not create approval authority.</p><p>That distinction is part of the work sample.</p><h2>Run the case</h2><p>The case is synthetic. The organization, records, systems, people, and evidence are fictional or safely constructed.</p><p>Start with the README, scenario, task brief, inputs, and templates.</p><p>Complete the three deliverables before opening the reviewer guide or reference answer.</p><p>Your job is not to guess what happened.</p><p>Your job is to determine what the submitted evidence can actually support.</p><p><strong>Run the case.</strong></p><p><a href="https://github.com/codeyourcompliance/awesome-grc-workflows/tree/main/cases/remediation-evidence-closure-review">https://github.com/codeyourcompliance/awesome-grc-workflows/tree/main/cases/remediation-evidence-closure-review</a></p>]]></content:encoded></item><item><title><![CDATA[Data Residency Claims Are Useless Without Scope]]></title><description><![CDATA[AI vendor data residency claims are incomplete without scope for processing, backups, subprocessors, support access, exceptions, and contract terms.]]></description><link>https://www.codeyourcompliance.com/p/data-residency-claims-are-useless</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/data-residency-claims-are-useless</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Tue, 04 Aug 2026 04:10:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bb9aad00-12f1-4996-a2c9-2c35e9be9df1_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>AI Vendor Evidence Gap Notes #8 </strong></em></p><p>A country name sounds like a boundary.</p><blockquote><p>&#8220;Customer data is stored in the United States.&#8221;</p><p>&#8220;EU data residency is available.&#8221;</p><p>&#8220;Enterprise customers can select a region.&#8221;</p></blockquote><p>These statements feel specific.</p><p>They identify a place, and a place can make the data path appear settled.</p><p>But in an AI vendor review, location is only the beginning of the question.</p><p>A residency statement may describe where one category of data is stored while saying little about where the rest of the workflow is processed, cached, backed up, reviewed, or routed.</p><p>The review question is not only:</p><blockquote><p>Where is customer data stored?</p></blockquote><p>The better question is:</p><blockquote><p>Which data is covered, what happens to it, which systems and providers receive it, and which parts of that path are actually restricted to the stated region?</p></blockquote><p>A hosting location can be accurate while the geographic boundary remains incomplete.</p><p>That is the evidence gap.</p><h3>Claim</h3><p>The vendor says:</p><blockquote><p>&#8220;Customer data is stored in the United States.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;EU data residency is available.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Enterprise customers can select a hosting region.&#8221;</p></blockquote><p>These statements may establish that defined customer data is stored within a stated location.</p><p>They do not establish the complete geographic path of the buyer&#8217;s data.</p><h3>Why it sounds sufficient</h3><p>Data residency is often reduced to a country, region, or dropdown selection.</p><p>That works well in a questionnaire.</p><p>The buyer asks where customer data is hosted. The vendor names a location. The answer appears complete.</p><p>But an AI workflow rarely involves one database and one data object.</p><p>A single interaction may create:</p><ul><li><p>prompts and outputs;</p></li><li><p>uploaded files;</p></li><li><p>audio and transcripts;</p></li><li><p>embeddings and indexes;</p></li><li><p>metadata and usage records;</p></li><li><p>logs and moderation events;</p></li><li><p>support artifacts;</p></li><li><p>cached copies;</p></li><li><p>backups and recovery copies.</p></li></ul><p>The application may store customer records in one region while a model provider, transcription service, analytics platform, support tool, or security service operates through a different path.</p><p>The storage location may be clear.</p><p>The processing location may not be.</p><p>The primary database may sit in one country.</p><p>Backups, logs, support systems, local caches, or downstream providers may follow different rules.</p><p>This is how a true statement can create the wrong impression.</p><p>&#8220;Stored in the United States&#8221; may accurately describe the primary application environment.</p><p>It may not describe the entire service.</p><h3>What it actually proves</h3><p>A current, product-specific residency statement may establish that:</p><ul><li><p>a primary hosting region has been identified;</p></li><li><p>defined customer content is stored in a stated location;</p></li><li><p>a regional storage option exists;</p></li><li><p>the vendor has documented a geographic control;</p></li><li><p>a particular plan or deployment supports regional selection.</p></li></ul><p>These are meaningful evidence points.</p><p>They establish something about location.</p><p>They do not automatically establish:</p><ul><li><p>which data types are covered;</p></li><li><p>whether storage and processing occur in the same region;</p></li><li><p>where external providers operate;</p></li><li><p>where backups and logs remain;</p></li><li><p>where support personnel may access data;</p></li><li><p>whether exceptions alter the path;</p></li><li><p>whether the commitment is contractual;</p></li><li><p>whether the same boundary applies to every product, plan, and feature.</p></li></ul><p>Storage is part of the data path.</p><p>It is not the whole data path.</p><h3>A public evidence example</h3><p>The<span> </span><strong><a href="https://signal.codeyourcompliance.com/companies/granola/">CodeYourCompliance public evidence profile for Granola</a></strong><span> </span>records a US data-residency reference among the public evidence surfaces observed for Granola&#8217;s AI meeting-notes product.</p><p>The profile was last checked on 27 June 2026. It also records that regional residency outside the United States was not observed during that review.</p><p>The profile is an evidence index.</p><p>It is not implementation verification, a security assessment, or a vendor recommendation.</p><p>Granola&#8217;s<span> </span><strong><a href="https://docs.granola.ai/help-center/consent-security-privacy/security-privacy-data-faqs">Security, Privacy &amp; Data FAQs</a></strong><span> </span>states that data is stored on AWS servers in the United States and that EU, UK, Canadian, Australian, and other regional residency options are not currently offered.</p><p>The same documentation also says that meeting notes are cached locally on the user&#8217;s device.</p><p>Granola&#8217;s separate<span> </span><strong><a href="https://www.granola.ai/security">security page</a></strong><span> </span>states that notes are stored in a US-hosted AWS Virtual Private Cloud and backed up daily. It also explains that transcription providers and AI providers form part of the service workflow.</p><p>These statements are useful.</p><p>They identify the primary hosting environment.</p><p>They identify the absence of alternative regional residency options.</p><p>They also begin to show that the service involves more than one data location and more than one provider role.</p><p>They do not, by themselves, establish:</p><ul><li><p>where each transcription or AI provider processes data;</p></li><li><p>which data types each provider receives;</p></li><li><p>where backups and recovery copies are located;</p></li><li><p>whether local caches follow the same deletion lifecycle;</p></li><li><p>where support or incident-response access may occur;</p></li><li><p>whether every plan and feature follows the same path;</p></li><li><p>which geographic commitments appear in the customer&#8217;s contract.</p></li></ul><p>The public profile helps locate the evidence.</p><p>The vendor&#8217;s own documentation remains the primary source.</p><p>Neither should be stretched beyond what it says.</p><h3>What it does not prove</h3><p>A data-residency statement does not automatically establish:</p><p><strong>Data-type coverage.</strong><span> </span>The statement may apply to notes, prompts, or outputs without covering uploaded files, transcripts, embeddings, metadata, logs, moderation records, support copies, or backups.</p><p><strong>Processing location.</strong><span> </span>Data can be stored in one country while being processed elsewhere by model, transcription, security, analytics, or infrastructure providers.</p><p><strong>Secondary storage.</strong><span> </span>Caches, indexes, vector stores, observability platforms, disaster-recovery environments, and support tools may follow different location rules.</p><p><strong>Provider routing.</strong><span> </span>The buyer may not know which model or service provider receives a request, whether fallback routing occurs, or whether provider selection changes by feature or region.</p><p><strong>Human access location.</strong><span> </span>A regional storage claim does not show where support, engineering, safety, or incident-response personnel may access customer data.</p><p><strong>Exception paths.</strong><span> </span>Abuse review, legal requests, security investigations, support cases, customer-enabled integrations, and service failures may alter the normal path.</p><p><strong>Deletion scope.</strong><span> </span>Deletion from the main application does not automatically establish deletion from local caches, logs, support systems, backups, or downstream providers.</p><p><strong>Product and plan scope.</strong><span> </span>A location statement may apply to one application, feature, plan, region, or deployment model without covering the exact service under review.</p><p><strong>Contract scope.</strong><span> </span>A public documentation page does not necessarily provide the same commitment as a DPA, order form, service agreement, regional addendum, or negotiated term.</p><p>None of these gaps proves that the vendor is handling data improperly.</p><p>They show that the location claim is narrower than the decision the buyer is trying to make.</p><h3>Weak-answer pattern</h3><p>This is the country-without-path pattern.</p><p>The vendor names a hosting region.</p><p>The buyer records:</p><blockquote><p>&#8220;Data hosted in the United States.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;EU residency available.&#8221;</p></blockquote><p>But the review file does not identify:</p><ul><li><p>which data types are covered;</p></li><li><p>where processing occurs;</p></li><li><p>which providers receive the data;</p></li><li><p>where logs and backups remain;</p></li><li><p>where support access may occur;</p></li><li><p>which exceptions change the path;</p></li><li><p>which product and plan are covered;</p></li><li><p>which contract term supports the boundary.</p></li></ul><p>The answer may be accurate.</p><p>The geographic scope is still incomplete.</p><h3>Evidence request</h3><p>Do not ask only:</p><blockquote><p>&#8220;Where is customer data hosted?&#8221;</p></blockquote><p>Ask for the data-location map.</p><p>A stronger request is:</p><blockquote><p>Please provide a product- and plan-specific data-location map for the intended workflow. For each relevant data type, identify where it is stored, where it is processed, which providers receive it, where backups and recovery copies are held, where human or support access may occur, which exceptions may alter the path, and which contractual source supports the stated regional boundary.</p></blockquote><p>Then ask:</p><ul><li><p>Which data types are covered by the residency commitment?</p></li><li><p>Does the stated region apply to both storage and processing?</p></li><li><p>Which model, transcription, infrastructure, security, and analytics providers receive data?</p></li><li><p>Can routing or fallback move processing to another provider or region?</p></li><li><p>Where are logs, caches, indexes, backups, and recovery copies located?</p></li><li><p>From which locations may support, engineering, safety, or incident personnel access the data?</p></li><li><p>Do integrations or customer-enabled features change the path?</p></li><li><p>Does the boundary differ by product, plan, configuration, or feature?</p></li><li><p>Which DPA, order-form term, or regional addendum confirms the commitment?</p></li></ul><p>The vendor does not need to disclose sensitive architecture.</p><p>It does need to establish a geographic boundary that the buyer can use.</p><h3>Review note</h3><p>A weak review note says:</p><blockquote><p>&#8220;Customer data is hosted in the United States.&#8221;</p></blockquote><p>A stronger review note says:</p><blockquote><p>The vendor identifies a customer-data hosting region, but the available evidence does not establish the complete geographic scope of processing, provider routing, logs, caches, backups, support access, subprocessors, or exception paths. The response is not evidence-complete for a use case requiring verified in-region storage and processing.</p></blockquote><p>That note does not say the residency statement is false.</p><p>It prevents a storage-location claim from being treated as proof of the complete data path.</p><h3>Usage boundary</h3><p>Until the geographic path is evidenced:</p><blockquote><p>Limit use to data that does not require verified in-region storage and processing. Do not introduce regulated, highly confidential, customer-restricted, or contract-restricted data where uncertainty about processing locations, providers, backups, support access, or exception paths would materially change the appropriate usage boundary.</p></blockquote><p>That is not approval.</p><p>That is review preparation.</p><p>The review unit is:</p><p><strong>vendor + product + plan + use case + data type + region + contract terms + evidence date.</strong></p><p>A residency claim can support that review.</p><p>It cannot replace the data path.</p><p>A country name is evidence.</p><p>It is not regional coverage.</p><h3>Boundary</h3><p>This material is for evidence structuring and review preparation. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply if you want the sanitized sample evidence gap memo.</p><p>#AIVendorRiskAssessment #DataResidency #AIGovernance</p>]]></content:encoded></item><item><title><![CDATA[AI Audit Logs: What Events Are Missing?]]></title><description><![CDATA[AI vendor audit logs are not evidence-complete unless they cover model activity, data access, human review, tool execution, routing, outcomes, retention, and known exclusions.]]></description><link>https://www.codeyourcompliance.com/p/ai-audit-logs-what-events-are-missing</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/ai-audit-logs-what-events-are-missing</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Tue, 04 Aug 2026 03:53:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4c8b743a-38ef-4e58-b15a-c539e3ab463d_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>AI Vendor Evidence Gap Notes #7 </strong></em></p><p>AI vendors often say:</p><blockquote><p>&#8220;Audit logs are available.&#8221;</p><p>&#8220;Enterprise administrators can monitor activity.&#8221;</p><p>&#8220;Logs can be exported to your SIEM.&#8221;</p></blockquote><p>These statements sound like evidence of accountability.</p><p>They may prove that some logging capability exists.</p><p>They do not prove that the events needed to reconstruct an AI workflow are actually recorded.</p><p>The review question is not only:</p><blockquote><p>Does the vendor provide audit logs?</p></blockquote><p>The better question is:</p><blockquote><p>Which events are recorded, which events are missing, and can the buyer reconstruct what the AI system accessed, produced, changed, or exposed?</p></blockquote><p>An audit log can exist while the decisive AI event remains invisible.</p><p>That is the evidence gap.</p><h3>Claim</h3><p>The vendor says:</p><blockquote><p>&#8220;Enterprise customers have access to audit logs.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Key platform activity is logged.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Security and administrative events can be exported.&#8221;</p></blockquote><p>These statements may establish that the product records certain identity, administrative, operational, or security events.</p><p>They do not establish that the actual AI activity is visible.</p><h3>Why it sounds sufficient</h3><p>Audit logs are familiar enterprise controls.</p><p>They suggest that administrators can monitor activity, investigate incidents, identify configuration changes, and retain evidence for internal review.</p><p>A vendor questionnaire may therefore ask whether audit logs exist and treat a &#8220;yes&#8221; answer as complete.</p><p>But conventional SaaS logs often focus on:</p><ul><li><p>login and logout;</p></li><li><p>account creation;</p></li><li><p>role and permission changes;</p></li><li><p>workspace settings;</p></li><li><p>administrative actions;</p></li><li><p>security alerts.</p></li></ul><p>An AI workflow may create additional events:</p><ul><li><p>prompts and model invocations;</p></li><li><p>uploaded files and connector access;</p></li><li><p>retrieval of documents or records;</p></li><li><p>model-provider routing or fallback use;</p></li><li><p>tool or agent execution;</p></li><li><p>generated outputs and external sharing;</p></li><li><p>human review or support access;</p></li><li><p>retention and policy-setting changes;</p></li><li><p>blocked, failed, overridden, or retried actions.</p></li></ul><p>If those events sit outside the logging scope, the buyer may have an enterprise log without having an AI activity record.</p><p>The feature may be real.</p><p>The incident-reconstruction capability may still be incomplete.</p><h3>What it actually proves</h3><p>A current, product- and plan-specific audit-log statement may establish that:</p><ul><li><p>an audit-logging mechanism exists;</p></li><li><p>certain identity or administrative events are recorded;</p></li><li><p>administrators or vendor personnel can review selected activity;</p></li><li><p>logs may be exportable through an API or SIEM integration;</p></li><li><p>the vendor maintains operational records for security or troubleshooting.</p></li></ul><p>These are meaningful evidence points.</p><p>They establish that logging exists.</p><p>They do not identify the complete event taxonomy, field coverage, retention period, customer-access model, export capability, or known exclusions.</p><p>Availability is not scope.</p><h3>A public evidence example</h3><p>The<span> </span><strong><a href="https://signal.codeyourcompliance.com/companies/decagon/">CodeYourCompliance public evidence profile for Decagon</a></strong><span> </span>records an audit-logging claim among the public enterprise-readiness evidence observed for Decagon&#8217;s AI customer-support platform.</p><p>The profile is an evidence index.</p><p>It is not verification that customers can access the logs or that the logging scope is sufficient for incident reconstruction.</p><p>Decagon&#8217;s<span> </span><strong><a href="https://decagon.ai/security">security page</a></strong><span> </span>states that tamper-protected logs capture key events ranging from logins to unusual activity. The same page says access to those logs is limited to senior engineering leadership.</p><p>A separate<span> </span><strong><a href="https://decagon.ai/legal/security">security and compliance page</a></strong><span> </span>states that Decagon maintains audit logs of activity, errors, and warnings on production systems.</p><p>These statements provide useful evidence that internal logging mechanisms exist.</p><p>They do not establish that enterprise customers receive a customer-facing audit trail.</p><p>The public materials do not identify:</p><ul><li><p>the complete event taxonomy;</p></li><li><p>which AI-specific actions are recorded;</p></li><li><p>whether customer administrators can access or export the records;</p></li><li><p>how long the logs are retained;</p></li><li><p>whether prompts, connector retrievals, model routes, tool calls, human access, policy changes, exports, and failed actions are included;</p></li><li><p>which important events are explicitly excluded.</p></li></ul><p>The evidence therefore supports a narrow conclusion:</p><blockquote><p>The vendor publicly describes internal audit-logging mechanisms.</p></blockquote><p>It does not establish the event-level visibility available to the buyer for the intended workflow.</p><h3>What it does not prove</h3><p>An audit-log claim does not automatically establish:</p><p><strong>AI event coverage.</strong><span> </span>The log may not record model invocation, prompt submission, retrieved context, file use, generated output, tool execution, or agent action.</p><p><strong>Data-access visibility.</strong><span> </span>The buyer may not be able to see which connector, repository, document, database, or customer record was accessed.</p><p><strong>Routing visibility.</strong><span> </span>The log may not identify which model provider, region, deployment, fallback route, or integration handled the request.</p><p><strong>Human and administrative access.</strong><span> </span>Support access, abuse review, human evaluation, retention changes, permission changes, connector changes, and model-selection changes may not be visible.</p><p><strong>Actor attribution.</strong><span> </span>The record may not distinguish users, administrators, service accounts, vendor personnel, contractors, and automated agents.</p><p><strong>Outcome visibility.</strong><span> </span>The event may not show whether an action succeeded, failed, was blocked, was retried, or was overridden.</p><p><strong>Evidence usability.</strong><span> </span>The buyer may not know whether timestamps are consistent, fields are documented, records are retained long enough, logs can be exported, or administrators can alter or delete them.</p><p>A vendor may have strong authentication and infrastructure logs while leaving the customer-relevant AI workflow largely unobservable.</p><p>None of these gaps proves that the events are absent.</p><p>They show that the available evidence does not establish whether the buyer can reconstruct them.</p><h3>Weak-answer pattern</h3><p>This is the feature-without-event-scope pattern.</p><p>The vendor confirms that audit logs exist.</p><p>The buyer records:</p><blockquote><p>&#8220;Audit logs available.&#8221;</p></blockquote><p>But the review file does not identify:</p><ul><li><p>which events are included;</p></li><li><p>which AI-specific events are excluded;</p></li><li><p>who can access the records;</p></li><li><p>how long they are retained;</p></li><li><p>whether customers can export them;</p></li><li><p>whether the records support incident reconstruction.</p></li></ul><p>The answer describes the feature.</p><p>It does not establish the evidence boundary.</p><h3>Evidence request</h3><p>Do not ask only:</p><blockquote><p>&#8220;Do you provide audit logs?&#8221;</p></blockquote><p>Ask for the event taxonomy.</p><p>A stronger request is:</p><blockquote><p>Please provide the audit-event taxonomy for the exact product and plan under review, including AI-specific events, administrative events, human-access events, tool execution, data access, routing, outcome status, and known exclusions.</p></blockquote><p>For each event type, identify:</p><ul><li><p>actor and actor type;</p></li><li><p>timestamp;</p></li><li><p>action;</p></li><li><p>target object;</p></li><li><p>success, failure, block, retry, or override result;</p></li><li><p>feature, integration, connector, model, or route involved;</p></li><li><p>customer-access model;</p></li><li><p>log-retention period;</p></li><li><p>export method;</p></li><li><p>documentation source.</p></li></ul><p>Then ask:</p><ul><li><p>Are prompts, model invocations, and generated outputs represented as events?</p></li><li><p>Are connector access, retrieved sources, file actions, and tool execution visible?</p></li><li><p>Are model routing, fallback use, and agent actions recorded?</p></li><li><p>Are support access, human review, and administrative changes logged?</p></li><li><p>Can customers export the records, and how long are they retained?</p></li><li><p>Which relevant events are explicitly excluded?</p></li></ul><p>The vendor does not need to expose model internals.</p><p>It does need to show whether the buyer can reconstruct the events that matter for the intended use case.</p><h3>Review note</h3><p>A weak review note says:</p><blockquote><p>&#8220;Audit logs available.&#8221;</p></blockquote><p>A stronger review note says:</p><blockquote><p>The vendor publicly describes audit-logging mechanisms, but the current evidence does not establish customer access, export capability, retention, or coverage of AI-specific events such as model invocation, connector access, routing, tool execution, human review, output sharing, and policy changes. The response is not evidence-complete for incident reconstruction or accountability in the intended workflow.</p></blockquote><p>That note does not say the vendor lacks logging.</p><p>It says the buyer does not yet know whether the available logs support the decision being made.</p><h3>Usage boundary</h3><p>The required log scope depends on what the AI system is allowed to do.</p><p>A drafting assistant used with low-sensitivity internal content may require less event detail than an agent that accesses customer records, executes tools, changes systems, or produces external communications.</p><p>Until the relevant event scope is evidenced:</p><blockquote><p>Limit use to workflows where missing audit events would not prevent incident investigation, accountability, or reversal. Do not rely on the vendor&#8217;s audit logs for high-impact actions, sensitive data access, autonomous execution, system changes, or external decisions until event coverage, customer access, retention, export, and known exclusions are confirmed.</p></blockquote><p>That is not approval.</p><p>That is review preparation.</p><p>The review unit is:</p><p><strong>vendor + product + plan + use case + data type + region + contract terms + evidence date.</strong></p><p>Audit-log availability can support that review.</p><p>It cannot replace event-level scope.</p><p>A log that omits the decisive event cannot support the conclusion the buyer expects from it.</p><h3>Boundary</h3><p>This material is for evidence structuring and review preparation. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply if you want the sanitized sample evidence gap memo.</p><p>#AIVendorRiskAssessment #AuditLogs #AIGovernance</p>]]></content:encoded></item><item><title><![CDATA[A Control Result Is Not Replayable Evidence]]></title><description><![CDATA[PASS or FAIL does not show whether the system changed or the decision conditions changed. See how replayable evidence preserves the full decision path.]]></description><link>https://www.codeyourcompliance.com/p/a-control-result-is-not-replayable</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/a-control-result-is-not-replayable</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Fri, 31 Jul 2026 09:13:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!l8_f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A host passed a control yesterday and failed it today. The retained record shows only this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;bffe8bc5-ff66-4408-abab-7d49575ec596&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">2026-07-29: PASS
2026-07-30: FAIL</code></pre></div><p>The first question is whether the host changed or the test changed. The record cannot answer it.</p><p>The package inventory may have moved, but the baseline, freshness rule, policy or evaluator may also have changed. The same evidence can produce a different result when it is judged under a different evaluation context.</p><p>With only <code>PASS</code> and <code>FAIL</code>, there is no way to separate a change in the system from a change in the decision conditions. The conclusions were retained. The basis for them was not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l8_f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l8_f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!l8_f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!l8_f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!l8_f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l8_f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png" width="1448" height="1086" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1086,&quot;width&quot;:1448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:936577,&quot;alt&quot;:&quot;Diagram showing a control changing from &#8220;Yesterday: PASS&#8221; to &#8220;Today: FAIL,&#8221; followed by the question &#8220;What changed?&#8221; The diagram branches into two possible causes: system state changed, including package inventory, version, or configuration; or decision conditions changed, including baseline, freshness window, policy artifact, or evaluator/runtime. The diagram concludes that PASS/FAIL alone cannot distinguish between these paths.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.codeyourcompliance.com/i/209215539?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Diagram showing a control changing from &#8220;Yesterday: PASS&#8221; to &#8220;Today: FAIL,&#8221; followed by the question &#8220;What changed?&#8221; The diagram branches into two possible causes: system state changed, including package inventory, version, or configuration; or decision conditions changed, including baseline, freshness window, policy artifact, or evaluator/runtime. The diagram concludes that PASS/FAIL alone cannot distinguish between these paths." title="Diagram showing a control changing from &#8220;Yesterday: PASS&#8221; to &#8220;Today: FAIL,&#8221; followed by the question &#8220;What changed?&#8221; The diagram branches into two possible causes: system state changed, including package inventory, version, or configuration; or decision conditions changed, including baseline, freshness window, policy artifact, or evaluator/runtime. The diagram concludes that PASS/FAIL alone cannot distinguish between these paths." srcset="https://substackcdn.com/image/fetch/$s_!l8_f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 424w, https://substackcdn.com/image/fetch/$s_!l8_f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 848w, https://substackcdn.com/image/fetch/$s_!l8_f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!l8_f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c9a5226-d039-4dad-b15c-882f9ab9e31c_1448x1086.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A changed control result does not show whether the system changed or the decision conditions changed. Replay requires both sides of that distinction to remain inspectable.</figcaption></figure></div><p>That is why a stored control result is not replayable evidence. An earlier note asked whether <a href="https://www.codeyourcompliance.com/p/can-your-audit-evidence-survive-replay">audit evidence can survive replay</a>; the harder implementation question is what must be retained for that replay to mean anything.</p><h2>What must survive the original decision</h2><p><a href="https://www.codeyourcompliance.com/p/compliance-is-not-documentation-it-18e">Replayable evidence is not the same as retained documentation.</a> Replay does not mean running the same scanner again.</p><p>A new scan observes the system as it exists now. Replay reconstructs a previous decision from the artifacts that existed when that decision was made.</p><p>For that reconstruction to be credible, the retained package must include more than the observation. It must also preserve the schema that admitted the evidence, the context that supplied the threshold or baseline, the policy artifact, the selected decision engine, the implementation version and an integrity digest binding the assessment to the original evidence bytes.</p><p>Each artifact answers a different review question.</p><p>The evidence shows what the collector observed. The schema shows what input was considered admissible. The context records the rule parameters used at that time. The policy contains the decision logic. Runtime metadata identifies the execution path. The digest shows whether the retained evidence has changed since evaluation.</p><p>If any of these elements is missing, part of the decision must be inferred rather than replayed.</p><p>A timestamped result may still be useful operationally, but it is only a historical claim unless the decision path can be reconstructed.</p><h2>The collector should not decide compliance</h2><p>Consider a <a href="https://www.codeyourcompliance.com/p/read-only-collection-as-an-audit">read-only collector operating within an explicit audit boundary</a>. It returns the following package inventory:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;62a03251-321f-4c09-8f64-fd5d96f326c9&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "packages": [
    {"name": "openssl", "version": "3.0.13"},
    {"name": "python3", "version": "3.12.3"},
    {"name": "curl", "version": "8.5.0"}
  ]
}</code></pre></div><p>This tells us what the collector observed. It does not tell us whether the host complies with a package baseline.</p><p>That decision depends on a separate context:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;49dca525-3f0e-4b4e-8847-67951467253e&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "required_packages": [
    {"name": "openssl", "version": "3.0.13"},
    {"name": "python3", "version": "3.12.3"},
    {"name": "curl", "version": "8.5.0"}
  ],
  "unexpected_package_mode": "ignore"
}</code></pre></div><p>If the required OpenSSL version changes, the same inventory may fail. If unexpected packages are changed from <code>ignore</code> to <code>fail</code>, an additional package may alter the result even though nothing on the host has changed.</p><p>The observation and the assessment therefore belong to different layers.</p><p>Package names and versions come from collection. Missing packages, mismatched versions and unexpected packages are derived by comparison. Pass or fail is produced only after policy evaluation.</p><p>Writing the control result back into the evidence object hides those transitions. The final document becomes easier to read, but harder to inspect. A reviewer can see the conclusion but cannot tell which facts came from the host, which were derived by the replay engine and which depended on policy choices.</p><h2>Invalid, stale and failed are different states</h2><p>A control should fail only after admissible evidence reaches the policy and the required condition is not met.</p><p>If the evidence does not satisfy its schema, the policy should not evaluate it. A missing timestamp, malformed package entry or incorrect field type is a problem with the evidence path, not proof that the host failed the control.</p><p>The assessment should record that distinction:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;926b3f60-6af9-4d0c-b307-0f36470e1275&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">evidence_status = invalid_evidence
control_status = unknown
decision_executed = false</code></pre></div><p><a href="https://www.codeyourcompliance.com/p/why-audit-evidence-goes-stale">Evidence can remain intact and still become too stale to support a current conclusion</a>. In this control, stale evidence creates a different problem from either invalid evidence or policy failure. A package inventory may be structurally valid and still be too old for the decision being attempted.</p><p>Suppose the context requires evidence collected within the previous 24 hours. An inventory from three days ago cannot support a current package-baseline decision. It does not prove that the host is non-compliant. It proves that the available observation is no longer fresh enough to answer the question.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;ced5faef-c7a9-4ec5-b702-1210d697b918&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">evidence_status = stale_evidence
control_status = unknown
decision_executed = false</code></pre></div><p>These distinctions are not cosmetic. They imply different actions.</p><p>A failed control may require investigation of the host or baseline. Stale evidence requires recollection. Invalid evidence requires examination of the collector, schema or processing pipeline.</p><p>A dashboard that reduces all three conditions to red has removed information that operations and audit both need.</p><h2>Collection and policy execution are separate boundaries</h2><p>The earlier implementation note moved <a href="https://www.codeyourcompliance.com/p/from-evidence-principles-to-an-executable">from evidence principles to an executable control</a>. The public reference artifacts now apply that structure through a fixed replay sequence:</p><p><code>evidence schema gate</code></p><p><code>-&gt; context schema gate</code></p><p><code>-&gt; integrity gate</code></p><p><code>-&gt; freshness gate</code></p><p><code>-&gt; derived facts</code></p><p><code>-&gt; policy evaluation</code></p><p><code>-&gt; assessment output</code></p><p>For the package-baseline example, the comparison stage derives three groups of facts:</p><ul><li><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">missing_packages</mark></p></li><li><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">version_mismatches</mark></p></li><li><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">unexpected_packages</mark></p></li></ul><p>The policy then decides how those facts affect the control result.</p><p>A missing required package causes failure. A version mismatch causes failure. An unexpected package may be ignored or treated as a violation depending on the explicit context.</p><p>The collector does not need to know any of this. Its job is to report the inventory accurately and preserve its collection metadata. Policy belongs later in the pipeline, where its input and execution can be inspected independently.</p><p>The same boundary applies to the decision engine.</p><p>A built-in evaluator can implement the same decision semantics as a Rego policy, but it does not execute the Rego artifact. That difference must appear in the assessment:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;d5e56514-7989-495c-9bdf-0c78128da736&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">builtin:
decision_executed = true
policy_artifact.executed = false

opa:
decision_executed = true
policy_artifact.executed = true</code></pre></div><p>Without this metadata, a result may appear to have been produced by a policy artifact that was never run. The conclusion could be correct while its provenance is false.</p><h2>Replay should stop before remediation</h2><p>The package-baseline control can identify a missing package, an incorrect version or an unexpected installation. It does not install, remove or upgrade software.</p><p>That is a deliberate boundary.</p><p>Remediation requires broader permissions and produces a different class of evidence: authorization records, execution logs, change results and post-remediation observations. Combining those actions with collection makes it harder to establish what state existed before the tool intervened.</p><p>A read-only collector preserves the condition it was asked to observe. A separate remediation workflow may act on the assessment later, but it should produce its own evidence package.</p><p>Collection establishes what was seen. Correction changes what will be seen next.</p><h2>Public reference artifacts</h2><p>The replay structure described here is implemented in the public <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline.git">codeyourcompliance/evidence-validation-pipeline</a> repository.</p><p>The current examples are:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/replayable-tls-control">examples/replayable-tls-control</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/os-package-baseline">examples/os-package-baseline</a></p></li></ul><p>The <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/replayable-tls-control">TLS example</a> applies the pipeline to certificate expiry. The <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/os-package-baseline">OS package example</a> applies it to required packages, version mismatches and unexpected software.</p><p>Both packages retain the evidence, validation schemas, evaluation context, integrity information, policy artifact and execution metadata needed to inspect how an assessment result was produced. Their tests also show how the pipeline behaves when evidence is stale, malformed or modified after hashing.</p><p>These examples do not prove that the underlying systems are compliant. They show that a control decision can be preserved in a form that is more inspectable than a stored <code>PASS</code> or <code>FAIL</code>.</p><p>They also stop before remediation. Installation, removal, upgrade and other corrective actions belong to a separate workflow with separate permissions and evidence.</p><p>Replayability does not establish that a decision was correct. It establishes whether the basis of that decision can still be examined.</p><h2>Origin and scope</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong><br>Website: <a href="https://www.codeyourcompliance.com/">https://www.codeyourcompliance.com/</a><br>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation. This project does not provide legal, regulatory, audit, certification or compliance advice.</p><h2>Related reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/from-evidence-principles-to-an-executable">From Evidence Principles to an Executable Control</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/why-audit-evidence-goes-stale">Why Audit Evidence Goes Stale</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[From Evidence Principles to an Executable Control]]></title><description><![CDATA[Discover how CodeYourCompliance transforms evidence principles into replayable compliance implementations using read-only collection, evidence objects, policy evaluation, and OSCAL representation.]]></description><link>https://www.codeyourcompliance.com/p/from-evidence-principles-to-an-executable</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/from-evidence-principles-to-an-executable</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 20 Jul 2026 14:39:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!99WK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the past few months, <strong><a href="https://www.codeyourcompliance.com/">Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</a></strong> has focused on a set of recurring principles.</p><ul><li><p><a href="https://www.codeyourcompliance.com/p/what-a-mas-trm-checklist-cannot-prove">Documents are not system state.</a>  </p></li><li><p><a href="https://www.codeyourcompliance.com/p/a-screenshot-is-a-supporting-artifact">Screenshots are supporting artifacts, not proof objects. </a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/compliance-automation-starts-at-evidence">Evidence should be timestamped, source-bound, integrity-checked, and replayable.</a> </p></li><li><p><a href="https://www.codeyourcompliance.com/p/why-audit-evidence-goes-stale">Audit evidence must remain current enough to support a conclusion.</a> </p></li><li><p><a href="https://www.codeyourcompliance.com/p/a-generated-report-is-not-an-accountable">Automatically generated reports are not accountable audit conclusions.</a> </p></li></ul><p>These ideas have shaped almost every article I&#8217;ve written.</p><p>But they also raised an uncomfortable question.</p><p><strong>If these principles only exist in articles, can they really be tested, challenged, or reproduced?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!99WK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!99WK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!99WK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!99WK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!99WK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!99WK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1165087,&quot;alt&quot;:&quot;Flow diagram showing the CodeYourCompliance implementation pipeline: Evidence Principle &#8594; Read-only Collection &#8594; Evidence Object (timestamp, source, and hash) &#8594; Policy Evaluation &#8594; Assessment Result &#8594; OSCAL Representation. The diagram illustrates how evidence principles are transformed into replayable engineering implementations.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.codeyourcompliance.com/i/207777414?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Flow diagram showing the CodeYourCompliance implementation pipeline: Evidence Principle &#8594; Read-only Collection &#8594; Evidence Object (timestamp, source, and hash) &#8594; Policy Evaluation &#8594; Assessment Result &#8594; OSCAL Representation. The diagram illustrates how evidence principles are transformed into replayable engineering implementations." title="Flow diagram showing the CodeYourCompliance implementation pipeline: Evidence Principle &#8594; Read-only Collection &#8594; Evidence Object (timestamp, source, and hash) &#8594; Policy Evaluation &#8594; Assessment Result &#8594; OSCAL Representation. The diagram illustrates how evidence principles are transformed into replayable engineering implementations." srcset="https://substackcdn.com/image/fetch/$s_!99WK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!99WK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!99WK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!99WK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d63f4a8-80ae-4629-8efd-1f359761de24_1024x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Transitioning an evidence principle into a replayable implementation pipeline, from read-only collection to OSCAL representation.</figcaption></figure></div><p>That question has led to the next stage of the project.</p><p>Instead of treating articles as the primary deliverable, I will begin treating each implementation as the primary object. Articles become explanations of that implementation rather than the implementation itself.</p><p>The goal is to turn individual evidence principles into small, replayable engineering experiments that anyone can inspect, critique, and improve.</p><p>The first reference experiment is intentionally narrow.</p><pre><code><strong>TLS endpoint</strong>
&#8595;
<strong>read-only collection</strong>
&#8595;
<strong>raw evidence</strong>
&#8595;
<strong>parsed facts</strong>
&#8595;
<strong>policy evaluation</strong>
&#8595;
<strong>assessment result</strong>
&#8595;
<strong>OSCAL representation</strong></code></pre><p>The objective is not to build a complete compliance platform.</p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">The objective is to answer one implementation question:</mark></p><blockquote><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Can a narrow, replayable implementation preserve the distinction between collection, evidence, policy evaluation, and accountable assessment?</mark></p></blockquote><p>Several boundaries are equally important.</p><div class="callout-block" data-callout="true"><p><strong><a href="https://www.csa.gov.sg/resources/internet-hygiene-portal/information-resources/tls/">TLS</a></strong> is only the experimental carrier.</p><p><strong><a href="https://info.standards.tech.gov.sg/">Singapore ICT&amp;SS</a></strong> NS-6 provides the direct technical control context.</p><p><strong><a href="https://www.mas.gov.sg/regulation/guidelines/technology-risk-management-guidelines">MAS TRM</a></strong> provides a broader engineering and security context rather than a compliance claim.</p><p><strong><a href="https://pages.nist.gov/OSCAL/">OSCAL</a></strong> is used as an assessment representation, not as evidence itself or as proof of compliance.</p></div><p><span data-color="#ff0000" style="color: rgb(255, 0, 0);">This experiment does </span><strong><span data-color="#ff0000" style="color: rgb(255, 0, 0);">not</span></strong><span data-color="#ff0000" style="color: rgb(255, 0, 0);"> claim that a successful assessment proves overall compliance, nor does it attempt to automate professional judgment.</span></p><p>The purpose is much smaller&#8212;and, I believe, much more useful.</p><p>If a single evidence principle can be implemented, replayed, inspected, and shown to fail under controlled conditions, it becomes more than an idea. It becomes something other people can verify, criticize, and build upon.</p><p>That is the direction <a href="https://www.codeyourcompliance.com/">Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</a> is taking next.</p><p>Not more articles.</p><p>More executable knowledge.</p><div><hr></div><h2>Origin</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong><br><span>Website: </span><a href="https://www.codeyourcompliance.com/"><span>https://www.codeyourcompliance.com/</span></a><br><span>GitHub: </span><a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p><em>Attribution is requested for forks, references, adaptations, and discussions.</em></p><h2>Scope Boundary</h2><p>MAS TRM-inspired means engineering interpretation.</p><p>This project does not provide legal, regulatory, audit, certification, or compliance advice.</p><h2>Project Direction </h2><p>Future articles will increasingly accompany replayable implementation packages rather than stand alone as methodology notes.</p><h2>Related Reading</h2><ul><li><p><a href="https://www.codeyourcompliance.com/p/compliance-automation-starts-at-evidence">Compliance Automation Starts at Evidence</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/what-a-mas-trm-checklist-cannot-prove">What a MAS TRM Checklist Cannot Prove</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/a-screenshot-is-a-supporting-artifact">A Screenshot Is a Supporting Artifact, Not a Proof Object</a></p></li><li><p><a href="https://www.codeyourcompliance.com/p/a-generated-report-is-not-an-accountable">A Generated Report Is Not an Accountable Audit Conclusion</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Prompt Retention Is a Control, Not a Preference]]></title><description><![CDATA[AI vendor prompt-retention claims are not evidence-complete without data-type coverage, storage layers, deletion timing, exceptions, admin controls, and contract scope.]]></description><link>https://www.codeyourcompliance.com/p/prompt-retention-is-a-control-not</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/prompt-retention-is-a-control-not</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Thu, 16 Jul 2026 15:51:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3d76d632-7500-4297-bbb7-124cddef0128_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>AI Vendor Evidence Gap Notes #6 </strong></em></p><p>AI vendors often describe retention as a setting:</p><blockquote><p>&#8220;Zero data retention is available.&#8221;</p><p>&#8220;Enterprise customers can configure retention.&#8221;</p><p>&#8220;Prompts are deleted after 30 days.&#8221;</p></blockquote><p>These statements sound operational.</p><p>They suggest that the buyer controls the data lifecycle.</p><p>But a retention setting is not automatically a retention control.</p><p>The review question is not only:</p><blockquote><p>What retention period does the vendor advertise?</p></blockquote><p>The better question is:</p><blockquote><p>What data lifecycle does the available evidence establish for this product, plan, feature, configuration, region, and use case?</p></blockquote><p>A setting may control one data object in one part of the service.</p><p>It may not cover files, metadata, logs, embeddings, support copies, caches, backups, or exception paths.</p><p>That is the evidence gap.</p><h3>Claim</h3><p>The vendor says:</p><blockquote><p>&#8220;Enterprise customers can configure prompt retention.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Zero data retention is enabled by default.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Customer content is deleted after 30 days.&#8221;</p></blockquote><p>These statements may establish that a retention feature or policy exists for a defined category of data.</p><p>They do not establish the complete lifecycle of the buyer&#8217;s data.</p><h3>Why it sounds sufficient</h3><p>Retention is often reduced to one number:</p><ul><li><p>zero days;</p></li><li><p>thirty days;</p></li><li><p>customer-configurable;</p></li><li><p>deleted on request.</p></li></ul><p>That makes the answer easy to enter into a questionnaire and mark complete.</p><p>But an AI workflow rarely creates only one data object.</p><p>A single interaction may create:</p><ul><li><p>prompts and outputs;</p></li><li><p>uploaded files;</p></li><li><p>embeddings or indexes;</p></li><li><p>metadata and usage records;</p></li><li><p>security or moderation events;</p></li><li><p>logs and diagnostic records;</p></li><li><p>support artifacts;</p></li><li><p>cached copies;</p></li><li><p>backups.</p></li></ul><p>The vendor may use &#8220;retention&#8221; to describe visible conversation history.</p><p>The buyer may assume that the same setting applies to every object created by the workflow.</p><p>It may not.</p><p>A prompt can disappear from the user interface while related metadata remains in an operational log.</p><p>A file can be removed from active storage while a backup copy remains until rotation.</p><p>A zero-retention inference endpoint can coexist with another feature that stores conversations by default.</p><p>The setting may be real.</p><p>The assumption that it controls the entire lifecycle is the problem.</p><h3>What it actually proves</h3><p>A current, product-specific retention statement may establish that:</p><ul><li><p>a retention feature exists;</p></li><li><p>a defined data type follows a stated retention period;</p></li><li><p>administrators can shorten or disable certain storage;</p></li><li><p>a product or plan provides additional lifecycle controls;</p></li><li><p>the vendor has documented a customer-facing retention option.</p></li></ul><p>These are useful evidence points.</p><p>They establish something about a defined setting or data category.</p><p>They do not automatically establish the lifecycle of every object, storage layer, feature, or exception path involved in the buyer&#8217;s workflow.</p><h3>A public evidence example</h3><p>The<span> </span><strong><a href="https://signal.codeyourcompliance.com/companies/fireworks-ai/">CodeYourCompliance public evidence profile for Fireworks AI</a></strong><span> </span>records zero data retention as a public evidence signal and points to the vendor&#8217;s data-handling documentation.</p><p>The profile is an evidence index.</p><p>It is not implementation verification for a particular customer account, endpoint, configuration, or request.</p><p>Fireworks AI&#8217;s<span> </span><strong><a href="https://docs.fireworks.ai/guides/security_compliance/data_handling">data-retention documentation</a></strong><span> </span>shows why scope matters.</p><p>For open-model inference, the documentation states that prompt and generation data is not logged or stored persistently by default without explicit user opt-in. It also states that service metadata, such as token counts, is logged.</p><p>The same documentation explains that certain advanced features allow customers to opt into prompt and generation logging.</p><p>Separately, the Fireworks Responses API follows a different lifecycle. When store=True, which is the documented default, complete conversation data is retained for 30 days. This may include user prompts, model responses, and tools called by the model.</p><p>Storage can be disabled by setting store=False.</p><p>These statements are not necessarily contradictory.</p><p>They describe different services, endpoints, data types, features, and configurations.</p><p>For one path, prompt and generation data may not be stored persistently.</p><p>For another path, conversation data may be stored by default for a defined period.</p><p>Metadata may still be logged.</p><p>Advanced features may introduce opt-in content storage.</p><p>That is exactly why &#8220;zero retention&#8221; cannot remain a vendor-level label.</p><p>The buyer must determine which lifecycle applies to the exact workflow being reviewed.</p><h3>What it does not prove</h3><p>A configurable retention statement does not automatically establish:</p><p><strong>Data-type coverage.</strong><span> </span>The setting may cover prompts and outputs without covering files, embeddings, metadata, logs, moderation records, support artifacts, or backups.</p><p><strong>Storage-layer coverage.</strong><span> </span>Deletion from the primary application does not establish deletion from caches, indexes, vector stores, observability platforms, support systems, or recovery environments.</p><p><strong>Deletion timing.</strong><span> </span>&#8220;Deleted&#8221; may mean removed immediately, queued for deletion, removed from active systems later, or retained in backups until scheduled rotation.</p><p><strong>Exception paths.</strong><span> </span>Data may follow different retention rules for security investigations, abuse monitoring, customer support, legal obligations, incident response, or customer-enabled features.</p><p><strong>Configuration scope.</strong><span> </span>The lifecycle may depend on an endpoint parameter, administrator setting, feature toggle, workspace default, or customer opt-in.</p><p><strong>Administrative enforcement.</strong><span> </span>A setting does not show whether changes are logged, whether access is restricted, whether the customer can verify enforcement, or whether new features inherit the same policy.</p><p><strong>Product and plan scope.</strong><span> </span>API products, hosted applications, enterprise plans, individual plans, integrations, beta features, and model routes may follow different retention rules.</p><p><strong>Contract scope.</strong><span> </span>Public documentation does not necessarily provide the same commitment as a DPA, order form, service agreement, product addendum, or customer-specific term.</p><p>None of these gaps proves that the vendor retains data improperly.</p><p>They show that a retention statement may be narrower than the lifecycle the buyer needs to understand.</p><h3>Weak-answer pattern</h3><p>This is the setting-without-lifecycle pattern.</p><p>The vendor provides a retention period or configuration option.</p><p>The buyer records:</p><blockquote><p>&#8220;Zero retention available.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Prompts deleted after 30 days.&#8221;</p></blockquote><p>But the review file does not identify:</p><ul><li><p>which data types are covered;</p></li><li><p>which endpoint or feature the setting controls;</p></li><li><p>whether it applies by default;</p></li><li><p>which storage layers are included;</p></li><li><p>whether metadata or logs remain;</p></li><li><p>which exceptions apply;</p></li><li><p>how deletion is verified;</p></li><li><p>which contractual source supports the claim.</p></li></ul><p>The vendor has described a setting.</p><p>The buyer has not yet established the control boundary.</p><h3>Evidence request</h3><p>Do not ask only:</p><blockquote><p>&#8220;What is your prompt-retention period?&#8221;</p></blockquote><p>Ask for the lifecycle.</p><p>A stronger request is:</p><blockquote><p>Please provide a product- and plan-specific retention matrix for the AI workflow under review. For prompts, outputs, uploaded files, embeddings, metadata, logs, moderation events, support artifacts, caches, indexes, and backups, identify the default and configurable retention period, storage layer, deletion timing, exception paths, human-access boundary, customer controls, audit evidence, and supporting contractual source.</p></blockquote><p>Then ask:</p><ul><li><p>Does the setting apply by default or require configuration?</p></li><li><p>Which endpoints, features, and data types are covered?</p></li><li><p>Does a setting change apply to existing data or only newly created data?</p></li><li><p>Which metadata, security records, or operational logs remain after content deletion?</p></li><li><p>How are cached, indexed, backed-up, or support-system copies handled?</p></li><li><p>Can the vendor override the setting for support, safety, abuse, incident, or legal purposes?</p></li><li><p>Are configuration changes recorded in audit logs?</p></li><li><p>Do new features and integrations inherit the same retention policy?</p></li><li><p>Which DPA, order-form term, or product addendum confirms the lifecycle?</p></li></ul><p>The vendor does not need to disclose sensitive architecture.</p><p>It does need to establish an operationally usable boundary.</p><h3>Review note</h3><p>A weak review note says:</p><blockquote><p>&#8220;Prompt retention is configurable.&#8221;</p></blockquote><p>A stronger review note says:</p><blockquote><p>The vendor identifies a configurable retention feature, but the available evidence does not establish the complete data lifecycle for the intended workflow. Coverage of files, embeddings, metadata, logs, support artifacts, caches, indexes, backups, configuration changes, and exception paths remains unclear. The response is not evidence-complete for data requiring verified deletion, short-lived processing, or customer-controlled retention.</p></blockquote><p>That note does not say the vendor&#8217;s statement is false.</p><p>It prevents a setting from being treated as proof of the entire lifecycle.</p><h3>Usage boundary</h3><p>Until the complete retention lifecycle is evidenced:</p><blockquote><p>Limit use to low-sensitivity internal or test data. Do not introduce customer-confidential data, regulated data, source code, employee records, privileged business material, or other data requiring verified deletion where uncertainty about storage layers, logs, metadata, backups, exception paths, or configuration would materially change the appropriate usage boundary.</p></blockquote><p>That is not approval.</p><p>That is review preparation.</p><p>The review unit is:</p><p><strong>vendor + product + plan + use case + data type + region + contract terms + evidence date.</strong></p><p>A retention setting can support that review.</p><p>It cannot remain a single number inside it.</p><p>A setting is part of the evidence.</p><p>It is not the whole control.</p><h3>Boundary</h3><p>This material is for evidence structuring and review preparation. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply if you want the sanitized sample evidence gap memo.</p><p>#AIVendorAssessment #AIGovernance #ThirdPartyRisk #Privacy #VendorRisk</p>]]></content:encoded></item><item><title><![CDATA[An Integration Is Not an Evidence Contract]]></title><description><![CDATA[An integration can move compliance data, but only an evidence contract preserves source, scope, integrity, provenance, and policy meaning.]]></description><link>https://www.codeyourcompliance.com/p/an-integration-is-not-an-evidence</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/an-integration-is-not-an-evidence</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 13 Jul 2026 09:22:28 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c3804c65-c231-442b-b101-b86e27cda429_1731x909.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A compliance platform connects to a source system.</p><p>Authentication succeeds.</p><p>Configuration data appears in the dashboard.</p><p>The control status turns green.</p><p>Then the reviewer asks:</p><blockquote><p>Which source produced this value?</p><p>Which collector version retrieved it?</p><p>When was it observed?</p><p>Was the full target scope reached?</p><p>Was the data changed during normalization?</p><p>Which policy evaluated it?</p></blockquote><p>The integration moved the data.</p><p>It did not preserve the answers.</p><p>That is the boundary.</p><div class="callout-block" data-callout="true"><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Integration = transport. </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Evidence contract = audit meaning.</mark></p></div><h2>What an Integration Proves</h2><p>A working integration may prove that:</p><ul><li><p>credentials were accepted</p></li><li><p>an endpoint was reachable</p></li><li><p>a payload was returned</p></li><li><p>field mapping completed</p></li><li><p>data reached the destination</p></li></ul><p>That is useful operational evidence.</p><p>It does not automatically prove that the transported data is valid audit evidence.</p><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">The integration may still omit:</mark></p><ul><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">source context</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">expected collection scope</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">failed targets</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">collector identity and version</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">collection timestamp</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">transformation history</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">integrity status</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">evidence freshness</mark></p></li><li><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">applicable policy version</mark></p></li></ul><p>Compliance evidence automation is not data movement.</p><p>It means collecting evidence from source systems, preserving provenance, validating integrity, evaluating policy, and producing a reviewable evidence package.</p><h2>Missing Data Must Survive the Integration</h2><p>Suppose a collector is expected to inspect 100 systems.</p><p>It reaches 94.</p><p>The integration writes 94 successful records into the compliance platform.</p><p>The dashboard reports that all received records passed.</p><p>Technically, the integration worked.</p><p><mark data-color="#d0e0e3" style="background-color: rgb(208, 224, 227); color: rgb(0, 0, 0);">The evidence package is incomplete.</mark></p><p><mark data-color="#d0e0e3" style="background-color: rgb(208, 224, 227); color: rgb(0, 0, 0);">The correct state is:</mark></p><p><mark data-color="#d0e0e3" style="background-color: rgb(208, 224, 227); color: rgb(0, 0, 0);">expected targets: 100</mark></p><p><mark data-color="#d0e0e3" style="background-color: rgb(208, 224, 227); color: rgb(0, 0, 0);">observed targets: 94</mark></p><p><mark data-color="#d0e0e3" style="background-color: rgb(208, 224, 227); color: rgb(0, 0, 0);">failed collection: 6</mark></p><p><mark data-color="#d0e0e3" style="background-color: rgb(208, 224, 227); color: rgb(0, 0, 0);">It is not:</mark></p><p><mark data-color="#d0e0e3" style="background-color: rgb(208, 224, 227); color: rgb(0, 0, 0);">evaluated environment: compliant</mark></p><p>The six missing systems did not fail the control.</p><p>They did not pass it either.</p><p>They were not observed.</p><div class="callout-block" data-callout="true"><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">missing evidence != control failure</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">missing evidence != control pass</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">missing evidence = unresolved evidence state</mark></p></div><p>If that distinction disappears during transport, the evidence has already lost part of its value.</p><h2>What an Evidence Contract Preserves</h2><p>An evidence contract defines the minimum structure that must survive collection, transport, normalization, evaluation, and reporting.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;9ff1f37e-16d6-4e7b-8e93-0ba40e98b2e0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">evidence_contract:
  source_system:
  collector:
  collector_version:
  collection_method:
  timestamp_utc:
  evidence_type:
  evidence_layer:
  integrity_hash:
  validation_status:
  policy_input_ref:</code></pre></div><p>Each field answers a different audit question.</p><blockquote><p><code>source_system</code> identifies where the evidence originated.</p><p><code>collector</code> and <code>collector_version</code> identify what process observed the source.</p><p><code>collection_method</code> distinguishes read-only observation from collection that may have changed the assessed system.</p><p><code>timestamp_utc</code> records when the state was observed.</p><p><code>evidence_type</code> defines what kind of object was collected.</p><p><code>evidence_layer</code> separates raw evidence, normalized facts, derived facts, policy results, and audit narratives.</p><p><code>integrity_hash</code> supports detection of post-collection mutation.</p><p><code>validation_status</code> preserves whether the evidence is valid, stale, missing, tampered, unknown, or not machine-verifiable.</p><p><code>policy_input_ref</code> links the evidence to the rule evaluation that consumed it.</p></blockquote><p>Without these fields, the destination may contain data.</p><p>It does not yet contain a replayable evidence object.</p><h2>One Green Status Is Not Enough</h2><p>A common implementation error is using one status field for the entire pipeline:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;98ee5efc-2b18-4231-85c9-c78702f37748&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "status": "success"
}</code></pre></div><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">What succeeded?</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">The API request?</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">The collection?</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">The schema validation?</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">The integrity check?</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">The policy evaluation?</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">The control?</mark></p><p>These outcomes should remain separate.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;b953c43c-8600-4dde-af92-3ede98ba77ed&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">transport_status: success
collection_status: partial
schema_status: valid
integrity_status: verified
freshness_status: stale
policy_status: not_evaluated
control_status: unknown</code></pre></div><p>A single green status is easy to display.</p><p>It is difficult to audit.</p><h2>Normalization Changes Meaning</h2><p>Integrations often rename fields, convert timestamps, flatten objects, infer Boolean values, and discard unsupported data.</p><p>These transformations may be necessary.</p><p>They are not neutral.</p><p>Suppose the source returns:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;e21ec0f3-9ff0-46cb-9f17-5765e35ef290&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "certificate_not_after": "2026-08-01T00:00:00Z"
}</code></pre></div><p>The integration writes:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;fe076494-9f14-4fab-b025-298fbb1bfa35&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "certificate_valid": true
}</code></pre></div><p>The second value is not raw evidence.</p><p>It is a derived fact.</p><p>The system should preserve the source value, transformation rule, evaluation time, and derived result.</p><p>Otherwise the integration replaces evidence with an unexplained conclusion.</p><h2>OPA Cannot Repair Weak Evidence</h2><p>OPA can evaluate a defined input against a defined policy.</p><p>It cannot determine whether the input was collected from the correct source, whether the target scope was complete, or whether the evidence was modified before evaluation.</p><p>A reproducible rule result can still be based on weak evidence.</p><p>The policy engine is not the point.</p><p>The audit problem starts earlier.</p><p>The evidence contract defines what the evaluator is allowed to treat as policy input.</p><h2>Different Failures Need Different Outcomes</h2><p>The pipeline should distinguish</p><div class="callout-block" data-callout="true"><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">transport failure</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">collection failure</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">invalid evidence</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">policy evaluation failure</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">control failure</mark></p></div><p>An API timeout is not automatically non-compliance.</p><p>The defensible chain is:</p><div class="callout-block" data-callout="true"><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">API timeout</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; collection incomplete</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; evidence missing</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; control not evaluated</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; review or escalation required</mark></p></div><p>Control failure should be recorded only when valid evidence was evaluated and the required condition was not met.</p><p>Failure states must survive the integration.</p><h2>Technical companion</h2><p>An evidence contract boundary note and two synthetic integration examples are available in the CodeYourCompliance <code>evidence-validation-pipeline</code> repository.</p><p>Evidence contract boundary:</p><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence_contract.md">https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence_contract.md</a></p><p>Integration without an evidence contract:</p><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/integration_without_evidence_contract.json">https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/integration_without_evidence_contract.json</a></p><p>Integration with an evidence contract:</p><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/integration_with_evidence_contract.json">https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/integration_with_evidence_contract.json</a></p><p>These examples do not implement a complete integration governance or evidence integrity model.</p><p>They show one boundary:</p><blockquote><p>Successful transport does not establish evidence validity.</p></blockquote><h2>Boundary</h2><p>This material is for evidence structuring, integration design review, and technical review preparation.</p><p>It does not provide legal, regulatory, audit, certification, compliance, procurement, or implementation advice.</p><p>The goal is not to prove MAS TRM compliance.</p><p>The goal is to make the transport-versus-evidence boundary visible before synchronized data becomes accepted audit evidence.</p><h2>Origin</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong></p><p>Website: <a href="https://www.codeyourcompliance.com/">https://www.codeyourcompliance.com/</a></p><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations, and discussions.</p><h2>Related reading</h2><p><a href="https://www.codeyourcompliance.com/p/why-audit-evidence-goes-stale">Why Audit Evidence Goes Stale</a></p><p><a href="https://www.codeyourcompliance.com/p/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</a></p><p><a href="https://www.codeyourcompliance.com/p/what-a-mas-trm-checklist-cannot-prove">What a MAS TRM Checklist Cannot Prove</a></p><p><a href="https://www.codeyourcompliance.com/p/a-screenshot-is-a-supporting-artifact">A Screenshot Is a Supporting Artifact, Not a Proof Object</a></p><p><a href="https://www.codeyourcompliance.com/p/a-generated-report-is-not-an-accountable">A Generated Report Is Not an Accountable Audit Conclusion</a></p>]]></content:encoded></item><item><title><![CDATA[Subprocessor Lists Do Not Show the Actual AI Data Path]]></title><description><![CDATA[A subprocessor list shows who may process data. It does not show which subprocessors touch which data, feature, region, workflow, or support path.]]></description><link>https://www.codeyourcompliance.com/p/subprocessor-lists-do-not-show-the</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/subprocessor-lists-do-not-show-the</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Fri, 10 Jul 2026 04:30:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9395179b-5ff5-41af-84ad-7a834ff2d168_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>AI Vendor Evidence Gap Notes #5 </strong></em></p><p>A subprocessor list is useful evidence.</p><p>It is not the actual AI data path.</p><p>An AI vendor may publish a list of third-party service providers. That list may show which subprocessors the vendor is permitted to use.</p><p>But for a buyer, the review question is narrower:</p><blockquote><p>Which provider touches which data, for which product feature, in which region, under which contract boundary, for which use case, and for how long?</p></blockquote><p>If that is not answered, the subprocessor list remains source material.</p><p>It is not evidence-complete for AI vendor review.</p><h3>Claim</h3><p>The vendor says:</p><blockquote><p>&#8220;We maintain a subprocessor list.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Our current subprocessors are listed here.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;We only share customer data with approved subprocessors.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Customers will be notified of subprocessor changes.&#8221;</p></blockquote><p>These statements may support a baseline third-party disclosure process.</p><p>They do not automatically show how data moves through the actual AI workflow.</p><h3>Why it sounds sufficient</h3><p>A subprocessor list feels concrete.</p><p>It usually includes company names, service descriptions, locations, and sometimes update dates or notification terms.</p><p>For a standard SaaS review, this may support a basic third-party processing check. The buyer can see that cloud infrastructure, analytics, support, security tooling, logging, email delivery, or AI infrastructure providers may be involved.</p><p>That matters.</p><p>But AI vendor review usually needs more than a list.</p><p>A buyer may be sending prompts, files, meeting audio, transcripts, source code, customer records, support tickets, embeddings, metadata, logs, or generated outputs into a specific product workflow.</p><p>A static subprocessor list may not show which of those data types each third party touches.</p><p>It may not show whether a model provider processes prompts and outputs. It may not show whether transcription, embedding, retrieval, safety filtering, support access, logging, analytics, or abuse monitoring follow different paths.</p><p>The list names possible processors.</p><p>It does not explain the operating path.</p><h3>What it actually proves</h3><p>A subprocessor list may show that the vendor discloses third parties, identifies their general functions, maintains an update process, and may notify customers of changes.</p><p>These are useful evidence points.</p><p>They establish disclosure practices.</p><p>They do not establish the buyer&#8217;s actual AI workflow.</p><h3>A public evidence example</h3><p>The<span> </span><strong><a href="https://signal.codeyourcompliance.com/companies/vercel/">CodeYourCompliance public evidence profile for Vercel</a></strong><span> </span>records several public evidence surfaces observed as of 27 June 2026, including the Trust Center, DPA, subprocessor disclosures, AI data-use terms, and the separate<span> </span><strong><a href="https://vercel.com/legal/v0-enterprise-addendum">v0 Enterprise Addendum</a></strong>.</p><p>The profile is an evidence index. It is not verification of an operating data path.</p><p>For v0,<span> </span><strong><a href="https://security.vercel.com/">Vercel&#8217;s public Trust Center materials</a></strong><span> </span>identify certain providers and describe functions such as model inference, AI services, monitoring, and analytics.</p><p>Separately, Vercel&#8217;s<span> </span><strong><a href="https://vercel.com/docs/ai-gateway/models-and-providers/provider-options">AI Gateway documentation</a></strong><span> </span>describes provider ordering and fallback behaviour for AI Gateway.</p><p>These are different product surfaces.</p><p>They should not be combined into one product-level conclusion.</p><p>Together, they illustrate the evidence problem: a subprocessor disclosure may identify possible participants, while product documentation may describe possible routing behaviour.</p><p>Neither source alone shows which provider handled a particular request, what data was sent, whether fallback occurred, what the provider retained, or whether the same path applied to the buyer&#8217;s product, plan, configuration, and region.</p><p>The list identifies possible participants.</p><p>The product documentation describes possible routing.</p><p>The buyer still needs the workflow-level map.</p><h3>What it does not prove</h3><p>A subprocessor list does not automatically establish:</p><p><strong>Product and feature use.</strong><span> </span>A provider listed at company level may not participate in the exact product, feature, plan, or configuration under review.</p><p><strong>Data-type coverage.</strong><span> </span>The list may not show whether a provider receives prompts, outputs, files, transcripts, embeddings, metadata, logs, support records, or safety events.</p><p><strong>Routing and fallback.</strong><span> </span>It may not show which provider handles a request, whether routing changes by region, or whether another provider is used after failure, timeout, or capacity constraints.</p><p><strong>Retention and access.</strong><span> </span>It may not explain what each provider stores, how long it is retained, who can access it, or how deletion is propagated.</p><p><strong>Contract scope.</strong><span> </span>It may not show whether the relevant processing path is covered by the customer&#8217;s DPA, order form, product addendum, objection rights, or regional commitments.</p><p>The buyer may therefore record:</p><blockquote><p>&#8220;Subprocessor list reviewed.&#8221;</p></blockquote><p>But the review file still does not establish the actual AI data path.</p><h3>Weak-answer pattern</h3><p>This is the list-without-routing pattern.</p><p>The vendor provides a subprocessor list, and the buyer records it as if the data path were understood.</p><p>But the list does not show which provider handles prompts, embeddings, logs, support records, or fallback traffic for the specific workflow.</p><p>Without that mapping, the list is a directory.</p><p>It is not the data path.</p><h3>Evidence request</h3><p>Do not ask only:</p><blockquote><p>&#8220;Can you provide your subprocessor list?&#8221;</p></blockquote><p>Ask for feature-level routing.</p><p>A stronger request is:</p><blockquote><p>Please map the subprocessors and model providers involved in the specific product, plan, region, and AI workflow under review, including which data types each provider receives, processes, stores, logs, or can access.</p></blockquote><p>Then ask:</p><ul><li><p>Which providers are used for the exact product, plan, feature, configuration, and region?</p></li><li><p>Which data types does each provider receive, process, store, log, or access?</p></li><li><p>Can model routing, fallback, support, monitoring, or safety workflows change the provider path?</p></li><li><p>What retention, deletion, and human-access terms apply at each provider?</p></li><li><p>Which DPA, addendum, order-form term, or customer control confirms the boundary?</p></li></ul><p>That is how a subprocessor list becomes reviewable.</p><h3>Review note</h3><p>A weak review note says:</p><blockquote><p>Subprocessor list available.</p></blockquote><p>A stronger review note says:</p><blockquote><p>The vendor provides a subprocessor list, but the list does not by itself establish the actual AI data path for the intended workflow. The buyer should confirm which subprocessors and model providers process each relevant data type, which product features use them, whether routing differs by plan, region, or configuration, whether support and monitoring systems receive customer content, and which contract terms confirm the processing boundary.</p></blockquote><p>That note does not say the vendor is unsafe.</p><p>It says the subprocessor evidence has not yet been mapped to the workflow.</p><h3>Usage boundary</h3><p>Until provider routing is mapped, usage should remain bounded.</p><blockquote><p>Limit use to low-sensitivity internal data. Do not introduce customer-confidential data, regulated data, source code, employee records, or privileged business material where uncertainty about provider routing, retention, support access, or regional handling would materially change the appropriate usage boundary.</p></blockquote><p>That is not approval.</p><p>That is review preparation.</p><p>The review unit is:</p><p><strong>vendor + product + plan + use case + data type + region + contract terms + evidence date.</strong></p><p>A subprocessor list can support the review.</p><p>It cannot replace the actual AI data path.</p><h3>Boundary</h3><p>This material is for evidence structuring and review preparation. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply to request the sanitized sample evidence gap memo.</p>]]></content:encoded></item><item><title><![CDATA[Why Audit Evidence Goes Stale]]></title><description><![CDATA[Audit evidence can pass integrity checks and still be too stale to support a current compliance conclusion.]]></description><link>https://www.codeyourcompliance.com/p/why-audit-evidence-goes-stale</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/why-audit-evidence-goes-stale</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Tue, 07 Jul 2026 05:32:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tqwP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>An access review export was collected two weeks before the audit pack was finalized.</p><p>The export is real.</p><p>The timestamp is real.</p><p>The file hash still verifies.</p><p>But the system changed after collection.</p><p>The evidence is intact.</p><p>The conclusion is not.</p><p>That is the freshness problem.</p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">A verified hash does not make stale evidence current.</mark></p><h2>Evidence can be true and stale at the same time</h2><p>Compliance teams often treat evidence as a static artifact.</p><p>A screenshot was captured.</p><p>A report was exported.</p><p>A log bundle was saved.</p><p>A file hash was recorded.</p><p>That may prove something useful.</p><p>It does not prove the evidence still supports the conclusion being made today.</p><p>Integrity asks whether the evidence changed after collection.</p><p>Freshness asks whether the evidence is still recent enough to support the current claim.</p><p>Those are different questions.</p><p>A stale evidence object can still pass integrity verification.</p><p>That is the trap.</p><h2>Freshness is an evidence property</h2><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Compliance evidence freshness is the condition that an evidence object remains recent enough, within its expected validity window, to support the compliance conclusion being drawn from it.</mark></p><p>Freshness is not decoration.</p><p>It is not a report date.</p><p>It is not the date the auditor opened the folder.</p><p>It belongs inside the evidence object.</p><p>A minimum freshness record should preserve:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;jsx&quot;,&quot;nodeId&quot;:&quot;fb4ce151-35aa-46bc-8f5a-07df9cee24f8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-jsx">evidence_freshness:
  collected_at:
  valid_until:
  freshness_window_seconds:
  freshness_status: fresh | stale | expired | unknown</code></pre></div><p>The collection timestamp tells us when the evidence was observed.</p><p>The validity window tells us how long that evidence can reasonably support the claim.</p><p>The freshness status tells us whether downstream evaluation should proceed.</p><p>Without this, the report can quietly reuse old evidence as if it were still current.</p><h2>Integrity is not freshness</h2><p>A hash can prove that an evidence object has not changed.</p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">It cannot prove that the system has not changed.</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">A TLS certificate export can be hashed.</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">A firewall rule export can be hashed.</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">An access review file can be hashed.</mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">A cloud configuration snapshot can be hashed.</mark></p><p>If the source system changes after collection, the hash still verifies.</p><p>The evidence object is stable.</p><p>The world it describes may not be.</p><p>This is the boundary:</p><div class="callout-block" data-callout="true"><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">integrity = did the evidence object change after collection? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">freshness = can this evidence still support the current conclusion?</mark></p></div><p>Both are needed.</p><p>One does not replace the other.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tqwP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tqwP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!tqwP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!tqwP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!tqwP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tqwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:994407,&quot;alt&quot;:&quot;Integrity Is Not Freshness&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.codeyourcompliance.com/i/205716351?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Integrity Is Not Freshness" title="Integrity Is Not Freshness" srcset="https://substackcdn.com/image/fetch/$s_!tqwP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!tqwP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!tqwP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!tqwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F768d5cc2-b010-4111-9c0f-aa180a735917_1672x941.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Integrity proves whether the evidence object changed after collection. Freshness asks whether the evidence still supports the conclusion now being made.</figcaption></figure></div><h2>Why stale evidence should not become pass or fail</h2><p>A stale evidence object should not silently produce a clean control result.</p><p>It should not be converted into pass.</p><p>It should not be converted into fail.</p><p>The correct outcome is a freshness classification.</p><p>For example:</p><blockquote><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">verified evidence + expired freshness window = stale_evidence</mark></p></blockquote><p>That is not the same as non-compliance.</p><p>It means the evidence can no longer safely support the current conclusion.</p><p>The control may be working.</p><p>The control may have failed.</p><p>The evidence is no longer strong enough to decide.</p><p>That distinction matters.</p><p>Automation should preserve it.</p><h2>The evidence quality gate</h2><p>Policy evaluation should not begin with the control.</p><p>It should begin with the evidence.</p><p>The pipeline should first ask:</p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Is the evidence intact? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Is the evidence source clear? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Is the collector identified? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Is the collection time preserved? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Is the evidence fresh enough?</mark></p><p>Only then should the system evaluate the control expectation.</p><p>A simple evidence quality gate looks like this:</p><blockquote><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">evidence object </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; integrity verification </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; freshness classification </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; derived facts </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; policy evaluation </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">-&gt; audit narrative</mark></p></blockquote><p>If freshness fails, downstream evaluation should stop or explicitly carry the stale evidence status.</p><p>The report should not hide the freshness failure.</p><h2>A stale evidence example</h2><p>In the <a href="https://www.codeyourcompliance.com/">CodeYourCompliance </a>evidence validation pipeline, the sample stale evidence object uses a TLS certificate evidence record.</p><p>The evidence was collected on July 1.</p><p>It was evaluated on July 7.</p><p>Its declared freshness window was 24 hours.</p><p>The integrity status is still verified.</p><p>The freshness status is stale.</p><p>The policy result is not pass or fail.</p><p>It is:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;17a0557d-c8fa-4b25-a82f-9532c9f1b9bf&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "input_status": "verified_but_stale_evidence",
  "result": "stale_evidence"
}
</code></pre></div><p>That is the correct boundary.</p><p>The evidence object survived integrity verification.</p><p>It did not survive freshness evaluation.</p><h2>What the audit narrative should say</h2><p>A weak audit narrative says:</p><p><mark data-color="#cfe2f3" style="background-color: rgb(207, 226, 243); color: rgb(0, 0, 0);">TLS evidence reviewed. No issue noted.</mark></p><p>A better audit narrative says:</p><div class="callout-block" data-callout="true"><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">TLS certificate evidence was collected and integrity verification passed. However, the evidence was evaluated after its declared freshness window expired. The evidence should not be used to support a current compliance conclusion without recollection or updated source evidence.</mark></p></div><p>That is not legal interpretation.</p><p>That is evidence discipline.</p><p>The narrative should explain what the evidence can still support.</p><p>It should also explain what it can no longer support.</p><h2>MAS TRM-inspired framing</h2><p>MAS TRM-inspired does not mean MAS TRM prescribes a freshness field.</p><p>It does not mean a specific JSON structure, Rego policy, hash algorithm, or evidence pipeline is required.</p><p>The framing is narrower.</p><p>If a compliance conclusion depends on technical evidence, the evidence should be recent enough to support that conclusion.</p><p>That is an engineering interpretation.</p><p>It separates the control claim from the proof material behind it.</p><h2>Freshness changes the report boundary</h2><p>Reports often collapse time.</p><p>They present collected evidence, reviewer notes, control statements, and conclusions inside one document.</p><p>That can make old evidence look current.</p><p>A freshness field forces the report to show the time boundary.</p><p>It asks:</p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">When was this evidence collected? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">How long was it valid for this claim? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">When was the conclusion made? </mark></p><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">Did the evidence remain fresh at conclusion time?</mark></p><p>If the answer is no, the report should say so.</p><p>The evidence may still be useful background.</p><p>It should not be treated as current proof.</p><h2>Technical companion</h2><p>A stale evidence example and a narrow OPA/Rego freshness policy demo are available in the CodeYourCompliance <code>evidence-validation-pipeline</code> repository.</p><p>Stale evidence example:</p><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/stale_evidence.json">https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/stale_evidence.json</a></p><p>Evidence freshness policy demo:</p><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/policies/demo/evidence_freshness.rego">https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/policies/demo/evidence_freshness.rego</a></p><p>These examples do not implement a complete evidence integrity model.</p><p>They show one boundary:</p><blockquote><p><mark data-color="#fff2cc" style="background-color: rgb(255, 242, 204); color: rgb(0, 0, 0);">verified evidence can still be stale evidence</mark></p></blockquote><h2>Boundary</h2><p>This material is for evidence structuring and technical review preparation.</p><p>It does not provide legal, regulatory, audit, certification, compliance, procurement, or implementation advice.</p><p>The goal is not to prove MAS TRM compliance.</p><p>The goal is to make the evidence freshness boundary visible before stale evidence becomes a clean report conclusion.</p><h2>Origin</h2><p><strong>Code<span data-color="#0000ff" style="color: rgb(0, 0, 255);">Your</span>Compliance</strong></p><p>Website: <a href="https://www.codeyourcompliance.com/">https://www.codeyourcompliance.com/</a></p><p>GitHub: <a href="https://github.com/codeyourcompliance">https://github.com/codeyourcompliance</a></p><p>Attribution is requested for forks, references, adaptations, and discussions.</p><h2>Related reading</h2><p><a href="https://www.codeyourcompliance.com/p/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</a></p><p><a href="https://www.codeyourcompliance.com/p/what-a-mas-trm-checklist-cannot-prove">What a MAS TRM Checklist Cannot Prove</a></p><p><a href="https://www.codeyourcompliance.com/p/a-screenshot-is-a-supporting-artifact">A Screenshot Is a Supporting Artifact, Not a Proof Object</a></p><p><a href="https://www.codeyourcompliance.com/p/a-generated-report-is-not-an-accountable">A Generated Report Is Not an Accountable Audit Conclusion</a></p><p><a href="https://www.codeyourcompliance.com/p/tool-approval-is-not-workflow-proof">Tool Approval Is Not Workflow Proof</a></p>]]></content:encoded></item><item><title><![CDATA[Human Review Is a Data Exposure Path Unless It Is Bounded]]></title><description><![CDATA[Human review may support safety and support workflows, but buyers still need evidence for scope, trigger, access roles, retention, opt-out, and contract boundary.]]></description><link>https://www.codeyourcompliance.com/p/human-review-is-a-data-exposure-path</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/human-review-is-a-data-exposure-path</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Fri, 03 Jul 2026 04:24:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/59dbde4a-230f-43b6-b06d-8f87d3ba7bcf_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>AI Vendor Evidence Gap Notes #4 </strong></em></p><p>Human review can be a safety control.</p><p>It can also be a data exposure path.</p><p>Both can be true.</p><p>An AI vendor may say human review is used for safety, abuse prevention, support, troubleshooting, quality assurance, or model evaluation.</p><p>That may sound responsible.</p><p>But for a buyer, the review question is narrower:</p><blockquote><p>Who can see customer data, under what condition, for what purpose, for how long, in which system, under which contract boundary, and with what customer control?</p></blockquote><p>If that is not answered, &#8220;human review&#8221; remains too vague for AI vendor assessment.</p><h3>Claim</h3><p>The vendor says:</p><blockquote><p>&#8220;Human review may be used for safety.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Authorized personnel may access customer data for support and troubleshooting.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Customer content may be reviewed in limited circumstances.&#8221;</p></blockquote><p>These statements may describe legitimate operational controls.</p><p>They do not automatically establish whether the exposure is bounded.</p><h3>Why it sounds sufficient</h3><p>Human review sounds responsible.</p><p>It suggests that the vendor is not relying blindly on automation. Human involvement may help investigate abuse, resolve support issues, troubleshoot product failures, review security incidents, or assess flagged content.</p><p>That matters.</p><p>But in an AI vendor review, human review is not only a control.</p><p>It is also a path through which customer data may become visible to people outside the buyer&#8217;s organization.</p><p>A general statement such as &#8220;limited human review&#8221; does not show which content can be accessed, who can access it, what triggers access, or where the reviewed information goes.</p><p>The buyer therefore needs more than a description.</p><p>The buyer needs a boundary.</p><h3>What it actually proves</h3><p>A human-review statement may establish that the vendor has a process through which authorized personnel can inspect certain content or operational records under defined circumstances.</p><p>It may support limited conclusions such as:</p><ul><li><p>the vendor investigates safety or abuse events;</p></li><li><p>support personnel can troubleshoot customer issues;</p></li><li><p>internal personnel may respond to security incidents;</p></li><li><p>the vendor maintains operational review workflows.</p></li></ul><p>These are useful evidence points.</p><p>They establish that a review process exists.</p><p>They do not establish its complete access boundary.</p><h3>A public evidence example</h3><p>The<span> </span><strong><a href="https://signal.codeyourcompliance.com/companies/openai/">CodeYourCompliance public evidence profile for OpenAI</a></strong><span> </span>records several public evidence surfaces, including the Trust Portal, security and privacy material, Services Agreement, DPA, enterprise privacy controls, and administrative-control references.</p><p>The profile is an evidence index.</p><p>It is not verification of how access operates for a particular customer, product, workspace, or incident.</p><p>OpenAI&#8217;s<span> </span><strong><a href="https://openai.com/enterprise-privacy/">Enterprise Privacy page</a></strong><span> </span>shows why product and plan scope matter. It says business data is subject to human review on a service-by-service basis.</p><p>For ChatGPT Enterprise, ChatGPT Edu, and ChatGPT for Healthcare, the page states that authorized OpenAI employees may access conversations for purposes such as resolving incidents, recovering conversations with explicit customer permission, or meeting legal requirements.</p><p>For ChatGPT Business and stored API data, the same page describes a different boundary. It states that authorized employees may require access for engineering support, investigation of potential platform abuse, or legal compliance. It also identifies specialized third-party contractors, subject to confidentiality and security obligations, who may review content for abuse and misuse.</p><p>These statements are more useful than a generic claim that human review is &#8220;limited.&#8221;</p><p>They begin to identify:</p><ul><li><p>the relevant service;</p></li><li><p>the category of person who may access data;</p></li><li><p>the purpose of access;</p></li><li><p>whether third-party reviewers may be involved.</p></li></ul><p>They also show why evidence from one product or plan should not be applied automatically to another.</p><p>The public page does not, by itself, establish every operational detail a buyer may require. It does not fully show the approval workflow, event-level access logs, time limits, reviewed-copy lifecycle, regional access location, customer-visible records, or customer-specific contractual terms.</p><p>The source describes an access boundary.</p><p>The buyer still needs to determine whether that boundary is sufficient for the intended workflow.</p><h3>What it does not prove</h3><p>A human-review statement does not automatically establish:</p><p><strong>Data-type coverage.</strong><span> </span>It may not show whether reviewers can access prompts, outputs, uploaded files, audio, transcripts, embeddings, metadata, logs, support tickets, screenshots, or derived records.</p><p><strong>Review triggers.</strong><span> </span>It may not distinguish customer-requested support, automated abuse flags, security incidents, quality sampling, legal requests, product evaluation, or internal investigations.</p><p><strong>Reviewer identity.</strong><span> </span>It may not show whether access is limited to employees or may also include contractors, subprocessors, support agents, safety teams, engineers, or third-party reviewers.</p><p><strong>Access controls.</strong><span> </span>It may not establish whether access requires approval, is time-limited, is logged, is monitored, or is visible to the customer.</p><p><strong>Secondary systems.</strong><span> </span>Reviewed content may be copied into support tools, ticketing systems, safety queues, labeling platforms, incident systems, or evaluation datasets.</p><p><strong>Retention and deletion.</strong><span> </span>The original content and the reviewed copy may follow different retention periods or deletion processes.</p><p><strong>Customer control.</strong><span> </span>It may not show whether the customer can opt out, restrict review, require approval, or receive notice of access.</p><p><strong>Contract scope.</strong><span> </span>Public documentation may not establish whether the same commitment applies to the buyer&#8217;s product, plan, region, feature, and agreement.</p><p>None of these gaps prove that review is uncontrolled.</p><p>They show that the available description may not yet establish the complete exposure boundary.</p><h3>Weak-answer pattern</h3><p>This is the safety-control blur.</p><p>The vendor frames human review as a safety or support measure, and the buyer records that statement as positive assurance.</p><p>But the same control can create a separate access path.</p><p>A weak review record says:</p><blockquote><p>Human review is limited to safety and support.</p></blockquote><p>That may be directionally useful.</p><p>It does not establish what content is accessible, what triggers access, which roles are involved, whether access is logged, where reviewed copies are stored, or whether customers can restrict the process.</p><p>Without those details, human review is described.</p><p>It is not bounded.</p><h3>Evidence request</h3><p>Do not ask only:</p><blockquote><p>&#8220;Do you use human review?&#8221;</p></blockquote><p>Ask for the review boundary.</p><p>A stronger request is:</p><blockquote><p>Please describe every circumstance in which employees, contractors, support personnel, safety reviewers, engineers, subprocessors, or third-party reviewers may access customer content or derived data. For each circumstance, identify the relevant product and plan, data types, access trigger, reviewer role, purpose, approval process, logging, retention, deletion, customer control, and supporting contract term.</p></blockquote><p>Then ask:</p><ul><li><p>Which data types can be reviewed?</p></li><li><p>What events or requests trigger access?</p></li><li><p>Which employee, contractor, subprocessor, or third-party roles may access the data?</p></li><li><p>Is access approved, time-limited, logged, monitored, and auditable?</p></li><li><p>Can the customer restrict review or require approval for support access?</p></li><li><p>Are reviewed records copied into support, safety, labeling, evaluation, analytics, or incident systems?</p></li><li><p>How long are the original content and reviewed copies retained?</p></li><li><p>Does the boundary differ by product, plan, feature, configuration, region, or contract?</p></li></ul><p>That is how human review becomes reviewable.</p><h3>Review note</h3><p>A weak review note says:</p><blockquote><p>Human review is limited.</p></blockquote><p>A stronger review note says:</p><blockquote><p>The vendor describes human access for safety, support, abuse investigation, incident response, or operational purposes, but the available evidence does not establish the complete review boundary for the intended workflow. The buyer should confirm which data types may be accessed, what triggers access, which employee or third-party roles are involved, whether access is approved and logged, whether reviewed copies enter secondary systems, how those copies are retained or deleted, which customer controls are available, and which contract terms confirm the boundary.</p></blockquote><p>That note does not say the vendor is unsafe.</p><p>It says the exposure path is not yet evidence-complete.</p><h3>Usage boundary</h3><p>Until human access is bounded, usage should remain conservative.</p><blockquote><p>Limit use to low-sensitivity internal data. Do not introduce customer-confidential data, regulated data, source code, employee records, privileged business material, or externally relied-upon outputs where uncertainty about human access, support workflows, secondary copies, retention, third-party reviewers, or customer controls would materially change the appropriate usage boundary.</p></blockquote><p>That is not approval.</p><p>That is review preparation.</p><p>The review unit is:</p><p><strong>vendor + product + plan + use case + data type + region + contract terms + evidence date.</strong></p><p>Human review can support safety, support, and incident response.</p><p>It can also create an access path.</p><p>The buyer needs evidence for both.</p><h3>Boundary</h3><p>This material is for evidence structuring and review preparation. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply if you want the sanitized sample evidence gap memo.</p><p>#AIVendorAssessment #AIGovernance #ThirdPartyRisk #Privacy #VendorRisk</p>]]></content:encoded></item><item><title><![CDATA[Why SOC 2 Does Not Prove the AI Vendor Data Path Is Covered]]></title><description><![CDATA[SOC 2 is useful evidence, but AI vendor risk assessment still needs product, model path, retention, support access, and use-case scope mapping.]]></description><link>https://www.codeyourcompliance.com/p/why-soc-2-does-not-prove-the-ai-vendor</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/why-soc-2-does-not-prove-the-ai-vendor</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Tue, 30 Jun 2026 05:05:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/65f9bcfb-ed33-4307-b2aa-48b3c042c298_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>AI Vendor Evidence Gap Notes #3 </strong></em></p><p>SOC 2 is useful evidence.</p><p>It is not automatically evidence that the AI data path is covered.</p><p>A SOC 2 report may support the existence of a tested control environment.</p><p>It may still not establish whether the specific AI product, feature, model route, support workflow, retention path, region, and contract boundary match the buyer&#8217;s intended use.</p><p>That is the evidence gap.</p><p>The question is not only:</p><blockquote><p>Does the vendor have SOC 2?</p></blockquote><p>The better question is:</p><blockquote><p>What does the SOC 2 report prove for this AI workflow, and what still needs to be mapped before real data use?</p></blockquote><h3>Claim</h3><p>The vendor says:</p><blockquote><p>&#8220;We have a SOC 2 Type II report.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Our platform is SOC 2 compliant.&#8221;</p></blockquote><p>Or:</p><blockquote><p>&#8220;Our security controls are independently audited.&#8221;</p></blockquote><p>These statements may be useful.</p><p>They do not, by themselves, establish that the buyer&#8217;s actual AI data path is covered.</p><h3>Why it sounds sufficient</h3><p>SOC 2 sounds formal.</p><p>It usually involves an independent auditor, a defined system, a reporting period, management assertions, control descriptions, testing procedures, and test results.</p><p>For a conventional SaaS review, the report may answer important baseline questions about access management, change management, incident response, monitoring, vendor management, and security operations.</p><p>That matters.</p><p>But an AI vendor review usually asks a narrower question.</p><p>The buyer is not simply purchasing &#8220;the platform.&#8221;</p><p>The buyer may be sending prompts, files, meeting audio, transcripts, summaries, source code, customer records, metadata, embeddings, logs, support tickets, or evaluation data into a specific workflow.</p><p>That workflow may involve:</p><ul><li><p>a hosted application;</p></li><li><p>one or more model providers;</p></li><li><p>retrieval or embedding systems;</p></li><li><p>transcription services;</p></li><li><p>support and troubleshooting tools;</p></li><li><p>safety or abuse-review systems;</p></li><li><p>logging and monitoring platforms;</p></li><li><p>regional infrastructure;</p></li><li><p>customer-selected integrations.</p></li></ul><p>A SOC 2 report may cover some or all of those elements.</p><p>It may also apply only to a more narrowly defined system.</p><p>The buyer cannot determine that from the SOC 2 label alone.</p><h3>What it actually proves</h3><p>A SOC 2 Type II report may establish that specified controls operated within a defined system and reporting period, subject to the scope, criteria, testing, exceptions, and limitations described in the report.</p><p>It may support findings such as:</p><ul><li><p>access-control procedures were documented and tested;</p></li><li><p>privileged access was reviewed;</p></li><li><p>system changes followed controlled processes;</p></li><li><p>relevant systems were monitored;</p></li><li><p>incident-response procedures existed;</p></li><li><p>selected vendors were subject to review;</p></li><li><p>security policies and operational controls were maintained.</p></li></ul><p>These are meaningful evidence points.</p><p>They establish something about the audited control environment.</p><p>They do not automatically establish the scope of the buyer&#8217;s AI workflow.</p><h3>A public evidence example</h3><p>The<span> </span><strong><a href="https://signal.codeyourcompliance.com/companies/harvey/">CodeYourCompliance public evidence profile for Harvey</a></strong><span> </span>records several public assurance surfaces, including Harvey&#8217;s Trust Center, security material, DPA references, subprocessor disclosures, and dated SOC 2 and ISO updates.</p><p>The profile is an evidence index.</p><p>It is not verification that a particular Harvey product, feature, plan, integration, or customer workflow falls within the scope of a specific audit report.</p><p>Harvey&#8217;s<span> </span><strong><a href="https://trust.harvey.ai/">public Trust Center</a></strong><span> </span>lists SOC 2 Type II among its compliance evidence and states that its current SOC 2 documentation is available through the portal.</p><p>Harvey&#8217;s<span> </span><strong><a href="https://www.harvey.ai/security">security page</a></strong><span> </span>also says that the company undergoes annual SOC 2 Type II and ISO 27001 audits. The same page describes a wider product environment involving uploaded documents, queries, responses, model providers, regional processing, retention controls, and subprocessors.</p><p>Those are useful public evidence points.</p><p>They show that independent assurance exists and that the service has multiple data-handling surfaces.</p><p>They do not allow a public reviewer to determine the complete audit boundary.</p><p>The public Trust Center does not expose the full SOC 2 system description, control tests, exceptions, complementary user-entity controls, reporting period details, or the treatment of every AI feature and external provider without access to the underlying report.</p><p>Harvey&#8217;s<span> </span><strong><a href="https://www.harvey.ai/legal/security-addendum">Security Addendum</a></strong><span> </span>provides an important next step. It states that customers may request the SOC 2 Type II report and, where applicable, relevant penetration-test summaries and data-flow diagrams.</p><p>That distinction matters.</p><p>The public SOC 2 statement establishes the existence of assurance evidence.</p><p>The private report establishes the audited system boundary.</p><p>The product documentation and data-flow materials help determine whether that boundary maps to the buyer&#8217;s actual AI workflow.</p><p>None of these sources should be stretched beyond what it proves.</p><h3>What it does not prove</h3><p>A SOC 2 statement does not automatically establish:</p><p><strong>Product scope.</strong><span> </span>The report may cover a defined service environment without identifying every AI product, feature, add-in, agent, integration, or beta capability.</p><p><strong>Plan and configuration scope.</strong><span> </span>The buyer&#8217;s product tier, regional deployment, optional feature, or customer configuration may differ from the environment described in the report.</p><p><strong>Model-provider scope.</strong><span> </span>The report may not establish which external model providers process data, what those providers receive, or whether their controls are included or treated as subservice organizations.</p><p><strong>Data-type coverage.</strong><span> </span>Prompts, outputs, uploaded files, transcripts, embeddings, metadata, logs, support artifacts, and derived data may follow different paths.</p><p><strong>Operational workflows.</strong><span> </span>Support access, abuse monitoring, safety review, troubleshooting, evaluation, and incident response may introduce systems or personnel not obvious from the SOC 2 badge.</p><p><strong>Retention and deletion.</strong><span> </span>The report does not automatically establish deletion across active storage, caches, logs, backups, support copies, and downstream providers.</p><p><strong>Regional routing.</strong><span> </span>A company-level audit does not prove where each data type is processed or whether routing changes by region, model, fallback path, or integration.</p><p><strong>Current applicability.</strong><span> </span>A Type II report covers a historical period. The buyer still needs to consider the evidence date, subsequent changes, bridge coverage, new features, and material changes to the service.</p><p><strong>Contract scope.</strong><span> </span>Audit evidence does not replace the DPA, order form, security addendum, regional commitment, or product-specific contractual term.</p><p>None of these gaps show that the vendor&#8217;s controls are deficient.</p><p>They show that the SOC 2 claim is narrower than the decision the buyer is trying to make.</p><h3>Weak-answer pattern</h3><p>This is the certification-scope blur.</p><p>The buyer asks:</p><blockquote><p>Can we use this AI vendor for this workflow?</p></blockquote><p>The vendor answers:</p><blockquote><p>We have SOC 2 Type II.</p></blockquote><p>That is not a bad answer.</p><p>It is an incomplete review record.</p><p>The missing question is:</p><blockquote><p>Which parts of this AI workflow fall within the audited system boundary?</p></blockquote><p>Without that mapping, SOC 2 remains valuable source material.</p><p>It is not evidence-complete for the intended use case.</p><h3>Evidence request</h3><p>Do not ask only:</p><blockquote><p>Can you provide your SOC 2 report?</p></blockquote><p>Ask for scope mapping.</p><p>A stronger request is:</p><blockquote><p>Please confirm whether the current SOC 2 report covers the exact product, plan, features, region, and AI workflow under review. Identify how prompts, outputs, uploaded files, transcripts, embeddings, metadata, logs, support artifacts, model-provider routes, integrations, and subprocessors relate to the audited system boundary.</p></blockquote><p>Then ask:</p><ul><li><p>What legal entity, system, products, and services are included in the report?</p></li><li><p>What reporting period does it cover?</p></li><li><p>Which AI features and customer plans are included?</p></li><li><p>Which model, transcription, embedding, retrieval, or infrastructure providers are involved?</p></li><li><p>Are those providers included in the scope, carved out, or addressed through vendor-management controls?</p></li><li><p>Are support, troubleshooting, safety, abuse-review, and human-access workflows covered?</p></li><li><p>What complementary user-entity controls must the customer operate?</p></li><li><p>Have material product or provider changes occurred since the reporting period?</p></li><li><p>Which data-flow document, DPA, security addendum, or order-form term confirms the operational boundary?</p></li></ul><p>That is how SOC 2 becomes reviewable.</p><h3>Review note</h3><p>A weak review note says:</p><blockquote><p>SOC 2 received. Risk resolved.</p></blockquote><p>A stronger review note says:</p><blockquote><p>The SOC 2 report may support the existence and operation of controls within the vendor&#8217;s stated system boundary and reporting period. The available evidence does not yet establish whether the specific AI product, feature, plan, model route, data types, support workflow, retention path, region, and customer configuration are included. Product-specific scope mapping is required before relying on the report for the intended AI workflow.</p></blockquote><p>That note does not reject the vendor.</p><p>It identifies where the assurance evidence stops.</p><h3>Usage boundary</h3><p>Until the SOC 2 scope is mapped to the intended workflow:</p><blockquote><p>Limit use to low-sensitivity internal data. Do not introduce customer-confidential data, regulated data, source code, privileged business material, or externally relied-upon outputs where uncertainty about product scope, model routing, support access, retention, subprocessors, regional handling, or contractual coverage would materially change the appropriate usage boundary.</p></blockquote><p>That is not approval.</p><p>That is review preparation.</p><p>The review unit is:</p><p><strong>vendor + product + plan + use case + data type + region + contract terms + evidence date.</strong></p><p>SOC 2 can support that review.</p><p>It cannot perform the scope mapping by itself.</p><h3>Boundary</h3><p>This material is for evidence structuring and review preparation. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p><p>The goal is not to approve or reject a vendor.</p><p>The goal is to make the evidence gap visible before real data use.</p><p>Reply if you want the sanitized sample evidence gap memo.</p><p>#AIVendorRisk #AIVendorAssessment #SOC2 #ThirdPartyRisk #AIgovernance</p>]]></content:encoded></item></channel></rss>