<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ventse</title>
    <description>The latest articles on DEV Community by Ventse (@traceseal).</description>
    <link>https://dev.to/traceseal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3882611%2F9fea844c-d8a3-423f-9fd5-c12bd3e6960d.png</url>
      <title>DEV Community: Ventse</title>
      <link>https://dev.to/traceseal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/traceseal"/>
    <language>en</language>
    <item>
      <title>AI agent audit trails: what to record, and what your records can prove</title>
      <dc:creator>Ventse</dc:creator>
      <pubDate>Tue, 11 Aug 2026 08:51:37 +0000</pubDate>
      <link>https://dev.to/traceseal/ai-agent-audit-trails-what-to-record-and-what-your-records-can-prove-4e0e</link>
      <guid>https://dev.to/traceseal/ai-agent-audit-trails-what-to-record-and-what-your-records-can-prove-4e0e</guid>
      <description>&lt;p&gt;An AI agent does not just answer questions. It calls tools, edits files, opens pull requests, moves money, sends messages. Sooner or later one of those actions gets questioned, by a customer, an auditor, a regulator, or your own incident review, and what you can say at that point depends entirely on what you recorded at the time.&lt;/p&gt;

&lt;p&gt;Building a useful audit trail for an agent is really two problems, and teams usually only notice the first one. &lt;strong&gt;Completeness&lt;/strong&gt;: did you capture the right events? &lt;strong&gt;Credibility&lt;/strong&gt;: can anyone other than you believe the record? This post covers both, including the record-keeping duties the EU AI Act now attaches to high-risk systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an AI agent audit trail should record
&lt;/h2&gt;

&lt;p&gt;Chat transcripts are not an audit trail. The transcript records what the model said; the questions that matter later are about what the system &lt;em&gt;did&lt;/em&gt;. A trail worth keeping records, for every run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Which code and model ran.&lt;/strong&gt; Agent and skill versions, the model identifier, and content hashes of the code that executed, not just a version string someone can retag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The inputs.&lt;/strong&gt; The task or prompt, the configuration, and the policy in force. Store sensitive payloads as SHA-256 digests rather than plaintext: a hash proves the input was what you say it was without retaining the data itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every tool call.&lt;/strong&gt; Name, arguments, result and exit status. Tool calls are where an agent touches the world; a trail that omits them records the commentary and drops the actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What changed.&lt;/strong&gt; Files written, diffs applied, messages sent, records created, again as digests, so the artefact can be checked against the record later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing.&lt;/strong&gt; Start and end of the run and of each step. This is not gold-plating: for biometric systems, &lt;a href="https://artificialintelligenceact.eu/article/12/" rel="noopener noreferrer"&gt;Article 12(3) of the EU AI Act&lt;/a&gt; requires logging "the period of each use of the system (start date and time and end date and time)" explicitly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human involvement.&lt;/strong&gt; Which steps ran under an approval, and who gave it. When something goes wrong, the first question after "what happened" is "who signed it off".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The regulatory floor: EU AI Act record-keeping
&lt;/h2&gt;

&lt;p&gt;If your agent falls in the Act's high-risk category, record-keeping stops being a best practice and becomes a duty with numbers attached. Three articles of &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/1689/oj" rel="noopener noreferrer"&gt;Regulation (EU) 2024/1689&lt;/a&gt; do the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://artificialintelligenceact.eu/article/12/" rel="noopener noreferrer"&gt;Article 12&lt;/a&gt;&lt;/strong&gt; requires high-risk AI systems to "technically allow for the automatic recording of events (logs) over the lifetime of the system", covering events relevant to identifying risk, post-market monitoring, and monitoring of operation by deployers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://artificialintelligenceact.eu/article/19/" rel="noopener noreferrer"&gt;Article 19&lt;/a&gt;&lt;/strong&gt; obliges providers to keep those automatically generated logs, to the extent they are under their control, for a period appropriate to the system's purpose and &lt;strong&gt;at least six months&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://artificialintelligenceact.eu/article/26/" rel="noopener noreferrer"&gt;Article 26(6)&lt;/a&gt;&lt;/strong&gt; places the mirror-image duty on deployers: keep the logs your high-risk system generates, again for at least six months, longer where other EU or national law (data protection in particular) requires it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On timing: under &lt;a href="https://artificialintelligenceact.eu/article/113/" rel="noopener noreferrer"&gt;Article 113&lt;/a&gt; the Act applies generally from 2 August 2026, which brings the obligations for high-risk systems listed in Annex III with it; systems that are high-risk because they are safety components of regulated products (Article 6(1)) follow from 2 August 2027.&lt;/p&gt;

&lt;p&gt;Most coding and operations agents are not high-risk systems under the Act. But the transparency duties in &lt;a href="https://traceseal.io/blog/eu-ai-act-article-50-ai-agents/" rel="noopener noreferrer"&gt;Article 50 already apply&lt;/a&gt; to systems that interact with people or generate content, and if you are going to keep records at all, the Act's six-month retention floor is the obvious number to copy rather than invent your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  A complete log can still prove nothing
&lt;/h2&gt;

&lt;p&gt;Suppose you record all of the above faithfully. You now have a trail that is excellent for debugging and incident response — and still worthless the moment someone outside your organisation needs convincing.&lt;/p&gt;

&lt;p&gt;The problem is authorship. Application logs are written by the same system they describe, stored on infrastructure the operator controls, and editable by anyone with write access to the store. When the record's author is the party whose conduct is in question, the record cannot clear them. Security practice has long treated missing or unprotected logs as a top-tier weakness (it is &lt;a href="https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/" rel="noopener noreferrer"&gt;A09 in the OWASP Top 10&lt;/a&gt;), but integrity is a separate property from existence. A log that exists, is complete, and could have been rewritten yesterday answers "what happened?" only for people who already trust you.&lt;/p&gt;

&lt;p&gt;We have written up the full argument in &lt;a href="https://traceseal.io/blog/signed-execution-receipts-primer/" rel="noopener noreferrer"&gt;why logs are not evidence&lt;/a&gt;; the short version is that WORM storage, centralised log collectors and hash chains each move the trust boundary without removing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the trail verifiable
&lt;/h2&gt;

&lt;p&gt;The fix is mechanical, and none of it is exotic cryptography:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hash every artefact&lt;/strong&gt; the run touched, so the record commits to specific bytes rather than descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serialise the record as canonical JSON&lt;/strong&gt;, so there is exactly one byte sequence a signature can cover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign it at execution time&lt;/strong&gt; with an ed25519 key held outside the agent's reach, so neither the agent nor a later intruder can rewrite history without breaking the seal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchor it in a transparency log&lt;/strong&gt;, so the record provably existed before the dispute did.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That turns your audit trail into a receipt anyone can check offline, with no access to your systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;traceseal-verify
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;traceseal-verify receipt.json
&lt;span class="go"&gt;[OK] receipt.json — operator signature verified
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We walk through &lt;a href="https://traceseal.io/blog/verify-what-an-ai-agent-actually-did/" rel="noopener noreferrer"&gt;what that verification actually proves&lt;/a&gt; in an earlier post, and the honest limits matter here too. A signed receipt proves the record has not changed since it was sealed and who sealed it. It does not prove the record is complete: an action taken outside the instrumented path leaves no receipt at all. That is why receipts pair naturally with &lt;a href="https://traceseal.io/blog/sandbox-an-ai-coding-agent/" rel="noopener noreferrer"&gt;sandboxing the agent&lt;/a&gt; — the sandbox narrows what can happen off the record, and the receipt seals what happened on it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The test worth applying:&lt;/strong&gt; pick one agent action from last month and try to show a third party what happened, without asking them to trust your database. If the exercise ends at "here is a row in our logging system", you have an audit trail. You do not yet have evidence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A checklist you can apply this week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Record tool calls and artefacts, not just conversation.&lt;/li&gt;
&lt;li&gt;Hash sensitive inputs and outputs instead of hoarding them.&lt;/li&gt;
&lt;li&gt;Retain records for at least six months, the floor set by &lt;a href="https://artificialintelligenceact.eu/article/19/" rel="noopener noreferrer"&gt;Article 19&lt;/a&gt; and &lt;a href="https://artificialintelligenceact.eu/article/26/" rel="noopener noreferrer"&gt;Article 26(6)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Sign records when they are made. A trail you start keeping after the dispute begins says nothing about what came before.&lt;/li&gt;
&lt;li&gt;Rehearse retrieval: if you have never pulled a specific run's record under time pressure, you do not know whether you can.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The receipt format, verifier and transparency log are open — the &lt;a href="https://github.com/traceseal/traceseal-verify/blob/main/RECEIPT-SPEC.md" rel="noopener noreferrer"&gt;spec&lt;/a&gt;, the &lt;a href="https://pypi.org/project/traceseal-verify/" rel="noopener noreferrer"&gt;verifier on PyPI&lt;/a&gt;, and the &lt;a href="https://log.traceseal.io" rel="noopener noreferrer"&gt;public log&lt;/a&gt;. You can adopt the format without adopting us.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://traceseal.io/blog/ai-agent-audit-trail/" rel="noopener noreferrer"&gt;Traceseal blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>compliance</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to sandbox an AI coding agent (and what a sandbox cannot prove)</title>
      <dc:creator>Ventse</dc:creator>
      <pubDate>Tue, 04 Aug 2026 08:50:37 +0000</pubDate>
      <link>https://dev.to/traceseal/how-to-sandbox-an-ai-coding-agent-and-what-a-sandbox-cannot-prove-h9b</link>
      <guid>https://dev.to/traceseal/how-to-sandbox-an-ai-coding-agent-and-what-a-sandbox-cannot-prove-h9b</guid>
      <description>&lt;p&gt;The question usually arrives after the run rather than before it. An agent has spent forty minutes in a repository, the diff is larger than anyone expected, and somebody asks whether it touched anything outside the working directory. The instinct is to search the transcript. The trouble with that instinct is the one this blog keeps returning to: the transcript is written by the process you are asking about, so a clean transcript is exactly what a misbehaving run produces.&lt;/p&gt;

&lt;p&gt;The durable answer is to make the action impossible rather than to watch for it. This post is a working profile for doing that on Linux, an honest account of where it leaked when we tested it, and the point at which a sandbox stops helping.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a sandbox is, underneath the word
&lt;/h2&gt;

&lt;p&gt;"Sandbox" is used loosely enough to mean anything from a Docker container to a permissions prompt. On Linux it has a specific meaning, assembled from three kernel facilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Namespaces&lt;/strong&gt; give a process a private view of a global resource: its own mount table, process tree, or network stack (&lt;a href="https://man7.org/linux/man-pages/man7/namespaces.7.html" rel="noopener noreferrer"&gt;namespaces(7)&lt;/a&gt;). &lt;a href="https://man7.org/linux/man-pages/man7/user_namespaces.7.html" rel="noopener noreferrer"&gt;User namespaces&lt;/a&gt; are the piece that matters for developer tooling, because they let an ordinary account create the others without root.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seccomp&lt;/strong&gt; filters system calls, so a process can be denied whole classes of kernel interface rather than denied a file (&lt;a href="https://man7.org/linux/man-pages/man2/seccomp.2.html" rel="noopener noreferrer"&gt;seccomp(2)&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Landlock&lt;/strong&gt; lets an unprivileged process restrict its own filesystem access and never get it back, which is the right shape for a wrapper that launches something it does not trust (&lt;a href="https://docs.kernel.org/userspace-api/landlock.html" rel="noopener noreferrer"&gt;kernel documentation&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/containers/bubblewrap" rel="noopener noreferrer"&gt;Bubblewrap&lt;/a&gt; is a small setuid-or-userns tool that composes the first two into a single command. It is what Flatpak uses underneath, it needs no daemon, and it starts in milliseconds, which matters when the thing you are wrapping is invoked hundreds of times a day. Everything below was run against bubblewrap 0.11.0 on Debian.&lt;/p&gt;

&lt;h2&gt;
  
  
  A profile that actually runs
&lt;/h2&gt;

&lt;p&gt;The shape you want for a coding agent is narrow: it may read the system, it may write to one directory, and it may not reach the network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bwrap &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--ro-bind&lt;/span&gt; / / &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--bind&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--dev&lt;/span&gt; /dev &lt;span class="nt"&gt;--proc&lt;/span&gt; /proc &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--unshare-net&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--unshare-pid&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--die-with-parent&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--chdir&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--&lt;/span&gt; your-agent-cli run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Line by line: &lt;code&gt;--ro-bind / /&lt;/code&gt; mounts the entire host filesystem read-only, so the agent keeps the toolchain, libraries and language runtimes it needs and can modify none of them. &lt;code&gt;--bind "$PWD" "$PWD"&lt;/code&gt; punches one writable hole at the working directory. &lt;code&gt;--unshare-net&lt;/code&gt; puts the process in a fresh network namespace with no interface but loopback. &lt;code&gt;--unshare-pid&lt;/code&gt; stops it seeing or signalling other processes on the box, and &lt;code&gt;--die-with-parent&lt;/code&gt; means an orphaned agent is killed rather than left running.&lt;/p&gt;

&lt;p&gt;Two classes of action stop being things you monitor and become things that cannot happen. A write outside the working directory fails at the kernel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; /home/tim/SHOULD_NOT_EXIST
&lt;span class="go"&gt;touch: cannot touch '/home/tim/SHOULD_NOT_EXIST': Read-only file system
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there is no route off the machine, so a connection to a raw address fails to establish. That is a better guarantee than any amount of transcript review, because it does not depend on the agent's cooperation, its honesty, or your diligence in reading the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it leaked
&lt;/h2&gt;

&lt;p&gt;Testing the profile above produced a result we did not expect. Egress was properly gone: &lt;code&gt;ip route&lt;/code&gt; was empty inside the namespace and &lt;code&gt;curl&lt;/code&gt; to a bare IP address failed to connect. But name resolution still worked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getent hosts example.com
&lt;span class="go"&gt;2606:4700:10::6814:179a  example.com
2606:4700:10::ac42:93f3  example.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The explanation is in &lt;code&gt;/etc/nsswitch.conf&lt;/code&gt;. Debian's hosts line includes the &lt;code&gt;resolve&lt;/code&gt; module, which does not send a DNS packet at all: it talks to systemd-resolved over a Unix socket at &lt;code&gt;/run/systemd/resolve/io.systemd.Resolve&lt;/code&gt;. That socket arrived inside the sandbox as an ordinary file, carried in by the read-only bind of &lt;code&gt;/&lt;/code&gt;. Masking the directory confirms it, and the resolution stops:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bwrap ... &lt;span class="nt"&gt;--unshare-net&lt;/span&gt; &lt;span class="nt"&gt;--tmpfs&lt;/span&gt; /run/systemd/resolve &lt;span class="nt"&gt;--&lt;/span&gt; getent hosts example.com
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c"&gt;# no output&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The general lesson is worth more than the specific fix. A network namespace governs interfaces, routes and sockets in the network stack. It has nothing to say about a Unix socket to a host daemon that still has full network access, and a filesystem bind will hand you one of those without mentioning it. Anyone auditing an agent sandbox should assume the same is true of the container runtime socket, the SSH agent socket, and the D-Bus session bus.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Worth stating plainly: we wrote the confident version of the paragraph above first, then ran it, and the run disagreed. A sandbox profile that has not been driven end to end is a hypothesis about isolation, not a control.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three further limits are structural rather than fixable. The working directory is writable by design, and for most repositories that is where the interesting secrets live: &lt;code&gt;.env&lt;/code&gt; files, and &lt;code&gt;.git/config&lt;/code&gt; remotes with an access token embedded in the URL. Environment variables cross the boundary untouched unless you add &lt;code&gt;--clearenv&lt;/code&gt;, so an API key exported in the parent shell is available inside. And the kernel is shared, which is the standing caveat on all container-style isolation and the reason &lt;a href="https://csrc.nist.gov/pubs/sp/800/190/final" rel="noopener noreferrer"&gt;NIST SP 800-190&lt;/a&gt; treats it as weaker than a virtual machine boundary. Docker's &lt;a href="https://docs.docker.com/engine/network/drivers/none/" rel="noopener noreferrer"&gt;&lt;code&gt;none&lt;/code&gt; network driver&lt;/a&gt; is the same idea with the same caveats, if a container is already in your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody budgets for
&lt;/h2&gt;

&lt;p&gt;Isolation changes what the agent does, not only what it is able to do, and this is a genuine operational cost rather than a footnote. An agent that cannot reach the network will still try to install a package. When that fails, it improvises: it writes a stub, or vendors something from a cache, or quietly adjusts a test so the missing dependency stops mattering. The run does not stop; it goes sideways.&lt;/p&gt;

&lt;p&gt;The second effect is on diagnosis. A run that failed because the sandbox blocked it and a run that failed because the task was wrong produce output that looks much the same, and the agent's own explanation of which one happened is not evidence either. Teams adopting sandboxing tend to lose a week to this before they start logging the policy denials separately from the task failures. It is worth doing on day one. This is also why &lt;a href="https://traceseal.io/blog/alibi-grade-agents-on-ground-truth/" rel="noopener noreferrer"&gt;grading agents against ground truth on disk&lt;/a&gt; beats grading them on what they said they did.&lt;/p&gt;

&lt;h2&gt;
  
  
  From control to evidence
&lt;/h2&gt;

&lt;p&gt;Here is the limit of everything above. A sandbox constrains; it does not communicate. You now know the agent could not write outside the repository. A customer, an auditor or a regulator asking the same question next quarter still has nothing but your description of a profile you say you applied.&lt;/p&gt;

&lt;p&gt;Closing that gap is what an execution receipt is for. The &lt;a href="https://github.com/traceseal/traceseal-verify/blob/main/RECEIPT-SPEC.md" rel="noopener noreferrer"&gt;receipt specification&lt;/a&gt; carries a &lt;code&gt;sandbox_profile_hash&lt;/code&gt; field: a SHA-256 hash of the sandbox configuration, meaning the bubblewrap argument list plus the environment. A verifier holding a known-good profile can hash it and check whether the run used that profile or a different one, offline, with &lt;a href="https://pypi.org/project/traceseal-verify/" rel="noopener noreferrer"&gt;one command&lt;/a&gt; and no access to your systems. Combined with the signature over the whole record, an altered profile cannot be presented as the original. For what the signature covers and what an &lt;code&gt;[OK]&lt;/code&gt; means, see &lt;a href="https://traceseal.io/blog/verify-what-an-ai-agent-actually-did/" rel="noopener noreferrer"&gt;the walkthrough&lt;/a&gt; and &lt;a href="https://traceseal.io/blog/signed-execution-receipts-primer/" rel="noopener noreferrer"&gt;the primer on why logs are not evidence&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What that does not do is more interesting, and the specification says so itself rather than leaving a reader to discover it. Among the things a valid receipt does &lt;em&gt;not&lt;/em&gt; prove:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That the sandbox actually enforced the declared profile (the receipt records what the operator &lt;em&gt;claims&lt;/em&gt; the sandbox was; a compromised operator could lie).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Section 6.1 of the same document puts it more bluntly still: the receipt is "an &lt;em&gt;attestation&lt;/em&gt;, not a &lt;em&gt;proof of execution&lt;/em&gt; in the zero-knowledge sense". An operator who never ran bubblewrap at all can sign a receipt naming a profile hash they took from the documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is still open
&lt;/h2&gt;

&lt;p&gt;That last gap does not close by thinking harder about receipt design, and we are not going to pretend a signature solves it. It closes only by moving the seal outside the party being trusted, and each route out has a real cost. A second party can run or observe the sandbox and cosign the record, which works and requires someone willing to be that party. Hardware-rooted attestation can bind the measurement to a chip rather than an assertion, at the price of a much heavier deployment. A third-party execution environment removes the operator's discretion entirely, along with the operator's control of their own infrastructure.&lt;/p&gt;

&lt;p&gt;Which of those becomes normal is going to be settled by procurement departments and insurers rather than by cryptographers, and probably not this year. In the meantime the honest position is that a signed profile hash moves an unverifiable claim to a checkable one and stops short of proof, which is still a considerable distance from a log file nobody can check at all.&lt;/p&gt;

&lt;p&gt;The regulatory direction is at least consistent with the effort. &lt;a href="https://artificialintelligenceact.eu/article/15/" rel="noopener noreferrer"&gt;Article 15&lt;/a&gt; of &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/1689/oj" rel="noopener noreferrer"&gt;Regulation (EU) 2024/1689&lt;/a&gt; requires high-risk systems to be designed for an appropriate level of accuracy, robustness and cybersecurity across their lifecycle. A demonstrable containment boundary is easier to argue than a policy document describing one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions to ask of your own setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Has the profile been run, or only written?&lt;/strong&gt; Try to write outside the workdir and try to reach the network from inside it. Ours resolved DNS through a socket we had not thought about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What sockets came in with the filesystem?&lt;/strong&gt; Enumerate what is under &lt;code&gt;/run&lt;/code&gt; and &lt;code&gt;/var/run&lt;/code&gt; in the mount. Each one is a channel your network namespace does not cover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is in the environment?&lt;/strong&gt; If you have not used &lt;code&gt;--clearenv&lt;/code&gt;, every secret in the parent shell is inside the sandbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are policy denials logged separately from task failures?&lt;/strong&gt; If not, you cannot tell a blocked agent from a confused one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can anyone outside your team check which profile ran?&lt;/strong&gt; If the answer is that you would tell them, that is a description, not a record.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The receipt format, the verifier and the &lt;a href="https://log.traceseal.io" rel="noopener noreferrer"&gt;transparency log&lt;/a&gt; are open. You can adopt the format without adopting us.&lt;/p&gt;

</description>
      <category>security</category>
      <category>linux</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>Alibi: grade coding agents on what actually happened on disk</title>
      <dc:creator>Ventse</dc:creator>
      <pubDate>Thu, 30 Jul 2026 08:36:27 +0000</pubDate>
      <link>https://dev.to/traceseal/alibi-grade-coding-agents-on-what-actually-happened-on-disk-4lan</link>
      <guid>https://dev.to/traceseal/alibi-grade-coding-agents-on-what-actually-happened-on-disk-4lan</guid>
      <description>&lt;p&gt;Ask a coding agent whether it finished the job and it will usually say yes. The closing summary may be fluent, itemised and confident. None of that proves what happened.&lt;/p&gt;

&lt;p&gt;We have written before about why &lt;a href="https://traceseal.io/blog/signed-execution-receipts-primer/" rel="noopener noreferrer"&gt;logs are not evidence&lt;/a&gt;: a record produced by the system it describes inherits that system's honesty. An agent's account of its own run has the same defect one layer up.&lt;/p&gt;

&lt;p&gt;So we built &lt;a href="https://github.com/Traceseal/alibi" rel="noopener noreferrer"&gt;Alibi&lt;/a&gt;, an MIT-licensed harness that ignores the account entirely. Alibi runs the same missions through agentic CLIs and grades each run against ground truth on disk: the files that exist and the changes that were made. It never grades what the agent says it did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The grading rule
&lt;/h2&gt;

&lt;p&gt;Each configured CLI, currently Claude Code and OpenAI Codex, receives an identical mission brief inside its own &lt;a href="https://github.com/containers/bubblewrap" rel="noopener noreferrer"&gt;bubblewrap sandbox&lt;/a&gt;. Each lane gets a private working tree, an isolated home and an isolated &lt;code&gt;/tmp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When the process exits, Alibi inspects the tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the requested file exist?&lt;/li&gt;
&lt;li&gt;Does it contain what the mission required?&lt;/li&gt;
&lt;li&gt;Did the specified tests pass?&lt;/li&gt;
&lt;li&gt;Did anything change outside the permitted area?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent's exit message is not consulted. A mission passes if the disk says it passed.&lt;/p&gt;

&lt;p&gt;The sandbox also makes containment measurable. A write outside the allowed tree is a recorded violation, not a judgement about style. Alibi retains the working directory, sandbox home, temporary files and logs after the run, so someone can derive the grade again and dispute it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Alibi refuses to claim
&lt;/h2&gt;

&lt;p&gt;Alibi is not a leaderboard. The mission set is small and the runs happened on our machines. A handful of missions is a probe, not a census, so we are not publishing rankings from it.&lt;/p&gt;

&lt;p&gt;It also says nothing about consent behaviour. Lanes run with approvals granted by design because the object of study is execution, not permission seeking. How a CLI behaves when it has to ask first is a separate question.&lt;/p&gt;

&lt;p&gt;The grades remain Alibi's judgement. Every assertion is ordinary code in the mission definition. You can read a check, run it again and dispute it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The grader cannot be trusted either
&lt;/h2&gt;

&lt;p&gt;A grading harness has the same structural problem as the agents it grades: it produces the record of its own run. If our scores mattered to anyone, we could quietly edit them.&lt;/p&gt;

&lt;p&gt;Alibi now supports signed Traceseal receipts. Point one environment variable at an Ed25519 key and each CLI and mission result is sealed into a receipt containing hashes of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the mission definition&lt;/li&gt;
&lt;li&gt;the result record&lt;/li&gt;
&lt;li&gt;the retained evidence tree&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A run-level receipt chains those results into one verifiable unit. Signing happens on the host after the contained processes exit, and the key is never mounted inside the sandbox.&lt;/p&gt;

&lt;p&gt;A second party can act as a witness. The witness tool derives every hash again from the retained evidence, checks each signature and the chain, and cosigns only if everything matches. It refuses to cosign with the original signer's key.&lt;/p&gt;

&lt;p&gt;There is an important limit. Two keys on one machine prove key separation, not operator separation. Full independence requires the witness to verify on hardware the original signer cannot write to.&lt;/p&gt;

&lt;p&gt;The signature means "this run occurred as described." The scores remain Alibi's judgement. Signing makes them tamper-evident, not true.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to ask of any agent benchmark
&lt;/h2&gt;

&lt;p&gt;First, what record was it graded against? If the answer is the agent's final message, the benchmark measured prose.&lt;/p&gt;

&lt;p&gt;Second, could the operator rewrite the results afterwards? A results table in a repository the grader controls is still a log.&lt;/p&gt;

&lt;p&gt;Third, can you run it yourself? The missions, assertions and harness should be readable and executable without the author's cooperation.&lt;/p&gt;

&lt;p&gt;Finally, what was the consent model? Auto-approved runs measure capability. They do not measure conduct, and a result that blurs the two flatters everyone.&lt;/p&gt;

&lt;p&gt;Alibi is our attempt to answer those questions cleanly for our own testing. Whether its missions generalise beyond the behaviours we care about remains open. The repository is small enough to read in an afternoon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Traceseal/alibi" rel="noopener noreferrer"&gt;Read the missions, dispute the assertions and grade your own agent on GitHub.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>security</category>
    </item>
    <item>
      <title>Signed execution receipts: a primer on why logs are not evidence</title>
      <dc:creator>Ventse</dc:creator>
      <pubDate>Tue, 28 Jul 2026 08:47:31 +0000</pubDate>
      <link>https://dev.to/traceseal/signed-execution-receipts-a-primer-on-why-logs-are-not-evidence-2dfg</link>
      <guid>https://dev.to/traceseal/signed-execution-receipts-a-primer-on-why-logs-are-not-evidence-2dfg</guid>
      <description>&lt;p&gt;Every team running AI agents keeps logs. Almost none of them can answer the question that actually gets asked in a dispute: &lt;strong&gt;why should anyone believe them?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A log is a record your system keeps about itself. It is useful for debugging, indispensable for operations, and — on its own — close to worthless as proof. This is a primer on the difference, and on what a signed execution receipt adds that a log cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What evidence actually demands
&lt;/h2&gt;

&lt;p&gt;Strip away the legal vocabulary and a record has to satisfy four things before a sceptical outsider should rely on it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrity.&lt;/strong&gt; It has not been altered since it was created — and if it has, that fact is detectable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribution.&lt;/strong&gt; Someone specific is on the hook for it. A record nobody vouched for commits nobody.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completeness.&lt;/strong&gt; You are seeing the whole set, not a selection made after the fact by an interested party.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independence.&lt;/strong&gt; The check can be performed by the doubter, without the cooperation of the party being doubted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that &lt;em&gt;admissibility&lt;/em&gt; is a much lower bar than any of this. English civil procedure will receive a business record in evidence without requiring a witness to speak to it (&lt;a href="https://www.legislation.gov.uk/ukpga/1995/38/section/9" rel="noopener noreferrer"&gt;Civil Evidence Act 1995, s.9&lt;/a&gt;). Getting a log in front of a tribunal is easy. What the tribunal then decides it is &lt;em&gt;worth&lt;/em&gt; is the entire question, and that is where ordinary logging collapses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where logs fail, property by property
&lt;/h2&gt;

&lt;p&gt;An application log fails all four, and it fails them structurally rather than through bad implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrity:&lt;/strong&gt; the log is a mutable file on infrastructure the operator controls. Anyone with disk or database access can rewrite history and leave no trace in the artefact itself. This is not a novel observation — computer-security guidance has said for two decades that log data requires explicit protection precisely because it is alterable by whoever holds the system (&lt;a href="https://csrc.nist.gov/pubs/sp/800/92/final" rel="noopener noreferrer"&gt;NIST SP 800-92&lt;/a&gt;), and the federal control catalogue carries a dedicated control, AU-9 &lt;em&gt;Protection of Audit Information&lt;/em&gt;, for exactly this problem (&lt;a href="https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final" rel="noopener noreferrer"&gt;NIST SP 800-53 Rev. 5&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribution:&lt;/strong&gt; the agent writes the log describing the agent. The witness and the accused are the same process. A misbehaving or compromised agent writes a clean log by construction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completeness:&lt;/strong&gt; what reaches an auditor is a filtered export — a date range, a grep, a dashboard screenshot. The absence of an entry is indistinguishable from an entry that was never emitted, dropped under load, or removed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independence:&lt;/strong&gt; verification means asking the operator for the file and believing what arrives. That is not verification; it is a courtesy.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The structural problem: a log asks the reader to trust the writer. No amount of log quality fixes that, because the defect is in the direction of trust, not in the contents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The partial fixes, and where each one stops
&lt;/h2&gt;

&lt;p&gt;The industry has good, real answers to pieces of this. It is worth being precise about what each one buys, because teams routinely believe they have solved evidence when they have solved storage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Centralised logging / SIEM.&lt;/strong&gt; Moves the log off the machine that produced it, so a single compromised host cannot quietly rewrite it. Real improvement. But the collector is still operator infrastructure, so integrity now rests on the operator's word about the collector instead of about the host.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Append-only and WORM storage.&lt;/strong&gt; Prevents edits at the storage layer. Also a real improvement — and enforced by a policy the operator configures, can reconfigure, and is asking you to take on trust. It constrains the operator; it does not let an outsider check anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hash chaining.&lt;/strong&gt; Each entry commits to the hash of the previous one, so removing or editing an entry breaks the chain — the idea behind digital timestamping since &lt;a href="https://link.springer.com/article/10.1007/BF00196791" rel="noopener noreferrer"&gt;Haber and Stornetta (1991)&lt;/a&gt;. This is genuinely strong, and it is why Traceseal keeps a hash-chained audit log underneath the receipts. Its limit: a chain proves &lt;em&gt;internal consistency&lt;/em&gt;. Whoever holds the chain can rebuild it end to end and present a perfectly consistent alternative history, unless the chain is anchored to something outside their control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trusted timestamps and transparency logs.&lt;/strong&gt; The anchoring step. An &lt;a href="https://www.rfc-editor.org/rfc/rfc3161" rel="noopener noreferrer"&gt;RFC 3161&lt;/a&gt; timestamp binds data to a time via a third party; a Merkle-tree transparency log in the &lt;a href="https://www.rfc-editor.org/rfc/rfc9162" rel="noopener noreferrer"&gt;RFC 9162&lt;/a&gt; style makes it cryptographically awkward to show two different histories to two different observers. This is the piece that closes the "rebuild the chain" gap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read that list in order and a pattern emerges: each step moves a claim from "trust the operator's process" towards "check the maths yourself". A signed receipt is simply the end of that road, packaged so a single file carries the whole argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the signature adds
&lt;/h2&gt;

&lt;p&gt;An execution receipt is a self-contained JSON document recording one execution: which signed code ran, what it consumed and produced (as SHA-256 hashes, per &lt;a href="https://csrc.nist.gov/pubs/fips/180-4/upd1/final" rel="noopener noreferrer"&gt;FIPS 180-4&lt;/a&gt;, so the record proves integrity without exposing the data), the sandbox policy it ran under, and an Ed25519 signature (&lt;a href="https://www.rfc-editor.org/rfc/rfc8032" rel="noopener noreferrer"&gt;RFC 8032&lt;/a&gt;) over the lot.&lt;/p&gt;

&lt;p&gt;Three design choices do the actual work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The signature covers a canonical encoding.&lt;/strong&gt; Keys sorted at every level, no whitespace, no booleans or nulls — so a given receipt has exactly one valid byte sequence. There is no room for a semantically identical but differently-encoded document to pass. Any edit anywhere breaks verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The public key travels inside the receipt.&lt;/strong&gt; Verification is offline and self-contained: no key server, no API call, no account, no request to the operator. The doubter is not dependent on the doubted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashes, not contents.&lt;/strong&gt; Because inputs and outputs appear only as hashes, a receipt can be published without leaking the data it describes — and anyone holding the original data can recompute the hash and confirm the match.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set against the four properties: integrity comes from the canonical signature, attribution from the operator key that signed it, independence from offline verification, and completeness from anchoring the record in a &lt;a href="https://log.traceseal.io" rel="noopener noreferrer"&gt;public transparency log&lt;/a&gt;. That last one is worth stating plainly, because it is the property most evidence schemes quietly skip.&lt;/p&gt;

&lt;p&gt;The format is fully specified — the &lt;a href="https://github.com/traceseal/traceseal-verify/blob/main/RECEIPT-SPEC.md" rel="noopener noreferrer"&gt;receipt specification&lt;/a&gt; is written so that a developer can implement a verifier in any language without touching our code, and the reference verifier is &lt;a href="https://pypi.org/project/traceseal-verify/" rel="noopener noreferrer"&gt;on PyPI&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;traceseal-verify
&lt;span class="nv"&gt;$ &lt;/span&gt;traceseal-verify receipt.json
&lt;span class="o"&gt;[&lt;/span&gt;OK] receipt.json — operator signature verified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a field-by-field walkthrough of a real receipt and what an &lt;code&gt;[OK]&lt;/code&gt; does and does not prove, see &lt;a href="https://traceseal.io/blog/verify-what-an-ai-agent-actually-did/" rel="noopener noreferrer"&gt;how to verify what an AI agent actually did&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is becoming a compliance question
&lt;/h2&gt;

&lt;p&gt;The EU AI Act already distinguishes keeping records from being able to stand behind them. &lt;a href="https://artificialintelligenceact.eu/article/12/" rel="noopener noreferrer"&gt;Article 12&lt;/a&gt; of &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/1689/oj" rel="noopener noreferrer"&gt;Regulation (EU) 2024/1689&lt;/a&gt; requires high-risk systems to allow the automatic recording of events over their lifetime, to a standard appropriate for traceability. &lt;a href="https://artificialintelligenceact.eu/article/19/" rel="noopener noreferrer"&gt;Article 19&lt;/a&gt; requires providers to keep those automatically generated logs where they are under their control. The obligation is to produce a record that supports traceability — and a record that the producing party can silently rewrite supports it only as far as that party's credibility extends.&lt;/p&gt;

&lt;p&gt;Nothing in the regulation mandates cryptographic receipts. But when the moment comes to demonstrate traceability to a regulator, an enterprise customer or an insurer, the difference between a log export and a signed receipt is the difference between asking to be believed and inviting a check.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to ask of your own stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If an insider altered our records, how would we know?&lt;/strong&gt; If the answer relies on that insider's access being correctly restricted, you have a control, not evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can an outsider verify without our help?&lt;/strong&gt; If verification requires you to hand over a file and be believed, the record proves nothing about your good faith to someone who doubts it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the record anchored outside our control?&lt;/strong&gt; Internal consistency is not the same as an unrewritable history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Was it sealed at the time?&lt;/strong&gt; Receipts only cover executions that were instrumented when they ran. Evidence collection that begins when the dispute begins proves nothing about what came before.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://traceseal.io/blog/signed-execution-receipts-primer/" rel="noopener noreferrer"&gt;traceseal.io/blog&lt;/a&gt;. The receipt spec, verifier and transparency log are open — you can adopt the format without adopting us.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>devops</category>
      <category>compliance</category>
    </item>
    <item>
      <title>How to verify what an AI agent actually did</title>
      <dc:creator>Ventse</dc:creator>
      <pubDate>Tue, 21 Jul 2026 08:46:24 +0000</pubDate>
      <link>https://dev.to/traceseal/how-to-verify-what-an-ai-agent-actually-did-251f</link>
      <guid>https://dev.to/traceseal/how-to-verify-what-an-ai-agent-actually-did-251f</guid>
      <description>&lt;p&gt;Your agent says it finished the job. Its log file agrees. Neither of those is evidence: the log was written by the same process it describes, and it can be rewritten afterwards by anyone with disk access. If you need to show a customer, an auditor or a court what an agent did, you need a record that &lt;strong&gt;fails loudly when altered&lt;/strong&gt; and that a stranger can check without trusting you. This is a practical walkthrough of doing exactly that with an open verifier and a signed execution receipt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: install the verifier
&lt;/h2&gt;

&lt;p&gt;The verifier is a small open-source Python package with a published &lt;a href="https://github.com/traceseal/traceseal-verify/blob/main/RECEIPT-SPEC.md" rel="noopener noreferrer"&gt;receipt specification&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;traceseal-verify
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;traceseal-verify receipt.json
&lt;span class="go"&gt;[OK] receipt.json — operator signature verified
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The check runs &lt;strong&gt;offline&lt;/strong&gt;. It needs no account, no API call and no access to the operator's infrastructure — which is the point. Verification that requires the operator's cooperation is not independent verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: read the receipt — the anatomy
&lt;/h2&gt;

&lt;p&gt;A receipt is a single JSON document with three blocks. Here is a real one, abridged:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"attestation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attested_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-15T05:29:04Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operator_fingerprint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ed25519:d8d13a6f..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operator_public_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3ba02728..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"signature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4678a52c..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"execution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"skill_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yoast-seo-audit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"skill_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"inputs_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"sha256:6ac78ba8..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outputs_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:66858bb9..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sandbox_profile_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:e7a3e6b8..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"skill_manifest_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"sha256:79c14974..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exit_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"wall_time_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provenance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"manifest_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:79c14974..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"publisher_fingerprint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ed25519:d8d13a6f..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transparency_log_seq"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"receipt_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each block answers a different question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;provenance&lt;/code&gt; — which code ran.&lt;/strong&gt; The publisher signs a content-addressed manifest: every artefact (the skill definition, its capability declaration, the code itself) is listed by its SHA-256 hash (&lt;a href="https://csrc.nist.gov/pubs/fips/180-4/upd1/final" rel="noopener noreferrer"&gt;FIPS 180-4&lt;/a&gt;). Change one byte of the code and the manifest hash no longer matches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;execution&lt;/code&gt; — what happened.&lt;/strong&gt; Inputs, outputs and the sandbox policy are recorded as hashes of their canonical JSON form. That proves integrity without exposing the data — you can demonstrate the output is unchanged without publishing the output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;attestation&lt;/code&gt; — who vouches for it.&lt;/strong&gt; The operator signs the whole record with an Ed25519 key (&lt;a href="https://www.rfc-editor.org/rfc/rfc8032" rel="noopener noreferrer"&gt;RFC 8032&lt;/a&gt;). The signature covers a canonical JSON encoding — sorted keys, fixed separators — so there is exactly one valid byte sequence for a given receipt. Any edit anywhere breaks the seal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: understand what the check proves
&lt;/h2&gt;

&lt;p&gt;When &lt;code&gt;traceseal-verify&lt;/code&gt; prints &lt;code&gt;[OK]&lt;/code&gt;, four things have been established:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The receipt is byte-for-byte what the operator signed — nothing was edited afterwards, by the agent, the operator's tooling, or anyone who handled the file since.&lt;/li&gt;
&lt;li&gt;The code that ran is exactly the code the publisher signed, down to the hash of each file.&lt;/li&gt;
&lt;li&gt;The recorded inputs, outputs and sandbox policy are the ones present at execution time — anything you are later shown can be checked against the hashes.&lt;/li&gt;
&lt;li&gt;The signing key is identified by fingerprint, so repeated receipts from the same operator are linkable, and the receipt can be anchored in a &lt;a href="https://log.traceseal.io" rel="noopener noreferrer"&gt;public transparency log&lt;/a&gt; (the &lt;code&gt;transparency_log_seq&lt;/code&gt; field), which prevents the operator quietly maintaining two versions of history.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What a receipt does not prove
&lt;/h2&gt;

&lt;p&gt;Honest tools state their limits, and this matters if you ever rely on a receipt in a dispute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It does not prove the work was good.&lt;/strong&gt; A receipt proves what ran and what it produced — not that the output was correct. Checking outcomes against ground truth is a separate, complementary verification step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It does not prove events it never covered.&lt;/strong&gt; A receipt seals one execution. Actions taken outside sealed executions are simply absent — which is why instrumentation has to start before the incident, not after.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It binds a key, not a person.&lt;/strong&gt; The signature proves the holder of the operator key vouched for the record. Tying that key to a legal identity is a key-management question, the same as with any signing scheme.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The trust inversion:&lt;/strong&gt; with logs, the burden is on the reader to trust the writer. With signed receipts, the burden is on the record to survive verification. That is the difference between "our system says it behaved" and "check it yourself".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why this beats screenshots and log exports
&lt;/h2&gt;

&lt;p&gt;The evidence teams typically produce today — screenshots, log exports, dashboard PDFs — shares one flaw: it is all produced by, or under the control of, the party whose behaviour is in question. Computer-security guidance on log management has warned for years that logs require protection precisely because they are alterable by whoever controls the system (&lt;a href="https://csrc.nist.gov/pubs/sp/800/92/final" rel="noopener noreferrer"&gt;NIST SP 800-92&lt;/a&gt;). A detached signature over a canonical record removes the alterability, and an open verifier removes the need to take anyone's word for it.&lt;/p&gt;

&lt;p&gt;Everything shown here is open: the &lt;a href="https://github.com/traceseal/traceseal-verify/blob/main/RECEIPT-SPEC.md" rel="noopener noreferrer"&gt;receipt spec&lt;/a&gt;, the &lt;a href="https://pypi.org/project/traceseal-verify/" rel="noopener noreferrer"&gt;verifier on PyPI&lt;/a&gt;, and the &lt;a href="https://log.traceseal.io" rel="noopener noreferrer"&gt;transparency log&lt;/a&gt;. You can implement the format yourself; the spec even includes a reference canonical-JSON encoder.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://traceseal.io/blog/verify-what-an-ai-agent-actually-did/" rel="noopener noreferrer"&gt;traceseal.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>agents</category>
      <category>devops</category>
    </item>
    <item>
      <title>EU AI Act Article 50: what it means for teams running AI agents</title>
      <dc:creator>Ventse</dc:creator>
      <pubDate>Sun, 19 Jul 2026 10:14:59 +0000</pubDate>
      <link>https://dev.to/traceseal/eu-ai-act-article-50-what-it-means-for-teams-running-ai-agents-p28</link>
      <guid>https://dev.to/traceseal/eu-ai-act-article-50-what-it-means-for-teams-running-ai-agents-p28</guid>
      <description>&lt;p&gt;On 2 August 2026 the transparency obligations in Article 50 of the EU AI Act (Regulation (EU) 2024/1689) became applicable. I run agents daily and I build tooling for them, so I have spent more time inside this article of the Act than is probably healthy. The short version: if your organisation deploys AI systems that interact with people or produce content, this now applies to you. Agents do both. And it applies wherever the system's output is used in the EU, so "we're not an EU company" is not the exit it sounds like.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Article 50 actually requires
&lt;/h2&gt;

&lt;p&gt;Four duties, in practical terms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;People must know they are interacting with an AI system, unless it is obvious from context.&lt;/li&gt;
&lt;li&gt;Systems that generate text, audio, image or video must mark outputs as artificially generated, in a machine-readable form "where technically feasible". That quoted phrase carries a lot of weight, and I have not seen a settled answer on what it means for plain text.&lt;/li&gt;
&lt;li&gt;Organisations deploying emotion recognition, biometric categorisation or deepfake-style generated content must inform the people affected.&lt;/li&gt;
&lt;li&gt;AI-generated text published to inform the public on matters of public interest must be disclosed as such, unless a human took editorial responsibility for it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Penalties for non-compliance run up to €15 million or 3% of worldwide annual turnover, whichever is higher (Article 99(4)).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why agents are the hard case
&lt;/h2&gt;

&lt;p&gt;For a chat window, disclosure is a banner. Done.&lt;/p&gt;

&lt;p&gt;An agent plans, calls tools, edits files, sends messages and commits code. The transparency question stops being "did we tell the user it's AI?" and becomes "can we show what the system actually did?" Those are very different engineering problems.&lt;/p&gt;

&lt;p&gt;The uncomfortable part is that the standard answer, application logs, proves nothing to anyone outside your organisation. Logs are written by the same system they describe. They can be edited after the fact. When an agent's action is challenged (a wrong transaction, a leaked file, a published article), "our logs say it behaved" is an assertion, not evidence. A regulator, an auditor or a journalist has no reason to take your word for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the record verifiable instead of trusted
&lt;/h2&gt;

&lt;p&gt;The approach we took with Traceseal is to make the execution record tamper-evident and checkable by a third party:&lt;/p&gt;

&lt;p&gt;The publisher signs the agent skill with an ed25519 key over a content-addressed manifest, so it is provable which code ran. The operator runs it in a kernel-namespace sandbox and signs a record of inputs, outputs, timing and sandbox policy. The record stores SHA-256 hashes rather than the data itself, so it proves integrity without exposing anything sensitive.&lt;/p&gt;

&lt;p&gt;Anyone can then check the receipt offline, with no access to the operator's systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;traceseal-verify
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;traceseal-verify receipt.json
&lt;span class="go"&gt;[OK] receipt.json — operator signature verified
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The receipt is canonical JSON under a signature, so any tampering breaks the seal, whether it comes from the agent, the operator or someone downstream.&lt;/p&gt;

&lt;p&gt;An honest limitation: a receipt only covers executions that were sealed at the time. If you start keeping records after a dispute begins, you have proof of nothing that came before. That cuts both ways. It is an argument for instrumenting now, and it is also a real gap if you are hoping to retrofit compliance onto last quarter's agent runs. You cannot.&lt;/p&gt;

&lt;p&gt;I also do not know yet how regulators will weigh a signed receipt against an ordinary log file when the first Article 50 disputes actually land. The Act sets out the duties. Enforcement practice will be written by cases that have not happened. My bet is that "check it yourself" evidence beats "trust me" evidence in front of any tribunal, but it is a bet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before your next agent ships
&lt;/h2&gt;

&lt;p&gt;Inventory your agents: anything that talks to people or generates content is in scope for at least one of the four duties. Then decide what your evidence standard is. Screenshots and logs are trust-me evidence. Signed receipts are check-it-yourself evidence.&lt;/p&gt;

&lt;p&gt;The receipt format, the verifier and the transparency log are open: the spec, the verifier on PyPI, and the public log are all at &lt;a href="https://traceseal.io/" rel="noopener noreferrer"&gt;traceseal.io&lt;/a&gt;. You can adopt the format without adopting us.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>compliance</category>
      <category>agents</category>
      <category>eu</category>
    </item>
    <item>
      <title>Proving What Your AI Agent Did: Introducing Traceseal</title>
      <dc:creator>Ventse</dc:creator>
      <pubDate>Thu, 16 Apr 2026 14:01:09 +0000</pubDate>
      <link>https://dev.to/traceseal/proving-what-your-ai-agent-did-introducing-traceseal-5bpn</link>
      <guid>https://dev.to/traceseal/proving-what-your-ai-agent-did-introducing-traceseal-5bpn</guid>
      <description>&lt;p&gt;Every AI agent framework can make agents do things. None of them&lt;br&gt;
can prove what the agent did.&lt;/p&gt;

&lt;p&gt;When a client asks "was your AI agent running authorized code when&lt;br&gt;
it published that article?" the answer today is "trust me." When a&lt;br&gt;
regulator asks "what capabilities did the automated system have?"&lt;br&gt;
the answer is "trust me." When something goes wrong and someone&lt;br&gt;
asks "what exactly happened?" the answer is still "trust me."&lt;/p&gt;

&lt;p&gt;We built Traceseal to replace "trust me" with math.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Traceseal does
&lt;/h2&gt;

&lt;p&gt;Traceseal produces an Execution Receipt — a signed JSON document&lt;br&gt;
that proves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What code ran (manifest hash over every source file)&lt;/li&gt;
&lt;li&gt;Who authorized it (publisher's ed25519 signature)&lt;/li&gt;
&lt;li&gt;What sandbox it ran in (hash of the kernel-namespace configuration)&lt;/li&gt;
&lt;li&gt;What it produced (SHA-256 of inputs and outputs)&lt;/li&gt;
&lt;li&gt;Who vouches for it (operator's ed25519 signature over all of the above)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A third party verifies the receipt with one command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install traceseal-verify
traceseal-verify receipt.json

[OK] receipt.json
  skill:     agentmail v1.2.0
  operator:  ed25519:f19bc125...
  publisher: ed25519:a07c7eb5...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;No access to the operator's machine. No trust assumptions. Just math.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;8 weeks. 217 tests. 27-entry audit chain on real Debian 13 hardware.&lt;br&gt;
Three signed production skills with verified receipts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A multi-entry-point skill bundle&lt;/strong&gt; — signed, sandboxed with&lt;br&gt;
kernel-namespace isolation, receipt verified by a third party. 116ms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A real production skill with SDK dependencies&lt;/strong&gt; — the agentmail&lt;br&gt;
SDK was mounted read-only into the sandbox. The execution failed&lt;br&gt;
(bad API key) and the receipt honestly records the failure.&lt;br&gt;
The system doesn't hide bad outcomes — it seals them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A web scraping skill&lt;/strong&gt; — signed, sandboxed, 47ms, receipt verified.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The full pipeline — sign, sandbox, execute, receipt, verify — runs&lt;br&gt;
in under 200ms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;AI agents are moving from demos to production. When they get there,&lt;br&gt;
someone will ask for proof. Proof that the code was authorized.&lt;br&gt;
Proof that the sandbox was real. Proof that the outputs weren't&lt;br&gt;
tampered with. Proof that a third party can check independently.&lt;/p&gt;

&lt;p&gt;Every other trust system in the AI agent space offers dashboards,&lt;br&gt;
not proofs. They log what happened. We seal it. The difference:&lt;br&gt;
a log says "the operator claims this happened." A receipt says&lt;br&gt;
"anyone can independently verify this happened."&lt;/p&gt;

&lt;h2&gt;
  
  
  Open spec, open verifier
&lt;/h2&gt;

&lt;p&gt;The Execution Receipt Specification is Apache 2.0:&lt;br&gt;
→ &lt;a href="https://traceseal.io/spec" rel="noopener noreferrer"&gt;RECEIPT-SPEC.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The standalone verifier is Apache 2.0:&lt;br&gt;
→ pip install traceseal-verify&lt;br&gt;
→ &lt;a href="https://github.com/traceseal/traceseal-verify" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The transparency log is live:&lt;br&gt;
→ &lt;a href="https://log.traceseal.io" rel="noopener noreferrer"&gt;log.traceseal.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone can verify receipts. Anyone can implement the spec.&lt;br&gt;
The hard part — signing, sandboxing, audit logging, the full stack&lt;br&gt;
that generates receipts worth verifying — is Traceseal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Traceseal currently produces receipts for skill execution. We're&lt;br&gt;
extending the receipt format to cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model call receipts&lt;/strong&gt; — prove which model processed your data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration receipts&lt;/strong&gt; — prove a multi-step workflow
executed in order with declared inputs at each step&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data flow receipts&lt;/strong&gt; — prove what data was sent where&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same format. Same verifier. Same transparency log.&lt;/p&gt;

&lt;p&gt;The goal: a cryptographic audit trail for every action your AI agent&lt;br&gt;
takes, verifiable by anyone, without trusting the operator's machine.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://traceseal.io" rel="noopener noreferrer"&gt;traceseal.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devops</category>
      <category>security</category>
    </item>
  </channel>
</rss>
