<?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>Sat, 31 Oct 2026 14:43:10 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[Model Changes Should Reopen Previous Evidence]]></title><description><![CDATA[Model changes can affect AI agent behaviour and control enforcement. Learn when previous acceptance evidence needs regression testing and what reviewers should request.]]></description><link>https://www.codeyourcompliance.com/p/model-changes-should-reopen-previous</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/model-changes-should-reopen-previous</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Thu, 29 Oct 2026 05:30:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7615fffc-d685-434b-b0ca-a69f592d8d4a_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>AI Vendor Evidence Gap Notes #15</em></p><p>An AI agent has completed acceptance testing. Its job is to update customer records, but every write operation requires human approval. The test report covers both approved and rejected requests, with execution traces showing whether the update was performed or blocked.</p><p>A few weeks later, the team upgrades the underlying model. The approval service and tool permissions remain unchanged, so the development team considers the previous acceptance report still valid.</p><p>That may be a reasonable position. Before relying on the report for the updated agent, though, I would want to see whether the model change affected any execution paths that the original tests were meant to cover.</p><h3>Claim</h3><p>&#8220;We only upgraded the model. The approval logic hasn&#8217;t changed, so we don&#8217;t need to repeat acceptance testing.&#8221;</p><p>There is some logic behind this. Software teams routinely use change impact analysis to decide which regression tests need to run. A minor component update should not automatically require the entire system to be tested again.</p><p>The difficulty with AI agents is that execution paths are not always fixed. Even when tool definitions and permissions remain unchanged, a different model may select tools differently, reorder steps, or handle failed calls in ways the previous version did not.</p><h3>Why it sounds sufficient</h3><p>Suppose approval is enforced by a separate backend service and every write request must pass through it. A model upgrade should not directly change that approval rule.</p><p>In that case, some of the earlier control evidence may remain applicable. The relevant question is whether the updated agent still operates within the same enforced boundary.</p><p>For example, the original agent might use one API to update a record, while the new version may choose an alternative tool after an API failure. If that alternative path was already available but never exercised during the original tests, the unchanged approval configuration tells us little about how the new execution behaves.</p><h3>What it actually proves</h3><p>The original acceptance report still has value. It establishes what happened under the previous model, configuration, and test conditions. If the recorded traces show that a rejected approval prevented a write operation, upgrading the model does not invalidate that historical observation.</p><p>The question is how much of that evidence still applies.</p><p>I would start with the differences between the two versions: model, system prompt, available tools, permissions, and relevant workflow configuration. Then I would compare those differences against the original acceptance scenarios.</p><p>In <a href="https://www.codeyourcompliance.com/p/a-successful-demo-is-not-an-acceptance">A Successful Demo Is Not an Acceptance Test</a>, I discussed why acceptance evidence needs to cover the conditions that matter beyond the normal execution path. The same principle applies when deciding what needs to be tested again.</p><p>For the customer-record example, I would pay particular attention to approval rejection and API failure handling. A successful update through the normal path shows that the agent can still complete the task, but it says little about whether approval remains enforced during retries or alternate tool calls.</p><p>Where an independent backend control demonstrably covers every available write path, some existing evidence may remain sufficient. That conclusion should be supported by the relevant configuration and execution-path evidence rather than assumed from the absence of an intentional control change.</p><h3>What it does not prove</h3><p>Running a few successful workflows after the upgrade does not necessarily establish that regression testing covered the effects of the change.</p><p>Anthropic discusses this distinction in <a href="https://www.anthropic.com/research/demystifying-evals-for-ai-agents">Demystifying Evals for AI Agents</a>. Its discussion of regression evals focuses on whether agents continue to perform tasks they could previously handle. OpenAI&#8217;s <a href="https://developers.openai.com/api/docs/guides/agent-evals">Evaluate Agent Workflows</a> also describes using execution traces and grading criteria to examine tool selection, handoffs, and workflow regressions.</p><p>These approaches are useful for organizing tests, but the resulting evidence still needs to correspond to the system being reviewed.</p><p>An updated agent might complete more tasks successfully while introducing a control problem in a less common execution path. Comparing overall success rates would not necessarily reveal that.</p><p>The execution record matters here. As discussed in <a href="https://www.codeyourcompliance.com/p/ai-audit-logs-what-events-are-missing">AI Audit Logs: What Events Are Missing?</a>, logging capability alone does not establish that the events needed to reconstruct a workflow are available. For regression testing, reviewers need enough detail to understand whether the expected approval, tool, retry, and final-state events occurred.</p><p>I would not require full retesting after every model change. I would first identify which previously tested assumptions could have been affected, then select the scenarios that need fresh evidence.</p><h3>Weak-answer pattern</h3><p>Two responses tend to appear together in this kind of review:</p><blockquote><p>&#8220;The approval logic wasn&#8217;t modified.&#8221;</p><p>&#8220;We ran the tests again after the upgrade, and everything passed.&#8221;</p></blockquote><p>Both statements may be accurate. Neither tells me enough about the evidence on its own.</p><p>The first needs supporting configuration and execution-path information. The second needs the test scope and results. Without those records, it is difficult to determine whether the updated agent introduced an alternative path that the regression tests did not exercise.</p><p>I would rather see a short explanation of which acceptance scenarios were affected, which were retested, and why the remaining evidence was considered applicable.</p><h3>Evidence request</h3><p>For an agent that has already passed acceptance testing and subsequently changed, I would request:</p><blockquote><p>Provide the differences in model version, prompt, tool definitions, permissions, and relevant workflow configuration. Identify which previously tested behaviours and control paths may be affected.</p><p>For affected scenarios, provide regression test results and execution traces, including applicable approval rejection, tool failure, and retry conditions. For scenarios not retested, explain the basis and limitations for continuing to rely on the original evidence.</p></blockquote><p>The purpose is to connect the change to the testing decision, rather than request another complete test cycle by default.</p><h3>Review note</h3><p>Where some regression testing has been completed but coverage remains limited, I would record:</p><blockquote><p>The original acceptance evidence supports the observed behaviour of the previous system version under its recorded test conditions. Regression testing following the model change covers selected affected scenarios, but execution evidence for certain alternate paths and exception conditions remains unavailable. The current evidence does not establish whether those paths continue to satisfy the original approval requirements.</p></blockquote><p>This preserves the earlier testing result while identifying the part of the current system that remains unverified.</p><h3>Usage boundary</h3><p>The importance of that gap depends on what the agent is allowed to do.</p><p>For an agent that produces recommendations subject to further human review, some behavioural variation may be manageable within the existing workflow. An agent with production write access creates a different concern, particularly if an untested retry or alternative tool path could affect business records.</p><p>If the updated agent can use a write path that has not been covered by current evidence, I would keep that path outside the evidenced operating scope until the relevant control behaviour has been checked. The review record should make clear which operations are supported by current-version evidence and which remain subject to further testing.</p><p>Over time, models, prompts, and tools will continue to change. An acceptance report therefore needs to remain associated with a particular system version, configuration, test environment, and evidence date.</p><p>Otherwise, the report may still be complete and historically accurate, while nobody reviewing it later can confidently establish which version of the agent it describes.</p><h3>Boundary</h3><p>This material is for evidence structuring, review preparation, and evidence-oriented testing discussion. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p>]]></content:encoded></item><item><title><![CDATA[Corrected Evidence Must Not Erase the Original]]></title><description><![CDATA[Corrected evidence must not overwrite the original. Learn why evidence revision lineage must preserve historical policy inputs, evaluation references, and audit replay.]]></description><link>https://www.codeyourcompliance.com/p/corrected-evidence-must-not-erase</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/corrected-evidence-must-not-erase</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 19 Oct 2026 13:22:10 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>An evidence object has already been used in an assessment.</p><p>Later, someone discovers that the normalization rule was wrong.</p><p>The team opens the stored JSON, changes the affected field, and calculates a new SHA256 hash.</p><p>The new hash matches the updated file.</p><p>But what happened to the evidence that produced the original assessment?</p><p>If the previous version was overwritten, the historical policy input may no longer exist. The current record looks consistent, but the earlier conclusion cannot be replayed from that record.</p><p><strong>A corrected evidence file is not a preserved evidence history.</strong></p><h2>Correction is a separate event</h2><p>Consider a source response containing:</p><p><code>status = not_configured</code></p><p>An earlier normalization rule produces:</p><p><code>enabled = false</code></p><p>A later rule preserves the same source value as:</p><p><code>enabled = null, state = unknown</code></p><p>The original observation has not changed in this scenario.</p><p>The interpretation has.</p><p>If the first normalized record has already been referenced by a policy evaluation, replacing its contents creates a second problem: the record no longer represents what the evaluator originally consumed.</p><p>This is not a new observation. It is not target-system remediation.</p><p>It is a revision of the evidence representation.</p><p>That distinction should survive in the evidence pipeline.</p><h2>Keep both versions identifiable</h2><p>A safer structure preserves three separate objects: the original evidence version, the revised version, and the event connecting them.</p><p>The revision event needs enough information to establish lineage:</p><ul><li><p>Original evidence reference and digest</p></li><li><p>Successor evidence reference and digest</p></li><li><p>Original raw observation reference</p></li><li><p>Revision reason and claimed actor</p></li><li><p>Affected historical evaluation references</p></li><li><p>Authorization and re-evaluation status</p></li></ul><p>The original evaluation must remain bound to its original input.</p><p>The revised representation gets a different identity.</p><p>This is consistent with the revision relationship described by <a href="https://www.w3.org/TR/prov-o/#wasRevisionOf">W3C PROV-O&#8217;s </a><code>prov:wasRevisionOf</code>: a revised entity can be linked to an earlier entity.</p><p>The CodeYourCompliance example does not implement the W3C ontology. The relationship is a useful conceptual reference.</p><p>But recording the relationship is not enough to establish that the correction is valid.</p><p>A revision event can still be unauthorized. Its reason can be wrong. The replacement fact may require independent review.</p><p>The lineage records what changed. It does not approve the change.</p><h2>Historical replay and reassessment are different operations</h2><p>As discussed in <a href="https://www.codeyourcompliance.com/p/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</a>, replay depends on preserving the evidence and evaluation context used for the original decision.</p><p>Suppose the original assessment used evidence version <code>v1</code>.</p><p>A later correction produces <code>v2</code>.</p><p>There are now two questions.</p><p><strong>Historical replay:</strong> What result did the original policy, using the original evidence and evaluation context, produce?</p><p><strong>Reassessment:</strong> What result would a separate evaluation produce using the revised evidence?</p><p>The second operation must not overwrite the first.</p><p>If <code>v1</code> disappears, a future reviewer may be unable to reproduce the historical assessment, even if <code>v2</code> is internally consistent and its hash verifies.</p><p>An old digest without the old evidence bytes does not reconstruct the original policy input.</p><p>If another independently preserved copy exists, replay may still be possible. That is a different storage and provenance claim.</p><h2>What the GitHub artifact models</h2><p>This week&#8217;s <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence-revision-lineage-contract.md">Evidence Revision Lineage Contract</a> compares two synthetic structures.</p><p>In the <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/evidence-revision-lineage/in-place-replacement.json">in-place replacement example</a>, a normalized record is overwritten. An earlier digest reference remains, but the original payload is unavailable from the modeled package.</p><p>In the <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/examples/evidence-revision-lineage/linked-revision.json">linked revision example</a>, separate versions preserve their identities, the common raw observation reference, and the original evaluation binding. A proposed revision event connects them.</p><p>The second structure preserves more information.</p><p>It does not prove the correction was approved, that either version is correct, or that an append-only storage system exists.</p><p>These are static synthetic examples. They do not execute a collector, calculate real hashes, enforce immutable storage, or replay an OPA policy. The original evaluation reference is modeled, not a runtime capture.</p><p>That is the current <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/current-implementation-status.md">implementation boundary</a>.</p><h2>The audit problem starts before correction</h2><p>Evidence pipelines need a way to handle errors discovered after collection.</p><p>A parser may be corrected. A source reference may be challenged. A previous evidence assertion may need to be withdrawn.</p><p>None of these events should silently mutate the historical inputs.</p><p>The pipeline should distinguish observation, transformation, revision, policy evaluation, and remediation. Each has a different provenance and authority boundary.</p><p>As argued in <a href="https://www.codeyourcompliance.com/p/compliance-automation-starts-at-evidence">Compliance Automation Starts at Evidence</a>, automating the report is not the same as establishing the evidence behind it.</p><p>The same applies to corrections. A clean, updated report does not establish what was originally observed or evaluated.</p><p>For MAS TRM-inspired engineering, this is an interpretation of what evidence must preserve to support later review. It is not a claim that the <a href="https://www.mas.gov.sg/regulation/guidelines/technology-risk-management-guidelines">MAS Technology Risk Management Guidelines</a> prescribe this revision schema or implementation mechanism.</p><p>A new evidence version may change what can be concluded today.</p><p><strong>It must not erase what was actually evaluated yesterday.</strong></p><div><hr></div><h2>Public reference artifacts</h2><p>The accompanying technical material is available in the CodeYourCompliance <code>evidence-validation-pipeline</code> repository:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence-revision-lineage-contract.md">Evidence Revision Lineage Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/evidence-revision-lineage">Synthetic Revision Comparison</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><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>CodeYourCompliance explores replayable evidence, read-only evidence collection, provenance, integrity verification, and policy-as-code.</p><p>Attribution is requested for forks, references, adaptations, and technical discussions.</p><p>MAS TRM-inspired means engineering interpretation, not legal, regulatory, audit, certification, or compliance advice.</p>]]></content:encoded></item><item><title><![CDATA[Why AI Agent Testing Needs Repeated Runs]]></title><description><![CDATA[Repeated AI agent tests reveal outcome variability and control gaps that a single passing run may hide. Learn why trial-level evidence matters.]]></description><link>https://www.codeyourcompliance.com/p/why-ai-agent-testing-needs-repeated</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/why-ai-agent-testing-needs-repeated</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Mon, 12 Oct 2026 14:28:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2a09899e-fd09-4d6b-8946-2886a86620bf_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>AI Vendor Evidence Gap Notes #14</em></p><p>In <strong><a href="https://www.codeyourcompliance.com/p/a-successful-demo-is-not-an-acceptance">A Successful Demo Is Not an Acceptance Test</a></strong>, I discussed why one successful execution cannot establish the full acceptance boundary of an AI agent. Even after an acceptance scenario has been defined and passed, another question remains: how consistently will the agent behave when the same task is attempted again?</p><p>A passing trial gives us one observation. Repeated runs help us understand whether the expected outcome and required controls remain consistent across comparable attempts, particularly when the agent may choose different execution paths.</p><h3><strong>Claim</strong></h3><p>A common statement is:</p><blockquote><p>&#8220;We ran the acceptance test and it passed.&#8221;</p></blockquote><p>If the test conditions, expected behavior, and results were recorded, this is useful evidence. It shows that the agent satisfied the acceptance condition during that particular trial.</p><p>The problem arises when one successful trial is used to support a broader reliability claim. An agent may be capable of completing a task without completing it consistently enough for the intended use. Establishing that consistency requires evidence from more than one run.</p><h3><strong>Why it sounds sufficient</strong></h3><p>Traditional software testing often gives us a relatively predictable relationship between inputs and outputs. We execute a test, compare the result against an expected outcome, and investigate when the result differs.</p><p>AI agents introduce additional variation. The same request may lead to different tool choices, execution sequences, or recovery paths. External dependencies, retrieval results, and system state can also affect how a task unfolds.</p><p>Variation itself is not necessarily a failure. Two runs may follow different paths and still produce acceptable outcomes. What matters is whether the requirements we depend on remain satisfied.</p><p>Consider an agent that updates customer records. It may use different intermediate steps, but each successful run should leave the record in the expected state. If human approval is mandatory, that requirement should remain in place regardless of the path the agent selects.</p><p>One passing test shows that these conditions were satisfied once. It does not establish how consistently they will be satisfied.</p><h3><strong>What it actually proves</strong></h3><p>Repeated trials provide evidence about behavior across multiple executions under comparable conditions. They can expose differences in final outcomes, control enforcement, tool usage, retries, and exception handling that would be invisible in a single run.</p><p>I would distinguish two things when reviewing the results: <strong>outcome consistency and control consistency</strong>.</p><p>Outcome consistency concerns whether the task reaches the expected final state without unintended side effects. Control consistency concerns whether required safeguards remain effective even when the execution path changes.</p><p>This is where execution traces become important. In <strong><a href="https://www.codeyourcompliance.com/p/ai-audit-logs-what-events-are-missing">AI Audit Logs: What Events Are Missing?</a></strong>, I discussed the events needed to reconstruct an AI workflow. The same principle applies here. Without records of tool calls, approvals, retries, failures, and final outcomes, a reviewer may know that several runs succeeded without understanding how they differed.</p><p>A result such as &#8220;9 of 10 runs passed&#8221; is useful, but the failed run needs examination. A formatting error and an approval bypass have very different implications, even if both appear as one failure in the summary.</p><h3><strong>A public evidence example</strong></h3><p>Anthropic discusses this distinction in its <strong><a href="https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents">guidance on evaluating AI agents</a></strong>. It treats each attempt as a separate trial and distinguishes between <span data-color="#ff0000" style="color: rgb(255, 0, 0);">pass@k</span>, which measures whether at least one of several attempts succeeds, and <span data-color="#ff0000" style="color: rgb(255, 0, 0);">pass^k</span>, which measures whether all of them succeed.</p><p>The earlier <strong><a href="https://arxiv.org/abs/2406.12045">&#964;-bench research</a></strong> introduced <span data-color="#ff0000" style="color: rgb(255, 0, 0);">pass^k</span> to examine agent reliability across repeated trials. Its findings illustrate how reasonable single-run success can coexist with substantially weaker consistency when an agent must succeed repeatedly.</p><p>These measures do not replace use-case-specific acceptance criteria. They illustrate why capability and consistency need separate evidence, particularly when the system is expected to perform reliably without repeated human intervention.</p><h3><strong>What it does not prove</strong></h3><p>Repeated runs still have limitations. Executing the same happy-path scenario twenty times does not replace testing approval rejection, dependency failures, prohibited actions, or other relevant conditions. Repeatability and scenario coverage answer different questions.</p><p>The test environment also matters. If trials inherit state from previous executions or use changing dependencies, differences between runs become harder to interpret. Starting conditions, permissions, configuration, and evaluation criteria should therefore be recorded and kept comparable where practical.</p><p>I would avoid universal rules such as requiring every agent to pass ten consecutive trials. The appropriate testing depth depends on the consequences of failure, observed variation, and the intended usage boundary.</p><p>Repeated testing provides evidence within the conditions examined. It does not guarantee reliability across untested situations or after the system changes.</p><h3><strong>Weak-answer pattern</strong></h3><p>A statement such as:</p><blockquote><p>&#8220;We tested it several times and it worked consistently.&#8221;</p></blockquote><p>sounds reassuring, but it leaves important details unresolved.</p><p>How many trials were performed? Were the starting conditions comparable? Were failed attempts retained? Did the team evaluate only the final output, or did it also examine required controls and intermediate actions?</p><p>Three successful demonstrations selected from a larger set of attempts are not equivalent to thirty recorded trials that include failures, execution traces, and final-state verification.</p><p>The weakest pattern is reporting only the best run. That removes precisely the variability repeated testing is supposed to reveal.</p><h3><strong>Evidence request</strong></h3><p>For important workflows, I would request repeated execution records for a small number of defined acceptance scenarios.</p><blockquote><p>Provide the results of repeated trials for selected acceptance scenarios, including the number of runs, starting conditions, expected outcome, actual final state, relevant tool and control events, retries, exceptions, and failed or divergent executions. Retain all trial results rather than only successful examples.</p></blockquote><p>Where a control is mandatory, the evidence should show whether it remained effective across the relevant trials. A prohibited action or skipped approval should remain visible even when the overall task success rate is high.</p><p>A small set of clearly defined scenarios with complete execution evidence is more useful than a large collection of poorly specified tests.</p><h3><strong>Review note</strong></h3><p>If repeated testing has been performed but the evidence remains limited, I would record:</p><blockquote><p>The available evidence shows successful execution across the recorded trials under the tested conditions. This provides some evidence of repeatability, but does not establish behaviour outside the observed sample. Control consistency and divergent execution paths require separate examination before broader reliability conclusions can be supported.</p></blockquote><p>The note recognizes the successful trials while keeping the limits of that evidence visible.</p><h3><strong>Usage boundary</strong></h3><p>The amount of repeatability evidence needed depends on what the agent is allowed to do.</p><p>For an assistant producing drafts subject to human review, some variability may be manageable. For an agent modifying production records, sending external communications, or operating through privileged tools, an infrequent inconsistent execution may have significant consequences.</p><p>In those cases, I would keep the operating scope aligned with the conditions actually tested, the variability observed, and the ability to detect or contain an unexpected outcome.</p><p>Repeated testing does not make an agent deterministic. Its value is making variation observable so that reliability claims can be supported by more than a successful example.</p><p>A single run demonstrates what an agent can achieve under one set of conditions. Repeated runs provide a clearer picture of how consistently it achieves the outcomes and respects the controls we intend to rely on.</p><h3><strong>Boundary</strong></h3><p>This material is for evidence structuring, review preparation, and evidence-oriented testing discussion. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p>]]></content:encoded></item><item><title><![CDATA[A Matching Hash Does Not Authenticate Evidence]]></title><description><![CDATA[A matching SHA256 hash does not authenticate evidence origin. Learn why integrity checks, custody records, and verified provenance are separate audit claims.]]></description><link>https://www.codeyourcompliance.com/p/a-matching-hash-does-not-authenticate</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/a-matching-hash-does-not-authenticate</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Thu, 08 Oct 2026 14:38:42 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 reviewer receives a JSON evidence file and its SHA256 hash.</p><p>The sender says the file came from a production system. The reviewer calculates the hash again, and it matches.</p><p>Can we now say the evidence is authentic?</p><p>Not yet.</p><p>The file and its hash may have come from the same sender. Someone could have modified the original content, generated a new hash, and delivered both together. The hash would still match.</p><p>The calculation is correct. But we have not established where the evidence originally came from.</p><h2>What a matching hash actually proves</h2><p>A SHA256 comparison answers a specific question:</p><pre><code><code>computed_hash(received_bytes)
==
reference_hash</code></code></pre><p>If they match, the received bytes correspond to the reference hash used in that comparison.</p><p>But where did the reference hash come from?</p><p>If it was independently captured and protected during collection, that gives us a stronger basis for detecting later changes.</p><p>If it was supplied alongside the file by the same unverified sender, the comparison cannot establish that the file is unchanged from the original collection.</p><p>This is a different problem from the one SHA256 was designed to solve.</p><p>And it becomes more interesting when we look at the evidence metadata.</p><h2>A collector name is still a claim</h2><p>An evidence object may already contain:</p><pre><code><code>collector:
  name: ansible-readonly-collector
  version: 0.1.0

source:
  system: production-server-01</code></code></pre><p>These fields are useful. They tell us which collector and source the evidence claims to represent.</p><p>But they do not independently authenticate that collector.</p><p>A field containing <code>production-server-01</code> does not prove that the bytes came from that server. Similarly, a collector version does not prove which executable actually ran.</p><p>This is why collector provenance and evidence authenticity need to remain separate.</p><p>Collector metadata helps us reconstruct the claimed production path. Authenticity requires additional assurance that the claimed producer is genuinely bound to the evidence.</p><p>Even an authenticated producer does not automatically prove that the source was authoritative or that the collected facts were correct.</p><h2>A recorded handoff is not a verified custody chain</h2><p>Now suppose the evidence pipeline also records a handoff:</p><pre><code><code>custody_event:
  from: collector
  to: evidence_repository
  subject_sha256: ...
  received_at_utc: ...</code></code></pre><p>This is useful information. It makes the claimed transfer visible.</p><p>But who recorded the event? Were the two parties authenticated? Was the evidence digest checked against an independently protected reference? And what happened before and after this handoff?</p><p>A JSON record containing those fields does not answer these questions by itself.</p><p>The term <a href="https://csrc.nist.gov/glossary/term/chain_of_custody">chain of custody</a> is used in digital evidence handling to describe tracking evidence through collection, handling, and transfer. That includes recording who handled the evidence, when, and for what purpose.</p><p>For an automated evidence pipeline, the engineering lesson is narrower: we need to distinguish a <em>recorded custody event</em> from an <em>authenticated and complete custody history</em>.</p><p>One recorded handoff does not establish the entire chain.</p><h2>Two synthetic scenarios</h2><p>The latest CodeYourCompliance artifact models this distinction using two scenarios involving the same synthetic evidence subject.</p><p>The first scenario contains a modeled digest correspondence and claimed collector metadata, but no handoff event.</p><pre><code><code>modeled_digest_match = true
integrity_verification = not_executed
origin_authentication = not_established
handoff_count = 0</code></code></pre><p>The second scenario uses the same evidence subject but adds one recorded handoff.</p><pre><code><code>modeled_digest_match = true
integrity_verification = not_executed
origin_authentication = not_established
handoff_count = 1
custody_chain = not_assessed</code></code></pre><p>The second record contains more information than the first.</p><p>But it still does not establish authenticated origin or a verified custody chain.</p><p>There is another important limitation: these are synthetic models. No real hash verification, transfer, signature verification, or policy evaluation was executed. Even the digest is explicitly marked as a placeholder.</p><p>The examples are intended to expose the distinction, not demonstrate a finished custody-verification system.</p><h2>Where authenticity belongs in the evidence pipeline</h2><p>Previous CodeYourCompliance work has separated collector provenance, transformation provenance, policy evaluation, observation outcomes, and time provenance.</p><p>Custody and authenticity add another boundary.</p><p>Before an evidence object is accepted for policy evaluation, we may need to know not only whether its bytes match a digest, but also what assurance exists for its claimed origin and handling history.</p><p>That does not mean every evidence package must immediately use digital signatures or an immutable evidence store.</p><p>It means the pipeline should preserve what it actually knows.</p><p>If the reference digest is self-supplied, record that.</p><p>If a handoff is only asserted, record it as an asserted handoff.</p><p>If origin authentication was never performed, keep that state as <code>not_established</code>.</p><p>Otherwise a series of unverified metadata fields can gradually become a report that describes the evidence as fully authenticated.</p><p>The report looks stronger. The underlying evidence has not changed.</p><h2>MAS TRM-inspired means engineering interpretation</h2><p>This is not a claim that the <a href="https://www.mas.gov.sg/regulation/guidelines/technology-risk-management-guidelines">MAS Technology Risk Management Guidelines</a> prescribe this custody schema, cryptographic signature mechanism, or particular evidence architecture.</p><p>The engineering interpretation is limited to preserving integrity, origin, and custody distinctions before making stronger technical control claims.</p><p>A matching hash does not authenticate the evidence producer.</p><p>A handoff record does not establish a verified chain of custody.</p><p>Those claims require their own evidence.</p><h2>Public reference artifacts</h2><p>The accompanying technical material is available in the CodeYourCompliance <code>evidence-validation-pipeline</code> repository:</p><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence-custody-authenticity-contract.md">Evidence Custody and Authenticity Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/evidence-custody-authenticity">Integrity-Only vs Recorded-Handoff Synthetic Examples</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><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>CodeYourCompliance explores compliance automation, replayable audit evidence, read-only evidence collection, policy-as-code, and evidence packages.</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/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</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[What Evidence Proves Human Oversight Actually Works?]]></title><description><![CDATA[Human oversight is not proven by an approval step alone. Learn what runtime evidence should show about review triggers, human decisions, blocked actions, retries, and execution outcomes.]]></description><link>https://www.codeyourcompliance.com/p/what-evidence-proves-human-oversight</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/what-evidence-proves-human-oversight</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Sat, 03 Oct 2026 11:54:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/140f9c79-a0e2-4e3a-9952-d1dece54b65f_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>AI Vendor Evidence Gap Notes #13</em></p><p>&#8220;Human in the loop&#8221; is one of those phrases that sounds reassuring almost immediately. If an AI agent is about to do something important, a person reviews it first. The risk appears bounded because the system is not acting entirely on its own.</p><p>As I argued in <strong><a href="https://www.linkedin.com/pulse/policy-evidence-ai-agent-obeys-cyc-codeyourcompliance-gbekc">A Policy Is Not Evidence That an AI Agent Obeys It</a></strong>, a documented control and an enforced control are different evidence questions. Human oversight is a good example of that distinction. The first is whether a human-review mechanism exists. The second is whether that mechanism actually changes what happens when the system runs.</p><p>For oversight to be meaningful, the human needs a real decision point before the relevant action takes effect, enough information to understand what is being proposed, authority to stop or change it, and a system that actually respects that decision. A documented approval step may describe that design. The stronger evidence comes from seeing the decision and its effect in the execution record.</p><h3>Claim</h3><p>A common statement is:</p><blockquote><p>&#8220;Sensitive actions require human approval before execution.&#8221;</p></blockquote><p>That could describe a useful control. It tells us something about how the workflow is intended to operate, and a configuration screen may show that an approval requirement has been enabled.</p><p>What it does not yet tell us is whether a particular action was actually intercepted, what the reviewer saw, who made the decision, or whether rejection prevented the action from continuing.</p><p>Those details become important because &#8220;human approval&#8221; can refer to several different things. A person might approve an exact tool call before execution, review a proposed action at a higher level, check the result after the action has already happened, or simply be available to intervene if something looks wrong. All involve a human, but they do not provide the same control.</p><h3>Why it sounds sufficient</h3><p>Human oversight is easy to accept as evidence because it appears to solve the autonomy problem directly. If the agent cannot proceed without a person, then the person seems to remain in control.</p><p>A demo can reinforce that impression. The agent proposes an action, an approval dialog appears, someone clicks Approve, and the workflow continues. That is useful evidence that the approval path can work. That is the same evidence boundary discussed in <strong><a href="https://www.linkedin.com/pulse/successful-demo-acceptance-test-cyc-codeyourcompliance-5tzcc">A Successful Demo Is Not an Acceptance Test</a></strong>: one successful execution shows that a path can work, but it does not establish how the control behaves across the conditions we intend to rely on.</p><p>The harder question is what happens around that path. Does every action in scope trigger it? Does rejection actually stop the action? If the agent retries or chooses another tool, does the same requirement still apply? What happens when the approval service is unavailable?</p><p>These are runtime questions. A policy or configuration can describe the intended control, but it cannot answer them by itself.</p><h3>What it actually proves</h3><p>Different evidence layers support different conclusions.</p><p>A policy can establish that human approval is expected. Configuration evidence can show that a tool or workflow has been marked as requiring approval. A screenshot can show the reviewer interface. None of those is useless, but they mainly describe the design and configuration of the control.</p><p>Earlier in the series, <strong><a href="https://www.linkedin.com/pulse/subprocessor-lists-do-show-actual-ai-data-path-cyc-codeyourcompliance-gnc8c">Human Review Is a Data Exposure Path Unless It Is Bounded</a></strong> looked at human review mainly as a data-path question: who can see what, and under which conditions. Here the evidence question is different. If the human is being relied upon as a control, we also need evidence that the decision actually changes execution.</p><p>Runtime evidence gets closer to that question. For a specific execution, I would want to see the action that triggered review, the point at which execution paused, the decision that was made, and what happened to the action afterwards.</p><p>The useful chain is fairly simple:</p><p><strong>proposed action &#8594; approval trigger &#8594; human decision &#8594; execution outcome</strong></p><p>If the reviewer rejects the action, the trace should make it possible to see that the rejected action did not occur. If the reviewer approves it, the resulting action should be linked back to that approval rather than appearing as an unrelated event later in the workflow.</p><p>That is what turns the presence of a human-review mechanism into evidence that the mechanism actually affected execution.</p><h3><strong>A public evidence example</strong></h3><p>The distinction is visible in the documentation for the <strong><a href="https://openai.github.io/openai-agents-js/guides/human-in-the-loop">OpenAI Agents SDK human-in-the-loop flow</a></strong>. The SDK allows a tool call to be marked as requiring approval; when approval is needed, the run pauses, records an interruption, and can later resume after the pending action is approved or rejected. The documentation also explains that approval can apply across nested agent/tool execution rather than only at the top-level agent.</p><p>That documentation is useful configuration and control-design evidence. For a particular deployed application, however, I would still want the execution record showing that the relevant tool call actually paused, which pending action was presented for review, what decision was made, and whether the resulting execution state matched that decision.</p><p>There is another detail in the same documentation that illustrates why the distinction matters. Some tool types can use programmatic approval callbacks instead of waiting for a person. That is a legitimate implementation option, but it means the word &#8220;approval&#8221; alone does not establish that a human actually made the decision. The execution evidence needs to distinguish the mechanism used in the workflow being reviewed.</p><p>A similar boundary appears in the <strong><a href="https://signal.codeyourcompliance.com/companies/decagon/">Trust Signal profile for Decagon</a></strong>, where audit logs and AI guardrails are recorded as observed enterprise-readiness evidence, while the profile explicitly avoids treating those public surfaces as proof that implementation matches the documentation.</p><p>That is the evidence gap here: knowing that an oversight capability exists is different from having evidence that it governed the execution being relied upon.</p><h3>What it does not prove</h3><p>Even a recorded approval event leaves some questions open.</p><p>The reviewer may have been shown too little information to make a meaningful decision. An approval screen that says &#8220;Allow tool call?&#8221; is not equivalent to showing the target system, proposed parameters, affected data, and expected consequence. The evidence should therefore include enough context to understand what the person was actually approving.</p><p>Identity and authority matter as well. If the control is supposed to require approval from a particular role, a generic approval event does not establish that the correct person made the decision. The reviewer identity or role needs to be linked to the event in a way that can be checked.</p><p>There is also the possibility of another execution path. An agent may receive a rejection, retry with different parameters, invoke another tool, or reach the same business outcome through a different workflow. The original rejection is evidence that one action was blocked; it does not automatically establish that the restricted outcome remained blocked afterwards.</p><p>Finally, the failure mode matters. If the approval service is unavailable, the system may stop, wait, time out, escalate, or continue through another path. Until that behavior has been observed or tested, &#8220;human approval required&#8221; still leaves an important part of the operating boundary unresolved.</p><h3>Weak-answer pattern</h3><p>A statement such as:</p><blockquote><p>&#8220;A human reviews all high-risk actions.&#8221;</p></blockquote><p>may be entirely accurate as a policy statement, but it becomes a weak answer when there is no evidence showing how review is triggered and what effect the decision has on execution.</p><p>I would want to know whether &#8220;review&#8221; means pre-action approval, post-action review, exception handling, or general supervision. I would also want to see at least some completed approval and rejection events rather than relying only on the configured workflow.</p><p>The gap is not that human oversight is absent. The gap is that its operating effect has not yet been evidenced.</p><h3>Evidence request</h3><p>For a workflow that relies on human approval as a control, I would ask for a small sample of completed oversight events rather than a large policy package.</p><p>A practical evidence request could be:</p><blockquote><p>Provide execution records for representative human-oversight events, including the action that triggered review, the information presented to the reviewer, reviewer identity or role, approval or rejection decision, timestamp, linked tool/action record, and final execution state. Include at least one rejection case and, where relevant, a case in which approval was unavailable or the agent attempted an alternate path.</p></blockquote><p>This gives the reviewer something that can actually be followed from the proposed action through to the resulting system behavior.</p><p>It also avoids turning the exercise into a general assessment of whether the human made a &#8220;good&#8221; decision. The immediate evidence question is narrower: did the oversight control occur when expected, and did the system behave according to that decision?</p><h3><strong>Review note</strong></h3><p>If the current evidence consisted mainly of a policy, configuration, or demo showing the approval mechanism, I would record something like:</p><blockquote><p>Current evidence shows that a human-approval mechanism is defined and can be invoked for the reviewed workflow. The available material does not yet establish that all in-scope actions consistently trigger the control, that rejection prevents equivalent execution through alternate paths, or that the resulting action can be reliably linked to the recorded approval decision.</p></blockquote><p>This preserves the value of the evidence already available without treating control design as evidence of operating effectiveness.</p><h3><strong>Usage boundary</strong></h3><p>Until the runtime behavior of the oversight mechanism has been demonstrated, I would keep the agent within a scope where an approval failure or bypass remains observable and recoverable.</p><p>That is particularly relevant for actions that modify production data, send external communications, create financial or contractual effects, change access, or trigger another system. In those cases, human oversight is being relied upon as part of the control boundary, so the evidence should show more than the existence of an Approve button.</p><p>A useful human-in-the-loop control is not simply a workflow with a person somewhere in it. The evidence should let us follow the decision from the point where intervention was required through to what the system ultimately did.</p><p>That is the point where human oversight becomes execution evidence rather than only a documented expectation.</p><h3><strong>Boundary</strong></h3><p>This material is for evidence structuring, review preparation, and evidence-oriented testing discussion. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p>]]></content:encoded></item><item><title><![CDATA[A Timestamp Field Does Not Prove When Evidence Existed]]></title><description><![CDATA[A timestamp records a time claim, not proof of when evidence existed. See why evidence pipelines need time provenance beyond UTC fields and SHA256.]]></description><link>https://www.codeyourcompliance.com/p/a-timestamp-field-does-not-prove</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/a-timestamp-field-does-not-prove</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Fri, 25 Sep 2026 06:04:26 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>An evidence object contains:</p><pre><code><code>collected_at_utc = 2026-09-22T01:00:00Z
</code></code></pre><p>A few seconds later, the object is hashed with SHA256.</p><p>The hash verifies.</p><p>It is tempting to read this as evidence that the system was observed at 01:00 UTC.</p><p>But the timestamp may only tell us what the collector&#8217;s clock said.</p><p>If that clock was wrong, the timestamp can be wrong. If the object was created later with a backdated timestamp and then hashed, the hash can still verify.</p><p>Nothing is wrong with SHA256.</p><p>We are asking it to prove something it does not prove.</p><p>A timestamp records a time claim. It does not by itself prove when the evidence existed.</p><h2>Hash integrity is not time assurance</h2><p>The useful integrity boundary is:</p><pre><code><code>hash verifies
=&gt; stored bytes match recorded digest
</code></code></pre><p>It is not:</p><pre><code><code>hash verifies
=&gt; embedded timestamp is historically true
</code></code></pre><p>A valid hash can protect a false timestamp just as effectively as a correct one.</p><p>This matters because evidence packages often put these fields next to each other:</p><pre><code><code>collected_at_utc
sealed_at_utc
sha256
</code></code></pre><p>That structure looks strong.</p><p>But <code>collected_at_utc</code> may still be an assertion from the same process that created the evidence.</p><p>Integrity and time assurance are different problems.</p><h2>There is more than one time in the evidence chain</h2><p>An evidence pipeline may contain several different time statements:</p><pre><code><code>source event time
collection time
seal time
receipt time
trusted attestation time
</code></code></pre><p>They answer different questions.</p><p>A source event time says when the source claims something happened.</p><p>A collection time says when the collector claims it observed the source.</p><p>A seal time says when the evidence packager claims it created the digest.</p><p>Those values can still be useful. Their provenance just needs to remain visible.</p><p>For example:</p><pre><code><code>collection_time:
  value_utc: 2026-09-22T01:00:00Z
  asserted_by: synthetic-readonly-collector
  clock_source_ref: collector-host-system-clock
  assurance: collector_asserted
</code></code></pre><p>The important part is not only the UTC value.</p><p>It is also:</p><pre><code><code>assurance = collector_asserted
</code></code></pre><h2>An independent receipt creates a different claim</h2><p>Suppose the collector claims the evidence was collected at 01:00.</p><p>A separate receiver later records the same evidence digest at 01:03.</p><p>Under the assumptions of that receiving system, this can support:</p><pre><code><code>this evidence digest existed no later than 01:03
</code></code></pre><p>It still does not prove:</p><pre><code><code>the target was observed at exactly 01:00
</code></code></pre><p>Those are different claims.</p><p>The receipt strengthens time provenance because the evidence crossed a separate recording boundary. But it is still not the same as trusted timestamping.</p><p>The current CodeYourCompliance model therefore keeps three states separate:</p><pre><code><code>collector_asserted
independent_receipt
trusted_timestamp
</code></code></pre><p>They should not become different labels for the same level of assurance.</p><h2>Freshness also depends on the time claim</h2><p>Consider a deterministic freshness rule:</p><pre><code><code>evaluation_time - collected_at &lt;= allowed_age
</code></code></pre><p>OPA can calculate this correctly every time.</p><p>But if <code>collected_at</code> came only from the collector clock, the result still depends on that asserted time.</p><p>So two questions remain separate:</p><pre><code><code>Was the freshness calculation correct?
</code></code></pre><p>and:</p><pre><code><code>How much assurance do we have in the collection time?
</code></code></pre><p>A deterministic policy result answers the first.</p><p>It does not automatically answer the second.</p><h2>Replay must preserve the original time semantics</h2><p>The same boundary applies later during evidence replay.</p><p>If the original assessment used collector-asserted time, replay should not silently upgrade that timestamp into independently verified time simply because the evidence hash still matches.</p><p>The historical chain may have been:</p><pre><code><code>observation
-&gt; collector-asserted time
-&gt; evidence bytes
-&gt; integrity seal
-&gt; policy evaluation
</code></code></pre><p>If an independent receipt existed, that relationship should survive replay.</p><p>If trusted timestamping existed, its attestation should remain separately bound to the evidence digest.</p><p>Replay should preserve not only the evidence bytes and policy version, but also what was actually known about the evidence at the time.</p><h2>This does not mean every pipeline needs a timestamp authority</h2><p>The new <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence-time-provenance-contract.md">Evidence Time Provenance Contract</a> deliberately stops before that conclusion.</p><p>The accompanying <a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/evidence-time-provenance">synthetic examples</a> compare only:</p><ul><li><p>collector-asserted collection and seal times</p></li><li><p>the same modeled evidence digest with a separately recorded receipt time</p></li></ul><p>They do not implement trusted timestamping.</p><p>They do not validate NTP synchronization, host clock correctness, receiver authentication, or <a href="https://www.rfc-editor.org/info/rfc3161/">RFC 3161 Time-Stamp Protocol</a> timestamp tokens.</p><p>The boundary is narrower.</p><p>If the system only has a collector-asserted timestamp, record it as collector-asserted.</p><p>If another system creates a separate time boundary, preserve that relationship.</p><p>If trusted timestamping does not exist, do not imply that it does.</p><h2>MAS TRM-inspired means engineering interpretation</h2><p>This is not a claim that the <a href="https://www.mas.gov.sg/regulation/guidelines/technology-risk-management-guidelines">MAS Technology Risk Management Guidelines</a> prescribe this time-provenance structure or any particular timestamping mechanism.</p><p>The engineering interpretation is simpler.</p><p>If evidence supports a point-in-time technical claim, the pipeline should preserve not only the timestamp value but also where that time came from and what assurance it provides.</p><p>Otherwise:</p><pre><code><code>2026-09-22T01:00:00Z
</code></code></pre><p>looks precise while hiding the more important question:</p><p>Who said it was 01:00?</p><h2>Public reference artifacts</h2><ul><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/blob/main/docs/evidence-time-provenance-contract.md">Evidence Time Provenance Contract</a></p></li><li><p><a href="https://github.com/codeyourcompliance/evidence-validation-pipeline/tree/main/examples/evidence-time-provenance">Evidence Time Provenance Synthetic Examples</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><h2>Origin and scope</h2><p><strong>CodeYourCompliance</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>CodeYourCompliance explores compliance automation, replayable audit evidence, read-only evidence collection, policy-as-code, and evidence packages.</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/can-your-audit-evidence-survive-replay">Can Your Audit Evidence Survive Replay?</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[A Successful Demo Is Not an Acceptance Test]]></title><description><![CDATA[A successful AI agent demo proves one execution path can work. Acceptance testing asks which conditions were tested, what behavior was expected, and what evidence was retained.]]></description><link>https://www.codeyourcompliance.com/p/a-successful-demo-is-not-an-acceptance</link><guid isPermaLink="false">https://www.codeyourcompliance.com/p/a-successful-demo-is-not-an-acceptance</guid><dc:creator><![CDATA[CodeYourCompliance]]></dc:creator><pubDate>Sat, 19 Sep 2026 10:18:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c64b75aa-c12a-4fb5-a474-b38f4fa3b54c_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>AI Vendor Evidence Gap Notes #12</em></p><p>When I look at AI agent demos now, I pay more attention to a simple question: what does a successful demo actually prove?</p><p>A demonstration shows that the system can perform a task under a particular set of conditions. Acceptance goes further. It asks whether the system has been tested against the conditions that matter for the intended use, including what should happen when the normal path fails.</p><p>That distinction becomes important quickly. An agent receives a task, calls the expected tool, pauses for the required approval, and completes the workflow. Everyone can see that it works, and it is natural to say that the agent has been tested. The demo does provide useful evidence, but it supports a narrower conclusion: this execution path worked under these conditions.</p><h3>Claim</h3><p>A typical statement is:</p><blockquote><p>&#8220;We tested the agent and the demo worked successfully.&#8221;</p></blockquote><p>If the demo was recorded, we may already know quite a lot. The agent understood the request, the relevant tool was available, permissions worked, the API responded, the normal approval path was triggered, and the expected result was produced.</p><p>That is real evidence. The gap appears when &#8220;this path worked&#8221; becomes &#8220;the agent has been tested,&#8221; because the second statement suggests a broader range of behaviour than the demo actually covered.</p><h3>Why it sounds sufficient</h3><p>A demo is persuasive because the system is visibly doing the work. Instead of reading architecture diagrams or documentation, we can watch the request move through tool calls, approvals, and the final action.</p><p>The problem is that demos usually use cooperative conditions. Inputs are reasonable, permissions are correct, dependencies are online, and APIs return something the workflow knows how to handle. Production is less predictable. An approval service may be unavailable, a tool call may fail, an API may return an unexpected result, or the user may phrase the task differently.</p><p>For an agent, this matters because a failed step may change what happens next. The agent may retry, select another tool, or follow another execution path. If that happens, I would want to know whether the same approval and control requirements still apply.</p><p>A happy-path demo normally does not answer that question because it was not designed to.</p><h3>What it actually proves</h3><p>A successful run can show that a particular version of the agent can complete a workflow under a known combination of input, configuration, permissions, tools, and dependencies. That is considerably stronger evidence than documentation alone.</p><p>Acceptance testing adds another requirement: the relevant conditions have to be identified in advance, with some expectation of how the system should behave under each of them.</p><p>For example, if an action requires human approval, I would not only record one successful approval. I would also want to know what happens when approval is rejected, when the approval service is unavailable, or when a failed tool call causes the agent to retry through another path.</p><p>Not everything needs to be tested at once. The important thing is to distinguish behaviour we have actually observed from behaviour we currently assume will occur.</p><h3>A public evidence example</h3><p>The distinction between documented controls and tested behaviour is visible even in public vendor evidence. The <a href="https://signal.codeyourcompliance.com/companies/decagon/?utm_source=chatgpt.com">Trust Signal profile for Decagon</a> identifies public security, AI data-usage, audit-log and guardrail surfaces, while explicitly warning that those sources do not verify implementation or control operating effectiveness.</p><p>That is the same boundary this article is concerned with. Documentation can show that a control or capability is described. To establish what happened during a particular workflow, the reviewer needs execution or test evidence.</p><p>The <a href="https://assurance.aiverifyfoundation.sg/report/executive-summary/?utm_source=chatgpt.com">AI Verify Foundation report on testing real-world GenAI systems</a> makes a related point from the testing side. Its pilot found that test design depended heavily on the use case, that teams often added adversarial or simulation testing for edge cases, and that application-level testing needs to look beyond generic model benchmarks.</p><p>Neither source defines a universal acceptance test. They do show why evidence has to move beyond documentation and a successful normal run when the question is whether a system can be relied upon under a wider operating range.</p><h3>What it does not prove</h3><p>One successful run does not establish repeatability. Another run may take a different execution path, particularly when the agent can choose tools or steps dynamically. The important issue is not whether every run is identical, but whether required controls remain present when the path changes.</p><p>It also tells us little about failure behaviour. A successful normal path does not show how the system responds to API timeouts, permission failures, missing data, unavailable dependencies, or rejected approvals.</p><p>Versioning creates another boundary. A test result may depend on a particular model version, prompt, agent configuration, tool set, and permission structure. When one of those changes, some previous evidence may still be useful, but its continued applicability has to be considered rather than assumed.</p><p>The demo is therefore not weak evidence. Its scope is simply narrower than &#8220;tested successfully&#8221; often implies.</p><h3>Weak-answer pattern</h3><p>When I see:</p><blockquote><p>&#8220;The agent has been tested successfully.&#8221;</p></blockquote><p>I want to know what &#8220;tested&#8221; means.</p><p>It might describe one happy-path demo. It might also describe repeated runs, approval-rejection tests, dependency failures, and retained execution records. Those represent very different evidence even though the summary sentence is identical.</p><p>The weak-answer pattern is therefore not that the statement is false. It is that the statement removes the test conditions, making it difficult for a reviewer to see what has actually been covered.</p><h3>Evidence request</h3><p>For an agent moving from demo toward real use, I would keep the evidence request fairly small. For important workflows, record the test condition, expected behaviour, actual result, agent or model version, tools, permissions, and relevant approval, retry, or error events.</p><p>For higher-impact actions, add a few conditions outside the happy path: approval rejection, dependency failure, tool-call failure, retry, and an attempted prohibited action.</p><p>A small matrix is often enough to separate what has actually been tested from what is still assumed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gpzM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gpzM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 424w, https://substackcdn.com/image/fetch/$s_!gpzM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 848w, https://substackcdn.com/image/fetch/$s_!gpzM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!gpzM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!gpzM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png" width="1280" height="1238" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/acc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1238,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:194758,&quot;alt&quot;:&quot;Acceptance evidence matrix for AI agent testing, showing scenarios such as normal execution, approval rejection, dependency failure, retry, prohibited action, and alternate paths, with expected behavior, evidence to retain, and testing status.&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/216425061?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Acceptance evidence matrix for AI agent testing, showing scenarios such as normal execution, approval rejection, dependency failure, retry, prohibited action, and alternate paths, with expected behavior, evidence to retain, and testing status." title="Acceptance evidence matrix for AI agent testing, showing scenarios such as normal execution, approval rejection, dependency failure, retry, prohibited action, and alternate paths, with expected behavior, evidence to retain, and testing status." srcset="https://substackcdn.com/image/fetch/$s_!gpzM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 424w, https://substackcdn.com/image/fetch/$s_!gpzM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 848w, https://substackcdn.com/image/fetch/$s_!gpzM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 1272w, https://substackcdn.com/image/fetch/$s_!gpzM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Facc5673f-7dfb-4c24-adc9-edbe13dd8e5e_1280x1238.png 1456w" sizes="auto, 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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 successful demo covers one path. Acceptance evidence should show which conditions were tested, what behavior was expected, and what execution evidence was retained.</figcaption></figure></div><p>A practical evidence request could be:</p><blockquote><p>Provide the acceptance scenarios already executed for this workflow, including expected and actual behaviour for normal execution, approval rejection, dependency failure, retry, and prohibited-action conditions. Include the relevant execution records and identify the agent/model version, tools, permissions, and configuration used during testing.</p></blockquote><p>This does not require a large testing framework. A few clearly defined conditions with retained evidence are more useful than a long test list with no clear connection to the behaviour being relied upon.</p><h3>Review note</h3><p>If the available evidence is mainly a successful demo, I would record:</p><blockquote><p>The current evidence shows that the agent can complete the intended workflow under the tested conditions. It supports this execution path, but does not yet establish whether relevant controls remain consistent across repeated runs, dependency failures, retries, unexpected inputs, or alternate execution paths.</p></blockquote><p>That records what the demo has established without extending the conclusion beyond the available evidence.</p><h3>Usage boundary</h3><p>Until those additional conditions have been tested, I would keep the agent within a scope where unexpected behaviour can still be observed and corrected before it creates a material outcome.</p><p>This matters more when an agent can modify data, send external messages, call other systems, or directly trigger business actions. In those cases, it is not enough to know that the agent can finish the task. We also need evidence of what it does when the expected workflow stops working.</p><p>A successful demo is therefore a useful starting point for acceptance work. It tells us that a workflow can run. The next step is to make the tested boundary explicit: which conditions have been exercised, what behaviour was observed, and which important conditions remain untested.</p><p>That is the practical difference between demonstration evidence and acceptance evidence.</p><h3>Boundary</h3><p>This material is for evidence structuring, review preparation, and evidence-oriented testing discussion. It does not provide legal, regulatory, audit, procurement, certification, or implementation advice.</p>]]></content:encoded></item><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="auto, 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="auto, 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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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></channel></rss>