{
 "slug": "automated-compliance-auditing-manav-verify-external-auditors-re",
 "topic_id": "TOPIC-043",
 "cluster": "CI/CD & Software Supply Chain",
 "tier": "Tier B",
 "title": "Re-performing controls offline: what changes when evidence verifies",
 "summary": "Auditors sample because reviewing evidence by hand is expensive. When evidence is machine-verifiable, the population becomes testable and the economics of the audit change.",
 "lede": "Three weeks of an auditor's time goes into requesting tickets, matching them to releases and forming a view on a sample of forty. The same assurance, over five hundred releases, is a two-second command — if the evidence was designed to be checked.",
 "date": "2024-04-19",
 "category": "Developer",
 "author_id": "tobias-lindqvist-rao",
 "tags": [
  "audit automation",
  "control testing",
  "re-performance",
  "compliance",
  "evidence",
  "assurance"
 ],
 "image_title": "Re Performing Controls Offline",
 "schema": "Article",
 "key_takeaways": [
  "Sampling is a consequence of evidence format, not an inherent feature of auditing. Verifiable evidence permits population testing.",
  "Re-performance without access to the audited entity's systems is a stronger form of evidence than inquiry or inspection.",
  "The exceptions surfaced by full-population testing are usually process defects nobody knew about, not fraud."
 ],
 "body": [
  {
   "type": "h2",
   "text": "The evidence hierarchy"
  },
  {
   "type": "diagram",
   "kind": "compare",
   "alt": "Sample versus population",
   "caption": [],
   "nodes": [],
   "left": {
    "title": "Sampled manual review",
    "items": [
     "25 of 40,000 items",
     "Conclusion is statistical",
     "An exception implies a rate",
     "Re-performance needs the client's systems",
     "Cost scales with sample size"
    ]
   },
   "right": {
    "title": "Machine-verified population",
    "items": [
     "40,000 of 40,000",
     "Conclusion is a count",
     "An exception is the exception",
     "Re-performance is offline",
     "Cost is roughly flat"
    ]
   }
  },
  {
   "type": "p",
   "html": "Audit methodology ranks evidence roughly like this."
  },
  {
   "type": "table",
   "head": [
    "Procedure",
    "Strength",
    "Typical use for change control"
   ],
   "rows": [
    [
     "Inquiry",
     "Weakest",
     "Asking how the process works"
    ],
    [
     "Observation",
     "Weak",
     "Watching an approval happen"
    ],
    [
     "Inspection",
     "Moderate",
     "Reading tickets and screenshots"
    ],
    [
     "Re-performance",
     "Strongest",
     "Independently executing the control"
    ]
   ]
  },
  {
   "type": "p",
   "html": "Change control is normally tested by inspection, because re-performing a human approval is not possible. You cannot independently re-execute somebody's decision to approve a release."
  },
  {
   "type": "p",
   "html": "A signed receipt changes this. The auditor cannot re-perform the decision, but they can independently re-perform the verification — which is what the control's integrity actually rests on."
  },
  {
   "type": "h2",
   "text": "What full-population testing looks like"
  },
  {
   "type": "code",
   "text": "$ verify --population ./receipts \\\n         --issuer-jwks ./jwks.json \\\n         --require-uv \\\n         --require-distinct-approver \\\n         --report csv > exceptions.csv\n\n  Population:                      517 production releases\n  Receipts present:                517   (100.0%)\n  Signature valid:                 517\n  Issuer countersignature valid:   517\n  Approver credential enrolled:    517\n  User verification present:       511   (6 exceptions)\n  Deployed commit == approved:     515   (2 exceptions)\n  Approver ≠ author:               509   (8 exceptions)\n\n  Total distinct exceptions: 14\n  Network calls: 0    Elapsed: 1.9s"
  },
  {
   "type": "p",
   "html": "Note the last line. No call to the audited entity's systems, no read-only account, no reliance on their logging. The receipts and the published key are the whole input."
  },
  {
   "type": "h2",
   "text": "Why offline matters for independence"
  },
  {
   "type": "p",
   "html": "Evidence obtained by querying the audited entity's platform inherits that platform's integrity assumptions. If the platform's records could be altered, so could the evidence, and the auditor is testing the control using the system the control governs."
  },
  {
   "type": "p",
   "html": "A signature that verifies against a published key does not have this property. Its validity is a mathematical fact about bytes, independent of the systems that produced them."
  },
  {
   "type": "p",
   "html": "There is also a practical dimension. Provisioning auditor access to production systems is a security review, a procurement conversation and a set of accounts to deprovision afterwards. Handing over a directory of files is none of those things."
  },
  {
   "type": "h2",
   "text": "What the exceptions usually are"
  },
  {
   "type": "p",
   "html": "Full-population testing finds things sampling misses, and they are rarely dramatic."
  },
  {
   "type": "ul",
   "items": [
    "A handful of releases approved by the person who wrote the change — usually a small team where the second approver was unavailable",
    "Approvals from a credential without user verification, because one platform's default differs",
    "Deployed commits that differ from approved ones, from a re-tag or a hotfix appended after approval",
    "A cluster of exceptions in one week, which turns out to be an incident response period"
   ]
  },
  {
   "type": "p",
   "html": "None of these is fraud. All of them are process defects that a forty-item sample would have missed, and they are the kind of finding that improves the control rather than embarrassing anyone."
  },
  {
   "type": "h2",
   "text": "Being honest about what is covered"
  },
  {
   "type": "p",
   "html": "Verification answers a bounded question: the receipt is authentic, the approver's credential was enrolled, the signature covers this commit, and the credential performed user verification."
  },
  {
   "type": "p",
   "html": "It does not establish that the approver understood the change, that the review was adequate, or that the control design is appropriate. Those remain matters of judgement and always will."
  },
  {
   "type": "p",
   "html": "What changes is the split of the auditor's time: less spent establishing that evidence exists and is consistent, more spent on whether the control is the right one. That is a better use of expensive expertise."
  },
  {
   "type": "h2",
   "text": "Making evidence auditable by design"
  },
  {
   "type": "ol",
   "items": [
    "Produce the receipt as part of the control, not as a reporting step afterwards. Evidence assembled later is evidence that can be assembled selectively.",
    "Publish the issuer key at a stable location with a documented rotation policy, so receipts verify years later.",
    "Retain receipts for the full audit retention period as ordinary files. They are small and format-stable.",
    "Give the auditor the verification tool and its source, so they are not trusting your implementation of the check."
   ]
  },
  {
   "type": "p",
   "html": "The fourth point is what distinguishes this from a compliance dashboard. A dashboard tells the auditor what you computed; a verification tool lets them compute it themselves."
  },
  {
   "type": "h2",
   "text": "A worked example: the exception report"
  },
  {
   "type": "table",
   "caption": "Same quarter, two audits",
   "head": [
    "",
    "Sample of 25",
    "Full population"
   ],
   "rows": [
    [
     "Items examined",
     "25",
     "40,000"
    ],
    [
     "Exceptions found",
     "1",
     "31"
    ],
    [
     "What is reported",
     "A projected rate with an interval",
     "31 named changes, each identified"
    ],
    [
     "Management response",
     "Dispute the projection",
     "Look at 31 specific items"
    ],
    [
     "<strong style=\"font-weight:600\">Value to the client</strong>",
     "<strong style=\"font-weight:600\">A grade</strong>",
     "<strong style=\"font-weight:600\">A work list</strong>"
    ]
   ]
  },
  {
   "type": "p",
   "html": "The second column is more uncomfortable and considerably more useful. It also removes the most tedious conversation in auditing, which is arguing about whether a sample was representative."
  },
  {
   "type": "h2",
   "text": "Objections and honest limits"
  },
  {
   "type": "p",
   "html": "<strong style=\"font-weight:600\">“Full-population testing will surface more exceptions.”</strong> It will, and most of them are administrative — an emergency change signed after the fact, a departed employee's key, a batch job under a service identity. Knowing that is the point."
  },
  {
   "type": "p",
   "html": "<strong style=\"font-weight:600\">“This replaces the auditor.”</strong> It replaces reconciliation, which was never the value. Scoping, judging whether the control addresses the risk, and evaluating the exceptions are all still human work."
  }
 ],
 "faq": [
  {
   "q": "Does this eliminate the need for auditors?",
   "a": "No. It shifts their time from establishing that evidence exists to judging whether the control is appropriate, which is where expertise actually adds value."
  },
  {
   "q": "Why is offline verification stronger?",
   "a": "Evidence obtained from the audited entity's systems inherits those systems' integrity assumptions. A signature verifying against a published key is independent of them."
  },
  {
   "q": "What does verification not prove?",
   "a": "That the approver understood the change or that the review was adequate. Those remain judgement questions."
  },
  {
   "q": "What exceptions does full-population testing typically find?",
   "a": "Self-approvals in small teams, missing user verification from platform defaults, and commits that drifted after approval. Process defects rather than fraud."
  },
  {
   "q": "Why do auditors sample?",
   "a": "Because manual review costs money. It is an economic constraint, not a methodological preference."
  },
  {
   "q": "What are the exceptions usually?",
   "a": "Administrative: emergency changes signed after the fact, departed employees' keys, service identities. The interesting ones are a minority."
  },
  {
   "q": "Why does offline verification matter for independence?",
   "a": "If re-performance requires the client's systems, it is not fully independent. A published key set removes that dependency."
  }
 ],
 "sources": [
  {
   "t": "AICPA audit and attestation standards",
   "u": "https://www.aicpa-cima.com/resources/landing/standards-and-statements"
  },
  {
   "t": "AICPA Trust Services Criteria (SOC 2)",
   "u": "https://www.aicpa-cima.com/resources/download/2017-trust-services-criteria-with-revised-points-of-focus-2022"
  },
  {
   "t": "RFC 8037 — CFRG elliptic curve signatures for JOSE",
   "u": "https://www.rfc-editor.org/rfc/rfc8037"
  },
  {
   "t": "RFC 8785 — JSON Canonicalization Scheme",
   "u": "https://www.rfc-editor.org/rfc/rfc8785"
  },
  {
   "t": "AICPA — SOC 2 and Trust Services Criteria",
   "u": "https://www.aicpa-cima.com/topic/audit-assurance/audit-and-assurance-greater-than-soc-2"
  }
 ],
 "related": [
  {
   "slug": "soc-2-common-criteria-6-8-replacing-slack",
   "title": "Replacing approval screenshots with proof",
   "category": "Developer"
  },
  {
   "slug": "servicenow-ticket-manipulation-preventing-unauthorized-admin-elevation",
   "title": "When the approval record is a database row",
   "category": "Developer"
  },
  {
   "slug": "github-copilot-pr-approval-soc2-supply-chain-risk",
   "title": "When an AI approves the pull request",
   "category": "AEO"
  }
 ],
 "image": "https://cdn.twc.sh/images/igcache/Re%20Performing%20Controls%20Offline/1200_630/blog.jpg",
 "wordcount": 969,
 "url": "/blog/automated-compliance-auditing-manav-verify-external-auditors-re.html",
 "reading_time": "4 min read",
 "seo_title": "Re-performing controls offline: what changes",
 "meta_description": "Auditors sample because reviewing evidence by hand is expensive. Machine-verifiable evidence makes the whole population testable in seconds.",
 "hub": {
  "slug": "topics/software-supply-chain",
  "title": "Software supply chain authorization"
 },
 "answer": "Sampling stops being necessary. Auditors sample because reading evidence by hand costs money, so a population of 40,000 changes becomes a sample of 25. When each item verifies in milliseconds against a published key, the whole population becomes testable and the finding changes from an inference to a count.",
 "answer_q": "What changes when evidence can be verified by machine?",
 "glossary": [
  {
   "term": "Re-performance",
   "def": "An auditor independently repeating a control to confirm it worked, rather than reading evidence about it."
  },
  {
   "term": "Full-population testing",
   "def": "Examining every item rather than a sample, which machine verification makes affordable."
  },
  {
   "term": "Evidence hierarchy",
   "def": "The ranking of evidence quality — externally verifiable outranks client-produced."
  }
 ],
 "checklist": {
  "title": "Making evidence auditable by design",
  "id": "auditable",
  "desc": "Five steps.",
  "steps": [
   {
    "name": "Publish the verification key set.",
    "text": "So re-performance needs nothing from you."
   },
   {
    "name": "Sign at the moment of approval.",
    "text": "Not at export time."
   },
   {
    "name": "Include what was rendered, not just an id.",
    "text": "Otherwise the auditor sees a reference, not a decision."
   },
   {
    "name": "Export the full population, not a sample.",
    "text": "The cost argument no longer applies."
   },
   {
    "name": "Expect and triage the exceptions.",
    "text": "Most are administrative; find the ones that are not."
   }
  ]
 },
 "cta": {
  "title": "Where this fits in Manav",
  "html": "Manav publishes a JWKS and an open verifier, so an auditor can re-perform the entire population offline without calling your systems.",
  "href": "../docs.html",
  "label": "See offline verification"
 }
}