<?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: Zentropy Labs</title>
    <description>The latest articles on DEV Community by Zentropy Labs (zentropylabs).</description>
    <link>https://dev.to/zentropylabs</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%2Forganization%2Fprofile_image%2F14049%2Fde309218-d0f9-41f4-9b37-4fe31130719b.png</url>
      <title>DEV Community: Zentropy Labs</title>
      <link>https://dev.to/zentropylabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zentropylabs"/>
    <language>en</language>
    <item>
      <title>The failed install was part of the evidence: reproducing an agent-action receipt</title>
      <dc:creator>Zain Dana Harper</dc:creator>
      <pubDate>Fri, 17 Jul 2026 10:09:37 +0000</pubDate>
      <link>https://dev.to/zentropylabs/the-failed-install-was-part-of-the-evidence-reproducing-an-agent-action-receipt-hh1</link>
      <guid>https://dev.to/zentropylabs/the-failed-install-was-part-of-the-evidence-reproducing-an-agent-action-receipt-hh1</guid>
      <description>&lt;p&gt;A reproducibility report gets weaker when it records only the green ending.&lt;/p&gt;

&lt;p&gt;Today I evaluated PermitReceipt &lt;code&gt;v2.2.6-public-eval&lt;/code&gt;, an evaluation-only release for agent-authorization receipts, in a fresh Windows 11 and CPython 3.12 reviewer environment. The useful result was not just that the final checks passed. The documented portable install path failed first.&lt;/p&gt;

&lt;p&gt;That failure belongs in the evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bounded question
&lt;/h2&gt;

&lt;p&gt;Could a fresh, unaffiliated reviewer verify the release artifacts and run the documented reviewer path without relying on hidden environment state?&lt;/p&gt;

&lt;p&gt;This was a narrow reproducibility test. It was not a production-readiness audit, an IETF review, or a claim that the receipt proves an agent action was authorized correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What verified before installation
&lt;/h2&gt;

&lt;p&gt;The release ZIP had this SHA-256 digest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e5c40eca74fe2f451a0723db915c64b201e1d52f382cee24062e4dfc61fc632f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The archive scan found 261 entries and zero unsafe paths. The release digest and artifact sidecars verified before package installation.&lt;/p&gt;

&lt;p&gt;That distinction matters. Artifact integrity, package installability, and behavioral verification are separate claims. One passing result should not silently stand in for the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first failure
&lt;/h2&gt;

&lt;p&gt;Inside the fresh virtual environment, the documented portable path included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-build-isolation&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--no-deps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It failed with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BackendUnavailable: Cannot import 'setuptools.build_meta'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--no-build-isolation&lt;/code&gt; tells pip to use build tooling already present in the environment. The fresh reviewer environment did not contain the expected backend, so the supposedly portable path depended on setup state that the command did not establish.&lt;/p&gt;

&lt;p&gt;This is a small packaging defect, but it is exactly the kind of detail that disappears when a report records only the final green state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal recovery and downstream result
&lt;/h2&gt;

&lt;p&gt;Installing the pinned build backends was enough to recover:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;&lt;span class="nv"&gt;setuptools&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;83.0.0 &lt;span class="nv"&gt;wheel&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;0.47.0
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-build-isolation&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--no-deps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that recovery, the downstream reviewer suites reported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IETF-format review packet: 20 of 20 passed&lt;/li&gt;
&lt;li&gt;Independent recomputation: 17 of 17 passed&lt;/li&gt;
&lt;li&gt;Independent cryptographic verification: 19 of 19 passed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those suite names come from the release materials. Passing them does not imply IETF endorsement, external certification, or production readiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the receipt should preserve
&lt;/h2&gt;

&lt;p&gt;A useful run receipt needs enough structure to explain both the failure and the recovery. In this case, the minimum record looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v2.2.6-public-eval&lt;/span&gt;
  &lt;span class="na"&gt;sha256&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;e5c40eca74fe2f451a0723db915c64b201e1d52f382cee24062e4dfc61fc632f&lt;/span&gt;
&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Windows &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;
  &lt;span class="na"&gt;python&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CPython &lt;/span&gt;&lt;span class="m"&gt;3.12&lt;/span&gt;
&lt;span class="na"&gt;attempt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python -m pip install --no-build-isolation -e . --no-deps&lt;/span&gt;
  &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;failed&lt;/span&gt;
  &lt;span class="na"&gt;error_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BackendUnavailable&lt;/span&gt;
  &lt;span class="na"&gt;missing_backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setuptools.build_meta&lt;/span&gt;
&lt;span class="na"&gt;recovery&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setuptools==83.0.0&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;wheel==0.47.0&lt;/span&gt;
  &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install_succeeded&lt;/span&gt;
&lt;span class="na"&gt;verification&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;review_packet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;20/20&lt;/span&gt;
  &lt;span class="na"&gt;recomputation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;17/17&lt;/span&gt;
  &lt;span class="na"&gt;crypto&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;19/19&lt;/span&gt;
&lt;span class="na"&gt;non_claims&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;not an IETF endorsement&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;not a production-readiness determination&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;not proof that every agent action was correctly authorized&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact schema can vary. The important property is that a later reviewer can distinguish what happened from what was inferred.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five practical lessons
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Preserve the failed command. A recovery does not erase the original portability defect.&lt;/li&gt;
&lt;li&gt;Separate integrity, installability, and behavior. They are different verification layers.&lt;/li&gt;
&lt;li&gt;Pin build backends when using &lt;code&gt;--no-build-isolation&lt;/code&gt;, or use build isolation so the backend is established mechanically.&lt;/li&gt;
&lt;li&gt;Treat limitations as first-class fields. A receipt should say what it does not prove.&lt;/li&gt;
&lt;li&gt;Publish the reproduction path. A claim becomes more useful when another person can inspect the commands and challenge the conclusion.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Public reproduction
&lt;/h2&gt;

&lt;p&gt;I reported the exact bounded outcome, including the failed install and minimal recovery, in the public repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/meridianverity/permit-receipt/issues/1" rel="noopener noreferrer"&gt;https://github.com/meridianverity/permit-receipt/issues/1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you maintain an agent, MCP, evaluation, or workflow tool and have a public, credential-free fixture, I am interested in running one similarly bounded case and publishing the raw result, including a negative result when that is what the evidence shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;I maintain the evidence tooling behind Project Telos at Zentropy Labs. I do not maintain PermitReceipt. The tested release is evaluation-only. I used an AI assistant to help structure and proofread this article. The commands, hashes, counts, links, and limitations were rechecked against the recorded run before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>security</category>
      <category>python</category>
    </item>
  </channel>
</rss>
