<?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: Brian Jin</title>
    <description>The latest articles on DEV Community by Brian Jin (@kikashy).</description>
    <link>https://dev.to/kikashy</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%2F4064884%2Fd01cffb8-2417-464c-8002-d70dea685aca.png</url>
      <title>DEV Community: Brian Jin</title>
      <link>https://dev.to/kikashy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kikashy"/>
    <language>en</language>
    <item>
      <title>I stopped printing the thresholds in the policy. The AI wrote the same tests anyway.</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Wed, 12 Aug 2026 16:05:36 +0000</pubDate>
      <link>https://dev.to/kikashy/i-stopped-printing-the-thresholds-in-the-policy-the-ai-wrote-the-same-tests-anyway-33ah</link>
      <guid>https://dev.to/kikashy/i-stopped-printing-the-thresholds-in-the-policy-the-ai-wrote-the-same-tests-anyway-33ah</guid>
      <description>&lt;p&gt;Last week I wrote about an experiment where I asked an AI to author tests for the same policy 50 times.&lt;/p&gt;

&lt;p&gt;Across 49 valid runs, every run covered all six boundary classes we had defined.&lt;/p&gt;

&lt;p&gt;What bothered me afterward was not the coverage number.&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;where the generated values were landing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The policy had two important thresholds: 40 and 70. The generated tests crowded around them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;39.99
39.999
40
69.99
70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Out of 784 accepted test records, &lt;strong&gt;410 sat exactly on an edge or within 0.01 of one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first I had a simple explanation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maybe the model wasn't really discovering the test surface. Maybe it was seeing the numbers in the policy and decorating them with boundary cases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That explanation sounded plausible.&lt;/p&gt;

&lt;p&gt;So I designed an experiment that could prove it wrong.&lt;/p&gt;

&lt;p&gt;It did.&lt;/p&gt;

&lt;p&gt;And then, while checking the write-up, I found that my explanation of the new experiment was wrong in several places too.&lt;/p&gt;

&lt;p&gt;That second failure may be the more useful result.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, an important correction to the original experiment
&lt;/h2&gt;

&lt;p&gt;The authoring prompt explicitly asked for borderline cases.&lt;/p&gt;

&lt;p&gt;It told the model to exercise every clause and include the borderline cases a careful clerk would have noticed.&lt;/p&gt;

&lt;p&gt;So the fact that the tests concentrated near thresholds was never evidence, by itself, that the model had independently discovered something clever.&lt;/p&gt;

&lt;p&gt;The more interesting question was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which boundaries can it find, and what happens when I change how those boundaries are represented?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The original distribution was strikingly concentrated.&lt;/p&gt;

&lt;p&gt;Values were not smoothly spread around 40 and 70. They were welded to them.&lt;/p&gt;

&lt;p&gt;Across the whole corpus, only &lt;strong&gt;four records&lt;/strong&gt; landed between 0.01 and 1.0 away from an edge.&lt;/p&gt;

&lt;p&gt;I also looked at another reference point: 39.&lt;/p&gt;

&lt;p&gt;The policy never prints &lt;code&gt;39&lt;/code&gt;, but one of the six registered classes begins there. Records did land exactly on 39, which is not surprising given the class definition.&lt;/p&gt;

&lt;p&gt;What was almost missing was the space immediately below it.&lt;/p&gt;

&lt;p&gt;That made the original explanation worth testing.&lt;/p&gt;

&lt;p&gt;Copying a visible threshold and reasoning about the semantics around that threshold can produce very similar-looking tests.&lt;/p&gt;

&lt;p&gt;To separate them, I needed to change the representation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comments that turned this into another experiment
&lt;/h2&gt;

&lt;p&gt;After the first post, people pushed on the interpretation rather than the headline.&lt;/p&gt;

&lt;p&gt;One suggestion was to rewrite and reorder the policy while preserving its meaning, then see whether the generated test surface stayed the same.&lt;/p&gt;

&lt;p&gt;Another observation was that repeated generation may profile the &lt;strong&gt;policy text&lt;/strong&gt; as much as it profiles the model.&lt;/p&gt;

&lt;p&gt;A third line of questioning was about measurement itself: if there were an off-by-one error at 70, would a coverage metric like "6 of 6 classes covered" even expose it?&lt;/p&gt;

&lt;p&gt;Those comments changed the experiment.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the model generate all the boundary classes we expect?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Study 012 asks something closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Does that boundary coverage survive when the representation of the same policy changes?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Five versions of the policy
&lt;/h2&gt;

&lt;p&gt;I created five variants.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;What changed&lt;/th&gt;
&lt;th&gt;Threshold representation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;40 and 70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reworded&lt;/td&gt;
&lt;td&gt;40 and 70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clauses reordered&lt;/td&gt;
&lt;td&gt;40 and 70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;D&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thresholds moved&lt;/td&gt;
&lt;td&gt;45 and 72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;E&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Threshold literals removed&lt;/td&gt;
&lt;td&gt;"four tenths" and "seven tenths" of a 0-100 scale&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Versions A, B, C, and E have the same decision semantics.&lt;/p&gt;

&lt;p&gt;Version D deliberately does not. Its thresholds move from 40 and 70 to 45 and 72.&lt;/p&gt;

&lt;p&gt;I ran 30 authoring attempts per version - 150 total - against one pinned model snapshot, &lt;code&gt;gpt-5.6-sol&lt;/code&gt;, through a digest-pinned CLI, all within one day.&lt;/p&gt;

&lt;p&gt;That matters because this is one model, one policy family, and one experimental window.&lt;/p&gt;

&lt;p&gt;It is not a statement about language models in general.&lt;/p&gt;

&lt;p&gt;More importantly, I wrote down the prediction &lt;strong&gt;before running the experiment&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Coverage should collapse in Version E when the literal threshold numbers disappear.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also wrote down what I would conclude if it didn't.&lt;/p&gt;

&lt;p&gt;Without that, it would have been far too easy to inspect the results afterward and redefine what I had meant all along.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result 1: move the thresholds, and the tests move with them
&lt;/h2&gt;

&lt;p&gt;Version D changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40 and 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;45 and 72
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated tests followed.&lt;/p&gt;

&lt;p&gt;Across Version D's 480 accepted records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;61 landed exactly on 45&lt;/li&gt;
&lt;li&gt;50 landed exactly on 72&lt;/li&gt;
&lt;li&gt;zero landed on the old thresholds 40 or 70&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The registered scorer calls this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COVERAGE-FOLLOWS-THE-NUMBERS&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I think this result matters more than I initially gave it credit for.&lt;/p&gt;

&lt;p&gt;Forty-five and seventy-two are not especially attractive round numbers, yet the generated tests moved directly to them.&lt;/p&gt;

&lt;p&gt;So a simple explanation like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The model just prefers round values.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;does not explain the result very well.&lt;/p&gt;

&lt;p&gt;Nothing pulled the tests back toward 40 or 70 either.&lt;/p&gt;

&lt;p&gt;Then came the result that broke my own prediction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result 2: hide 40 and 70, and the model still finds them
&lt;/h2&gt;

&lt;p&gt;Version E never prints the literals &lt;code&gt;40&lt;/code&gt; or &lt;code&gt;70&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead, the thresholds are expressed indirectly as four tenths and seven tenths of a scale defined from zero to one hundred.&lt;/p&gt;

&lt;p&gt;My preregistered prediction was that boundary coverage would collapse.&lt;/p&gt;

&lt;p&gt;It didn't.&lt;/p&gt;

&lt;p&gt;All five versions covered all six registered boundary classes in every valid run.&lt;/p&gt;

&lt;p&gt;The valid-run counts were:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A: 29 / 30
B: 28 / 30
C: 28 / 30
D: 30 / 30
E: 27 / 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Version E reconstructed 40 and 70 exactly.&lt;/p&gt;

&lt;p&gt;It also produced &lt;strong&gt;107 records exactly on one of its three registered edges&lt;/strong&gt;, the same total as the baseline.&lt;/p&gt;

&lt;p&gt;That tie is prettier than the result deserves, so I don't want to oversell it.&lt;/p&gt;

&lt;p&gt;The 107 count includes the third edge at 39. Looking only at the two main thresholds, Version E produced 103 exact-edge records versus 105 in the baseline.&lt;/p&gt;

&lt;p&gt;Still, the result that matters is straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Removing the literal 40 and 70 did not produce the collapse I predicted.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My prediction was wrong.&lt;/p&gt;

&lt;p&gt;The explanation I had published - that the strong boundary behavior was primarily caused by anchoring on printed threshold numerals - no longer survived its own test.&lt;/p&gt;

&lt;h2&gt;
  
  
  But a failed prediction does not prove the opposite
&lt;/h2&gt;

&lt;p&gt;This is where I made the next mistake.&lt;/p&gt;

&lt;p&gt;If my anchoring hypothesis fails, I do &lt;strong&gt;not&lt;/strong&gt; automatically get to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The model understood the policy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also do not get to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The printed numerals had no causal effect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The study does not establish either claim.&lt;/p&gt;

&lt;p&gt;The defensible conclusion is much narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For this policy family, this model snapshot, and this particular way of hiding the literal thresholds, removing 40 and 70 from the text did not reduce registered boundary coverage.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are several reasons to stop there.&lt;/p&gt;

&lt;h3&gt;
  
  
  The policy may not have been novel to the model
&lt;/h3&gt;

&lt;p&gt;This policy family had already been public in the repository for several days before the experiment.&lt;/p&gt;

&lt;p&gt;That means contamination cannot be ruled out.&lt;/p&gt;

&lt;p&gt;If the model had encountered the policy previously, recovering 40 and 70 would not necessarily demonstrate that it derived them fresh from the transformed policy.&lt;/p&gt;

&lt;p&gt;This experiment cannot distinguish:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;from:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Version E hides the numerals, not the arithmetic
&lt;/h3&gt;

&lt;p&gt;Version E still contains the threshold information.&lt;/p&gt;

&lt;p&gt;"Seven tenths of a 0-100 scale" deterministically evaluates to 70.&lt;/p&gt;

&lt;p&gt;"Four tenths" evaluates to 40.&lt;/p&gt;

&lt;p&gt;So Version E tests the effect of &lt;strong&gt;indirection&lt;/strong&gt;, not the effect of making the boundary genuinely absent.&lt;/p&gt;

&lt;p&gt;That is a much narrower experiment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Each perturbation is represented by one policy instance
&lt;/h3&gt;

&lt;p&gt;Version B tells us that &lt;strong&gt;this particular paraphrase&lt;/strong&gt; did not substantially change the measured boundary coverage.&lt;/p&gt;

&lt;p&gt;It does not tell us that paraphrasing never changes boundary discovery.&lt;/p&gt;

&lt;p&gt;The same limitation applies to clause ordering and threshold denaming.&lt;/p&gt;

&lt;p&gt;One instance per perturbation type is not enough to generalize across all possible rewrites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I discovered that my retraction was wrong too
&lt;/h2&gt;

&lt;p&gt;This part is less flattering, but probably more useful.&lt;/p&gt;

&lt;p&gt;After writing the first retraction, I checked the prose mechanically against the published result files.&lt;/p&gt;

&lt;p&gt;I found eight material errors.&lt;/p&gt;

&lt;p&gt;The worst involved a claim I had described as the part of the original interpretation that still survived.&lt;/p&gt;

&lt;p&gt;I had effectively said that none of the versions explored the immediate space below the unstated reference point.&lt;/p&gt;

&lt;p&gt;That was false.&lt;/p&gt;

&lt;p&gt;Version C contains a record at 38.&lt;/p&gt;

&lt;p&gt;I had also treated 39 as though it were the equivalent reference point for Version D, even though Version D moved its lower threshold to 45.&lt;/p&gt;

&lt;p&gt;Its comparable reference point is 44.&lt;/p&gt;

&lt;p&gt;Another sentence said there were "0 of 464 records" below 39 in Version A.&lt;/p&gt;

&lt;p&gt;That wording made it sound like there were no values below 39.&lt;/p&gt;

&lt;p&gt;In reality:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;117 of Version A's 464 records are below 39.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The zero referred only to a narrow interval immediately below the edge.&lt;/p&gt;

&lt;p&gt;Those are very different claims.&lt;/p&gt;

&lt;p&gt;Then I checked the correction.&lt;/p&gt;

&lt;p&gt;And found another problem.&lt;/p&gt;

&lt;p&gt;The corrected prose still said, in several places, that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The numerals were not the cause.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The experiment does not establish that.&lt;/p&gt;

&lt;p&gt;It establishes that &lt;strong&gt;this particular removal of the literal numerals did not change the measured coverage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A failed prediction does not prove its opposite.&lt;/p&gt;

&lt;p&gt;I had written that rule into the study.&lt;/p&gt;

&lt;p&gt;Then violated it while summarizing the study.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually survives
&lt;/h2&gt;

&lt;p&gt;After correcting those mistakes, there is still an interesting pattern.&lt;/p&gt;

&lt;p&gt;Across all five versions, the one-unit interval immediately below the unstated reference point is almost empty.&lt;/p&gt;

&lt;p&gt;For Versions A, B, C, and E, that interval is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[38, 39)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Version D, because the threshold moved, the equivalent interval is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[43, 44)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Across the entire experiment, there is only &lt;strong&gt;one record&lt;/strong&gt; in those intervals:&lt;/p&gt;

&lt;p&gt;Version C's value at 38.&lt;/p&gt;

&lt;p&gt;Four of the five policy variants have nothing there at all.&lt;/p&gt;

&lt;p&gt;But this needs another qualification.&lt;/p&gt;

&lt;p&gt;Values below 39 are &lt;strong&gt;not&lt;/strong&gt; generally rare.&lt;/p&gt;

&lt;p&gt;Version A has 117 records below 39.&lt;/p&gt;

&lt;p&gt;Version E has 101.&lt;/p&gt;

&lt;p&gt;The observation is specifically about the &lt;strong&gt;immediate approach to the boundary&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That distinction matters because I had previously conflated:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nothing immediately below 39&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nothing below 39&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They are not remotely the same claim.&lt;/p&gt;

&lt;p&gt;And importantly, the nearly empty approach exists in the baseline just as it does in the version where the threshold numerals were hidden.&lt;/p&gt;

&lt;p&gt;So the clean explanation I started with no longer works.&lt;/p&gt;

&lt;p&gt;If the gap had appeared only after I removed the printed thresholds, "the model copies visible numbers" would have been an appealing explanation.&lt;/p&gt;

&lt;p&gt;It didn't.&lt;/p&gt;

&lt;p&gt;What I can say is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Removing the literal thresholds did not remove the pattern.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I cannot currently say is &lt;strong&gt;why the pattern exists&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I thought I knew.&lt;/p&gt;

&lt;p&gt;The experiment told me I didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What developers can actually use from this
&lt;/h2&gt;

&lt;p&gt;The practical lesson is not that generated tests are bad.&lt;/p&gt;

&lt;p&gt;It is that &lt;strong&gt;boundary coverage is a much weaker metric than it looks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If a generated test suite says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6 / 6 boundary classes covered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;that tells you the expected categories appeared.&lt;/p&gt;

&lt;p&gt;It does not tell you whether the generator understood the decision space, explored nearby alternatives, or simply concentrated values around obvious rule boundaries.&lt;/p&gt;

&lt;p&gt;A very cheap diagnostic is to plot the generated numeric values relative to the policy thresholds.&lt;/p&gt;

&lt;p&gt;If nearly everything is welded to exact thresholds and their nearest decimal neighbors while the surrounding space is mostly empty, that tells you something the coverage percentage cannot.&lt;/p&gt;

&lt;p&gt;Not necessarily that the model failed.&lt;/p&gt;

&lt;p&gt;But certainly that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100% boundary coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;should not automatically be read as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;the policy was understood
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are different claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson I didn't expect to get from the study
&lt;/h2&gt;

&lt;p&gt;The experiment went through extensive adversarial review.&lt;/p&gt;

&lt;p&gt;The prose explaining it did not.&lt;/p&gt;

&lt;p&gt;That turned out to be a mistake.&lt;/p&gt;

&lt;p&gt;The experimental apparatus had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preregistered predictions&lt;/li&gt;
&lt;li&gt;frozen artifacts&lt;/li&gt;
&lt;li&gt;deterministic scorers&lt;/li&gt;
&lt;li&gt;raw records&lt;/li&gt;
&lt;li&gt;review rounds designed to find overclaims&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I sat down afterward and summarized all of that in ordinary prose.&lt;/p&gt;

&lt;p&gt;That is where the errors appeared.&lt;/p&gt;

&lt;p&gt;The number errors were in the explanation.&lt;/p&gt;

&lt;p&gt;The causal overclaim was in the explanation.&lt;/p&gt;

&lt;p&gt;The experiment itself had a rule saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A failed prediction does not license the opposite conclusion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The write-up broke the rule.&lt;/p&gt;

&lt;p&gt;So the meta-result I am taking away is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The write-up is part of the research artifact.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an experiment is important enough to adversarially review, the final article probably deserves the same treatment.&lt;/p&gt;

&lt;p&gt;In this case, every material error found so far has been in the layer where evidence gets turned into a story.&lt;/p&gt;

&lt;p&gt;That is uncomfortable.&lt;/p&gt;

&lt;p&gt;It is also useful evidence about where another verification boundary belongs.&lt;/p&gt;




&lt;h2&gt;
  
  
  This study started in the comments
&lt;/h2&gt;

&lt;p&gt;One thing I don't want to lose in the write-up: Study 012 came directly out of the discussion on the previous experiment. &lt;a href="https://dev.to/deanlee"&gt;@deanlee&lt;/a&gt; suggested the core falsifier - keep the boundary classes fixed, perturb the wording and ordering of the policy, and see whether the model still finds the same test surface. &lt;a href="https://dev.to/alexshev"&gt;@alexshev&lt;/a&gt; pointed out that repeated generation may be telling us as much about the shape and fragility of the policy text as about the model itself. And &lt;a href="https://dev.to/kartik-nvjk"&gt;@kartik-nvjk&lt;/a&gt; pushed on the rejected run and whether something as small as an off-by-one error at the threshold would even be visible behind the clean coverage number.&lt;/p&gt;

&lt;p&gt;Those were not just good comments to acknowledge. Together they changed what I tested next. Thanks Dean, Alex, and Kartik for pushing on the result instead of simply accepting the headline.&lt;/p&gt;




&lt;p&gt;Everything is public:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/012-policy-perturbation" rel="noopener noreferrer"&gt;Study 012 - Policy Perturbation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository includes the preregistration written before the data existed, review records, raw generated tests, result files, the retraction, and the corrections.&lt;/p&gt;

&lt;p&gt;The claim I would carry forward is deliberately narrow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This experiment falsified my prediction that hiding the literal threshold numbers would collapse boundary coverage. It did not establish why the model still found those boundaries.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For now, that is enough.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>When Agents Can Act on Real Devices, Governance Moves Beyond the Prompt</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Tue, 11 Aug 2026 13:20:33 +0000</pubDate>
      <link>https://dev.to/kikashy/when-agents-can-act-on-real-devices-governance-moves-beyond-the-prompt-2kf1</link>
      <guid>https://dev.to/kikashy/when-agents-can-act-on-real-devices-governance-moves-beyond-the-prompt-2kf1</guid>
      <description>&lt;p&gt;Google's new Developer Device Platform makes the agent-governance problem much more concrete.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/announcing-developer-device-platform-on-google-cloud" rel="noopener noreferrer"&gt;Developer Device Platform&lt;/a&gt; gives coding agents access to real physical devices and high-concurrency emulators. An agent can run a multi-step user journey, inspect what happened, analyze performance, modify the application, and then test the result again. This is a meaningful change from the familiar coding-assistant workflow where a model proposes a patch and a developer remains responsible for executing and validating it. The agent is now operating inside the environment it is changing, and its own observations can influence the next action it takes.&lt;/p&gt;

&lt;p&gt;That loop is powerful because it allows an agent to move from suggestion to investigation and remediation. It also exposes a harder question: once the agent can diagnose and change a real system, what determines which changes it should be allowed to make automatically?&lt;/p&gt;

&lt;h2&gt;
  
  
  The execution loop is becoming more autonomous
&lt;/h2&gt;

&lt;p&gt;Imagine an agent testing a mobile application across several devices. It reproduces a rendering problem, profiles the application, identifies a likely cause, modifies the relevant code, and confirms that the new version performs better. From a capability perspective, the task may look complete.&lt;/p&gt;

&lt;p&gt;Operationally, however, not every successful fix should have the same outcome. A rendering optimization may be safe to apply automatically, while a change that touches authentication, customer data, payments, or privacy controls may need additional verification or human review. If the issue appears on only one of five devices, the right next step may be to gather more evidence rather than modify the application at all.&lt;/p&gt;

&lt;p&gt;The interesting problem therefore shifts from "can the agent fix this?" to "given what the agent observed, is this particular remediation justified?"&lt;/p&gt;

&lt;p&gt;That second question is not simply about tool access. It involves evidence quality, risk, exceptions, required validation, and sometimes organizational approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills introduce another trust boundary
&lt;/h2&gt;

&lt;p&gt;A recent paper, &lt;a href="https://arxiv.org/abs/2608.05223" rel="noopener noreferrer"&gt;Towards a Risk Assessment of Malicious Skill Files in Coding Agents&lt;/a&gt;, examines a related problem from the instruction side of the stack. The researchers created 2,826 adversarial skill files and tested them against Gemini CLI and Qwen Code across more than 5,600 completed runs.&lt;/p&gt;

&lt;p&gt;In the scenarios they evaluated, Gemini CLI attempted the behavior embedded in the malicious skills in roughly 96% of runs, while Qwen Code did so in roughly 72% to 74%. Explicit recognition that the skill itself represented a security problem occurred in fewer than 2% of the experiments.&lt;/p&gt;

&lt;p&gt;Those numbers should stay within the scope of the study. The researchers tested two coding agents against deliberately adversarial skill definitions, so the result does not establish that every skill system behaves this way. The architectural implication is still worth examining.&lt;/p&gt;

&lt;p&gt;Skills are often described as reusable instructions that teach an agent how to perform a task. A skill might explain how to deploy an application, initialize an environment, diagnose an incident, or run a particular testing workflow. When the agent only consumes the skill as documentation, this may look like ordinary context.&lt;/p&gt;

&lt;p&gt;Once the agent also has terminal access, filesystem permissions, cloud credentials, MCP tools, or access to physical testing environments, those same instructions can influence privileged execution. At that point, a skill starts behaving less like passive documentation and more like a software dependency.&lt;/p&gt;

&lt;p&gt;The researchers' &lt;a href="https://github.com/awsm-research/AgentJailbreak" rel="noopener noreferrer"&gt;AgentJailbreak benchmark&lt;/a&gt; makes this especially interesting because the evaluation artifacts are public. It gives other teams a way to study how agents behave when instructions that appear useful also contain behavior that should not be trusted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capability, authorization, and judgment are different problems
&lt;/h2&gt;

&lt;p&gt;Google's device platform and the malicious-skill study highlight two different parts of the same emerging architecture.&lt;/p&gt;

&lt;p&gt;A skill can tell an agent how to perform a task. A device platform gives it an environment in which to perform that task. MCP or another tool interface can expose additional capabilities, while an authorization layer determines whether the agent is permitted to use them.&lt;/p&gt;

&lt;p&gt;None of those layers necessarily answers whether the action the agent wants to take is justified.&lt;/p&gt;

&lt;p&gt;Consider the mobile debugging example again. After testing the application, the system may know that an issue reproduced on four of five devices, performance improved by 18% after a proposed change, authentication-related code was modified, and one required privacy validation has not yet completed.&lt;/p&gt;

&lt;p&gt;Those are facts about the situation.&lt;/p&gt;

&lt;p&gt;The organization may have a rule saying that any change touching authentication code requires additional review when mandatory validation is incomplete. In that case, the appropriate outcome is not determined by how confident the agent feels or how strongly the performance metric improved. The decision follows from the organization's criteria for handling that combination of evidence.&lt;/p&gt;

&lt;p&gt;This is where the distinction between agent capability and organizational judgment becomes useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Judgment Pack fits
&lt;/h2&gt;

&lt;p&gt;This is one of the boundaries I have been exploring with the Judgment Pack Specification.&lt;/p&gt;

&lt;p&gt;The basic idea is to keep the criteria governing a consequential decision separate from the instructions that teach the agent how to perform the work. The agent can still investigate, use tools, gather evidence, propose fixes, and operate with substantial autonomy. The judgment artifact instead defines how the organization evaluates the resulting evidence and which dispositions are possible.&lt;/p&gt;

&lt;p&gt;Conceptually, the flow could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;skills
  |
  v
agent &amp;lt;----&amp;gt; device environment
  |
  v
evidence
  |
  v
judgment
  |
  v
disposition
  |
  v
execution / approval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;The distinction matters even more if skills themselves can become part of the execution attack surface. A Judgment Pack should not simply become another general-purpose instruction file.&lt;/p&gt;

&lt;p&gt;If the judgment artifact remains declarative, constrained, versioned, and interpreted by a known evaluator, its trust properties are different from those of a skill capable of introducing arbitrary commands or changing how the agent operates. That does not make the system automatically safe, but it gives each layer a narrower responsibility that can be inspected independently.&lt;/p&gt;

&lt;p&gt;This also helps separate failure modes. The agent may gather incorrect evidence, the device environment may produce a misleading observation, a binding may reference the wrong source, runtime state may change after the decision, or the evaluator itself may contain a defect. Those are all real problems, but they are easier to analyze when evidence acquisition, decision criteria, and execution behavior are not mixed into one large agent prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open-source governance points in a similar direction
&lt;/h2&gt;

&lt;p&gt;A second recent study, &lt;a href="https://arxiv.org/abs/2608.03329" rel="noopener noreferrer"&gt;Making AI Visible, Not Vanished&lt;/a&gt;, looked at how open-source projects are responding to AI-assisted development. The researchers analyzed 29,624 GitHub repositories and identified 385 projects with explicit policies governing AI-related contributions.&lt;/p&gt;

&lt;p&gt;They organized those policies around five dimensions: transparency, responsibility, attribution, constraints, and enforcement. What I found interesting is that governance usually did not mean banning AI-assisted work. Instead, the policies made AI involvement more visible and clarified who remained responsible for the contribution. The analysis also found associations between these policies and richer review interaction, increased disclosure, and stronger quality measures, particularly where transparency and responsibility were emphasized.&lt;/p&gt;

&lt;p&gt;I think there is a useful parallel with agent architecture.&lt;/p&gt;

&lt;p&gt;As agents gain more capabilities, adding more hidden instructions inside the model may not be the most sustainable way to govern them. It may be more effective to make the boundaries explicit: where a skill came from, who approved it, which evidence supported a decision, which criteria were applied, who owns those criteria, and who is allowed to change them.&lt;/p&gt;

&lt;p&gt;That kind of visibility does not remove risk, but it makes the system much easier to reason about than an agent whose instructions, permissions, decision logic, and execution behavior are all intertwined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google gives us a useful environment to test the boundary
&lt;/h2&gt;

&lt;p&gt;The Developer Device Platform creates a practical environment for testing this separation.&lt;/p&gt;

&lt;p&gt;An agent could be given a skill for diagnosing application problems and allowed to interact with real devices, reproduce failures, generate fixes, and validate its own changes. Before those changes are applied automatically, however, an external judgment step could evaluate the evidence against explicit acceptance criteria.&lt;/p&gt;

&lt;p&gt;The cases do not need to be complicated. A low-risk deterministic remediation might be eligible for automatic execution, while a security-sensitive change could require human review. Conflicting results across devices might require more testing, and missing mandatory validation could prevent the decision from resolving at all.&lt;/p&gt;

&lt;p&gt;The useful comparison would be between two architectures.&lt;/p&gt;

&lt;p&gt;In the first, the agent gathers the evidence and also decides whether its own proposed fix is acceptable.&lt;/p&gt;

&lt;p&gt;In the second, the agent gathers the evidence but the criteria determining whether the action is justified remain external.&lt;/p&gt;

&lt;p&gt;The purpose of the experiment would not be to prove that the second architecture is always better. It would be to find out whether capability and organizational judgment can remain meaningfully separate once an agent is operating inside a real feedback loop.&lt;/p&gt;

&lt;p&gt;Google's new device platform makes that question much less theoretical.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Receipt Was Valid. The Policy Was Retired.</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 23:28:43 +0000</pubDate>
      <link>https://dev.to/kikashy/the-receipt-was-valid-the-policy-was-retired-164a</link>
      <guid>https://dev.to/kikashy/the-receipt-was-valid-the-policy-was-retired-164a</guid>
      <description>&lt;p&gt;A receipt can be cryptographically valid.&lt;/p&gt;

&lt;p&gt;The judgment can recompute exactly.&lt;/p&gt;

&lt;p&gt;The action can still be bound to the same facts, same policy bytes, and same disposition.&lt;/p&gt;

&lt;p&gt;And the whole thing can still be stale.&lt;/p&gt;

&lt;p&gt;That is the problem behind our newest experiment.&lt;/p&gt;

&lt;p&gt;Suppose an agent made a decision under policy version &lt;code&gt;v1.0.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At the time, that policy was valid.&lt;/p&gt;

&lt;p&gt;Later, the organization retires &lt;code&gt;v1.0.0&lt;/code&gt; and replaces it with &lt;code&gt;v1.1.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Someone now presents the old decision again.&lt;/p&gt;

&lt;p&gt;Nothing inside the original decision has changed.&lt;/p&gt;

&lt;p&gt;Nothing inside the receipt has changed.&lt;/p&gt;

&lt;p&gt;Every digest still matches.&lt;/p&gt;

&lt;p&gt;Every signature can still verify.&lt;/p&gt;

&lt;p&gt;Replay produces exactly the same disposition.&lt;/p&gt;

&lt;p&gt;The missing fact is outside all of those artifacts:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Is this policy version still in force?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That became &lt;strong&gt;Study 016 - Policy Currency Anchor&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  This started with a public architecture discussion
&lt;/h2&gt;

&lt;p&gt;The study grew directly out of a discussion with &lt;a href="https://dev.to/dengyier"&gt;@dengyier&lt;/a&gt;, the author of &lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;OpenWorkProof&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/014-openworkproof-binding" rel="noopener noreferrer"&gt;Study 014&lt;/a&gt;, we composed our deterministic judgment layer with OpenWorkProof's signed work orders, capability grants, execution receipts, causal replay, and offline verifier.&lt;/p&gt;

&lt;p&gt;That experiment asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a third party prove afterward which recorded judgment corresponds to which recorded action?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It worked across the registered mutation set, but it left an important boundary open.&lt;/p&gt;

&lt;p&gt;A perfectly self-consistent chain cannot tell you whether the policy inside that chain is still the policy the organization considers authoritative.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/dengyier/when-ai-agents-ship-code-a-protocol-for-verifiable-execution-29m3"&gt;DEV.to thread&lt;/a&gt;, we started sketching what an external anchor might look like.&lt;/p&gt;

&lt;p&gt;Our gateway already had a related pattern: a small signed registry outside the artifacts it checks, used to detect replay and rollback.&lt;/p&gt;

&lt;p&gt;But the gateway tracks &lt;strong&gt;input lineage&lt;/strong&gt;, not policy currency.&lt;/p&gt;

&lt;p&gt;So the idea became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep the registry pattern. Change the subject.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of anchoring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;which input bytes did this judgment use?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;anchor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;which versions of this policy series are in force?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Study 016 turns that idea into something measurable.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fourth check, not a replacement for the first three
&lt;/h2&gt;

&lt;p&gt;Study 016 did not redesign Study 014.&lt;/p&gt;

&lt;p&gt;It added one new check on top of the existing ceremony.&lt;/p&gt;

&lt;p&gt;The stack became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenWorkProof verification
        |
        v
judgment binding
        |
        v
deterministic replay
        |
        v
policy currency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer asks a different question.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenWorkProof
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Is the authorization and execution receipt chain internally valid?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Judgment binding
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Are these still the exact pack, facts, disposition, and action that were committed together?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Deterministic replay
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Do the retained pack and facts still reproduce the recorded disposition?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Policy currency
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this pack version in the supported set at the registry snapshot the verifier trusts?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last question cannot be answered from the decision artifact alone.&lt;/p&gt;

&lt;p&gt;So we made the changing world itself an artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The minimal registry
&lt;/h2&gt;

&lt;p&gt;The study implemented a deliberately small signed registry.&lt;/p&gt;

&lt;p&gt;It supports policy-version events such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;add
retire
reinstate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The events form a hash chain.&lt;/p&gt;

&lt;p&gt;The registry publishes signed snapshot heads.&lt;/p&gt;

&lt;p&gt;An offline verifier receives retained registry state plus out-of-band trust material and checks the history before deciding whether a particular tuple is current:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pack identity
+
pack version
+
pack digest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a &lt;strong&gt;study prototype&lt;/strong&gt;, not a proposed standard.&lt;/p&gt;

&lt;p&gt;Nothing from it was silently added to JPS Core, the runtime, the gateway, or OpenWorkProof.&lt;/p&gt;

&lt;p&gt;That separation matters because the point of the study was to measure the mechanism before deciding whether any project should own it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experiment
&lt;/h2&gt;

&lt;p&gt;The preregistration went through five cross-vendor adversarial review rounds before freeze.&lt;/p&gt;

&lt;p&gt;A reviewer using a model from a different vendor also authored a separate 10-cell holdout stratum.&lt;/p&gt;

&lt;p&gt;Those holdout cells were committed before freeze and had never been executed.&lt;/p&gt;

&lt;p&gt;Then the registered primary attempt ran once from the freeze commit.&lt;/p&gt;

&lt;p&gt;The result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Locked stratum:
22 / 22 adjudicated
0 endpoint divergence
0 pipeline-invalid

Reviewer holdout:
10 / 10 constructed on first execution
10 / 10 adjudicated
0 divergence
0 pipeline-invalid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The clean numbers are useful.&lt;/p&gt;

&lt;p&gt;The boundaries are more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 1 - the registry caught a failure the receipt chain could not
&lt;/h2&gt;

&lt;p&gt;The central test reused a decision under a policy version that the signed registry had retired.&lt;/p&gt;

&lt;p&gt;The important part is what &lt;strong&gt;did not&lt;/strong&gt; change.&lt;/p&gt;

&lt;p&gt;The judgment and execution-chain bytes were the same as the passing control.&lt;/p&gt;

&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenWorkProof: PASS
Binding:       PASS
Replay:        PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the external world moved.&lt;/p&gt;

&lt;p&gt;The currency registry now said:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v1.0.0 -&amp;gt; retired
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the fourth layer returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;not-current-at-snapshot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the result I wanted from the experiment.&lt;/p&gt;

&lt;p&gt;It demonstrates why currency is structurally different from integrity.&lt;/p&gt;

&lt;p&gt;A digest can tell you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is still the same artifact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A signature can tell you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This authority signed these bytes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Replay can tell you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These inputs still produce this result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;None of those statements mean:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This artifact is still in force.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Currency is relational.&lt;/p&gt;

&lt;p&gt;The policy may stay byte-for-byte identical while the authoritative world around it changes.&lt;/p&gt;

&lt;p&gt;So the authoritative world has to become part of the retained evidence too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 2 - a policy registry cannot solve authorization-contract currency
&lt;/h2&gt;

&lt;p&gt;This was deliberately registered as something the new layer should &lt;strong&gt;not&lt;/strong&gt; catch.&lt;/p&gt;

&lt;p&gt;Take the exact same judgment commitment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;same pack
same version
same digest
same facts
same disposition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now bind it under a different but equally valid WorkOrder.&lt;/p&gt;

&lt;p&gt;All four layers pass.&lt;/p&gt;

&lt;p&gt;That is the correct result.&lt;/p&gt;

&lt;p&gt;A policy-version registry has no signal to inspect because the policy tuple did not change.&lt;/p&gt;

&lt;p&gt;This is a different kind of currency question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this still the authorization contract under which the action should proceed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Study 016 does not solve that.&lt;/p&gt;

&lt;p&gt;And I do not think the right response is to make the pack registry understand WorkOrders.&lt;/p&gt;

&lt;p&gt;The experiment gives us a cleaner boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;policy currency
!=
authorization-contract currency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the second problem deserves an anchor, it needs a subject appropriate to the authorization/receipt protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 3 - two valid histories expose the stateless-verifier ceiling
&lt;/h2&gt;

&lt;p&gt;The next case is more uncomfortable.&lt;/p&gt;

&lt;p&gt;One authority.&lt;/p&gt;

&lt;p&gt;One policy series.&lt;/p&gt;

&lt;p&gt;Two contradictory histories.&lt;/p&gt;

&lt;p&gt;Both are internally valid.&lt;/p&gt;

&lt;p&gt;Both are correctly signed.&lt;/p&gt;

&lt;p&gt;Give history A to a fresh verifier:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Give history B to a different fresh verifier:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Neither isolated verifier sees anything wrong.&lt;/p&gt;

&lt;p&gt;There is nothing malformed inside either history.&lt;/p&gt;

&lt;p&gt;The contradiction exists only when someone can compare the two views.&lt;/p&gt;

&lt;p&gt;We also ran a stateful variant.&lt;/p&gt;

&lt;p&gt;Once the verifier retained a previously accepted head, presenting the conflicting continuation was refused by prefix containment.&lt;/p&gt;

&lt;p&gt;That gives us a narrower measured statement than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;State solves equivocation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What we actually observed is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prior verifier state can expose some conflicting histories that a fresh isolated verifier cannot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;General split-view resistance needs more.&lt;/p&gt;

&lt;p&gt;Potentially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transparency logging&lt;/li&gt;
&lt;li&gt;witnesses&lt;/li&gt;
&lt;li&gt;cross-signing&lt;/li&gt;
&lt;li&gt;cross-view comparison&lt;/li&gt;
&lt;li&gt;retention requirements&lt;/li&gt;
&lt;li&gt;verifier enforcement&lt;/li&gt;
&lt;li&gt;assumptions about witness independence and non-collusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those remain design questions.&lt;/p&gt;

&lt;p&gt;The study measured the floor.&lt;/p&gt;

&lt;p&gt;It did not design the whole trust system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 4 - offline verification cannot reconstruct "current when used"
&lt;/h2&gt;

&lt;p&gt;There is another limit no amount of careful digesting removes.&lt;/p&gt;

&lt;p&gt;Consider two histories.&lt;/p&gt;

&lt;h3&gt;
  
  
  History A
&lt;/h3&gt;

&lt;p&gt;Policy &lt;code&gt;v1&lt;/code&gt; is current.&lt;/p&gt;

&lt;p&gt;The agent legitimately uses it.&lt;/p&gt;

&lt;p&gt;Later, &lt;code&gt;v1&lt;/code&gt; is retired.&lt;/p&gt;

&lt;p&gt;Much later, an auditor verifies the old decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  History B
&lt;/h3&gt;

&lt;p&gt;Policy &lt;code&gt;v1&lt;/code&gt; has already been retired.&lt;/p&gt;

&lt;p&gt;Someone reuses the old decision anyway.&lt;/p&gt;

&lt;p&gt;Later, an auditor verifies it.&lt;/p&gt;

&lt;p&gt;At verification time, the retained decision bytes can be identical.&lt;/p&gt;

&lt;p&gt;The decision cannot tell the auditor which history happened.&lt;/p&gt;

&lt;p&gt;So the currency layer makes a deliberately narrower claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this version in force at the pinned registry snapshot?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Was this version current at the exact moment the action occurred?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That stronger question requires trustworthy temporal evidence connecting execution time to policy-state history.&lt;/p&gt;

&lt;p&gt;For an offline-first design, that may require another artifact.&lt;/p&gt;

&lt;p&gt;Or the honest answer may eventually be that some forms of real-time freshness are irreducibly online.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reviewer corrected something I had already said publicly
&lt;/h2&gt;

&lt;p&gt;This part matters to me because the correction is against my own earlier argument.&lt;/p&gt;

&lt;p&gt;In the discussion with dengyier, I initially described bootstrap too neatly.&lt;/p&gt;

&lt;p&gt;Roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pin an authority key
+
pin a genesis checkpoint
=
bootstrap trust
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adversarial review of the RFC amendment rejected that framing.&lt;/p&gt;

&lt;p&gt;The reviewer was right.&lt;/p&gt;

&lt;p&gt;A pinned signing key proves:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This key authenticated the history I was handed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not prove:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is the only history that key has ever signed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And a pinned genesis checkpoint does not prevent the signer from creating two contradictory histories &lt;strong&gt;after&lt;/strong&gt; that common checkpoint.&lt;/p&gt;

&lt;p&gt;The trust problem also changes depending on the signer model.&lt;/p&gt;

&lt;p&gt;A publisher signing its own currency assertions and a neutral log attesting inclusion do not necessarily need the same bootstrap artifacts.&lt;/p&gt;

&lt;p&gt;So &lt;a href="https://github.com/Judgment-Pack/judgment-pack-spec/blob/main/rfcs/0011-judgment-currency-anchor.md" rel="noopener noreferrer"&gt;RFC 0011&lt;/a&gt; now leaves the questions open rather than smuggling an answer into the design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does a fresh verifier actually need under each signer model?&lt;/li&gt;
&lt;li&gt;Does it need an independently supplied starting checkpoint at all?&lt;/li&gt;
&lt;li&gt;What threat would such a checkpoint address?&lt;/li&gt;
&lt;li&gt;How should key rotation work?&lt;/li&gt;
&lt;li&gt;What would a real witness contract require?&lt;/li&gt;
&lt;li&gt;How would split views become observable?&lt;/li&gt;
&lt;li&gt;What assumptions about witness independence and non-collusion are necessary?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a better outcome than preserving a clean architecture diagram that the evidence did not support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the holdout matters
&lt;/h2&gt;

&lt;p&gt;The locked matrix is useful, but it was developed while we were building the study.&lt;/p&gt;

&lt;p&gt;The holdout is different.&lt;/p&gt;

&lt;p&gt;The reviewer authored ten cells before freeze.&lt;/p&gt;

&lt;p&gt;None had been executed.&lt;/p&gt;

&lt;p&gt;On their first-ever execution, all ten landed exactly on the registered outcomes.&lt;/p&gt;

&lt;p&gt;Some tested strict parsing.&lt;/p&gt;

&lt;p&gt;Some tested first-failure ordering.&lt;/p&gt;

&lt;p&gt;Some tested exact size boundaries.&lt;/p&gt;

&lt;p&gt;One combined replay and currency failures and verified that the two layers failed independently.&lt;/p&gt;

&lt;p&gt;Another deliberately changed unauthenticated labels without touching signed bytes and was expected to pass everything.&lt;/p&gt;

&lt;p&gt;It did.&lt;/p&gt;

&lt;p&gt;That last kind of case matters.&lt;/p&gt;

&lt;p&gt;An adversarial suite should not merely contain more ways to fail.&lt;/p&gt;

&lt;p&gt;It should also contain cases designed to prove the verifier is &lt;strong&gt;not&lt;/strong&gt; reacting to irrelevant changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this study does not establish
&lt;/h2&gt;

&lt;p&gt;The cleanest result would be easy to oversell:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We built the missing policy registry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not what happened.&lt;/p&gt;

&lt;p&gt;Study 016 establishes something narrower.&lt;/p&gt;

&lt;p&gt;Within the registered cells, a small hash-chained signed pack-version registry, added as one fail-closed step over Study 014's unchanged ceremony:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;detected reuse of a version retired at the pinned snapshot&lt;/li&gt;
&lt;li&gt;rejected the registered invalid-registry states&lt;/li&gt;
&lt;li&gt;detected an older-snapshot replay when the verifier retained the required prior state&lt;/li&gt;
&lt;li&gt;accepted the constructions registered as outside its scope&lt;/li&gt;
&lt;li&gt;reproduced the expected split-view and freshness ceilings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; establish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;policy truth&lt;/li&gt;
&lt;li&gt;fact truth&lt;/li&gt;
&lt;li&gt;real-time staleness&lt;/li&gt;
&lt;li&gt;authorization-contract currency&lt;/li&gt;
&lt;li&gt;resistance to registry equivocation for fresh isolated verifiers&lt;/li&gt;
&lt;li&gt;trust from nothing&lt;/li&gt;
&lt;li&gt;a standardized registry format&lt;/li&gt;
&lt;li&gt;interoperability with an independently implemented consumer&lt;/li&gt;
&lt;li&gt;JPS conformance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The registry says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This authority asserts that these versions are in force at this signed snapshot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These policies are correct.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same ceiling as the rest of this research line:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;binding and lineage, not truth.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The next evidence should probably come from outside JPS
&lt;/h2&gt;

&lt;p&gt;There is one methodological limitation I do not want to hide.&lt;/p&gt;

&lt;p&gt;We wrote both sides of the new currency check.&lt;/p&gt;

&lt;p&gt;We wrote the registry.&lt;/p&gt;

&lt;p&gt;We wrote the consumer step.&lt;/p&gt;

&lt;p&gt;The reviewer holdout gives us useful prospective adversarial evidence, but this is still one project testing its own currency interpretation.&lt;/p&gt;

&lt;p&gt;That is not interoperability evidence.&lt;/p&gt;

&lt;p&gt;The stronger test would be an independently designed consumer.&lt;/p&gt;

&lt;p&gt;OpenWorkProof is a natural candidate because Study 014 already established the receipt-side boundary and because this whole experiment grew out of the discussion with &lt;a href="https://dev.to/dengyier"&gt;@dengyier&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But that does &lt;strong&gt;not&lt;/strong&gt; mean OWP should adopt our schema.&lt;/p&gt;

&lt;p&gt;The stronger experiment would be the opposite:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If OWP ever needs policy currency, let its author design the consumer by OWP's own process, then test whether our registered cells still describe the boundary correctly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe the formats converge.&lt;/p&gt;

&lt;p&gt;Maybe they do not.&lt;/p&gt;

&lt;p&gt;Either answer would teach us more than another JPS-owned implementation agreeing with itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The progression so far
&lt;/h2&gt;

&lt;p&gt;These last few experiments now form a useful sequence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Study 013 - behavior
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/013-agent-eval-forge-integration" rel="noopener noreferrer"&gt;Agent Eval Forge integration&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did the surrounding application actually respect the judgment at runtime?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Study 014 - provenance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/014-openworkproof-binding" rel="noopener noreferrer"&gt;OpenWorkProof binding&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a third party later verify the binding between the recorded judgment and the recorded action?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Study 016 - currency
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/016-policy-currency-anchor" rel="noopener noreferrer"&gt;Policy Currency Anchor&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can an offline verifier determine whether the recorded policy version is in force at the registry state it trusts?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They are not three permanent product categories.&lt;/p&gt;

&lt;p&gt;EvalForge, OpenWorkProof, JPS, and the surrounding OSS projects are all evolving and may expand or converge.&lt;/p&gt;

&lt;p&gt;The useful distinction is narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What responsibility did each pinned implementation actually own in the experiment we ran?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That keeps the claims attached to code rather than turning early open-source projects into fixed architecture boxes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Study 016 - Policy Currency Anchor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/016-policy-currency-anchor" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/016-policy-currency-anchor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Study 014 - OpenWorkProof binding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/014-openworkproof-binding" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/014-openworkproof-binding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RFC 0011 - Judgment Currency Anchor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-spec/blob/main/rfcs/0011-judgment-currency-anchor.md" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-spec/blob/main/rfcs/0011-judgment-currency-anchor.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenWorkProof&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;https://github.com/dengyier/OpenWorkProof&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks again to &lt;a href="https://dev.to/dengyier"&gt;@dengyier&lt;/a&gt; for pushing on the external-anchor question in public. The useful part of that discussion was not that we agreed on an architecture. It was that the conversation produced a claim concrete enough to test - and the test then forced part of my own answer to change.&lt;/p&gt;

&lt;p&gt;The next question is no longer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do we need an external policy-state anchor?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For this threat model, we now have evidence that it adds a distinct check.&lt;/p&gt;

&lt;p&gt;The harder question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who should operate that anchor, and what would make two contradictory signed views observable to verifiers who never meet?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Five Adversarial Reviews Told Me My Study Was Measuring a Fiction</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 19:29:04 +0000</pubDate>
      <link>https://dev.to/kikashy/five-adversarial-reviews-told-me-my-study-was-measuring-a-fiction-4cna</link>
      <guid>https://dev.to/kikashy/five-adversarial-reviews-told-me-my-study-was-measuring-a-fiction-4cna</guid>
      <description>&lt;p&gt;I thought I had a fairly clear experiment.&lt;/p&gt;

&lt;p&gt;An agent platform stages an external side effect for approval.&lt;/p&gt;

&lt;p&gt;Something upstream decides that the action is allowed.&lt;/p&gt;

&lt;p&gt;The platform records what happened.&lt;/p&gt;

&lt;p&gt;So the question seemed straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a third party later prove, from the retained records alone, which decision authorized which action?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I started building a falsification study around that question.&lt;/p&gt;

&lt;p&gt;Five rounds of cross-vendor adversarial review later, the study still has &lt;strong&gt;no registered result&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every round told me not to freeze it.&lt;/p&gt;

&lt;p&gt;That sounds like a failed experiment.&lt;/p&gt;

&lt;p&gt;I think the opposite happened.&lt;/p&gt;

&lt;p&gt;The reviews kept finding that some of the things I thought I was measuring either did not exist in the upstream system, could not be proven from the records I had chosen, or were weaker than the claims I had written around them.&lt;/p&gt;

&lt;p&gt;The study became more useful before it ever ran.&lt;/p&gt;

&lt;p&gt;That distinction became &lt;strong&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/015-cloudflare-os-boundary" rel="noopener noreferrer"&gt;Study 015 - Cloudflare OS Boundary&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post is about what the review process exposed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;The platform side is &lt;a href="https://github.com/cloudflare/cloudflare-os" rel="noopener noreferrer"&gt;Cloudflare OS&lt;/a&gt;, pinned in the study at commit &lt;code&gt;b2a51b5&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cloudflare describes the August 2026 release as early access with rough edges. Everything here refers to that &lt;strong&gt;specific pinned source tree&lt;/strong&gt;, not to some permanent definition of what Cloudflare OS is or will become.&lt;/p&gt;

&lt;p&gt;Its governance architecture is interesting.&lt;/p&gt;

&lt;p&gt;Agents and generated applications do not simply receive credentials to external services. A &lt;strong&gt;Gatekeeper&lt;/strong&gt; mediates access. External side effects can be staged for approval rather than executed immediately.&lt;/p&gt;

&lt;p&gt;Auto-approval requires two independent signals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the connector classifies the action as eligible&lt;/li&gt;
&lt;li&gt;the workspace user has enabled a rule allowing that action kind&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The decision side of my study is different.&lt;/p&gt;

&lt;p&gt;A portable judgment artifact receives facts and produces a structured disposition:&lt;br&gt;
&lt;/p&gt;

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

or

not-applicable

or

unresolved:
  - unknown
  - conflict
  - missing evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important property is that the judgment layer has a first-class way to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I cannot decide.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The study tries to join those two worlds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;facts + policy
      |
      v
   judgment
      |
      v
 proposed action
      |
      v
 platform governance
      |
      v
 approval / rejection / execution
      |
      v
 retained records
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What can someone prove afterward?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last question turned out to be much harder than I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  First lesson: read the implementation contract, not the architecture you imagine
&lt;/h2&gt;

&lt;p&gt;Before measuring anything, I had to establish what the pinned platform actually records and guarantees.&lt;/p&gt;

&lt;p&gt;Several assumptions I had made were simply wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  The generic MCP Gatekeeper cannot become vetted through normal configuration
&lt;/h3&gt;

&lt;p&gt;The generic MCP Gatekeeper hardcodes its trust tier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TRUST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ServerTrust&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;byo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Auto-approval requires &lt;code&gt;vetted&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So the original scenario I had designed around a "vetted generic MCP endpoint" described a configuration that does not exist in the pinned implementation.&lt;/p&gt;

&lt;p&gt;The MCP Portal path has a different trust mechanism.&lt;/p&gt;

&lt;p&gt;My study had quietly invented an upstream capability.&lt;/p&gt;

&lt;p&gt;Review round 2 caught it.&lt;/p&gt;

&lt;p&gt;That is a useful kind of failure.&lt;/p&gt;

&lt;p&gt;Before asking whether a system preserves some property, first verify that the state you are testing is actually reachable.&lt;/p&gt;

&lt;h2&gt;
  
  
  A read-only classification can bypass the action queue
&lt;/h2&gt;

&lt;p&gt;The tool classifier honors an upstream &lt;code&gt;readOnlyHint&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That means a tool classified as read-only can execute without going through the side-effect approval path.&lt;/p&gt;

&lt;p&gt;Cloudflare's own source comments acknowledge the tradeoff.&lt;/p&gt;

&lt;p&gt;This is not the same as saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The approval system is bypassable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The condition is narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If an upstream server labels a mutating operation as read-only, the platform may treat it as a read rather than as a staged action.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changed the claim I was allowed to make.&lt;/p&gt;

&lt;p&gt;"All external effects go through the approval queue" was too broad.&lt;/p&gt;

&lt;p&gt;The source did not support it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The outer action log cannot represent every execution outcome
&lt;/h2&gt;

&lt;p&gt;The workspace-facing action state has three values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ActionState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;approved&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rejected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the MCP connector's internal store has additional states, including failure.&lt;/p&gt;

&lt;p&gt;That creates an interesting observability gap.&lt;/p&gt;

&lt;p&gt;If a staged call is dispatched but the call fails before the outer layer receives a normal completion, the private connector record can know the call failed while the outer record remains:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The outer log does not have a state capable of expressing what actually happened.&lt;/p&gt;

&lt;p&gt;That matters if you are trying to reconstruct history later.&lt;/p&gt;

&lt;p&gt;A missing state is not merely a UI inconvenience.&lt;/p&gt;

&lt;p&gt;It limits what can be proven from that record.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;approved&lt;/code&gt; is not proof that the external effect happened
&lt;/h2&gt;

&lt;p&gt;The pinned MCP implementation describes its guarantee as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;at most once, not exactly once&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;An &lt;code&gt;approved&lt;/code&gt; record tells you something about the platform's control flow.&lt;/p&gt;

&lt;p&gt;It does not give you an independently verifiable receipt from the external system saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yes, this effect happened.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no universal external transaction identifier or effect receipt attached to the action record.&lt;/p&gt;

&lt;p&gt;So I had to separate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;platform approved execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;external world changed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are not the same statement.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;appliedAt&lt;/code&gt; is not necessarily "when the action was applied"
&lt;/h2&gt;

&lt;p&gt;Another assumption cost me an actual study bug.&lt;/p&gt;

&lt;p&gt;The field name suggested one interpretation.&lt;/p&gt;

&lt;p&gt;The implementation had another.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;appliedAt&lt;/code&gt; is populated when an action is approved &lt;strong&gt;and&lt;/strong&gt; when it is rejected.&lt;/p&gt;

&lt;p&gt;So it is closer to:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;than:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;A verifier reconstructing a timeline from the name alone could silently produce the wrong history.&lt;/p&gt;

&lt;p&gt;Field names are not protocol semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  The useful join key is intentionally not public
&lt;/h2&gt;

&lt;p&gt;The Gatekeeper has an opaque internal action identifier.&lt;/p&gt;

&lt;p&gt;The client-facing action log does not expose it.&lt;/p&gt;

&lt;p&gt;The source explicitly says that identifier should not be provided to the client.&lt;/p&gt;

&lt;p&gt;That is a reasonable encapsulation decision.&lt;/p&gt;

&lt;p&gt;But it has a consequence for my study.&lt;/p&gt;

&lt;p&gt;A holder of the published action log cannot independently join that log to the connector's private execution records using the actual internal identity.&lt;/p&gt;

&lt;p&gt;Retention makes the problem stronger.&lt;/p&gt;

&lt;p&gt;The outer log is durable.&lt;/p&gt;

&lt;p&gt;The private store retains only a bounded number of settled records.&lt;/p&gt;

&lt;p&gt;Eventually, historical records can exist on one side after their corresponding private records have disappeared on the other.&lt;/p&gt;

&lt;p&gt;Again, this is not necessarily a platform defect.&lt;/p&gt;

&lt;p&gt;It means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The platform's runtime records were not designed as a permanent offline evidence bundle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My study initially treated them as though they were.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval rules do not create historical policy evidence
&lt;/h2&gt;

&lt;p&gt;Auto-approval rules can be removed.&lt;/p&gt;

&lt;p&gt;The retained records do not necessarily preserve a tombstone proving:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This rule existed at time T and authorized this action then.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So an action can have been validly auto-approved under the platform's state at execution time without leaving enough retained evidence to prove that fact later.&lt;/p&gt;

&lt;p&gt;This connects directly to a problem I had already encountered in another study:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;current state and historical authority are different things.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  This does not mean Cloudflare OS is doing the wrong job
&lt;/h2&gt;

&lt;p&gt;This distinction is important.&lt;/p&gt;

&lt;p&gt;The pinned platform is primarily governing execution &lt;strong&gt;in the moment&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;capability isolation&lt;/li&gt;
&lt;li&gt;connector mediation&lt;/li&gt;
&lt;li&gt;human approval&lt;/li&gt;
&lt;li&gt;auto-approval constraints&lt;/li&gt;
&lt;li&gt;information-flow controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My experiment was asking it to support something different:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Produce enough durable evidence that an independent third party can later reconstruct why a particular action was permitted and prove the causal relationship offline.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are different responsibilities.&lt;/p&gt;

&lt;p&gt;The mistake would be to infer the second from the existence of the first.&lt;/p&gt;

&lt;p&gt;And Cloudflare OS is an early open-source project.&lt;/p&gt;

&lt;p&gt;Its architecture and retained evidence model can evolve.&lt;/p&gt;

&lt;p&gt;This study is about the contract exposed by the &lt;strong&gt;pinned version&lt;/strong&gt;, not a prediction about where the project will end up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then the reviewers started attacking the study itself
&lt;/h2&gt;

&lt;p&gt;The upstream findings were only half of the story.&lt;/p&gt;

&lt;p&gt;I also ran cross-vendor adversarial review against the study.&lt;/p&gt;

&lt;p&gt;The reviewer was a different vendor's model, running read-only with the study tree and pinned upstream available.&lt;/p&gt;

&lt;p&gt;The instruction was essentially:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find every way this experiment could produce a result stronger than what the machinery actually proves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Five rounds.&lt;/p&gt;

&lt;p&gt;Every round said:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DO NOT FREEZE.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The sequence is probably the most useful artifact the study has produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 1 - seven blockers
&lt;/h2&gt;

&lt;p&gt;The first review found something embarrassingly fundamental.&lt;/p&gt;

&lt;p&gt;My bridge wrote a commitment describing the action it believed it was binding.&lt;/p&gt;

&lt;p&gt;Later, the verifier checked downstream records against that same commitment.&lt;/p&gt;

&lt;p&gt;So if the bridge committed the wrong action in the first place, every downstream check could still agree.&lt;/p&gt;

&lt;p&gt;The system would report:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;But all it had shown was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;everything matches the bridge's own mistake
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is self-consistency.&lt;/p&gt;

&lt;p&gt;Not independent verification.&lt;/p&gt;

&lt;p&gt;The distinction sounds obvious after someone points it out.&lt;/p&gt;

&lt;p&gt;It was not obvious enough when I built the first version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 2 - five blockers, including fixes that were themselves wrong
&lt;/h2&gt;

&lt;p&gt;Round 2 did something even more useful.&lt;/p&gt;

&lt;p&gt;It rejected several of my Round 1 repairs.&lt;/p&gt;

&lt;p&gt;One was the impossible vetted generic-MCP scenario.&lt;/p&gt;

&lt;p&gt;Another involved what I had called "evidence backing."&lt;/p&gt;

&lt;p&gt;The study checked whether an evidence digest looked like a valid digest.&lt;/p&gt;

&lt;p&gt;But there was no retained evidence artifact whose bytes could actually be hashed and compared.&lt;/p&gt;

&lt;p&gt;I had built:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;digest-shaped string exists
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and described it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;evidence is cryptographically backed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are not remotely the same claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 3 - the historical witness problem
&lt;/h2&gt;

&lt;p&gt;I had built a replay mechanism intended to establish that an approval had been lawful at the time it occurred.&lt;/p&gt;

&lt;p&gt;The witness proving historical state came from the very store being examined.&lt;/p&gt;

&lt;p&gt;That creates an obvious laundering path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;store claims historical state X
        |
        v
verifier asks same store for witness
        |
        v
store supplies evidence for X
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final check may be perfectly deterministic.&lt;/p&gt;

&lt;p&gt;The independence claim is still false.&lt;/p&gt;

&lt;p&gt;So the study claim got weaker.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;historical lawfulness proved&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;it became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;consistency with a self-asserted historical witness&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Much less impressive.&lt;/p&gt;

&lt;p&gt;Much more accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 4 - correct counts can hide the wrong cause
&lt;/h2&gt;

&lt;p&gt;This was the finding I would defend hardest.&lt;/p&gt;

&lt;p&gt;Imagine the records show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 approved action
1 external effect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The counts match.&lt;/p&gt;

&lt;p&gt;But the effect was actually produced by a &lt;strong&gt;different invocation with the same arguments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The original call never caused it.&lt;/p&gt;

&lt;p&gt;A cardinality check says:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The causal claim is false.&lt;/p&gt;

&lt;p&gt;The reviewer called this fatal.&lt;/p&gt;

&lt;p&gt;It was right.&lt;/p&gt;

&lt;p&gt;So instead of documenting the limitation, I changed the artifact.&lt;/p&gt;

&lt;p&gt;Effect attestations now need to carry the identity of the staged action that produced them.&lt;/p&gt;

&lt;p&gt;The check became an identity join rather than a count.&lt;/p&gt;

&lt;p&gt;That is a broader lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When causation matters, count matching is not identity matching.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Round 5 - one predicate left
&lt;/h2&gt;

&lt;p&gt;By Round 5, the reviewer found one blocker.&lt;/p&gt;

&lt;p&gt;One governed call had no commitment digest.&lt;/p&gt;

&lt;p&gt;The study checked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;number of governed calls == number of committed calls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the counts matched.&lt;/p&gt;

&lt;p&gt;But the unbound call sat outside the set the later verification actually examined.&lt;/p&gt;

&lt;p&gt;Once again:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;was pretending to establish:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Round 1 asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does this experiment verify anything independent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Round 5 asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should this exact predicate compare identities instead of counts?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That narrowing is the best evidence I have that the study is converging.&lt;/p&gt;

&lt;p&gt;Not that the reviewer started agreeing with me.&lt;/p&gt;

&lt;p&gt;That the disagreements became smaller and more mechanical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four things I personally wrote down that were false
&lt;/h2&gt;

&lt;p&gt;The reviewers were not the only source of correction.&lt;/p&gt;

&lt;p&gt;My own source-verification passes refuted several statements I had already committed.&lt;/p&gt;

&lt;p&gt;I think these are worth publishing because they show how easy it is for technically plausible prose to outrun the implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. "This component cannot be typechecked from the committed tree."
&lt;/h3&gt;

&lt;p&gt;False.&lt;/p&gt;

&lt;p&gt;It typechecks after one committed code-generation step.&lt;/p&gt;

&lt;p&gt;My own verification refuted the claim before a reviewer reached it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "The adapter reproduces upstream behavior."
&lt;/h3&gt;

&lt;p&gt;Not really.&lt;/p&gt;

&lt;p&gt;Six documents cited a check that supposedly compared my adapter against upstream.&lt;/p&gt;

&lt;p&gt;The implementation effectively did:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f(x) == f(x)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An automated edit that was supposed to insert the real comparison had silently failed because the anchor string had been renamed.&lt;/p&gt;

&lt;p&gt;The commit message claimed the fix had landed.&lt;/p&gt;

&lt;p&gt;The file disagreed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. "The tool name never appears in the log."
&lt;/h3&gt;

&lt;p&gt;False.&lt;/p&gt;

&lt;p&gt;It appears in prose and structurally inside the action-kind tag.&lt;/p&gt;

&lt;p&gt;A grep disproved the claim.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. "There is no action-log export anywhere."
&lt;/h3&gt;

&lt;p&gt;Also false.&lt;/p&gt;

&lt;p&gt;There is a &lt;code&gt;listActions()&lt;/code&gt; API.&lt;/p&gt;

&lt;p&gt;The accurate claim was narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There is no signed, complete, offline-verifiable action-history export supporting the evidence properties this study requires.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The weaker sentence is the true one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would carry into any similar experiment
&lt;/h2&gt;

&lt;p&gt;A few practices survived all five review rounds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the reviewer
&lt;/h3&gt;

&lt;p&gt;Do not immediately accept an adversarial review because it sounds sophisticated.&lt;/p&gt;

&lt;p&gt;For every load-bearing finding, I went back to the source and reproduced the claim.&lt;/p&gt;

&lt;p&gt;Most reviewer findings held.&lt;/p&gt;

&lt;p&gt;A few needed narrower wording.&lt;/p&gt;

&lt;p&gt;Sometimes the verification produced a better repair than the reviewer proposed.&lt;/p&gt;

&lt;p&gt;Adversarial review still needs verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix the missing mechanism when you own the artifact
&lt;/h2&gt;

&lt;p&gt;Some findings really are limitations.&lt;/p&gt;

&lt;p&gt;Others identify missing machinery you can actually add.&lt;/p&gt;

&lt;p&gt;The substituted-causation problem was not something I wanted to solve with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This study does not claim causality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Causality was the point of that artifact.&lt;/p&gt;

&lt;p&gt;So the artifact gained the missing identity.&lt;/p&gt;

&lt;p&gt;A disclaimer should not substitute for a mechanism you can reasonably build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Narrow claims aggressively
&lt;/h2&gt;

&lt;p&gt;Several claims became weaker during review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proved historical lawfulness
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;consistent with a self-asserted witness
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;retained-preimage consistency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That can feel like losing ground.&lt;/p&gt;

&lt;p&gt;It is actually progress.&lt;/p&gt;

&lt;p&gt;A narrow falsifiable claim is more useful than a broad impressive sentence whose evidence does not support it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delete checks that cannot fire
&lt;/h2&gt;

&lt;p&gt;A verdict branch with no reachable input is not defense in depth.&lt;/p&gt;

&lt;p&gt;It is dead prose written as code.&lt;/p&gt;

&lt;p&gt;The same goes for schema fields with only one possible reachable value.&lt;/p&gt;

&lt;p&gt;If a mechanism cannot distinguish two states, do not describe it as though it does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify scripted edits after they run
&lt;/h2&gt;

&lt;p&gt;This one is painfully mundane.&lt;/p&gt;

&lt;p&gt;An automated source edit silently failed.&lt;/p&gt;

&lt;p&gt;The script exited.&lt;/p&gt;

&lt;p&gt;The commit succeeded.&lt;/p&gt;

&lt;p&gt;The message described the intended change.&lt;/p&gt;

&lt;p&gt;The implementation never changed.&lt;/p&gt;

&lt;p&gt;Now every scripted edit in this study gets verified against the resulting file.&lt;/p&gt;

&lt;p&gt;"Automation ran" is not evidence that the intended change happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  A study can be honest and still not be ready
&lt;/h2&gt;

&lt;p&gt;Five consecutive DO-NOT-FREEZE verdicts are not something I need to hide.&lt;/p&gt;

&lt;p&gt;They are the current result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/015-cloudflare-os-boundary" rel="noopener noreferrer"&gt;Study 015 - Cloudflare OS Boundary&lt;/a&gt;&lt;/strong&gt; remains merged as a &lt;strong&gt;draft&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The study index says that explicitly.&lt;/p&gt;

&lt;p&gt;There is no registered result.&lt;/p&gt;

&lt;p&gt;Nothing in the current study should be cited as though the experiment has already established the decision-to-action binding it is trying to test.&lt;/p&gt;

&lt;p&gt;That is the correct state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary that remains open
&lt;/h2&gt;

&lt;p&gt;Even if every current blocker is resolved, one problem remains outside both systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staleness and rollback.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suppose a decision was correctly produced under policy version 3.&lt;/p&gt;

&lt;p&gt;Later, version 4 becomes authoritative.&lt;/p&gt;

&lt;p&gt;Someone presents an old-but-valid decision under version 3.&lt;/p&gt;

&lt;p&gt;Or they coherently reconstruct a history around version 3.&lt;/p&gt;

&lt;p&gt;Every digest may still match.&lt;/p&gt;

&lt;p&gt;Every signature may still verify.&lt;/p&gt;

&lt;p&gt;The chain can be perfectly self-consistent.&lt;/p&gt;

&lt;p&gt;What it cannot say about itself is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Was this policy still authoritative at the relevant point in time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That requires an anchor outside the chain.&lt;/p&gt;

&lt;p&gt;Something needs to establish the history of authoritative policy state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;policy identity
      |
      v
revision
      |
      v
artifact digest
      |
      v
effective time
      |
      v
next revision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is similar to a boundary that surfaced in our earlier &lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/014-openworkproof-binding" rel="noopener noreferrer"&gt;Study 014 - OpenWorkProof binding experiment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A self-consistent proof can establish lineage inside its trust boundary.&lt;/p&gt;

&lt;p&gt;It cannot establish that the state it contains is still the externally authoritative state.&lt;/p&gt;

&lt;p&gt;That is not a Cloudflare OS problem.&lt;/p&gt;

&lt;p&gt;It is not an OpenWorkProof problem.&lt;/p&gt;

&lt;p&gt;It is not something a Judgment Pack should silently decide for itself.&lt;/p&gt;

&lt;p&gt;It is a separate trust problem.&lt;/p&gt;

&lt;p&gt;And it is probably the next one worth defining carefully.&lt;/p&gt;




&lt;p&gt;The current study is public here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/015-cloudflare-os-boundary" rel="noopener noreferrer"&gt;Study 015 - Cloudflare OS Boundary&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the draft study protocol&lt;/li&gt;
&lt;li&gt;the five verbatim cross-vendor review rounds&lt;/li&gt;
&lt;li&gt;the disposition of every finding&lt;/li&gt;
&lt;li&gt;the withdrawn and narrowed claims&lt;/li&gt;
&lt;li&gt;the deviations record&lt;/li&gt;
&lt;li&gt;the pinned upstream identity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is evidence of a review process and of several architectural boundaries.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;not&lt;/strong&gt; a frozen experimental result.&lt;/p&gt;

&lt;p&gt;And at this point, that distinction is the entire point.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>testing</category>
      <category>architecture</category>
    </item>
    <item>
      <title>When Agents Can Run Anywhere, Where Should Organizational Judgment Live?</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 19:22:44 +0000</pubDate>
      <link>https://dev.to/kikashy/when-agents-can-run-anywhere-where-should-organizational-judgment-live-161c</link>
      <guid>https://dev.to/kikashy/when-agents-can-run-anywhere-where-should-organizational-judgment-live-161c</guid>
      <description>&lt;p&gt;Two developments today came from very different parts of the agent stack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://research.meta.ai/blog/introducing-muse-glimmer-open-agentic-model" rel="noopener noreferrer"&gt;Meta released Muse Glimmer&lt;/a&gt;, a 30B open model designed for local, always-on agent workflows. It can run on consumer hardware and is trained for tool use, long-running execution, multimodal input, and failure recovery.&lt;/p&gt;

&lt;p&gt;At the enterprise layer, &lt;a href="https://www.businesswire.com/news/home/20260810927887/en/Realpage-Introduces-the-Lumina-AI-Suite-Uniting-AI-Agents-Operational-Intelligence-and-Institutional-Reasoning-in-One-Trusted-Platform-for-Real-Estate" rel="noopener noreferrer"&gt;RealPage introduced the Lumina AI Suite&lt;/a&gt;, combining agents, a governed knowledge graph, operational intelligence, institutional intelligence, and MCP-based access to external models.&lt;/p&gt;

&lt;p&gt;One development is pushing agents down onto local hardware.&lt;/p&gt;

&lt;p&gt;The other is building more enterprise infrastructure around them.&lt;/p&gt;

&lt;p&gt;Together they make an architectural question easier to see.&lt;/p&gt;

&lt;p&gt;If the model can increasingly run anywhere, where should the organization's actual decision criteria live?&lt;/p&gt;

&lt;h2&gt;
  
  
  The model is becoming one component of the system
&lt;/h2&gt;

&lt;p&gt;Consider a procurement agent reviewing a new vendor.&lt;/p&gt;

&lt;p&gt;It might retrieve:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vendor identity
sanctions status
tax documentation
annual contract value
internal risk classification
budget information
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Those facts could come from several places.&lt;/p&gt;

&lt;p&gt;A knowledge graph can connect them.&lt;/p&gt;

&lt;p&gt;An MCP server can expose them.&lt;/p&gt;

&lt;p&gt;An identity system can decide whether the agent is allowed to retrieve them.&lt;/p&gt;

&lt;p&gt;A gateway can determine whether the agent is permitted to call the vendor-management API.&lt;/p&gt;

&lt;p&gt;But none of those necessarily answers:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;should this vendor be approved?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That decision could depend on relationships between the facts.&lt;/p&gt;

&lt;p&gt;A sanctions match might be a hard stop.&lt;/p&gt;

&lt;p&gt;A particular spend threshold might require committee review.&lt;/p&gt;

&lt;p&gt;Handling personal data might introduce another evidence requirement.&lt;/p&gt;

&lt;p&gt;Missing tax documentation might mean the correct outcome is neither approval nor rejection.&lt;/p&gt;

&lt;p&gt;It may mean:&lt;/p&gt;

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

&lt;/div&gt;

&lt;p&gt;The interesting boundary is between obtaining the information and applying the organization's decision criteria to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Institutional knowledge is not necessarily institutional judgment
&lt;/h2&gt;

&lt;p&gt;RealPage describes part of its new architecture as "institutional intelligence."&lt;/p&gt;

&lt;p&gt;The platform builds on a governed knowledge graph so its agents and analytics operate from a consistent understanding of the real-estate domain.&lt;/p&gt;

&lt;p&gt;That solves an important problem.&lt;/p&gt;

&lt;p&gt;An enterprise agent should not reconstruct the organization from random documents every time it receives a request.&lt;/p&gt;

&lt;p&gt;But knowing the organization's facts and relationships is not quite the same thing as knowing how the organization makes a decision.&lt;/p&gt;

&lt;p&gt;Suppose the system knows that a property has exceeded its maintenance budget.&lt;/p&gt;

&lt;p&gt;That is knowledge.&lt;/p&gt;

&lt;p&gt;Suppose it also knows that a particular repair is safety-critical, that emergency work below one threshold may proceed automatically, and that anything above another threshold requires regional approval.&lt;/p&gt;

&lt;p&gt;That begins to look like judgment.&lt;/p&gt;

&lt;p&gt;The distinction matters because the two things may have different owners and different change cycles.&lt;/p&gt;

&lt;p&gt;Data teams may own the knowledge graph.&lt;/p&gt;

&lt;p&gt;Security teams may own tool authorization.&lt;/p&gt;

&lt;p&gt;Business or risk owners may own the decision criteria.&lt;/p&gt;

&lt;p&gt;Agents use all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is the boundary I am exploring with Judgment Pack
&lt;/h2&gt;

&lt;p&gt;The Judgment Pack Specification is an attempt to make the third category explicit.&lt;/p&gt;

&lt;p&gt;A Judgment Pack can define what evidence matters, how evidence is interpreted, which rules and exceptions apply, how missing information is handled, and which dispositions are possible.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;organizational knowledge
        |
        v
    evidence
        |
        v
   judgment
        |
        v
  disposition
        |
        v
execution policy
        |
        v
     action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The model does not disappear from this architecture.&lt;/p&gt;

&lt;p&gt;It can gather evidence, interpret requests, call tools, plan workflows, and interact with people.&lt;/p&gt;

&lt;p&gt;The difference is that changing the model does not automatically change the organization's definition of the correct decision.&lt;/p&gt;

&lt;p&gt;That property becomes more interesting when a model like Muse Glimmer can run locally.&lt;/p&gt;

&lt;p&gt;A company might use a frontier model for one workflow, a local model for another, and a specialized model for a third.&lt;/p&gt;

&lt;p&gt;Should each model independently reconstruct the company's decision logic?&lt;/p&gt;

&lt;p&gt;Or should they operate against the same reviewed judgment artifact?&lt;/p&gt;

&lt;p&gt;That is something we can test.&lt;/p&gt;

&lt;h2&gt;
  
  
  The safety research is moving toward similar distinctions
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://safe-ai-workshop.github.io/uai-2026/" rel="noopener noreferrer"&gt;SafeAI workshop at UAI 2026&lt;/a&gt; published its accepted program today.&lt;/p&gt;

&lt;p&gt;Several of the papers sit surprisingly close to this problem.&lt;/p&gt;

&lt;p&gt;There is work on auditable agent memory, authority-bearing tool parameters, system assurance, abstention, and a paper titled "Underspecified, Not Uncertain: Context Ambiguity Versus Knowledge Gaps in Safety-Critical LLM Use."&lt;/p&gt;

&lt;p&gt;I find that last distinction particularly useful.&lt;/p&gt;

&lt;p&gt;There are at least two reasons an agent may not be able to make a reliable decision.&lt;/p&gt;

&lt;p&gt;The model may be uncertain.&lt;/p&gt;

&lt;p&gt;Or the decision itself may be underspecified because a required fact is missing.&lt;/p&gt;

&lt;p&gt;Those should not automatically produce the same behavior.&lt;/p&gt;

&lt;p&gt;If the system has not completed a sanctions check, switching to a larger model does not create the missing evidence.&lt;/p&gt;

&lt;p&gt;The correct response may simply be:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cannot decide yet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is one reason I think explicit evidence requirements matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating possibilities is getting easier
&lt;/h2&gt;

&lt;p&gt;A different example appeared today in scientific AI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://techcrunch.com/2026/08/10/discovered-materials-is-playing-ai-whack-a-mole-to-hunt-cooler-chips/" rel="noopener noreferrer"&gt;Discovered Materials&lt;/a&gt; raised a $9 million seed round to use swarms of agents to search for new semiconductor materials.&lt;/p&gt;

&lt;p&gt;Its agents can generate thousands of candidates, which are then filtered using physics simulations and eventually laboratory validation.&lt;/p&gt;

&lt;p&gt;One investor involved in the round made an interesting observation: generating candidates may no longer be the bottleneck. Filtering and synthesizing the right candidates is.&lt;/p&gt;

&lt;p&gt;I would not equate scientific validation with enterprise judgment.&lt;/p&gt;

&lt;p&gt;But there is a shared pattern.&lt;/p&gt;

&lt;p&gt;Better models make candidate generation cheaper.&lt;/p&gt;

&lt;p&gt;Agents can produce more recommendations, plans, actions, vendors, hypotheses, and possible answers than people could manually create.&lt;/p&gt;

&lt;p&gt;That increases the importance of selection.&lt;/p&gt;

&lt;p&gt;What evidence makes one candidate acceptable?&lt;/p&gt;

&lt;p&gt;Which criteria eliminate another?&lt;/p&gt;

&lt;p&gt;When should the system abstain?&lt;/p&gt;

&lt;p&gt;Who owns those criteria?&lt;/p&gt;

&lt;p&gt;How do they change without allowing the agent to rewrite its own judge?&lt;/p&gt;

&lt;h2&gt;
  
  
  A small experiment could make this concrete
&lt;/h2&gt;

&lt;p&gt;Muse Glimmer creates a useful opportunity to test the architecture rather than debate it.&lt;/p&gt;

&lt;p&gt;Take one existing enterprise workflow.&lt;/p&gt;

&lt;p&gt;Run it with a local Muse Glimmer agent.&lt;/p&gt;

&lt;p&gt;Run the same workflow with a frontier cloud model.&lt;/p&gt;

&lt;p&gt;Let both agents gather the evidence.&lt;/p&gt;

&lt;p&gt;Keep the Judgment Pack and evaluator unchanged.&lt;/p&gt;

&lt;p&gt;Then compare what changes.&lt;/p&gt;

&lt;p&gt;If model capability changes the quality of evidence acquisition but not the organization's final decision semantics, that would support a meaningful separation between agent intelligence and organizational judgment.&lt;/p&gt;

&lt;p&gt;If it does not, that would be equally useful to learn.&lt;/p&gt;

&lt;p&gt;As agent models become cheaper, smaller, and easier to swap, I think the durable parts of an enterprise AI architecture will become easier to identify.&lt;/p&gt;

&lt;p&gt;The question is whether organizational judgment is one of them.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Receipt Was Cryptographically Valid. The Action Didn't Match the Judgment.</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:53:38 +0000</pubDate>
      <link>https://dev.to/kikashy/the-receipt-was-cryptographically-valid-the-action-didnt-match-the-judgment-2b20</link>
      <guid>https://dev.to/kikashy/the-receipt-was-cryptographically-valid-the-action-didnt-match-the-judgment-2b20</guid>
      <description>&lt;p&gt;Here is the attack that motivated our newest experiment.&lt;/p&gt;

&lt;p&gt;A policy evaluator receives an expense request for &lt;strong&gt;250.00&lt;/strong&gt; and produces a disposition that supports that action.&lt;/p&gt;

&lt;p&gt;That judgment is committed into a signed work order. A capability grant is issued. The action executes. Receipts are produced. Evidence is attached. An acceptance is signed.&lt;/p&gt;

&lt;p&gt;An offline verifier checks the bundle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;signatures valid&lt;/li&gt;
&lt;li&gt;causal parents correct&lt;/li&gt;
&lt;li&gt;evidence digests correct&lt;/li&gt;
&lt;li&gt;authorization chain valid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything passes.&lt;/p&gt;

&lt;p&gt;Except the action that now appears in the coherently re-signed chain is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2500.00&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An insider changed the amount after the judgment and re-signed the affected artifacts with valid keys.&lt;/p&gt;

&lt;p&gt;From the execution protocol's point of view, the new chain can still be internally consistent.&lt;/p&gt;

&lt;p&gt;But it is no longer the action supported by the recorded judgment.&lt;/p&gt;

&lt;p&gt;That distinction became &lt;strong&gt;Study 014&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this study came from
&lt;/h2&gt;

&lt;p&gt;Study 014 follows directly from &lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/013-agent-eval-forge-integration" rel="noopener noreferrer"&gt;Study 013 - Agent Eval Forge integration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Study 013 asked the &lt;strong&gt;runtime behavior&lt;/strong&gt; question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the judgment is correct, does the surrounding agent actually respect it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We integrated JPS with an independently developed agent regression harness, deliberately injected decision-layer and integration-layer failures, and measured which layer caught what.&lt;/p&gt;

&lt;p&gt;That study showed an important separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the judgment layer can detect errors inside the decision semantics&lt;/li&gt;
&lt;li&gt;an external trajectory harness can detect cases where the application misuses an otherwise correct decision&lt;/li&gt;
&lt;li&gt;neither layer automatically proves the historical relationship between the judgment and the action afterward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Study 014 starts exactly at that last boundary.&lt;/p&gt;

&lt;p&gt;It asks the &lt;strong&gt;provenance&lt;/strong&gt; question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After execution, can an independent third party prove which recorded judgment corresponds to which recorded action?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the progression is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Study 013
Did the application behave consistently with the judgment?

        ↓

Study 014
Can a third party later verify the binding between
the judgment and the executed action?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why EvalForge and OpenWorkProof are different
&lt;/h3&gt;

&lt;p&gt;The external systems in Studies 013 and 014 solve different problems today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/deghosal-2026/agent-eval-forge" rel="noopener noreferrer"&gt;Agent Eval Forge&lt;/a&gt;, as it currently exists, is primarily a regression-testing harness for agents. You define scenarios and expected behavior, run an agent, and inspect the resulting trajectory - which tools it called, which arguments it passed, whether it crossed a safety boundary, and whether a change introduced a regression.&lt;/p&gt;

&lt;p&gt;Its question is roughly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did this version of the agent behave the way we expected?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;OpenWorkProof&lt;/a&gt;, in its current form, operates further downstream. It creates signed work orders, capability grants, execution receipts, evidence relationships, and an offline verification bundle.&lt;/p&gt;

&lt;p&gt;Its question is closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Was this recorded action authorized, and can another party later verify the signed execution and evidence chain?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why they were useful for two different studies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JPS
What should happen under these facts and rules?
        |
        +-------------------------+
        |                         |
        v                         v
Agent Eval Forge             OpenWorkProof
Study 013                    Study 014

Did the system              Can the recorded
behave correctly?           authorization and
                            execution lineage
                            be verified afterward?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are descriptions of the projects &lt;strong&gt;as they exist today&lt;/strong&gt;, not permanent category boundaries.&lt;/p&gt;

&lt;p&gt;Both are early open-source projects, and their capabilities could expand or converge over time.&lt;/p&gt;

&lt;p&gt;EvalForge could add more runtime verification or provenance features. OpenWorkProof could add richer policy evaluation, testing, or regression capabilities. JPS itself may also expand its integration surface.&lt;/p&gt;

&lt;p&gt;The useful distinction for these studies is therefore not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These projects can never overlap.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which responsibility did each independently developed implementation actually own at the pinned version we tested?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Study 013 used EvalForge as an external observer of agent behavior.&lt;/p&gt;

&lt;p&gt;Study 014 uses OpenWorkProof as an external protocol for authorization and receipted execution lineage.&lt;/p&gt;

&lt;p&gt;That keeps the experimental claims tied to real implementations rather than drawing permanent product-category boxes around three projects that are still evolving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two independently designed layers
&lt;/h2&gt;

&lt;p&gt;Study 014 composes two systems that were designed independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judgment Pack / JPS&lt;/strong&gt; handles judgment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given this exact pack and these exact facts, what disposition follows?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;OpenWorkProof&lt;/strong&gt; handles authorization and execution lineage:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Was this actor allowed to perform this action, what happened afterward, and does the signed receipt chain verify?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The distinction matters.&lt;/p&gt;

&lt;p&gt;JPS does not issue capability grants.&lt;/p&gt;

&lt;p&gt;A JPS disposition does not authorize execution.&lt;/p&gt;

&lt;p&gt;OpenWorkProof does not decide whether a business judgment is substantively correct.&lt;/p&gt;

&lt;p&gt;Each system owns a different part of the chain.&lt;/p&gt;

&lt;p&gt;Study 014 asks whether those parts can be bound strongly enough to survive adversarial substitution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why signatures alone are not enough
&lt;/h2&gt;

&lt;p&gt;A digital signature tells you something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These bytes were signed by this key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What it does not automatically tell you is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These bytes still represent the same business judgment that originally justified this action.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gap becomes especially interesting under an insider threat model.&lt;/p&gt;

&lt;p&gt;Simple tampering is easy to detect.&lt;/p&gt;

&lt;p&gt;Change an amount without re-signing the receipt and signature verification fails.&lt;/p&gt;

&lt;p&gt;But suppose the attacker controls valid signing keys.&lt;/p&gt;

&lt;p&gt;They can change the action and construct a new, cryptographically valid chain.&lt;/p&gt;

&lt;p&gt;Now the question is no longer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Was something tampered with?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is the newly valid chain still bound to the exact judgment, facts, and action that belong together?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was the attack surface we wanted to test.&lt;/p&gt;

&lt;h2&gt;
  
  
  We did not modify OpenWorkProof
&lt;/h2&gt;

&lt;p&gt;This was important methodologically.&lt;/p&gt;

&lt;p&gt;We pinned OpenWorkProof at commit &lt;code&gt;8eeca6f&lt;/code&gt; and used its &lt;code&gt;verify_acceptance_bundle&lt;/code&gt; verifier unchanged.&lt;/p&gt;

&lt;p&gt;For the pinned version we tested, the cleanest interoperability boundary was to let OpenWorkProof remain unaware of JPS.&lt;/p&gt;

&lt;p&gt;OpenWorkProof can carry external data inside fields it signs without needing to understand what that data means.&lt;/p&gt;

&lt;p&gt;So we created a small adapter between the two systems.&lt;/p&gt;

&lt;p&gt;The adapter builds a &lt;strong&gt;judgment commitment&lt;/strong&gt; over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exact Judgment Pack bytes&lt;/li&gt;
&lt;li&gt;exact normalized input bytes&lt;/li&gt;
&lt;li&gt;canonical JPS disposition&lt;/li&gt;
&lt;li&gt;evaluator replay tuple&lt;/li&gt;
&lt;li&gt;exact authorized action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That commitment is then carried at signed points in the OpenWorkProof chain.&lt;/p&gt;

&lt;p&gt;The verification ceremony has three separate layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1 - OpenWorkProof verification
&lt;/h3&gt;

&lt;p&gt;Are the signatures, grants, causal relationships, authorization windows, receipts, and evidence sets internally valid?&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2 - judgment binding
&lt;/h3&gt;

&lt;p&gt;Do the retained pack, facts, disposition, and action recompute to the commitment carried by the signed chain?&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3 - deterministic replay
&lt;/h3&gt;

&lt;p&gt;If we evaluate the retained pack again with the retained inputs and pinned evaluator, do we reproduce the recorded disposition?&lt;/p&gt;

&lt;p&gt;No layer is asked to pretend it knows something it does not.&lt;/p&gt;

&lt;p&gt;And importantly, we do not claim that both signed commitment points are independently necessary. In this study they are defense in depth, not a proven minimal construction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then we tried to break it
&lt;/h2&gt;

&lt;p&gt;The locked study stratum contained &lt;strong&gt;39 registered cells&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That included 33 one-at-a-time mutation constructions, five validity controls, and one demonstration. Of those, 32 were endpoint cells used for the primary registered result.&lt;/p&gt;

&lt;p&gt;The attacks covered six broad areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;judgment artifact substitution&lt;/li&gt;
&lt;li&gt;fact substitution&lt;/li&gt;
&lt;li&gt;disposition forgery&lt;/li&gt;
&lt;li&gt;action substitution&lt;/li&gt;
&lt;li&gt;replay and drift&lt;/li&gt;
&lt;li&gt;causal-chain corruption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where it mattered, we tested two attacker capabilities.&lt;/p&gt;

&lt;p&gt;The easy version was ordinary tampering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Change something and leave the old signature behind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The harder version was coherent reminting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Change something and re-sign the resulting artifacts with valid study keys.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second category is where the architectural boundaries became much more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different layers caught different attacks
&lt;/h2&gt;

&lt;p&gt;The detection ownership ended up being one of the most useful outputs of the experiment.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenWorkProof caught chain failures
&lt;/h3&gt;

&lt;p&gt;The unchanged OpenWorkProof verifier caught the things its protocol is designed to own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;post-signature tampering&lt;/li&gt;
&lt;li&gt;broken causal parents&lt;/li&gt;
&lt;li&gt;authorization-window violations&lt;/li&gt;
&lt;li&gt;evidence-set inconsistencies&lt;/li&gt;
&lt;li&gt;malformed execution chains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, JPS did not need to know anything was wrong.&lt;/p&gt;

&lt;p&gt;The execution proof itself was invalid.&lt;/p&gt;

&lt;h3&gt;
  
  
  The binding layer caught judgment-side substitutions
&lt;/h3&gt;

&lt;p&gt;Now consider the opening attack.&lt;/p&gt;

&lt;p&gt;The amount changes from:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;250.00&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;2500.00&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and the attacker coherently re-signs the affected chain.&lt;/p&gt;

&lt;p&gt;The OpenWorkProof verifier can still pass because the newly produced artifacts are cryptographically self-consistent.&lt;/p&gt;

&lt;p&gt;But the adapter recomputes the action commitment and sees:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is not the action bound to the recorded judgment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The same pattern applied to substitutions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;different pack bytes&lt;/li&gt;
&lt;li&gt;different pack version&lt;/li&gt;
&lt;li&gt;changed facts&lt;/li&gt;
&lt;li&gt;different action&lt;/li&gt;
&lt;li&gt;altered action arguments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a weakness in signature verification.&lt;/p&gt;

&lt;p&gt;The signatures are doing exactly what signatures do.&lt;/p&gt;

&lt;p&gt;The missing property is &lt;strong&gt;semantic binding across independently owned layers&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replay caught another class
&lt;/h2&gt;

&lt;p&gt;There was a third failure class.&lt;/p&gt;

&lt;p&gt;Suppose an attacker creates retained artifacts that are internally consistent with one another.&lt;/p&gt;

&lt;p&gt;The pack digest matches.&lt;/p&gt;

&lt;p&gt;The facts digest matches.&lt;/p&gt;

&lt;p&gt;The recorded disposition matches the commitment.&lt;/p&gt;

&lt;p&gt;The chain verifies.&lt;/p&gt;

&lt;p&gt;But the disposition itself is forged.&lt;/p&gt;

&lt;p&gt;Now neither cryptographic integrity nor digest agreement necessarily tells you that the judgment is the one the evaluator would actually produce.&lt;/p&gt;

&lt;p&gt;So we replay it.&lt;/p&gt;

&lt;p&gt;Same pack.&lt;/p&gt;

&lt;p&gt;Same inputs.&lt;/p&gt;

&lt;p&gt;Same pinned evaluator.&lt;/p&gt;

&lt;p&gt;Recompute the disposition.&lt;/p&gt;

&lt;p&gt;Several mutations were caught &lt;strong&gt;only&lt;/strong&gt; at this layer.&lt;/p&gt;

&lt;p&gt;That gave us a useful separation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Internal consistency is not the same as semantic reproducibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The sharpest holdout case
&lt;/h2&gt;

&lt;p&gt;The locked matrix was useful, but it was still developed while we were building the study.&lt;/p&gt;

&lt;p&gt;So the reviewer authored a separate holdout set.&lt;/p&gt;

&lt;p&gt;Those eight cases were committed before freeze and were not executed until the registered attempt.&lt;/p&gt;

&lt;p&gt;One of them was particularly useful.&lt;/p&gt;

&lt;p&gt;The attacker constructed a &lt;strong&gt;self-consistent wrong action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The commitment agreed with the receipt.&lt;/p&gt;

&lt;p&gt;The receipt chain was valid.&lt;/p&gt;

&lt;p&gt;OpenWorkProof verification passed.&lt;/p&gt;

&lt;p&gt;But the action was not compatible with the recorded JPS disposition under the study's registered disposition-to-action map.&lt;/p&gt;

&lt;p&gt;Only that final binding check rejected it.&lt;/p&gt;

&lt;p&gt;That is probably the cleanest demonstration of the boundary we were trying to study:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agreement between attacker-controlled records is not enough to establish that the action follows from the judgment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The holdout finished:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8 / 8 adjudicated, 0 divergent, 0 pipeline-invalid.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The locked stratum also finished with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;39 / 39 adjudicated, 0 endpoint divergences, 0 pipeline-invalid.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things nothing inside the chain could detect
&lt;/h2&gt;

&lt;p&gt;I think these results matter as much as the successful detections.&lt;/p&gt;

&lt;p&gt;Two registered boundaries remained outside the composition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision currency
&lt;/h3&gt;

&lt;p&gt;Suppose the chain contains a perfectly valid judgment produced from a perfectly valid pack.&lt;/p&gt;

&lt;p&gt;But that pack is no longer the organizational policy that should be used today.&lt;/p&gt;

&lt;p&gt;Nothing inside the old chain can discover that by itself.&lt;/p&gt;

&lt;p&gt;The chain can prove:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This action corresponds to this recorded judgment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It cannot prove:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is still the judgment artifact the organization currently wants applied.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That requires some source of current authority outside the chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternative valid WorkOrder rollback
&lt;/h3&gt;

&lt;p&gt;A stronger insider can also coherently construct an alternative valid WorkOrder and remint the associated chain.&lt;/p&gt;

&lt;p&gt;All signatures can be valid.&lt;/p&gt;

&lt;p&gt;All internal references can agree.&lt;/p&gt;

&lt;p&gt;All three verification layers can pass.&lt;/p&gt;

&lt;p&gt;From inside that self-contained universe, there is nothing distinguishing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the currently authoritative chain&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;another coherently signed chain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Detecting that requires an &lt;strong&gt;external anchor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A transparency service, monotonic registry, trusted current-version pointer, or another external authority could potentially provide such an anchor.&lt;/p&gt;

&lt;p&gt;Study 014 does not.&lt;/p&gt;

&lt;p&gt;We registered that boundary instead of patching around it after seeing the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  One practical integration trap: unsigned metadata
&lt;/h2&gt;

&lt;p&gt;The study also found a much simpler lesson.&lt;/p&gt;

&lt;p&gt;OpenWorkProof has a generic evidence-bundle &lt;code&gt;metadata&lt;/code&gt; area.&lt;/p&gt;

&lt;p&gt;It is useful metadata.&lt;/p&gt;

&lt;p&gt;It is not a judgment-binding location.&lt;/p&gt;

&lt;p&gt;We created a demonstration where the JPS reference lived only there.&lt;/p&gt;

&lt;p&gt;Substitute that reference and OpenWorkProof verification remains green.&lt;/p&gt;

&lt;p&gt;That is expected because the verifier was never given a signed semantic commitment to check.&lt;/p&gt;

&lt;p&gt;For our integration, moving the commitment into signed carriage through &lt;code&gt;WorkOrder.objective&lt;/code&gt; and &lt;code&gt;AgentRequest.context_source_digest&lt;/code&gt; closed that gap.&lt;/p&gt;

&lt;p&gt;The practical lesson is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not confuse "included in the bundle" with "cryptographically bound to the action."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction may be worth making explicit in integration documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The study itself failed review several times before the system did
&lt;/h2&gt;

&lt;p&gt;The technical result matters.&lt;/p&gt;

&lt;p&gt;The review process may matter more.&lt;/p&gt;

&lt;p&gt;The review record spans seven cross-vendor rounds.&lt;/p&gt;

&lt;p&gt;The reviewer was a different vendor's model running read-only, with every prompt and response retained verbatim.&lt;/p&gt;

&lt;p&gt;Round 1 opened with &lt;strong&gt;14 findings&lt;/strong&gt;, including four blockers.&lt;/p&gt;

&lt;p&gt;Those blockers were not cosmetic.&lt;/p&gt;

&lt;p&gt;One found that our fixtures bypassed OpenWorkProof's real patch execution path.&lt;/p&gt;

&lt;p&gt;That would have made the verifier look stronger by testing chains that a real deployment might never produce.&lt;/p&gt;

&lt;p&gt;Another found that our own execution-receipt selection logic could be bypassed simply by omitting a marker.&lt;/p&gt;

&lt;p&gt;That was almost perfectly embarrassing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We built a study to detect integration bypasses, and the study's own integration ceremony had one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another found that what we initially wanted to call prospective evidence was actually postdictive.&lt;/p&gt;

&lt;p&gt;That forced the split between the locked replication and the reviewer-authored holdout.&lt;/p&gt;

&lt;p&gt;Another found that our freeze-integrity mechanism was not actually sufficient to freeze the study.&lt;/p&gt;

&lt;p&gt;Later rounds kept finding problems.&lt;/p&gt;

&lt;p&gt;One draft expectation was falsified during pilot work and changed before freeze.&lt;/p&gt;

&lt;p&gt;The holdout machinery itself was repeatedly tightened so the reviewer cases could not accidentally be executed early or silently rebuilt after seeing the result.&lt;/p&gt;

&lt;p&gt;Even the seventh review round still found a package-metadata shadowing path that needed to be closed before the study was ready.&lt;/p&gt;

&lt;p&gt;That is why I do not describe the review as validation that our initial design was good.&lt;/p&gt;

&lt;p&gt;It did the opposite.&lt;/p&gt;

&lt;p&gt;It repeatedly showed where it was not good enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the holdout matters
&lt;/h2&gt;

&lt;p&gt;The 39-cell locked stratum is useful evidence.&lt;/p&gt;

&lt;p&gt;But it is still a replication of behavior we had observed while constructing and hardening the study.&lt;/p&gt;

&lt;p&gt;The eight holdout cells are different.&lt;/p&gt;

&lt;p&gt;They belonged to the reviewer.&lt;/p&gt;

&lt;p&gt;They were registered before execution.&lt;/p&gt;

&lt;p&gt;Their first execution happened only after freeze.&lt;/p&gt;

&lt;p&gt;One was deliberately designed so that a specific review fix had to be correct or the study would diverge.&lt;/p&gt;

&lt;p&gt;All eight landed on their registered outcomes.&lt;/p&gt;

&lt;p&gt;That does not turn eight cases into a security proof.&lt;/p&gt;

&lt;p&gt;But it gives the study at least one genuinely prospective stratum rather than letting the entire result be a polished description of behavior already seen during development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a green result actually means
&lt;/h2&gt;

&lt;p&gt;After all of that, the final claim is narrower than the title might suggest.&lt;/p&gt;

&lt;p&gt;A green Study 014 verification means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The retained artifacts and receipted lineage are internally consistent, and the executed call represented by the chain is the one associated with the recorded judgment under the registered binding ceremony.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the policy is correct&lt;/li&gt;
&lt;li&gt;the supplied facts are true&lt;/li&gt;
&lt;li&gt;the JPS disposition authorizes the action&lt;/li&gt;
&lt;li&gt;the physical action necessarily happened&lt;/li&gt;
&lt;li&gt;OpenWorkProof is secure against arbitrary attackers&lt;/li&gt;
&lt;li&gt;JPS is conformant because this experiment passed&lt;/li&gt;
&lt;li&gt;every possible binding attack has been covered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trust roots still exist.&lt;/p&gt;

&lt;p&gt;The study relies on the work order's study-minted keys, the pinned JPS evaluator, the adapter implementation, and the retained artifact store.&lt;/p&gt;

&lt;p&gt;This is a binding and lineage result.&lt;/p&gt;

&lt;p&gt;Not a truth result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I think the separation matters
&lt;/h2&gt;

&lt;p&gt;Agent systems increasingly have several distinct control problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judgment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Given these facts and organizational rules, what should happen?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authority&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Is this actor permitted to perform that action?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What action actually ran?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can another party later verify the relationship among those three?&lt;/p&gt;

&lt;p&gt;Trying to make one component answer all four questions tends to blur the trust boundaries.&lt;/p&gt;

&lt;p&gt;Study 014 instead let each component remain narrow.&lt;/p&gt;

&lt;p&gt;JPS did not become an authorization protocol.&lt;/p&gt;

&lt;p&gt;OpenWorkProof did not become a business judgment engine.&lt;/p&gt;

&lt;p&gt;And the adapter did not attempt to decide either question.&lt;/p&gt;

&lt;p&gt;It only committed the relationship between them strongly enough that the relationship could be independently recomputed.&lt;/p&gt;

&lt;p&gt;That is the result I find most interesting.&lt;/p&gt;

&lt;p&gt;Not that every attack was caught.&lt;/p&gt;

&lt;p&gt;Some deliberately were not.&lt;/p&gt;

&lt;p&gt;The interesting part is that we can now say &lt;strong&gt;which layer should see which failure, and where the evidence simply does not exist to see it at all.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;

&lt;p&gt;Everything is public.&lt;/p&gt;

&lt;h3&gt;
  
  
  Study 014 - decision-to-execution binding
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/014-openworkproof-binding" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/014-openworkproof-binding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the study described in this post - offline provenance and binding between a recorded JPS judgment and the action represented in an OpenWorkProof receipt chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Study 013 - Agent Eval Forge integration
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/013-agent-eval-forge-integration" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/013-agent-eval-forge-integration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Study 013 is the runtime sibling of this work. It asks whether the surrounding agent/application actually behaves consistently with the judgment and uses an independently developed regression harness to distinguish judgment failures from integration failures.&lt;/p&gt;

&lt;p&gt;The two studies answer different questions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;013 - Did the system respect the judgment at runtime?

014 - Can we prove the judgment-to-action binding afterward?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Study 014 analysis
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/blob/main/studies/014-openworkproof-binding/ANALYSIS.md" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/blob/main/studies/014-openworkproof-binding/ANALYSIS.md&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Study 014 detection matrix
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/blob/main/studies/014-openworkproof-binding/results/primary-attempt-001/DETECTION-MATRIX.md" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/blob/main/studies/014-openworkproof-binding/results/primary-attempt-001/DETECTION-MATRIX.md&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-vendor review record
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/blob/main/studies/014-openworkproof-binding/PREREG-REVIEW.md" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/blob/main/studies/014-openworkproof-binding/PREREG-REVIEW.md&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenWorkProof
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/dengyier/OpenWorkProof" rel="noopener noreferrer"&gt;https://github.com/dengyier/OpenWorkProof&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Study 014 is not a security audit or endorsement of OpenWorkProof. It is one interoperability falsification study against one pinned commit, one Judgment Pack, one action encoding, and one adapter written by us.&lt;/p&gt;

&lt;p&gt;The most useful next question is probably the one the expected-undetected boundaries leave behind:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where should the external anchor live when a perfectly valid receipt chain is no longer the authoritative one?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Broke My AI Decision System 20 Ways to See Which Layer Would Catch What</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:02:14 +0000</pubDate>
      <link>https://dev.to/kikashy/i-broke-my-ai-decision-system-20-ways-to-see-which-layer-would-catch-what-36g0</link>
      <guid>https://dev.to/kikashy/i-broke-my-ai-decision-system-20-ways-to-see-which-layer-would-catch-what-36g0</guid>
      <description>&lt;p&gt;When an AI agent makes a business decision - approve this request, charge this fee, escalate this case - and something goes wrong, the failure can live in very different places.&lt;/p&gt;

&lt;p&gt;Sometimes &lt;strong&gt;the decision logic itself is wrong&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Someone encoded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$1000 or more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;more than $1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or removed an exception.&lt;/p&gt;

&lt;p&gt;Or treated missing evidence as &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Other times, &lt;strong&gt;the decision was correct but the surrounding application failed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The agent received the wrong fact.&lt;/p&gt;

&lt;p&gt;It was told to escalate and continued anyway.&lt;/p&gt;

&lt;p&gt;It made the right decision and invoked the wrong tool.&lt;/p&gt;

&lt;p&gt;Those are different failure classes.&lt;/p&gt;

&lt;p&gt;They need different owners, different tests, and different fixes.&lt;/p&gt;

&lt;p&gt;I wanted to know whether we could actually separate them experimentally.&lt;/p&gt;

&lt;p&gt;So I took JPS, the deterministic judgment system I am working on, integrated it with an independently developed agent regression harness called &lt;a href="https://github.com/deghosal-2026/agent-eval-forge" rel="noopener noreferrer"&gt;EvalForge&lt;/a&gt;, and broke the combined system in 20 different ways on purpose.&lt;/p&gt;

&lt;p&gt;Then I asked a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which layer catches what?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why use someone else's test harness?
&lt;/h2&gt;

&lt;p&gt;I could have built another JPS-specific test framework.&lt;/p&gt;

&lt;p&gt;That would have been easier.&lt;/p&gt;

&lt;p&gt;It also would have been weaker evidence.&lt;/p&gt;

&lt;p&gt;EvalForge was built independently. It knew nothing about JPS.&lt;/p&gt;

&lt;p&gt;It evaluates agent behavior from the outside by inspecting things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which tools were called&lt;/li&gt;
&lt;li&gt;which arguments were passed&lt;/li&gt;
&lt;li&gt;whether a disallowed action occurred&lt;/li&gt;
&lt;li&gt;whether expected actions happened&lt;/li&gt;
&lt;li&gt;whether the execution stayed within the scenario constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That made it useful as an external observer.&lt;/p&gt;

&lt;p&gt;The point of the experiment was not to make JPS "pass EvalForge."&lt;/p&gt;

&lt;p&gt;It was to see whether the boundary between &lt;strong&gt;judgment correctness&lt;/strong&gt; and &lt;strong&gt;integration correctness&lt;/strong&gt; actually survives contact with another system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 one business case
          same facts, same expected outcome
                          |
          +---------------+---------------+
          |                               |
          v                               v
 ARM A: prompt-mediated            ARM B: deterministic

 policy as plain text              structured facts
          |                               |
          v                               v
   model decides                  JPS evaluator
          |                               |
          +---------------+---------------+
                          |
                          v
                 shared execution layer
          decision -&amp;gt; tool call / escalate
                          |
                          v
               EvalForge scores trajectory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three independent detection mechanisms watched each injected failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[J] Judgment-layer tests
    Does the decision logic itself still behave correctly?

[F] EvalForge
    Does the surrounding agent execute the correct tools and arguments?

[G] Study gate
    Does the observed outcome still match the pinned expected result?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two primary paths used the same business cases and the same expected operational outcomes.&lt;/p&gt;

&lt;p&gt;The only major difference was where the judgment came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test surface
&lt;/h2&gt;

&lt;p&gt;The study contained 21 business cases covering situations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;straightforward approval&lt;/li&gt;
&lt;li&gt;hard-stop conditions&lt;/li&gt;
&lt;li&gt;exact numeric thresholds&lt;/li&gt;
&lt;li&gt;values just below thresholds&lt;/li&gt;
&lt;li&gt;missing required evidence&lt;/li&gt;
&lt;li&gt;unknown evidence&lt;/li&gt;
&lt;li&gt;conflicting rules&lt;/li&gt;
&lt;li&gt;escalation&lt;/li&gt;
&lt;li&gt;routing to a specific destination&lt;/li&gt;
&lt;li&gt;protected actions that must never execute under certain dispositions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then we introduced &lt;strong&gt;20 deliberate failures&lt;/strong&gt;, one at a time.&lt;/p&gt;

&lt;p&gt;Six were inside the judgment semantics.&lt;/p&gt;

&lt;p&gt;Fourteen were in the surrounding integration.&lt;/p&gt;

&lt;p&gt;Before running the scored experiment, we wrote down which detector we expected to catch each mutation.&lt;/p&gt;

&lt;p&gt;The protocol was then frozen after three rounds of adversarial review by a different vendor's model.&lt;/p&gt;

&lt;p&gt;Only after that did the scored run begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 1 - the boundary was measurable
&lt;/h2&gt;

&lt;p&gt;Every rule-level mutation was detected exactly where we predicted.&lt;/p&gt;

&lt;p&gt;Examples included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;changing an inclusive threshold into an exclusive one&lt;/li&gt;
&lt;li&gt;moving a threshold&lt;/li&gt;
&lt;li&gt;removing an exception&lt;/li&gt;
&lt;li&gt;collapsing &lt;code&gt;unknown&lt;/code&gt; into &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;changing conflict behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those belong to the judgment layer.&lt;/p&gt;

&lt;p&gt;Its own tests caught them.&lt;/p&gt;

&lt;p&gt;The surrounding integration did not need to know why the rule was wrong.&lt;/p&gt;

&lt;p&gt;The opposite was also true.&lt;/p&gt;

&lt;p&gt;When the decision logic remained correct but the surrounding system misused the result, the judgment evaluator could not see the failure.&lt;/p&gt;

&lt;p&gt;Examples included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mapping the wrong fact into the evaluator&lt;/li&gt;
&lt;li&gt;ignoring an escalation&lt;/li&gt;
&lt;li&gt;taking a protected action after an unresolved result&lt;/li&gt;
&lt;li&gt;calling the wrong tool&lt;/li&gt;
&lt;li&gt;passing the wrong argument&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those failures appeared in the execution trajectory.&lt;/p&gt;

&lt;p&gt;That is where EvalForge caught them.&lt;/p&gt;

&lt;p&gt;Its simple trace-level scorers ended up doing most of the work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zero_disallowed_actions
tool_called
argument_correctness
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The more semantic grounding and contradiction scorers were mostly irrelevant.&lt;/p&gt;

&lt;p&gt;In hindsight, that makes sense.&lt;/p&gt;

&lt;p&gt;The injected failures were often not changing what the agent &lt;strong&gt;said&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They were changing what it &lt;strong&gt;did&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So the trace was the evidence.&lt;/p&gt;

&lt;p&gt;Across the full mutation matrix, there were &lt;strong&gt;zero divergences from the preregistered detection ownership&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That includes three mutations we predicted none of the three detectors would catch.&lt;/p&gt;

&lt;p&gt;They escaped exactly as expected.&lt;/p&gt;

&lt;p&gt;That matters.&lt;/p&gt;

&lt;p&gt;A good experiment should expose where detection stops, not quietly redefine every escaped case as something the system was never supposed to catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 2 - the independent adversarial cases were more useful than my own
&lt;/h2&gt;

&lt;p&gt;After the protocol was frozen, an independent reviewer contributed four hidden adversarial scenarios.&lt;/p&gt;

&lt;p&gt;I did not know their exact contents before execution.&lt;/p&gt;

&lt;p&gt;One of them targeted a field the judgment layer could not see:&lt;/p&gt;

&lt;p&gt;the configured escalation destination.&lt;/p&gt;

&lt;p&gt;The judgment itself could still be correct:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;But the application could route it to:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fee review queue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the judgment layer's perspective, nothing was wrong.&lt;/p&gt;

&lt;p&gt;It had correctly decided to escalate.&lt;/p&gt;

&lt;p&gt;EvalForge's &lt;code&gt;argument_correctness&lt;/code&gt; scorer caught the bad destination downstream.&lt;/p&gt;

&lt;p&gt;That was exactly the kind of separation I wanted this study to expose.&lt;/p&gt;

&lt;p&gt;More importantly, it revealed a real blind spot.&lt;/p&gt;

&lt;p&gt;The runtime's test rows could assert that escalation should occur, but they could not assert the exact configured escalation target.&lt;/p&gt;

&lt;p&gt;That capability has since been added and released in the runtime.&lt;/p&gt;

&lt;p&gt;So the feedback loop became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;external adversarial case
        |
        v
blind spot exposed
        |
        v
external harness catches it
        |
        v
runtime capability improved
        |
        v
new regression coverage
        |
        v
versioned release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That may be the most useful result of the study.&lt;/p&gt;

&lt;p&gt;The experiment did not merely produce a score.&lt;/p&gt;

&lt;p&gt;It changed the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 3 - prompt-mediated judgment got 62 of 63 decision outcomes right
&lt;/h2&gt;

&lt;p&gt;We also ran the comparison originally suggested by the EvalForge author.&lt;/p&gt;

&lt;p&gt;Same business cases.&lt;/p&gt;

&lt;p&gt;Same expected outcomes.&lt;/p&gt;

&lt;p&gt;But instead of evaluating a structured Judgment Pack, a strong model received the policy as plain prose and made the decision itself.&lt;/p&gt;

&lt;p&gt;The model performed very well.&lt;/p&gt;

&lt;p&gt;It got:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;decision outcomes correct.&lt;/p&gt;

&lt;p&gt;It never executed a forbidden protected action.&lt;/p&gt;

&lt;p&gt;It correctly abstained on the blocked cases.&lt;/p&gt;

&lt;p&gt;So this study does &lt;strong&gt;not&lt;/strong&gt; support a claim that prose-based judgment is generally unreliable.&lt;/p&gt;

&lt;p&gt;The interesting part was where it failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exact conflict boundary
&lt;/h3&gt;

&lt;p&gt;One case sits at an exact threshold where two rules genuinely conflict.&lt;/p&gt;

&lt;p&gt;The deterministic evaluator is required to surface that conflict.&lt;/p&gt;

&lt;p&gt;It is not permitted to invent a tie-break.&lt;/p&gt;

&lt;p&gt;Across identical prompt runs, the model sometimes did something else.&lt;/p&gt;

&lt;p&gt;In one run, it quietly chose a winner.&lt;/p&gt;

&lt;p&gt;That produced a plausible answer.&lt;/p&gt;

&lt;p&gt;It was also precisely the behavior the deterministic semantics prohibit.&lt;/p&gt;

&lt;p&gt;More importantly, the behavior was inconsistent across repeated identical runs.&lt;/p&gt;

&lt;p&gt;That is a different failure from simply "getting the answer wrong."&lt;/p&gt;

&lt;p&gt;It means the system did not have a stable rule for what happens when the policy itself contains unresolved conflict.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured routing identity
&lt;/h3&gt;

&lt;p&gt;A second failure appeared in a different place.&lt;/p&gt;

&lt;p&gt;The model repeatedly altered a configured routing destination.&lt;/p&gt;

&lt;p&gt;The structured value was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fee review queue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prose-mediated path produced plausible variations such as:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The semantic intention is close.&lt;/p&gt;

&lt;p&gt;Operationally, the identifier is not the same.&lt;/p&gt;

&lt;p&gt;That distinction matters when downstream systems expect exact configuration rather than approximate language.&lt;/p&gt;

&lt;p&gt;So these are two separate failure modes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. judgment instability at a real rule boundary

2. loss of exact operational configuration
   when structured data is carried through prose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model's overall accuracy number hides both.&lt;/p&gt;

&lt;h2&gt;
  
  
  The important result was not "deterministic beats model"
&lt;/h2&gt;

&lt;p&gt;That would be the wrong conclusion.&lt;/p&gt;

&lt;p&gt;The model performed strongly.&lt;/p&gt;

&lt;p&gt;And this is a small study.&lt;/p&gt;

&lt;p&gt;The result I care about is that the failure classes had &lt;strong&gt;owners&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A deterministic judgment evaluator can tell you whether:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;same facts
+
same judgment artifact
=
same disposition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it cannot necessarily tell you that the application fed it the wrong facts.&lt;/p&gt;

&lt;p&gt;It cannot tell you that another layer ignored &lt;code&gt;escalate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It cannot tell you that the right decision was followed by the wrong tool call unless that behavior is brought back into its test surface.&lt;/p&gt;

&lt;p&gt;Likewise, an execution regression harness can tell you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;the wrong tool fired
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;the tool received the wrong argument
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that does not automatically tell you whether the underlying organizational rule was encoded incorrectly.&lt;/p&gt;

&lt;p&gt;Those are different questions.&lt;/p&gt;

&lt;p&gt;Testing the layers separately made that boundary visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The detection model that emerged
&lt;/h2&gt;

&lt;p&gt;The study ended up looking less like one testing system and more like a chain of responsibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;business policy
      |
      v
judgment artifact
      |
      v
[J] judgment tests
      |
      v
deterministic disposition
      |
      v
integration / agent
      |
      v
[F] trajectory tests
      |
      v
tool execution
      |
      v
[G] end-to-end expected outcome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer can be correct while another layer fails.&lt;/p&gt;

&lt;p&gt;That is not duplication.&lt;/p&gt;

&lt;p&gt;It is defense through separation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The blind spots matter too
&lt;/h2&gt;

&lt;p&gt;Three registered mutations were expected to escape all three detectors.&lt;/p&gt;

&lt;p&gt;They did.&lt;/p&gt;

&lt;p&gt;I think that is useful evidence.&lt;/p&gt;

&lt;p&gt;There is a temptation in evaluation work to make every test failure somebody's responsibility after seeing the result.&lt;/p&gt;

&lt;p&gt;We tried not to do that.&lt;/p&gt;

&lt;p&gt;If neither the judgment artifact nor the execution trajectory contains enough information to observe a particular failure, then a detector cannot reconstruct that missing evidence afterward.&lt;/p&gt;

&lt;p&gt;The correct outcome is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are blind here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That can become the input to the next design change or experiment.&lt;/p&gt;

&lt;p&gt;But it should remain a blind spot until something actually closes it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What EvalForge taught me
&lt;/h2&gt;

&lt;p&gt;The integration also surfaced several implementation observations in EvalForge itself, which I filed upstream as issues #269-#274.&lt;/p&gt;

&lt;p&gt;But the larger takeaway was positive.&lt;/p&gt;

&lt;p&gt;Its:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scenario format&lt;/li&gt;
&lt;li&gt;runner&lt;/li&gt;
&lt;li&gt;payload isolation&lt;/li&gt;
&lt;li&gt;artifact layer&lt;/li&gt;
&lt;li&gt;deterministic trace scorers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all held up under adversarial use.&lt;/p&gt;

&lt;p&gt;The blocking &lt;code&gt;zero_disallowed_actions&lt;/code&gt; scorer was particularly useful.&lt;/p&gt;

&lt;p&gt;Every scenario where a protected action executed when it should not have was stopped there.&lt;/p&gt;

&lt;p&gt;That is a very clean operational invariant.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in JPS
&lt;/h2&gt;

&lt;p&gt;The study also produced a concrete runtime improvement.&lt;/p&gt;

&lt;p&gt;One hidden adversarial case showed that JPS could assert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;escalation must happen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but could not test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;escalation must go to this exact configured destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gap is now addressed in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;judgment-pack-runtime v0.17.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the feedback loop I want around judgment artifacts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;author
  |
  v
test
  |
  v
evaluate
  |
  v
observe failures
  |
  v
improve semantics / tooling
  |
  v
review
  |
  v
version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The artifact should evolve because evidence exposed a gap, not because someone casually changed a prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;p&gt;This study is deliberately narrow.&lt;/p&gt;

&lt;p&gt;It involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 planted mutations&lt;/li&gt;
&lt;li&gt;21 business cases&lt;/li&gt;
&lt;li&gt;one external regression harness&lt;/li&gt;
&lt;li&gt;one model in the prompt-mediated arm&lt;/li&gt;
&lt;li&gt;one JPS decision family&lt;/li&gt;
&lt;li&gt;deterministic scoring wherever possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not prove that JPS improves model accuracy generally.&lt;/p&gt;

&lt;p&gt;In fact, an earlier experiment on a harder third-party benchmark produced a less favorable efficacy result, and that result still stands.&lt;/p&gt;

&lt;p&gt;Study 013 answers a different question.&lt;/p&gt;

&lt;p&gt;It asks whether failures inside the decision semantics can be distinguished from failures in the surrounding execution path.&lt;/p&gt;

&lt;p&gt;Within this study, they could.&lt;/p&gt;

&lt;p&gt;It also does not prove that the mutation set is complete.&lt;/p&gt;

&lt;p&gt;There will be failures outside all three detectors.&lt;/p&gt;

&lt;p&gt;The study already contains examples.&lt;/p&gt;

&lt;p&gt;And the prompt-mediated comparison is too small to support broad claims about model reliability.&lt;/p&gt;

&lt;p&gt;The interesting value is &lt;strong&gt;where&lt;/strong&gt; the failures occurred, not the headline percentage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;

&lt;p&gt;Everything needed to inspect or reproduce the study is public.&lt;/p&gt;

&lt;h3&gt;
  
  
  Study 013
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/013-agent-eval-forge-integration" rel="noopener noreferrer"&gt;https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/013-agent-eval-forge-integration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preregistration&lt;/li&gt;
&lt;li&gt;adversarial review&lt;/li&gt;
&lt;li&gt;mutation definitions&lt;/li&gt;
&lt;li&gt;hidden-case handling&lt;/li&gt;
&lt;li&gt;raw run artifacts&lt;/li&gt;
&lt;li&gt;deterministic scoring&lt;/li&gt;
&lt;li&gt;detection matrix&lt;/li&gt;
&lt;li&gt;analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent Eval Forge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/deghosal-2026/agent-eval-forge" rel="noopener noreferrer"&gt;https://github.com/deghosal-2026/agent-eval-forge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The harness was pinned and used as an independently developed external observer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runtime change
&lt;/h3&gt;

&lt;p&gt;The blind spot identified by the hidden escalation-target case was addressed in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;judgment-pack-runtime v0.17.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;I started with a fairly simple claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A deterministic judgment layer should make business decision logic testable independently of the agent executing it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The experiment made that claim more precise.&lt;/p&gt;

&lt;p&gt;The useful separation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Judgment layer:
Was the decision implied by these facts and rules?

Integration layer:
Did the surrounding system respect that decision?

Execution layer:
Did the correct action actually happen?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A correct answer at one layer does not guarantee correctness at the next.&lt;/p&gt;

&lt;p&gt;That is why the most interesting result was not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;JPS caught X and EvalForge caught Y.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We could identify which layer owned each registered failure - and we could also identify failures owned by neither.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives us somewhere concrete to improve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In your agent stack, who owns the failure when the decision was right but the action was wrong - and would anything in your current tests tell you which one happened?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Where Does Judgment End and Runtime Policy Begin?</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Sun, 09 Aug 2026 18:24:35 +0000</pubDate>
      <link>https://dev.to/kikashy/where-does-judgment-end-and-runtime-policy-begin-59cf</link>
      <guid>https://dev.to/kikashy/where-does-judgment-end-and-runtime-policy-begin-59cf</guid>
      <description>&lt;p&gt;AWS introduced something this week that is close enough to the problem I have been working on that I do not think it should be casually labeled complementary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/machine-learning/control-agent-behaviors-and-cost-beyond-a-single-action-new-capabilities-in-amazon-bedrock-agentcore/" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore added temporal policies&lt;/a&gt;, along with an open-source policy language called &lt;a href="https://github.com/dogwood-policy" rel="noopener noreferrer"&gt;Dogwood&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instead of asking only whether an individual tool invocation is allowed, the gateway can evaluate the sequence of actions that led to it.&lt;/p&gt;

&lt;p&gt;Consider a purchasing agent with this rule:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;purchases under $10,000 do not require escalation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The agent makes six purchases of $9,000.&lt;/p&gt;

&lt;p&gt;Every individual action satisfies the rule.&lt;/p&gt;

&lt;p&gt;The sequence may violate the organization's intended limit.&lt;/p&gt;

&lt;p&gt;The same problem appears with approvals.&lt;/p&gt;

&lt;p&gt;An API call may be permitted only if a human approval occurred earlier in the workflow. Looking only at the final call cannot establish that condition. Something needs to remember the relevant execution history and evaluate policy against it.&lt;/p&gt;

&lt;p&gt;That is the class of problem temporal policy addresses.&lt;/p&gt;

&lt;p&gt;The interesting architectural choice is that this logic lives outside the agent.&lt;/p&gt;

&lt;p&gt;The model does not need to faithfully remember the constraint from its prompt. The runtime owns the control.&lt;/p&gt;

&lt;h2&gt;
  
  
  More agent behavior is becoming explicit
&lt;/h2&gt;

&lt;p&gt;This is not the only sign that agent instructions are moving out of conversations and into inspectable artifacts.&lt;/p&gt;

&lt;p&gt;A recent &lt;a href="https://arxiv.org/abs/2608.04661" rel="noopener noreferrer"&gt;ESEM 2026 study of Agent Plans&lt;/a&gt; screened 36,710 engineered GitHub repositories and found 85 Markdown plan files across 10 repositories.&lt;/p&gt;

&lt;p&gt;That is a very small population, so I would not interpret the result as evidence of broad adoption.&lt;/p&gt;

&lt;p&gt;But the content is interesting.&lt;/p&gt;

&lt;p&gt;Those plans commonly described implementation steps, specific files or locations, and testing or validation instructions.&lt;/p&gt;

&lt;p&gt;The agent's execution intent was being preserved as part of the repository.&lt;/p&gt;

&lt;p&gt;There is a similar pattern in distribution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tenable.com/press-releases/tenable-launches-industrys-first-open-source-ai-agent-exchange" rel="noopener noreferrer"&gt;Tenable's CyberAgents Exchange&lt;/a&gt; treats agents, skills, MCP servers, and multi-agent playbooks as separate reusable components.&lt;/p&gt;

&lt;p&gt;The ecosystem is gradually decomposing "the agent" into more explicit pieces.&lt;/p&gt;

&lt;p&gt;MCP gives the agent capabilities.&lt;/p&gt;

&lt;p&gt;Skills help it understand how to use them.&lt;/p&gt;

&lt;p&gt;Plans describe how work should be performed.&lt;/p&gt;

&lt;p&gt;Runtime policies constrain what actions may happen and in what order.&lt;/p&gt;

&lt;p&gt;That decomposition raises another question.&lt;/p&gt;

&lt;p&gt;Where should organizational judgment live?&lt;/p&gt;

&lt;h2&gt;
  
  
  A permitted action is not necessarily a justified decision
&lt;/h2&gt;

&lt;p&gt;Suppose an agent is onboarding a new vendor.&lt;/p&gt;

&lt;p&gt;The runtime can verify that the user is authorized.&lt;/p&gt;

&lt;p&gt;The gateway can verify that the agent is allowed to call the vendor-management API.&lt;/p&gt;

&lt;p&gt;A temporal policy can require a recorded approval before the vendor is created.&lt;/p&gt;

&lt;p&gt;But what determines whether the vendor should receive that approval?&lt;/p&gt;

&lt;p&gt;The answer might depend on sanctions screening, tax documentation, annual spend, personal-data handling, risk classification, or an exception requiring committee review.&lt;/p&gt;

&lt;p&gt;There may also be incomplete evidence.&lt;/p&gt;

&lt;p&gt;If a required sanctions check could not be completed, the correct outcome may not be approval or rejection.&lt;/p&gt;

&lt;p&gt;It may be:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;insufficient evidence - escalate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is not quite the same problem as tool authorization.&lt;/p&gt;

&lt;p&gt;The runtime policy can enforce that approval must exist.&lt;/p&gt;

&lt;p&gt;Something else still has to determine whether the evidence warrants approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is where Judgment Pack currently sits
&lt;/h2&gt;

&lt;p&gt;This distinction is part of what I have been exploring with the open-source Judgment Pack Specification.&lt;/p&gt;

&lt;p&gt;A Judgment Pack externalizes the organization's decision criteria from the agent.&lt;/p&gt;

&lt;p&gt;Instead of asking the model to reconstruct the business decision from a policy document every time, the pack can explicitly define the relevant evidence, rules, exceptions, unknown handling, and possible dispositions.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;facts
  |
  v
judgment
  |
  v
disposition
  |
  v
execution policy
  |
  v
action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;But Dogwood makes the boundary less comfortable than that diagram suggests.&lt;/p&gt;

&lt;p&gt;Both systems move deterministic logic outside the model.&lt;/p&gt;

&lt;p&gt;Both are inspectable.&lt;/p&gt;

&lt;p&gt;Both can produce an outcome that prevents an action.&lt;/p&gt;

&lt;p&gt;Both can encode conditions and escalation.&lt;/p&gt;

&lt;p&gt;That means the useful question is not whether JPS and Dogwood are "different."&lt;/p&gt;

&lt;p&gt;The useful question is exactly where they differ.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary I want to test
&lt;/h2&gt;

&lt;p&gt;My current hypothesis is that the two systems may operate at different semantic levels.&lt;/p&gt;

&lt;p&gt;A Judgment Pack evaluates evidence in order to determine an organizational disposition.&lt;/p&gt;

&lt;p&gt;A temporal policy evaluates execution history and runtime state in order to determine whether an action is currently permitted.&lt;/p&gt;

&lt;p&gt;For vendor onboarding, that might mean the Judgment Pack evaluates:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sanctions status
tax documentation
risk
annual spend
exceptions
missing evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and produces:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;approve
reject
committee review
insufficient evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The runtime policy then evaluates things such as:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;was approval recorded?
did the required previous step occur?
has the spending limit already been consumed?
is the authorization still valid?
may this tool execute at this point in the sequence?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That separation makes sense on paper.&lt;/p&gt;

&lt;p&gt;I do not yet know whether it survives implementation.&lt;/p&gt;

&lt;p&gt;Some JPS rules may turn out to belong naturally in runtime policy.&lt;/p&gt;

&lt;p&gt;Some Dogwood policies may look much closer to organizational judgment than expected.&lt;/p&gt;

&lt;p&gt;There may also be workflows where maintaining the distinction creates unnecessary complexity.&lt;/p&gt;

&lt;p&gt;That would be useful to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next experiment should implement both
&lt;/h2&gt;

&lt;p&gt;Rather than debate the architecture abstractly, I think the better next step is to take one realistic workflow and implement it twice.&lt;/p&gt;

&lt;p&gt;Vendor onboarding is a useful candidate because it contains both kinds of constraints.&lt;/p&gt;

&lt;p&gt;The decision side can include required evidence, a sanctions hard stop, a spend threshold, unknown facts, and escalation.&lt;/p&gt;

&lt;p&gt;The execution side can require that the decision occurred, enforce ordering, prevent action after relevant state changes, and control the final tool invocation.&lt;/p&gt;

&lt;p&gt;Then compare the two representations.&lt;/p&gt;

&lt;p&gt;Which rules naturally belong in the Judgment Pack?&lt;/p&gt;

&lt;p&gt;Which belong in Dogwood?&lt;/p&gt;

&lt;p&gt;Which can be represented in either system?&lt;/p&gt;

&lt;p&gt;Where does duplication appear?&lt;/p&gt;

&lt;p&gt;What evidence would be required to prove that the final action was both justified and correctly executed?&lt;/p&gt;

&lt;p&gt;Agent governance is becoming infrastructure.&lt;/p&gt;

&lt;p&gt;That makes the boundaries between its components more important, not less.&lt;/p&gt;

&lt;p&gt;The useful question now is not whether we need more governance layers.&lt;/p&gt;

&lt;p&gt;It is whether we can define precisely what each layer is responsible for.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Agent Stack Is Filling In. The Judgment Layer Is Still an Open Problem</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Sun, 09 Aug 2026 17:29:57 +0000</pubDate>
      <link>https://dev.to/kikashy/the-agent-stack-is-filling-in-the-judgment-layer-is-still-an-open-problem-40g2</link>
      <guid>https://dev.to/kikashy/the-agent-stack-is-filling-in-the-judgment-layer-is-still-an-open-problem-40g2</guid>
      <description>&lt;p&gt;Over the last few days I have been looking at several developments around enterprise AI agents that initially seemed unrelated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.cloudflare.com/cloudflare-os/" rel="noopener noreferrer"&gt;Cloudflare open-sourced&lt;/a&gt; its internal agent workspace platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/html/2608.02764v1" rel="noopener noreferrer"&gt;Researchers published work&lt;/a&gt; on what happens when an agent authorizes an action using state that changes before execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reuters.com/commentary/breakingviews/corporate-ai-is-still-chasing-theoretical-benefits-2026-08-07/" rel="noopener noreferrer"&gt;Enterprise AI leaders are starting to talk&lt;/a&gt; less about how many agents they can deploy and more about whether those agents are producing measurable value.&lt;/p&gt;

&lt;p&gt;There is also growing infrastructure around agent identity, tool access, observability, security, and runtime isolation.&lt;/p&gt;

&lt;p&gt;Taken separately, these are different stories.&lt;/p&gt;

&lt;p&gt;Together, I think they point to a larger architectural shift.&lt;/p&gt;

&lt;p&gt;The ecosystem is getting much better at answering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What can this agent access and execute?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But another question remains less well defined:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given the available evidence, what should this organization actually decide?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are not the same question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare OS made the boundary easier to see
&lt;/h2&gt;

&lt;p&gt;Cloudflare recently open-sourced Cloudflare OS, the platform it uses internally for AI agents.&lt;/p&gt;

&lt;p&gt;The architecture is interesting because the model is not treated as the entire system.&lt;/p&gt;

&lt;p&gt;There is organizational context. There are skills. There are MCP-connected tools. There are isolated environments in which agents operate. And there are Gatekeepers that help control what an agent can do.&lt;/p&gt;

&lt;p&gt;This seems like a reasonable direction for enterprise agents.&lt;/p&gt;

&lt;p&gt;As agents move closer to production systems, companies need much more than an LLM and a collection of tools.&lt;/p&gt;

&lt;p&gt;But imagine using this architecture for vendor onboarding.&lt;/p&gt;

&lt;p&gt;An employee asks an agent to onboard Acme Corp.&lt;/p&gt;

&lt;p&gt;The employee has permission to make the request.&lt;/p&gt;

&lt;p&gt;The agent has permission to call the vendor-management API.&lt;/p&gt;

&lt;p&gt;The request passes the security gateway.&lt;/p&gt;

&lt;p&gt;Does that mean the vendor should be onboarded?&lt;/p&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;The decision might depend on facts such as sanctions screening, tax documentation, annual contract value, country of registration, personal-data handling, or an internal risk score.&lt;/p&gt;

&lt;p&gt;There may also be exceptions.&lt;/p&gt;

&lt;p&gt;A sanctions match could be a hard stop.&lt;/p&gt;

&lt;p&gt;A high contract value might require committee review.&lt;/p&gt;

&lt;p&gt;Missing evidence might mean that neither approval nor rejection is correct yet.&lt;/p&gt;

&lt;p&gt;The authorization layer can answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this agent allowed to perform this operation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The business still needs an answer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Under our rules, is this operation justified?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the boundary I find interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision may be correct while the action is wrong
&lt;/h2&gt;

&lt;p&gt;A recent paper on stateful governance for concurrent agent systems describes another version of the problem.&lt;/p&gt;

&lt;p&gt;Suppose two agents share the same purchasing budget.&lt;/p&gt;

&lt;p&gt;Agent A checks the available budget and determines that a $30,000 purchase is allowed.&lt;/p&gt;

&lt;p&gt;Before Agent A executes the purchase, Agent B spends $40,000.&lt;/p&gt;

&lt;p&gt;The state has changed.&lt;/p&gt;

&lt;p&gt;Agent A may have made the correct decision using the facts it had at evaluation time. Executing that decision later can still violate the organization's rules.&lt;/p&gt;

&lt;p&gt;This is easy to miss when we think about agent governance only as a policy check performed immediately before a tool call.&lt;/p&gt;

&lt;p&gt;For deterministic judgment systems, I usually describe one useful property as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;same facts + same judgment definition → same disposition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives us reproducibility.&lt;/p&gt;

&lt;p&gt;But the concurrency problem suggests another requirement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;the facts that justified the disposition
must still be valid when the action commits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are different guarantees.&lt;/p&gt;

&lt;p&gt;A production workflow might therefore need to look more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Acquire facts
     ↓
Evaluate judgment
     ↓
Record disposition + relevant state
     ↓
Validate state / re-evaluate if necessary
     ↓
Execute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an area I want to experiment with because it sits directly between decision semantics and runtime enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hundreds of agents create a different governance problem
&lt;/h2&gt;

&lt;p&gt;Another signal comes from enterprise adoption.&lt;/p&gt;

&lt;p&gt;Organizations are starting to discover that deploying agents is easier than understanding the full operational footprint afterward.&lt;/p&gt;

&lt;p&gt;One recent report described a company where the CIO believed roughly 40 agents were operating internally. An audit reportedly found more than 400.&lt;/p&gt;

&lt;p&gt;That number caught my attention because it changes the governance problem.&lt;/p&gt;

&lt;p&gt;If you have three experimental agents, reviewing their prompts and workflows manually may be perfectly reasonable.&lt;/p&gt;

&lt;p&gt;If you have hundreds of agents making decisions across finance, procurement, customer operations, HR, and IT, it becomes much harder to answer basic questions consistently.&lt;/p&gt;

&lt;p&gt;Which decisions are these agents allowed to make?&lt;/p&gt;

&lt;p&gt;What evidence must be available?&lt;/p&gt;

&lt;p&gt;Which exceptions apply?&lt;/p&gt;

&lt;p&gt;When must the agent abstain or escalate?&lt;/p&gt;

&lt;p&gt;Who approved the decision logic?&lt;/p&gt;

&lt;p&gt;Which version was active when a particular action happened?&lt;/p&gt;

&lt;p&gt;These questions do not disappear because the underlying model becomes more capable.&lt;/p&gt;

&lt;p&gt;Some of them become more important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I separate judgment from the agent
&lt;/h2&gt;

&lt;p&gt;This is the problem I am exploring with the open-source Judgment Pack Specification.&lt;/p&gt;

&lt;p&gt;A Judgment Pack represents organizational decision logic as a separate artifact.&lt;/p&gt;

&lt;p&gt;The goal is not to replace the agent.&lt;/p&gt;

&lt;p&gt;The agent can still gather information, interact with users, use tools, and reason where reasoning is useful.&lt;/p&gt;

&lt;p&gt;The difference is that the criteria governing a consequential business decision do not have to live entirely inside the agent's prompt.&lt;/p&gt;

&lt;p&gt;For a vendor-onboarding decision, for example, a pack might define the required evidence, thresholds, exceptions, treatment of missing facts, and possible outcomes.&lt;/p&gt;

&lt;p&gt;The agent supplies facts.&lt;/p&gt;

&lt;p&gt;The evaluator applies the reviewed judgment definition.&lt;/p&gt;

&lt;p&gt;The result can then be used by another layer responsible for execution.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent
  ↓
Evidence acquisition
  ↓
Judgment Pack
  ↓
Disposition + evidence
  ↓
Gateway / policy enforcement
  ↓
Business system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think this distinction becomes clearer as the rest of the agent stack matures.&lt;/p&gt;

&lt;p&gt;MCP is solving connectivity.&lt;/p&gt;

&lt;p&gt;Agent platforms are solving orchestration and execution.&lt;/p&gt;

&lt;p&gt;Skills are helping models use systems correctly.&lt;/p&gt;

&lt;p&gt;Security layers are controlling identity and access.&lt;/p&gt;

&lt;p&gt;Observability platforms are helping companies understand what agents actually did.&lt;/p&gt;

&lt;p&gt;None of those necessarily owns the organization's definition of a correct business decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  I don't think this means every decision needs a Judgment Pack
&lt;/h2&gt;

&lt;p&gt;A deterministic lookup does not need one.&lt;/p&gt;

&lt;p&gt;A simple permission check probably belongs in an authorization system.&lt;/p&gt;

&lt;p&gt;A low-risk conversational suggestion may be perfectly appropriate to leave to the model.&lt;/p&gt;

&lt;p&gt;The interesting cases are decisions where the organization expects consistent treatment of evidence, rules, exceptions, uncertainty, and escalation.&lt;/p&gt;

&lt;p&gt;That is where putting the judgment into a reviewable artifact starts to become useful.&lt;/p&gt;

&lt;p&gt;I am particularly interested in testing this boundary against real agent platforms rather than defining it only on paper.&lt;/p&gt;

&lt;p&gt;Cloudflare OS looks like one possible integration environment.&lt;/p&gt;

&lt;p&gt;Concurrent state changes are another area I want to test.&lt;/p&gt;

&lt;p&gt;And the larger question is whether this separation still makes sense when applied to real production workflows rather than clean examples.&lt;/p&gt;

&lt;p&gt;That is the part I am trying to learn now.&lt;/p&gt;

&lt;p&gt;If you are building enterprise agents and have a workflow where the difficult part is not tool access but deciding &lt;strong&gt;whether the action is justified&lt;/strong&gt;, I would be interested in hearing what that decision looks like.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>architecture</category>
    </item>
    <item>
      <title>I Asked an AI to Author the Same Policy Tests 50 Times. It Hit Every Boundary in 49 Valid Runs.</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Fri, 07 Aug 2026 16:10:23 +0000</pubDate>
      <link>https://dev.to/kikashy/i-asked-an-ai-to-author-the-same-policy-tests-50-times-it-hit-every-boundary-in-49-valid-runs-2g8n</link>
      <guid>https://dev.to/kikashy/i-asked-an-ai-to-author-the-same-policy-tests-50-times-it-hit-every-boundary-in-49-valid-runs-2g8n</guid>
      <description>&lt;p&gt;I have been experimenting with a specific question: &lt;strong&gt;can an AI independently author the test cases needed to challenge structured business decision logic?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a vendor-screening policy with sanctions rules, country restrictions, personal-data conditions, and risk thresholds. If that policy is converted into executable decision logic, someone still needs to test the difficult boundaries - exactly 70 versus just below 70, whether an embargo-list member is handled correctly, or whether a condition changes when personal data is involved.&lt;/p&gt;

&lt;p&gt;In the earlier Judgment Pack evaluator experiments, I gave an independent AI model the policy and asked it to author those kinds of records without seeing the Judgment Pack or the defects that would later be tested.&lt;/p&gt;

&lt;p&gt;Before the authoring call, six classes of potential defects had already been committed.&lt;/p&gt;

&lt;p&gt;The model authored records that covered &lt;strong&gt;all 6 of 6 classes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That was encouraging, but it answered only one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the model do it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It did not answer the more important reliability question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If I ask it to do the same job again, how often will it cover those boundaries?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A single successful generation could simply be a lucky draw.&lt;/p&gt;

&lt;p&gt;So &lt;a href="https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/tree/main/studies/011-authorship-coverage-rates" rel="noopener noreferrer"&gt;Study 011&lt;/a&gt; repeated the same blinded authoring task &lt;strong&gt;50 times&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result, for this particular experimental setup, was striking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;49 runs passed the preregistered pipeline checks&lt;/li&gt;
&lt;li&gt;1 run was rejected before scoring&lt;/li&gt;
&lt;li&gt;all 49 valid runs covered all six boundary classes&lt;/li&gt;
&lt;li&gt;every valid run produced exactly 16 accepted records&lt;/li&gt;
&lt;li&gt;784 of 784 accepted records agreed with the reference policy semantics&lt;/li&gt;
&lt;li&gt;all 49 valid completions were different&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this one prompt, one model, and one synthetic policy, the answer to "how often?" was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every valid time we observed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That sounds like a perfect result.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;And understanding why is the interesting part of the experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: one good generation is not a reliability result
&lt;/h2&gt;

&lt;p&gt;I am working on an open-source project called the &lt;a href="https://github.com/Judgment-Pack/judgment-pack-spec" rel="noopener noreferrer"&gt;Judgment Pack Specification&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One area I am exploring is whether AI can help humans author the structured test cases around organizational decision logic.&lt;/p&gt;

&lt;p&gt;Imagine a vendor-screening policy containing rules such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sanctions matches create a hard stop&lt;/li&gt;
&lt;li&gt;vendors registered in embargoed countries require a different outcome&lt;/li&gt;
&lt;li&gt;a risk score of 70 crosses a high-risk boundary&lt;/li&gt;
&lt;li&gt;handling personal data changes the threshold at 40&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those rules produce boundaries.&lt;/p&gt;

&lt;p&gt;And boundaries are where subtle errors tend to hide.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;risk = 69.99
risk = 70
risk = 70.01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can represent three very different cases if the policy says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;risk &amp;gt;= 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same issue appears around a personal-data threshold:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;39.99
40
40.01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If AI is going to help author tests for these rules, I do not only care whether it notices the boundary once.&lt;/p&gt;

&lt;p&gt;I want to know how consistently it notices it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Study 011 asked "how often?"
&lt;/h2&gt;

&lt;p&gt;The experiment used one fixed cell:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one model - &lt;code&gt;gpt-5.6-sol&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;one fixed prompt&lt;/li&gt;
&lt;li&gt;one fixed synthetic policy&lt;/li&gt;
&lt;li&gt;one pinned CLI and binary&lt;/li&gt;
&lt;li&gt;fresh isolated environment for each call&lt;/li&gt;
&lt;li&gt;50 sequential authoring calls&lt;/li&gt;
&lt;li&gt;six preregistered coverage classes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The prompt, policy family, binary, environment capture, and preregistration were all digest-pinned.&lt;/p&gt;

&lt;p&gt;The scoring rules were fixed before looking at the batch.&lt;/p&gt;

&lt;p&gt;There were no competing arms and no hypothesis test.&lt;/p&gt;

&lt;p&gt;This study was simply estimating a frequency.&lt;/p&gt;

&lt;h2&gt;
  
  
  What counts as coverage?
&lt;/h2&gt;

&lt;p&gt;Six boundary classes were registered before the batch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 0 - exact high-risk boundary
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No sanctions hit
Non-embargoed country
risk = 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This catches a common implementation error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;risk &amp;gt; 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;risk &amp;gt;= 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model independently authored records with names such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exact-high-risk-threshold
northstar-risk-seventy
alpine-exact-seventy
summit-exactly-seventy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every valid run included a correctly labelled record at this boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coverage: 49/49&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;95% exact interval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0.9275, 1.0000]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Class 1 - the off-by-one region above 70
&lt;/h3&gt;

&lt;p&gt;The next class tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;70 &amp;lt;= risk &amp;lt; 71
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Imagine someone accidentally changes the threshold from:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Testing only 70 and 80 might miss useful information about that region.&lt;/p&gt;

&lt;p&gt;The authored records included cases represented by names such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fraction-above-high-risk-threshold
atlas-risk-seventy-decimal
harbor-above-seventy
baltic-risk-above-seventy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coverage: 49/49&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Class 2 - personal-data boundary at 40
&lt;/h3&gt;

&lt;p&gt;The policy also changes behavior when a vendor handles personal data.&lt;/p&gt;

&lt;p&gt;This class tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;handles personal data
40 &amp;lt;= risk &amp;lt; 41
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is designed to expose a lower-bound change such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;risk &amp;gt;= 41
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;risk &amp;gt;= 40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples of independently authored records included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;personal-data-exact-threshold
harbor-data-risk-forty
bluebell-personal-data-at-forty
maple-data-forty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Coverage: 49/49&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Class 3 - the interior decision region
&lt;/h3&gt;

&lt;p&gt;This class tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40 &amp;lt;= risk &amp;lt; 70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with either value of the personal-data flag.&lt;/p&gt;

&lt;p&gt;This was intentionally broader.&lt;/p&gt;

&lt;p&gt;The model repeatedly generated multiple records across this space, including examples labelled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;personal-data-mid-band
no-personal-data-mid-band
fjord-data-midrange
andes-no-data-moderate-risk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Coverage: 49/49&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Class 4 - membership rather than arithmetic
&lt;/h3&gt;

&lt;p&gt;Not every policy defect is a numeric threshold.&lt;/p&gt;

&lt;p&gt;Another class tested vendors registered in Syria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;registered country = SY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was designed to catch a mutation where &lt;code&gt;SY&lt;/code&gt; disappears from an embargo list.&lt;/p&gt;

&lt;p&gt;The model repeatedly produced examples such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;syria-registration-high-risk
damascus-embargo-high-risk
levant-syria-high-risk
levant-cloud-embargo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the authoring behavior was not limited to discovering numeric boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coverage: 49/49&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Class 5 - the interesting one
&lt;/h3&gt;

&lt;p&gt;The final class tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;handles personal data
39 &amp;lt;= risk &amp;lt; 40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This class deserves special attention.&lt;/p&gt;

&lt;p&gt;The synthetic policy text explicitly mentions the threshold at &lt;strong&gt;40&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; explicitly say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please test the hidden family boundary at 39.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yet all 49 valid runs produced a record inside this interval.&lt;/p&gt;

&lt;p&gt;The actual values were extremely revealing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;28 runs used &lt;code&gt;39.99&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;21 runs used &lt;code&gt;39.999&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the model was consistently generating a "just below 40" case.&lt;/p&gt;

&lt;p&gt;Examples included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;personal-data-just-below-forty
fjord-data-below-forty
maple-data-below-threshold
cedar-data-below-forty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This technically covers the registered class.&lt;/p&gt;

&lt;p&gt;But it does &lt;strong&gt;not&lt;/strong&gt; prove that the model discovered some hidden semantic threshold at 39.&lt;/p&gt;

&lt;p&gt;A much simpler explanation fits the evidence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The prompt asked for borderline cases around the stated threshold of 40, and the model generated values immediately below 40.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;Coverage is real.&lt;/p&gt;

&lt;p&gt;The interpretation must remain narrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline result
&lt;/h2&gt;

&lt;p&gt;Across the six classes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Valid runs covering it&lt;/th&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exact risk = 70&lt;/td&gt;
&lt;td&gt;49 / 49&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70 &amp;lt;= risk &amp;lt; 71&lt;/td&gt;
&lt;td&gt;49 / 49&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal data + 40 &amp;lt;= risk &amp;lt; 41&lt;/td&gt;
&lt;td&gt;49 / 49&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40 &amp;lt;= risk &amp;lt; 70&lt;/td&gt;
&lt;td&gt;49 / 49&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registered in SY&lt;/td&gt;
&lt;td&gt;49 / 49&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal data + 39 &amp;lt;= risk &amp;lt; 40&lt;/td&gt;
&lt;td&gt;49 / 49&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each rate has the same exact 95% Clopper-Pearson interval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0.9275, 1.0000]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That interval is important.&lt;/p&gt;

&lt;p&gt;Observing 49 successes out of 49 valid runs does &lt;strong&gt;not&lt;/strong&gt; establish a true rate of 100%.&lt;/p&gt;

&lt;p&gt;With this sample size, the experiment cannot distinguish:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"always"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;from something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"at least about 92.75% under this experimental cell"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why I prefer reporting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;49 / 49
95% CI [0.9275, 1.0000]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than simply saying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100% reliable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Every output was different
&lt;/h2&gt;

&lt;p&gt;Another result surprised me.&lt;/p&gt;

&lt;p&gt;All &lt;strong&gt;49 valid completions were distinct&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The largest group of byte-identical outputs was:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;So this was not one cached completion accidentally counted 49 times.&lt;/p&gt;

&lt;p&gt;The model varied names, examples, and record composition across runs.&lt;/p&gt;

&lt;p&gt;For example, the exact-70 case appeared under names including:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exact-high-risk-threshold
northstar-risk-seventy
atlas-risk-threshold
alpine-security-threshold
granite-risk-seventy
summit-risk-threshold
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The surface form changed.&lt;/p&gt;

&lt;p&gt;The boundary coverage did not.&lt;/p&gt;

&lt;p&gt;That is an interesting form of consistency:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Different generations converged on the same important semantic regions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But even this has a limitation.&lt;/p&gt;

&lt;p&gt;Different outputs do not prove statistically independent draws.&lt;/p&gt;

&lt;p&gt;Provider-side cross-session behavior is not observable from the retained artifacts.&lt;/p&gt;

&lt;p&gt;The study records that limitation rather than pretending it can prove independence.&lt;/p&gt;

&lt;h2&gt;
  
  
  784 accepted records, zero observed label disagreements
&lt;/h2&gt;

&lt;p&gt;Each valid run produced exactly:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Across 49 runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;49 x 16 = 784 accepted records
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Against the study's policy mirror:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;policy-concordant records: 784
mislabelled records:        0
dropped records:            0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So pooled label agreement was:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;I deliberately do not attach a binomial confidence interval to that number.&lt;/p&gt;

&lt;p&gt;The 16 records inside a single completion are not independent trials.&lt;/p&gt;

&lt;p&gt;Treating all 784 records as independent observations would make the precision look much stronger than it really is.&lt;/p&gt;

&lt;p&gt;The run remains the meaningful repeated unit.&lt;/p&gt;

&lt;h2&gt;
  
  
  One run failed - and I think that is useful
&lt;/h2&gt;

&lt;p&gt;Run 026 was not scored.&lt;/p&gt;

&lt;p&gt;The model process itself exited successfully.&lt;/p&gt;

&lt;p&gt;But the pre-prompt developer context did not match the locked golden context.&lt;/p&gt;

&lt;p&gt;The pipeline therefore returned:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;and excluded the run before looking at its authored records.&lt;/p&gt;

&lt;p&gt;The observed pipeline-invalid rate was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 / 50 = 2%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with a 95% interval of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0.05%, 10.65%]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The likely explanation is service-side boilerplate variation.&lt;/p&gt;

&lt;p&gt;But the study deliberately does not inspect the refused transcript and say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This difference looks harmless, let's count it anyway.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That would undermine the point of having an allowlist.&lt;/p&gt;

&lt;p&gt;The rule was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context matches the registered environment
        -&amp;gt; admit

context differs
        -&amp;gt; refuse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So it refused.&lt;/p&gt;

&lt;p&gt;I actually find this result useful.&lt;/p&gt;

&lt;p&gt;The model-authoring behavior looked extremely stable.&lt;/p&gt;

&lt;p&gt;The experimental pipeline was not perfect.&lt;/p&gt;

&lt;p&gt;Those are two different reliability questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about human review?
&lt;/h2&gt;

&lt;p&gt;Before running the batch, the study registered a deliberately simple mapping from observed coverage to review depth.&lt;/p&gt;

&lt;p&gt;It uses the &lt;strong&gt;lower bound&lt;/strong&gt; of the confidence interval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lower &amp;gt;= 0.80  -&amp;gt; LIGHT review
lower &amp;gt;= 0.40  -&amp;gt; STANDARD review
lower &amp;lt; 0.40   -&amp;gt; FULL review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A high mislabelling rate can escalate the tier.&lt;/p&gt;

&lt;p&gt;All six classes ended with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lower bound = 0.9275
mislabel share = 0
tier = LIGHT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So under the preregistered mapping, every class receives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LIGHT review.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That does &lt;strong&gt;not&lt;/strong&gt; mean AI-authored policy artifacts no longer require humans.&lt;/p&gt;

&lt;p&gt;The review-tier mapping itself is experimental and has not been validated operationally.&lt;/p&gt;

&lt;p&gt;But it suggests an interesting direction.&lt;/p&gt;

&lt;p&gt;Instead of treating every AI-authored rule or test case as equally trustworthy, perhaps review depth can eventually depend on empirical evidence about the authoring process.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI authors candidate records
        |
        v
measure historical coverage / error rates
        |
        v
assign confidence
        |
        +------ high confidence ------&amp;gt; light review
        |
        +------ uncertain ------------&amp;gt; standard review
        |
        +------ weak evidence --------&amp;gt; full review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is much closer to what I ultimately want from AI-assisted authoring.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The model wrote it, trust it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The model wrote it, manually redo everything."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We have measured evidence about where this authoring process is strong and where humans should spend their review time."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What this study does NOT show
&lt;/h2&gt;

&lt;p&gt;This is the most important section.&lt;/p&gt;

&lt;p&gt;The result does not mean:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI can reliably author arbitrary organizational judgment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This prompt, with this model, on this small synthetic policy, repeatedly produced correctly labelled records reaching these six registered classes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nothing more transfers automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is one model
&lt;/h3&gt;

&lt;p&gt;Only one model configuration was tested.&lt;/p&gt;

&lt;p&gt;A different model may behave differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is one prompt
&lt;/h3&gt;

&lt;p&gt;The prompt explicitly asks for borderline cases.&lt;/p&gt;

&lt;p&gt;That probably contributes substantially to the ceiling result.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is one small synthetic policy
&lt;/h3&gt;

&lt;p&gt;The policy has a few thresholds, one membership rule, sanctions logic, and a personal-data condition.&lt;/p&gt;

&lt;p&gt;Real organizational policies can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interacting exceptions&lt;/li&gt;
&lt;li&gt;multiple documents&lt;/li&gt;
&lt;li&gt;ambiguous language&lt;/li&gt;
&lt;li&gt;precedence&lt;/li&gt;
&lt;li&gt;temporal conditions&lt;/li&gt;
&lt;li&gt;missing evidence&lt;/li&gt;
&lt;li&gt;conflicting authorities&lt;/li&gt;
&lt;li&gt;human approval requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those may produce very different rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  The mirror is not ground truth
&lt;/h3&gt;

&lt;p&gt;"Correctly labelled" means the authored outcome agrees with the study's deterministic mirror.&lt;/p&gt;

&lt;p&gt;The same policy supplied to the model is implemented in that mirror.&lt;/p&gt;

&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;measures consistency with the supplied policy semantics.&lt;/p&gt;

&lt;p&gt;It does not independently prove those semantics are correct in the real world.&lt;/p&gt;

&lt;h3&gt;
  
  
  Coverage is not defect detection
&lt;/h3&gt;

&lt;p&gt;Study 011 never evaluates a mutated Judgment Pack.&lt;/p&gt;

&lt;p&gt;It asks whether an independently authored record lands in a region that &lt;em&gt;could expose&lt;/em&gt; a registered defect.&lt;/p&gt;

&lt;p&gt;Study 010 performed the single defect-detection draw.&lt;/p&gt;

&lt;p&gt;Study 011 measures the repeatability of the authorship coverage behind it.&lt;/p&gt;

&lt;p&gt;Those are deliberately separate claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result changed how I think about AI authoring
&lt;/h2&gt;

&lt;p&gt;Before this experiment, I was mostly thinking about AI-assisted authoring as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;policy
  |
  v
AI
  |
  v
candidate structured artifact
  |
  v
human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I now think a better model might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 historical evaluations
                         |
                         v
policy -&amp;gt; AI author -&amp;gt; candidate artifact
                         |
                         v
                 automated validation
                         |
                         v
                 confidence estimate
                         |
              +----------+----------+
              |          |          |
            LIGHT     STANDARD     FULL
            review      review      review
              |
              v
        authorized approval
              |
              v
          versioned artifact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting question becomes less:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can AI author the artifact?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Frontier models increasingly can.&lt;/p&gt;

&lt;p&gt;The harder question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How much review does this particular generated artifact deserve?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is something we may be able to measure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want to test next
&lt;/h2&gt;

&lt;p&gt;The obvious next experiment is not another 50 runs of this same cell.&lt;/p&gt;

&lt;p&gt;This one is already sitting at the ceiling.&lt;/p&gt;

&lt;p&gt;The useful next variable is the thing this study deliberately held constant.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Change the policy
&lt;/h3&gt;

&lt;p&gt;Use a larger policy with interacting rules and exceptions.&lt;/p&gt;

&lt;p&gt;Does coverage remain near the ceiling?&lt;/p&gt;

&lt;h3&gt;
  
  
  Change the model
&lt;/h3&gt;

&lt;p&gt;Run the same registered task across multiple model families.&lt;/p&gt;

&lt;p&gt;Do the boundary classes remain stable?&lt;/p&gt;

&lt;h3&gt;
  
  
  Remove the boundary-forward wording
&lt;/h3&gt;

&lt;p&gt;If the prompt stops explicitly asking for borderline cases, what happens to classes like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;39 &amp;lt;= risk &amp;lt; 40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That would help separate general semantic discovery from prompt-induced test generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduce ambiguity
&lt;/h3&gt;

&lt;p&gt;What happens when the policy itself contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;conflicting language&lt;/li&gt;
&lt;li&gt;incomplete evidence requirements&lt;/li&gt;
&lt;li&gt;inconsistent descriptions and executable conditions&lt;/li&gt;
&lt;li&gt;unclear precedence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is much closer to the real authoring problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Study 010 told me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The independent author can cover all six classes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Study 011 tells me something stronger:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Under this exact experimental setup, that coverage was the typical observed behavior, not a lucky single run.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the more important lesson is methodological.&lt;/p&gt;

&lt;p&gt;One impressive AI output is an anecdote.&lt;/p&gt;

&lt;p&gt;Repeated outputs give you a rate.&lt;/p&gt;

&lt;p&gt;A rate gives you uncertainty.&lt;/p&gt;

&lt;p&gt;And uncertainty can start informing how much human review an AI-generated artifact deserves.&lt;/p&gt;

&lt;p&gt;For this experiment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50 calls
49 valid
49 / 49 valid runs covered all six classes
784 accepted records
0 observed label disagreements
49 distinct completions
1 pipeline refusal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Promising?&lt;/p&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;Proof that AI can safely author organizational judgment without review?&lt;/p&gt;

&lt;p&gt;Absolutely not.&lt;/p&gt;

&lt;p&gt;The next job is to find where these numbers stop being this clean.&lt;/p&gt;




&lt;p&gt;The experiment, preregistration, retained artifacts, scorer, and analysis are all part of the open-source Judgment Pack evaluator experiments repository.&lt;/p&gt;

&lt;p&gt;I would especially welcome adversarial policy examples that you think would break this authoring approach.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>What I Learned Trying to Make AI-Agent Decisions Testable</title>
      <dc:creator>Brian Jin</dc:creator>
      <pubDate>Wed, 05 Aug 2026 23:30:29 +0000</pubDate>
      <link>https://dev.to/kikashy/what-i-learned-trying-to-make-ai-agent-decisions-testable-5h6h</link>
      <guid>https://dev.to/kikashy/what-i-learned-trying-to-make-ai-agent-decisions-testable-5h6h</guid>
      <description>&lt;h1&gt;
  
  
  What I Learned Trying to Make AI-Agent Decisions Testable
&lt;/h1&gt;

&lt;p&gt;AI agents can retrieve the right policy, call the right tools, and still reach the wrong conclusion.&lt;/p&gt;

&lt;p&gt;That gap became increasingly hard for me to ignore.&lt;/p&gt;

&lt;p&gt;Most agent systems are getting better at access and execution. They can search documents, query databases, call APIs, use MCP servers, and complete multi-step workflows.&lt;/p&gt;

&lt;p&gt;But many important business decisions depend on something different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which evidence is actually required?&lt;/li&gt;
&lt;li&gt;Which rule applies in this situation?&lt;/li&gt;
&lt;li&gt;Which exception changes the outcome?&lt;/li&gt;
&lt;li&gt;What should happen when evidence is missing or conflicting?&lt;/li&gt;
&lt;li&gt;When must the agent stop and escalate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions are often buried inside prompts, application code, policy documents, or the judgment of a few experienced people.&lt;/p&gt;

&lt;p&gt;That makes them difficult to test, review, reuse, and improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Is Not Always Missing Knowledge
&lt;/h2&gt;

&lt;p&gt;Imagine an agent reviewing a new vendor.&lt;/p&gt;

&lt;p&gt;It retrieves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the vendor-onboarding policy&lt;/li&gt;
&lt;li&gt;the sanctions-screening result&lt;/li&gt;
&lt;li&gt;the tax form&lt;/li&gt;
&lt;li&gt;the proposed annual spend&lt;/li&gt;
&lt;li&gt;the business justification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent has access to all the relevant information.&lt;/p&gt;

&lt;p&gt;But it still has to determine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the request is in scope&lt;/li&gt;
&lt;li&gt;whether all mandatory evidence is present&lt;/li&gt;
&lt;li&gt;whether a sanctions match creates a hard stop&lt;/li&gt;
&lt;li&gt;whether high annual spend requires committee review&lt;/li&gt;
&lt;li&gt;whether incomplete evidence means rejection or escalation&lt;/li&gt;
&lt;li&gt;whether it has enough information to decide at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retrieval helps the agent find the policy.&lt;/p&gt;

&lt;p&gt;It does not guarantee that the agent will apply the policy correctly.&lt;/p&gt;

&lt;p&gt;A model may produce a plausible explanation while overlooking an exception, treating missing evidence as negative evidence, or claiming that approval occurred when no authorized person was consulted.&lt;/p&gt;

&lt;p&gt;The answer can sound reasonable and still be indefensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Coding Agents Often Feel More Reliable
&lt;/h2&gt;

&lt;p&gt;Coding agents currently provide one of the clearest examples of useful multi-step agent behavior.&lt;/p&gt;

&lt;p&gt;I do not think that is only because models are unusually good at code.&lt;/p&gt;

&lt;p&gt;Coding agents work inside an environment that already knows how to challenge their output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compilers&lt;/li&gt;
&lt;li&gt;unit tests&lt;/li&gt;
&lt;li&gt;type systems&lt;/li&gt;
&lt;li&gt;linters&lt;/li&gt;
&lt;li&gt;runtime feedback&lt;/li&gt;
&lt;li&gt;version control&lt;/li&gt;
&lt;li&gt;code review&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model proposes work.&lt;/p&gt;

&lt;p&gt;The surrounding environment evaluates it.&lt;/p&gt;

&lt;p&gt;Most business agents do not have an equivalent judgment harness.&lt;/p&gt;

&lt;p&gt;They may have access to tools and knowledge, but the conditions behind a defensible decision remain implicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Tried First
&lt;/h2&gt;

&lt;p&gt;The obvious place to start was prompts.&lt;/p&gt;

&lt;p&gt;A prompt can say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;always check sanctions&lt;/li&gt;
&lt;li&gt;require a tax form&lt;/li&gt;
&lt;li&gt;escalate high-value vendors&lt;/li&gt;
&lt;li&gt;never approve when evidence is incomplete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can work for a narrow workflow.&lt;/p&gt;

&lt;p&gt;But as the decision grows, the prompt becomes difficult to review and test. Rules, exceptions, evidence requirements, explanations, and workflow instructions become mixed together.&lt;/p&gt;

&lt;p&gt;A model can also interpret the same prose differently across runs or implementations.&lt;/p&gt;

&lt;p&gt;The next option is application code.&lt;/p&gt;

&lt;p&gt;Hard-coded logic is more deterministic, but it creates another problem. The judgment becomes coupled to one application, one programming language, and one deployment.&lt;/p&gt;

&lt;p&gt;A domain expert cannot easily review it. Another agent cannot reuse it without reproducing the logic. Changes become software releases rather than reviewed updates to an organizational decision contract.&lt;/p&gt;

&lt;p&gt;Skills and tool definitions help package behavior.&lt;/p&gt;

&lt;p&gt;MCP helps standardize access to context and capabilities.&lt;/p&gt;

&lt;p&gt;Policy engines can evaluate explicit rules.&lt;/p&gt;

&lt;p&gt;All of these are useful. None of them, by themselves, fully represent the evidence, applicability, exceptions, uncertainty, and escalation conditions behind a business decision.&lt;/p&gt;

&lt;p&gt;That led me to experiment with separating the judgment from both the model and the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea: A Testable Judgment Contract
&lt;/h2&gt;

&lt;p&gt;I started working on what is now the &lt;strong&gt;Judgment Pack Specification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A Judgment Pack is a declarative representation of the conditions behind a decision.&lt;/p&gt;

&lt;p&gt;At a high level, a pack can describe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what question is being decided&lt;/li&gt;
&lt;li&gt;when the pack applies&lt;/li&gt;
&lt;li&gt;which evidence is required&lt;/li&gt;
&lt;li&gt;which facts are relevant&lt;/li&gt;
&lt;li&gt;which rules and exceptions affect the outcome&lt;/li&gt;
&lt;li&gt;which conditions make the decision unresolved&lt;/li&gt;
&lt;li&gt;when escalation is required&lt;/li&gt;
&lt;li&gt;which outputs are valid&lt;/li&gt;
&lt;li&gt;how expected behavior can be tested&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simplified vendor-onboarding pack might express:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Decision:
May this vendor be onboarded?

Required evidence:
- sanctions-screening result
- tax-form status

Exceptions:
- sanctions match → hard stop
- annual spend above threshold → committee review

Unresolved conditions:
- required evidence missing
- screening could not be completed
- approval authority is unknown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not the file format.&lt;/p&gt;

&lt;p&gt;The important part is that the decision conditions become a reviewable and testable artifact rather than hidden instructions inside a prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Testability Changes
&lt;/h2&gt;

&lt;p&gt;Once the judgment is explicit, we can write scenarios such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario 1:
Sanctions clear
Tax form received
Spend below threshold
Expected result: eligible for approval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario 2:
Sanctions match
Tax form received
Expected result: hard stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario 3:
Sanctions screening missing
Tax form received
Expected result: unresolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario 4:
Sanctions clear
Tax form received
Spend above threshold
Expected result: committee review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now a change to the pack can be evaluated against known expectations.&lt;/p&gt;

&lt;p&gt;If someone modifies the annual-spend exception and an existing scenario starts producing direct approval instead of committee review, the test should fail.&lt;/p&gt;

&lt;p&gt;That is closer to what coding agents already have: an environment that can challenge the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correctly Refusing to Decide Is Part of Correctness
&lt;/h2&gt;

&lt;p&gt;One lesson has become especially important.&lt;/p&gt;

&lt;p&gt;A business agent should not always produce an answer.&lt;/p&gt;

&lt;p&gt;Sometimes the correct outcome is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;evidence required&lt;/li&gt;
&lt;li&gt;unresolved&lt;/li&gt;
&lt;li&gt;not applicable&lt;/li&gt;
&lt;li&gt;escalate&lt;/li&gt;
&lt;li&gt;human approval required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many current evaluation approaches reward producing the expected answer. But in enterprise decisions, a system can also fail by deciding when it should have stopped.&lt;/p&gt;

&lt;p&gt;That means abstention and escalation cannot be treated as fallback error states.&lt;/p&gt;

&lt;p&gt;They are first-class outcomes.&lt;/p&gt;

&lt;p&gt;A useful judgment system must be able to distinguish:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The answer is no”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The system does not yet have authority or evidence to answer.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are operationally very different.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Judgment Pack Does Not Solve
&lt;/h2&gt;

&lt;p&gt;I do not see this as a replacement for agent frameworks, MCP, policy engines, or knowledge graphs.&lt;/p&gt;

&lt;p&gt;They solve different parts of the system.&lt;/p&gt;

&lt;p&gt;MCP can connect an agent to a sanctions service.&lt;/p&gt;

&lt;p&gt;A gateway can control whether the agent is allowed to call it.&lt;/p&gt;

&lt;p&gt;A policy engine can evaluate a deterministic rule.&lt;/p&gt;

&lt;p&gt;A knowledge graph can represent relationships and organizational context.&lt;/p&gt;

&lt;p&gt;A Judgment Pack is intended to describe how those inputs contribute to a defensible decision.&lt;/p&gt;

&lt;p&gt;It also does not prove that source data is true.&lt;/p&gt;

&lt;p&gt;If a system receives a false sanctions result, a correct evaluator can still produce the wrong real-world outcome. Provenance, source trust, authorization, and evidence acquisition remain separate concerns.&lt;/p&gt;

&lt;p&gt;The current project is an attempt to make those boundaries explicit rather than claiming one specification solves all of agent governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions That Are Still Open
&lt;/h2&gt;

&lt;p&gt;Opening the project as open source is important because several of the hardest questions should not be answered by one person.&lt;/p&gt;

&lt;p&gt;Some of the questions I am currently exploring are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How should an agent select the correct pack?&lt;/li&gt;
&lt;li&gt;How should multiple packs compose?&lt;/li&gt;
&lt;li&gt;Where should Judgment Pack end and policy engines begin?&lt;/li&gt;
&lt;li&gt;How should conflicting evidence be represented?&lt;/li&gt;
&lt;li&gt;Which evaluator semantics must be portable across runtimes?&lt;/li&gt;
&lt;li&gt;How should evidence freshness be expressed?&lt;/li&gt;
&lt;li&gt;How should organizations version and approve judgment changes?&lt;/li&gt;
&lt;li&gt;How should authorization be separated from decision evaluation?&lt;/li&gt;
&lt;li&gt;What makes an explanation defensible rather than merely plausible?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are specification questions, runtime questions, and organizational questions at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Opened It
&lt;/h2&gt;

&lt;p&gt;I spent many years building enterprise data platforms, operational systems, and AI infrastructure.&lt;/p&gt;

&lt;p&gt;Across those environments, organizations often had plenty of data and documentation. What they struggled to preserve was the judgment behind important decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which evidence mattered&lt;/li&gt;
&lt;li&gt;why an exception was allowed&lt;/li&gt;
&lt;li&gt;when a rule stopped applying&lt;/li&gt;
&lt;li&gt;who had authority&lt;/li&gt;
&lt;li&gt;what uncertainty required escalation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontier models can reason over more context and use more tools.&lt;/p&gt;

&lt;p&gt;But every organization still has its own conditions for what counts as an acceptable decision.&lt;/p&gt;

&lt;p&gt;That judgment should not remain trapped inside prompts, undocumented code, or individual experience.&lt;/p&gt;

&lt;p&gt;It should be possible to review, test, version, and improve it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project Is Now Open Source
&lt;/h2&gt;

&lt;p&gt;The Judgment Pack Specification and runtime are now open source.&lt;/p&gt;

&lt;p&gt;I am looking for contributors in several areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specification review&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Challenge how the project represents evidence, exceptions, uncertainty, escalation, and outcomes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-world decision packs&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Contribute a difficult decision from procurement, data governance, security, support, finance, operations, or another domain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adversarial scenarios&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Add cases where a reasonable-looking agent should refuse, escalate, or produce a different outcome.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Runtime and tooling&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Improve the Go runtime, evaluator, CLI, documentation, and agent integrations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most useful first contribution may not be code.&lt;/p&gt;

&lt;p&gt;A real decision that exposes where the current model breaks can be more valuable than another feature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://judgmentpack.org" rel="noopener noreferrer"&gt;judgmentpack.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Specification: &lt;a href="https://github.com/Judgment-Pack/judgment-pack-spec" rel="noopener noreferrer"&gt;Judgment-Pack/judgment-pack-spec&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Good first issues: &lt;a href="https://github.com/Judgment-Pack/judgment-pack-spec/labels/good%20first%20issue" rel="noopener noreferrer"&gt;Browse beginner-friendly issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would especially value critical feedback from people working on agent evaluation, MCP, policy engines, rules-as-code, human approval, and enterprise AI systems.&lt;/p&gt;

&lt;p&gt;The project will improve faster through strong disagreement and real use cases than through agreement alone.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; AI tools assisted with editing and structure. The project design, technical content, examples, and final review are my own.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
