<?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: Jeremy Longshore</title>
    <description>The latest articles on DEV Community by Jeremy Longshore (@jeremy_longshore).</description>
    <link>https://dev.to/jeremy_longshore</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%2F3842419%2Ff5d02b54-daf0-4520-9aef-118fbd0c24ac.jpeg</url>
      <title>DEV Community: Jeremy Longshore</title>
      <link>https://dev.to/jeremy_longshore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jeremy_longshore"/>
    <language>en</language>
    <item>
      <title>Three Gates on Standard-User BitLocker State Observation</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Tue, 15 Sep 2026 11:30:13 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/three-gates-on-standard-user-bitlocker-state-observation-1h5l</link>
      <guid>https://dev.to/jeremy_longshore/three-gates-on-standard-user-bitlocker-state-observation-1h5l</guid>
      <description>&lt;h2&gt;
  
  
  The day started with a P1 on merge day
&lt;/h2&gt;

&lt;p&gt;Closing intent-blue-gold Epic 1+2 was supposed to be the easy part. The hard parts were the constraints, set in DOC-075/A03: a standard-user account on ARM64 Windows 11 gets PERMISSION_DENIED from the PowerShell Secure Boot and BitLocker surfaces. WMI is out. COM is out. Elevation is out. Anything that requires a privileged token is out. Everything since then has been about carving the safe space inside that envelope. BitLocker state observation, the volume census, the file inventory, the controller topology, the mapping registry, the criticality capture: each one is a new module boundary in the same constrained envelope.&lt;/p&gt;

&lt;p&gt;I ran Codex (GPT-5.6 Sol) read-only against the day's merge candidates on purpose. Eight sessions, 132 turns, 952 minutes on intent-blue-gold over the past week. The audit was not a polish pass. It was a closure gate. It surfaced three P1 blockers. Two of them were exactly the kind of failure the audit exists to catch.&lt;/p&gt;

&lt;p&gt;The three gates that have to hold together are: the observer contract, the bounded native provider, and the fixture-boundary authorization. Gate 3 was the one that slipped. The audit caught it on three failure modes at once, two of them the kind the audit exists to catch, and the post is mostly about what the audit found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gate 1: the observer contract
&lt;/h2&gt;

&lt;p&gt;The observer contract is the seam between the constrained envelope and any code that wants to read BitLocker state. Anything that talks to &lt;code&gt;GetFveLogicalVolumeInformation&lt;/code&gt;-equivalent surfaces has to enter through this contract. Here is the seam in Go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// BitlockerObserver is the standard-user entry point. It returns&lt;/span&gt;
&lt;span class="c"&gt;// State with the OBSERVED bit set only when the call ran through&lt;/span&gt;
&lt;span class="c"&gt;// the helper, the helper authenticated, and the fixture boundary&lt;/span&gt;
&lt;span class="c"&gt;// held. Anything else is OBSERVED=false, even if the bytes look&lt;/span&gt;
&lt;span class="c"&gt;// reasonable.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;BitlockerObserver&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vol&lt;/span&gt; &lt;span class="n"&gt;VolumeRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// State has three meaningful bits:&lt;/span&gt;
&lt;span class="c"&gt;// OBSERVED  = we ran the native probe and got a result&lt;/span&gt;
&lt;span class="c"&gt;// CACHED    = we have a non-stale prior observation for this vol&lt;/span&gt;
&lt;span class="c"&gt;// UNAVAIL  = the probe ran but the OS returned access denied or&lt;/span&gt;
&lt;span class="c"&gt;//            empty; we treat that as no information, not as "off"&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Volume&lt;/span&gt;    &lt;span class="n"&gt;VolumeRef&lt;/span&gt;
    &lt;span class="n"&gt;Status&lt;/span&gt;    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="c"&gt;// protect_state strings, NOT raw OS bytes&lt;/span&gt;
    &lt;span class="n"&gt;Observed&lt;/span&gt;  &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;Cached&lt;/span&gt;    &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;Unavail&lt;/span&gt;   &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;Source&lt;/span&gt;    &lt;span class="n"&gt;ProbeSource&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting bit is &lt;code&gt;Observed&lt;/code&gt;. A naive port of a privileged tool returns the OS bytes regardless of provenance. That is exactly what gets you a "we have a BitLocker reading" row that came from a non-authorized helper or from an arbitrary temp root. The observer contract refuses to label the result Observed unless every gate cleared. The byte string is still in &lt;code&gt;Status&lt;/code&gt;, but downstream code is supposed to ignore &lt;code&gt;Status&lt;/code&gt; when &lt;code&gt;Observed&lt;/code&gt; is false. That is the contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gate 2: the bounded native provider
&lt;/h2&gt;

&lt;p&gt;Gate 2 is the provider that does the actual syscall. Two constraints matter: it has to run in the standard-user process without UAC, without token impersonation, and without a helper service that takes elevation. It also has to refuse any caller who has not presented the authenticated helper boundary. The provider entry point.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;NativeProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;QueryVolume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vol&lt;/span&gt; &lt;span class="n"&gt;VolumeRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;helperBoundary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authorized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Fail closed: an unauthorized caller gets the same answer&lt;/span&gt;
        &lt;span class="c"&gt;// they would get from an unauthenticated probe. No detail,&lt;/span&gt;
        &lt;span class="c"&gt;// no exception type, no "near miss" leak.&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Unavail&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;ErrBoundaryClosed&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsFixtureAuthorized&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// The fixture boundary: even an authenticated helper can&lt;/span&gt;
        &lt;span class="c"&gt;// not cross outside the manifest-verified fixture. This&lt;/span&gt;
        &lt;span class="c"&gt;// is gate 3, but we enforce it at the provider entry to&lt;/span&gt;
        &lt;span class="c"&gt;// avoid a second code path that needs the same guarantee.&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Volume&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Unavail&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;ErrOutsideFixture&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queryViaSyscall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;queryViaSyscall&lt;/code&gt; is the boring part. &lt;code&gt;FsctlEnumerateVolumeInformation&lt;/code&gt; with a &lt;code&gt;BITLOCKER_INFORMATION&lt;/code&gt; header, &lt;code&gt;IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS&lt;/code&gt; for layout, fall through to the registry path when the helper IPC returned access denied. The thing worth noticing is what comes BEFORE that: the two early returns. An unauthorized caller and an out-of-fixture caller both get &lt;code&gt;Unavail: true&lt;/code&gt; with &lt;code&gt;Observed: false&lt;/code&gt;. They get the same answer a probe that genuinely failed would have given. There is no signal that says "we are not telling you because of X."&lt;/p&gt;

&lt;p&gt;That is fail-closed by construction. The audit did not flag this gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gate 3: the fixture-boundary authorization (the failure)
&lt;/h2&gt;

&lt;p&gt;Gate 3 was the failure. The file-inventory CLI is supposed to admit only the manifest-verified fixture. The fixture is a checked-in blob with a hash pinned in &lt;code&gt;fixture.manifest&lt;/code&gt;. Anything else is a synthetic root, and synthetic roots are test-only. The CLI was supposed to refuse a synthetic root at admission. Here is what the gate looks like.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Authorized root check. The CLI calls this before any work.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FixtureAuth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;LoadManifest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="c"&gt;// no manifest, no authorization, fail closed&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;pinned&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CanonicalRoot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pathEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pinned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Synthetic roots are valid in tests, but the production&lt;/span&gt;
        &lt;span class="c"&gt;// CLI is not a test. Production admission refuses them.&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ErrSyntheticRootRejected&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HashMatches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// The pinned root is the right path but the bytes don't&lt;/span&gt;
        &lt;span class="c"&gt;// match. That is a fixture drift, also a hard refusal.&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ErrFixtureDrift&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is what the code is supposed to do. Codex found that &lt;code&gt;prototypes/blue-windows/cmd/file-inventory/main.go:54-76&lt;/code&gt; accepts any directory containing a user-created marker and then scans its &lt;code&gt;Desktop&lt;/code&gt;, &lt;code&gt;Documents&lt;/code&gt;, &lt;code&gt;Downloads&lt;/code&gt;, and &lt;code&gt;Pictures&lt;/code&gt; children. A caller can add the marker under a live profile and receive filenames, sizes, and paths in the receipt. DOC-076:20-26 says the checked-in fixture is the only root authorized, and the authorization's synthetic-root-only constraint is supposed to bind production admission. The code did not bind it. The CLI was test-friendly and production-broken in the same binary.&lt;/p&gt;

&lt;p&gt;The minimal fix is to call &lt;code&gt;FixtureAuth.Authorize&lt;/code&gt; from &lt;code&gt;main.go:54-76&lt;/code&gt; before any traversal. The CLI keeps its test ergonomics because the test harness can register a synthetic root with the test-only &lt;code&gt;RegisterSynthetic&lt;/code&gt; hook, but the production binary refuses anything except the canonical fixture or a manifest-verified immutable fixture. That is what is shipping today. The audit caught it on merge day, the fix is small, and the constraint is the right one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The TOCTOU reparse replacement (gate 3, the second finding)
&lt;/h2&gt;

&lt;p&gt;The same audit flagged a separate failure in &lt;code&gt;scan.go:185-216&lt;/code&gt;: path-based &lt;code&gt;ReadDir&lt;/code&gt;, &lt;code&gt;Lstat&lt;/code&gt;, then recursive &lt;code&gt;ReadDir&lt;/code&gt;. A validated directory can be swapped for a reparse point mid-traversal. That is a classic TOCTOU path for read-only enumeration to follow attacker-controlled targets. The standard fix on Linux is &lt;code&gt;O_DIRECTORY | O_NOFOLLOW&lt;/code&gt;, then keep the file descriptor and enumerate from it. On Windows the equivalent is to open with &lt;code&gt;FILE_FLAG_OPEN_REPARSE_POINT&lt;/code&gt; and the standard share-mode set, capture the handle, and re-validate the reparse status from the handle before walking into children. The sketch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Linux side: open the directory once, hold the fd, refuse to walk&lt;/span&gt;
&lt;span class="c"&gt;// a reparse change observed post-open.&lt;/span&gt;
&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;O_RDONLY&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;O_DIRECTORY&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;O_NOFOLLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;// Snapshot the reparse status at open time, then compare against&lt;/span&gt;
&lt;span class="c"&gt;// each entry's d_type before deciding to descend. (The full&lt;/span&gt;
&lt;span class="c"&gt;// re-validation lives in the production helper; the sketch is the&lt;/span&gt;
&lt;span class="c"&gt;// shape, not the implementation.)&lt;/span&gt;
&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Getdents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Windows side is heavier (handle capture plus &lt;code&gt;DeviceIoControl(FSCTL_GET_REPARSE_POINT)&lt;/code&gt; per candidate), but the principle is the same: validate once, keep the handle, refuse a reparse change observed after open. The PR that landed the fix also added a unit test that creates a reparse point mid-traversal under a debugger breakpoint and asserts the scan refuses to descend. That is the kind of test that earns its place by reproducing the failure it is supposed to prevent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The non-reparse offline file (the stale classifier, gate 3 by association)
&lt;/h2&gt;

&lt;p&gt;The third finding is closer to a stale classifier than a security boundary failure, but it is still P1 because the classifier decides what downstream code does with the result. &lt;code&gt;prototypes/blue-windows/cloudstate/observe_windows.go:41-42&lt;/code&gt; returns &lt;code&gt;StateLocal&lt;/code&gt; whenever &lt;code&gt;FILE_ATTRIBUTE_REPARSE_POINT&lt;/code&gt; is absent. The &lt;code&gt;OFFLINE&lt;/code&gt;, &lt;code&gt;RECALL_ON_OPEN&lt;/code&gt;, and &lt;code&gt;RECALL_ON_DATA_ACCESS&lt;/code&gt; flags are examined later in &lt;code&gt;classifyWindowsState&lt;/code&gt; at lines 73-74, which is unreachable for non-reparse files. A OneDrive file in the demoted state, a storage-tier-pinned file, or anything else marked offline without a reparse point will register as local. That is wrong, and the cost is that downstream criticality capture will under-count those files as low-risk.&lt;/p&gt;

&lt;p&gt;The fix is to evaluate the offline/recall mask before the non-reparse &lt;code&gt;StateLocal&lt;/code&gt; return. A non-reparse file with &lt;code&gt;FILE_ATTRIBUTE_OFFLINE&lt;/code&gt; should classify as &lt;code&gt;CLOUD_ONLY&lt;/code&gt; (or &lt;code&gt;UNKNOWN/unavailable&lt;/code&gt; if we want to be conservative on recall flags we cannot yet test on every Windows SKU). The native probe needs a regression test for a non-reparse offline file. That is also shipping today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not the obvious approach?
&lt;/h2&gt;

&lt;p&gt;The obvious approach for standard-user state observation is to shell out to &lt;code&gt;manage-bde -status&lt;/code&gt; and parse the text. That is what every PowerShell script in the wild does. It works on a privileged user. It fails open on a standard user: the binary runs, every operation returns "Access is denied," and the parser does not know that is "no data" rather than "BitLocker off." The classifier ends up reporting everything as off.&lt;/p&gt;

&lt;p&gt;The other obvious approach is to elevate. &lt;code&gt;manage-bde&lt;/code&gt; is the right tool for the privileged envelope. Elevation is not available here. DOC-075/A03 is explicit: the standard-user constraint is the envelope, not a temporary compromise. WMI stays out. COM stays out. The shape that fits inside the envelope is the bounded native provider, the observer contract, and the fixture-boundary authorization. They are less convenient than &lt;code&gt;manage-bde&lt;/code&gt;. They are what works inside the envelope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adjacent finding on the NVMe health-log parser
&lt;/h2&gt;

&lt;p&gt;The audit surfaced a separate bug in the NVMe health-log parser. The parser used wrong offsets: bytes 160-175 instead of 176-191. &lt;code&gt;NVME_HEALTH_INFO_LOG&lt;/code&gt; places UnsafeShutdowns at 160-175 and MediaErrors at 176-191, and the parser was rejecting every byte from 216 onward (which is also where valid sensors 7 and 8 live). Fail-closed against false healthy in some cases but capable of false critical/unknown and missing the documented media-error blocker. Not a P1 for this epic, but it is the next bead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;Other repos did work today, briefly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;omarchy-plugins-bluegold-email-fix&lt;/strong&gt;: closed FAQ panels 35 and 36, the adversarial buyer FAQ set. Buyer FAQ 36 is the version that survives a buyer who has already read the documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;intent-solutions-landing-bluegold-faq&lt;/strong&gt;: shipped v3.2.0 with a mobile conversion baseline (PR #54). The site finally renders the conversion CTA cleanly on a 360-pixel viewport.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;intent-demos&lt;/strong&gt;: launched the proof-first demos catalog (fd6198e) and fixed site previews on touch screens (6dc710d).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;contributing-clanker&lt;/strong&gt;: closed regression-state isolation and review-synthetic-alert tolerance fixes (#78 and #79).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jeremylongshore-dot-github&lt;/strong&gt;: bound VPS deploys to the caller revision (#5). Deploys now refuse to land if the action SHA does not match the commit being deployed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;omarchy-listening-post-entry&lt;/strong&gt;: recorded approvals and bound deploy revisions (#19), launched the Perception product foundation (#18).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;braves&lt;/strong&gt;: a beads sync remote update only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those are the day's center. The day's center is intent-blue-gold, the three gates, and the audit that caught two of them slipping before they shipped to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="//{{&lt;%20ref%20"&gt;}}"&amp;gt;Auditing Written Claims Against Their Artifacts&lt;/a&gt;: the second-review pattern across two unrelated domains. Today's Codex audit instantiates it on the BitLocker surface.&lt;/li&gt;
&lt;li&gt;
&lt;a href="//{{&lt;%20ref%20"&gt;}}"&amp;gt;Sealing a 168-bead planning graph took three reviews and a seven-seat council&lt;/a&gt;: planning under multi-review pressure, the day before.&lt;/li&gt;
&lt;li&gt;
&lt;a href="//{{&lt;%20ref%20"&gt;}}"&amp;gt;Adversarial review before team rollout&lt;/a&gt;: the adversarial pattern that the Codex audit instantiates on this surface.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>windows</category>
      <category>security</category>
      <category>bitlocker</category>
      <category>go</category>
    </item>
    <item>
      <title>Perception Is On the Way, on Its Own Domain</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Sun, 13 Sep 2026 11:30:14 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/perception-is-on-the-way-on-its-own-domain-53g6</link>
      <guid>https://dev.to/jeremy_longshore/perception-is-on-the-way-on-its-own-domain-53g6</guid>
      <description>&lt;p&gt;The day's pattern is the redirection. One Omarchy entry repo launched Perception's&lt;br&gt;
web/API surface and shipped a customer preview page to &lt;code&gt;perception.intentsolutions.io&lt;/code&gt;,&lt;br&gt;
but the live deployment was a coming-soon page rather than the full paid product.&lt;br&gt;
The smaller deployment was what the day's infrastructure could close. The same&lt;br&gt;
shift showed up on a second repo, where a 1,262-line master blueprint commit and&lt;br&gt;
17 documents filed into a flat chronological index paired with a 15-child Beads&lt;br&gt;
decomposition that waits on itself by design. Two products, two repos, one shared&lt;br&gt;
shape: ship the version the constraints can actually carry, and name the gap that&lt;br&gt;
forced the smaller scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  omarchy-listening-post-entry: Perception's web and API surface, then the customer preview
&lt;/h2&gt;

&lt;p&gt;The repo shipped Perception in two commits on 2026-09-11. The first commit&lt;br&gt;
(&lt;code&gt;12ba7df feat: establish Perception web and API product&lt;/code&gt;, 00:17 -0600) was&lt;br&gt;
46 files, 5,894 insertions: a new &lt;code&gt;web/&lt;/code&gt; Vite + React app, a new &lt;code&gt;api/&lt;/code&gt; Fastify&lt;br&gt;
service with Dockerfile, and a &lt;code&gt;packages/perception-contract/&lt;/code&gt; shared schema&lt;br&gt;
package that the web app and the API both depend on. The contract carries the&lt;br&gt;
Perception v1 snapshot schema, with &lt;code&gt;snapshot.id&lt;/code&gt;, &lt;code&gt;snapshot.staleAfter&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;snapshot.account&lt;/code&gt;, &lt;code&gt;snapshot.topics&lt;/code&gt;, and a &lt;code&gt;snapshot.signals&lt;/code&gt; array typed&lt;br&gt;
to &lt;code&gt;lane&lt;/code&gt; ∈ &lt;code&gt;incident | release | pricing | engineering&lt;/code&gt;. The web app imports&lt;br&gt;
the types directly from &lt;code&gt;@listening-post/perception-contract&lt;/code&gt;; the API and the&lt;br&gt;
contract tests share the same module.&lt;/p&gt;

&lt;p&gt;The second commit (&lt;code&gt;d992ce5 feat: prepare Perception customer preview&lt;/code&gt;,&lt;br&gt;
17:15 -0600) was 102 files, 5,077 insertions and added the rest of the&lt;br&gt;
customer-facing surface: a &lt;code&gt;PublicExperience.tsx&lt;/code&gt; that owns the public marketing&lt;br&gt;
site, four policy pages (privacy, terms, acceptable-use, support), a passwordless&lt;br&gt;
auth flow with magic links via &lt;code&gt;consumeMagicLink&lt;/code&gt; and &lt;code&gt;requestMagicLink&lt;/code&gt;,&lt;br&gt;
account views, customer-journey tests, and a &lt;code&gt;mailer.ts&lt;/code&gt; plus &lt;code&gt;customer-messages.ts&lt;/code&gt;&lt;br&gt;
plus &lt;code&gt;entitlements.ts&lt;/code&gt; plus &lt;code&gt;billing-webhook.test.ts&lt;/code&gt; that gate access on Lemon&lt;br&gt;
Squeezy subscription state. The schema gained a stricter signals shape (the&lt;br&gt;
array now requires &lt;code&gt;id, title, url, source, lane, relevance, resolved, quiet,&lt;br&gt;
matchedTopicIds, publishedAt, read&lt;/code&gt; per item with &lt;code&gt;additionalProperties: false&lt;/code&gt;).&lt;br&gt;
The manifest was updated to point &lt;code&gt;perceptionEndpoint&lt;/code&gt; at&lt;br&gt;
&lt;code&gt;https://api.perception.intentsolutions.io&lt;/code&gt; and the web &lt;code&gt;public/CNAME&lt;/code&gt; file&lt;br&gt;
was written with &lt;code&gt;perception.intentsolutions.io&lt;/code&gt;. PRODUCT.md, DESIGN.md,&lt;br&gt;
VERIFICATION.md, SECURITY.md, and CHANGELOG.md were authored together.&lt;/p&gt;

&lt;p&gt;That is the day's product surface. The live deploy is where the day's&lt;br&gt;
reversal starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the live deploy is a coming-soon page
&lt;/h2&gt;

&lt;p&gt;The original direction arrived as a single line near the end of the day's&lt;br&gt;
session: "merge the prs commit push etc deploy the website i meed it online&lt;br&gt;
i meed it online i give u commercial and legal approval." That authorization&lt;br&gt;
covered the full paid-product release: the API at &lt;code&gt;api.perception.intentsolutions.io&lt;/code&gt;,&lt;br&gt;
the web app, the Lemon Squeezy checkout flow, and the policy pages as binding&lt;br&gt;
production terms.&lt;/p&gt;

&lt;p&gt;The agent surfaced four gaps before changing live traffic. GitHub Pages was&lt;br&gt;
not enabled on the repo. The three &lt;code&gt;PERCEPTION_*&lt;/code&gt; repository variables were&lt;br&gt;
absent. The VPS deploy secrets were absent. The custom domains for both&lt;br&gt;
&lt;code&gt;perception.intentsolutions.io&lt;/code&gt; and &lt;code&gt;api.perception.intentsolutions.io&lt;/code&gt; were&lt;br&gt;
failing DNS resolution. PRODUCT.md was explicit that price, billing interval,&lt;br&gt;
refund window, legal operator, governing law, and final checkout URL were&lt;br&gt;
deployment-owned open decisions. The customer copy labelled itself "not yet&lt;br&gt;
production terms."&lt;/p&gt;

&lt;p&gt;The redirect that followed read, verbatim: "dude i just want perception.intentsolutions.io&lt;br&gt;
to work as a site people click to know its on the way i posted it in discord."&lt;br&gt;
That is the day's reversal. The full release was deferred, not failed: the&lt;br&gt;
agent was told the goal had shrunk to a single page that says the product is&lt;br&gt;
on its way and links to the GitHub repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Pages → VPS at intent-solutions
&lt;/h2&gt;

&lt;p&gt;The smaller deployment still needed a live URL. The agent's first attempt was&lt;br&gt;
GitHub Pages: a &lt;code&gt;gh-pages&lt;/code&gt; branch with the standalone coming-soon HTML and a&lt;br&gt;
Porkbun CNAME at 300s TTL. Pages was configured with Actions as its source,&lt;br&gt;
&lt;code&gt;PERCEPTION_DEMO_MODE=true&lt;/code&gt; was the only repo variable set, and the&lt;br&gt;
checkout/API variables were deliberately left unset so the preview could not&lt;br&gt;
masquerade as a paid production launch. DNS propagated. Pages started serving&lt;br&gt;
the page over HTTP. The certificate did not arrive.&lt;/p&gt;

&lt;p&gt;After the certificate stall, the agent switched to the VPS path that was&lt;br&gt;
already under control. Caddy was healthy on the VPS, passwordless sudo was&lt;br&gt;
available, and the same static page was served from there. The first Caddy&lt;br&gt;
reload failed closed because the new access-log file did not yet exist with&lt;br&gt;
Caddy ownership. The reload was isolated and retried after creating only&lt;br&gt;
that log file with the service's established permissions. The second reload&lt;br&gt;
succeeded. Porkbun was then asked to move the &lt;code&gt;perception&lt;/code&gt; CNAME from GitHub&lt;br&gt;
Pages to the VPS A record, with an automatic rollback path armed during the&lt;br&gt;
cutover. Caddy issued the Let's Encrypt certificate on retry. The local DNS&lt;br&gt;
resolver on the workstation had a stale negative cache for the new A record,&lt;br&gt;
which the agent bypassed to confirm the public origin.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;perception.intentsolutions.io&lt;/code&gt; now serves the coming-soon page over HTTPS&lt;br&gt;
from the VPS. The full paid product remains local and un-pushed; the open&lt;br&gt;
beads for price, billing interval, refund window, legal operator, governing&lt;br&gt;
law, and final checkout URL still own those decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  intent-blue-gold: 17 Stage 0 documents plus an Epic 0 Beads decomposition
&lt;/h2&gt;

&lt;p&gt;The second repo's day was a documentation discipline pass plus a Beads&lt;br&gt;
decomposition. The first commit (&lt;code&gt;d9cd691 docs: replace product summary with&lt;br&gt;
canonical MVP execution blueprint&lt;/code&gt;) added 1,262 insertions across a single&lt;br&gt;
file, the master blueprint that owns the BLUE → GOLD → BLUE → WELCOME&lt;br&gt;
sequence. The second commit (&lt;code&gt;a23517b docs: file Stage 0 repository records&lt;/code&gt;)&lt;br&gt;
filed 17 source documents (&lt;code&gt;PRODUCT.md&lt;/code&gt;, &lt;code&gt;V1-SCOPE.md&lt;/code&gt;, &lt;code&gt;RISK-REGISTER.md&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;THREAT-MODEL.md&lt;/code&gt;, &lt;code&gt;MIGRATION-CONTRACT.md&lt;/code&gt;, &lt;code&gt;COMPATIBILITY.md&lt;/code&gt;, &lt;code&gt;RESEARCH.md&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;AI-STRATEGY.md&lt;/code&gt;, &lt;code&gt;DECISIONS.md&lt;/code&gt;, &lt;code&gt;MASTER-BLUEPRINT.md&lt;/code&gt;, the &lt;code&gt;docs/&lt;/code&gt; subfolder&lt;br&gt;
documents) into a flat chronological &lt;code&gt;000-docs/&lt;/code&gt; tree using a global sequence&lt;br&gt;
plus an &lt;code&gt;AGENTS.md&lt;/code&gt; at root, a &lt;code&gt;CODEX-HANDOFF.md&lt;/code&gt; update, and a&lt;br&gt;
&lt;code&gt;000-docs/000-INDEX.md&lt;/code&gt; that names the order.&lt;/p&gt;

&lt;p&gt;The Beads side was harder. The first Beads init auto-adopted the unrelated&lt;br&gt;
Intent Eval Dolt database (1,499 imported issues inherited from a remote the&lt;br&gt;
agent had not selected). The first reset attempt succeeded technically but the&lt;br&gt;
inherited graph was still present in the local Dolt history. The second reset&lt;br&gt;
moved the &lt;code&gt;.beads/&lt;/code&gt; directory to &lt;code&gt;/tmp/intent-blue-gold-beads-XQ7n2p/imported-beads&lt;/code&gt;&lt;br&gt;
and &lt;code&gt;/tmp/intent-blue-gold-beads-reset-xXV59D/imported-beads&lt;/code&gt; and started&lt;br&gt;
with &lt;code&gt;dolt.local-only: true&lt;/code&gt; and &lt;code&gt;backup.enabled: false&lt;/code&gt; so no remote could be&lt;br&gt;
adopted. The third init came up clean (zero issues, no Dolt remote, no&lt;br&gt;
Intent Eval reference).&lt;/p&gt;

&lt;p&gt;On the clean workspace the master blueprint was decomposed into five epics,&lt;br&gt;
and Epic 0 (engineering foundation, CI/CD, repository quality gates) was&lt;br&gt;
decomposed into 15 bounded Beads children using three Luna-high subagents.&lt;br&gt;
The decomposition surfaced a cross-slice overlap (the CI orchestration bead&lt;br&gt;
and the bootstrap bead both claimed the local command), which was narrowed so&lt;br&gt;
CI consumes the bootstrap-owned gate rather than reimplementing it. The&lt;br&gt;
final DAG has nine dependency waves with maximum parallelism of three, a&lt;br&gt;
single onboarding/exit gate at the apex, and selective Epic 1 integration:&lt;br&gt;
research and safety-analysis work remains runnable, schema/fixture hardening&lt;br&gt;
waits for Epic 0 validators, experiment operationalization waits for workflow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;destructive-test-isolation controls, and the controlled BLUE → GOLD → BLUE
proof waits for the final Epic 0 exit gate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Beads config (&lt;code&gt;dolt.local-only: true&lt;/code&gt;, &lt;code&gt;backup.enabled: false&lt;/code&gt;, no remote)&lt;br&gt;
was committed, the issue graph was validated with &lt;code&gt;bd lint&lt;/code&gt; and &lt;code&gt;bd dep cycles&lt;/code&gt;&lt;br&gt;
(zero cycles, zero lint warnings), and the worktree was committed, pushed,&lt;br&gt;
and merged to &lt;code&gt;main&lt;/code&gt; as PR #1 with &lt;code&gt;delete_branch_on_merge&lt;/code&gt; flipped from&lt;br&gt;
&lt;code&gt;false&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; first via the GitHub repository API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;The comehomealabama journal (a separate Astro surface, not startaitools)&lt;br&gt;
published &lt;code&gt;ac9b179 post(journal): Orange Beach is three different decisions.&lt;br&gt;
Know which one you're making.&lt;/code&gt;, automated by &lt;code&gt;scripts/journal/mandy-land.sh&lt;/code&gt;&lt;br&gt;
after the voice and fair-housing lints both passed. That post lives on the&lt;br&gt;
Mandy machine and does not enter the startaitools archive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cost
&lt;/h2&gt;

&lt;p&gt;Two redirects, one certificate stall, one Caddy fail-closed reload, two&lt;br&gt;
failed Beads resets, and a 1,262-insertion master blueprint rewrite that&lt;br&gt;
became the canonical reference. The Perception web/API surface and the&lt;br&gt;
Beads Epic 0 graph both landed in their final form on the first attempt&lt;br&gt;
inside their own repositories. The deploy paths and the Beads remote selection&lt;br&gt;
each needed a second try. The customer-facing launch is now bounded by what&lt;br&gt;
HTTPS, Porkbun, and a Caddy file permission can carry, not by what the&lt;br&gt;
product itself can carry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://startaitools.com/posts/the-same-mission-on-two-surfaces-in-one-day/" rel="noopener noreferrer"&gt;The Same Mission on Two Surfaces in One Day&lt;/a&gt;, 2026-09-10's pair of initial scaffolds and the marketplace claim ledger pattern that precedes the Perception customer preview&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://startaitools.com/posts/a-953-line-skill-entry-fits-the-budget-again/" rel="noopener noreferrer"&gt;A 953-Line Skill Entry Fits the Budget Again&lt;/a&gt;, 2026-09-09's split-and-pull-only refactor and the same-day 17-repo audit-harness refresh&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://startaitools.com/posts/hardening-a-marketplace-in-one-day/" rel="noopener noreferrer"&gt;Hardening a Marketplace in One Day&lt;/a&gt;, 2026-09-08's C44 installable-tree gate and the portable install integrity contract that ship next to the contributor workflow&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>omarchy</category>
      <category>releaseengineering</category>
      <category>deployment</category>
      <category>beads</category>
    </item>
    <item>
      <title>The Primary Record Settles What a Derived One Assumed</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Tue, 08 Sep 2026 11:30:14 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/the-primary-record-settles-what-a-derived-one-assumed-7oc</link>
      <guid>https://dev.to/jeremy_longshore/the-primary-record-settles-what-a-derived-one-assumed-7oc</guid>
      <description>&lt;p&gt;A legal packet had already been corrected once. That is what made the day worth&lt;br&gt;
writing down. The name on the drafts was wrong, somebody caught it, somebody&lt;br&gt;
fixed it against the records we had, and the fixed version was still wrong. On&lt;br&gt;
2026-09-06 the same shape showed up three more times, on systems that share no&lt;br&gt;
code: a homepage publishing three different star counts, a ratified security&lt;br&gt;
record, and a migration linter that counted an index build inside a log&lt;br&gt;
message.&lt;/p&gt;

&lt;p&gt;The common mechanism is boring and it costs a lot. A derived record is any&lt;br&gt;
statement of fact produced from another statement of fact rather than from the&lt;br&gt;
thing itself. Repo files describing an entity. An audit summarizing a record. A&lt;br&gt;
grep counting SQL. Each one is cheap to read and confident by default, because&lt;br&gt;
a derived record carries no expiry on its source unless someone builds one in.&lt;br&gt;
Only a primary record settles it: the state filing, the GitHub API, the&lt;br&gt;
governing section, the parsed statement.&lt;/p&gt;
&lt;h2&gt;
  
  
  The correction that was itself derived
&lt;/h2&gt;

&lt;p&gt;The legal packet's entity name had been fixed once already, from repo records.&lt;br&gt;
Those repo records had normalized the name at some earlier point, so the&lt;br&gt;
correction inherited the normalization. Commit &lt;code&gt;da39e57b&lt;/code&gt; says it plainly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the audit had corrected the name once from repo records that had normalized&lt;br&gt;
it; the primary record produced 2026-09-06 shows both earlier forms were wrong&lt;br&gt;
and the state of formation was an assumption the drafts had baked into&lt;br&gt;
governing law and forum.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Certificate of Formation and the IRS EIN record arrived and closed two&lt;br&gt;
standing assumptions as false. A-02, the name spelling: the registered entity is&lt;br&gt;
&lt;strong&gt;IntentSolutions.io LLC&lt;/strong&gt;. A-01, the state of formation: Delaware, file&lt;br&gt;
10329498, formed 2025-09-11, registered agent Harvard Business Services.&lt;/p&gt;

&lt;p&gt;The name was a find-and-replace. The state of formation cost more, because it&lt;br&gt;
had never been written down as a fact anywhere. It was an assumption, and it had&lt;br&gt;
already propagated into meaning, since the governing-law and forum clauses of&lt;br&gt;
the contract templates were built on top of it. A wrong string is a lint. A&lt;br&gt;
wrong premise underneath a clause is a different category of problem, and no&lt;br&gt;
amount of internal review would have surfaced it, because every document in the&lt;br&gt;
packet agreed with every other document in the packet.&lt;/p&gt;

&lt;p&gt;Enforcement shipped with the correction, and the shape of the enforcement&lt;br&gt;
matters more than the value it now accepts. The validator does not check that&lt;br&gt;
the entity string looks plausible. It rejects the two specific forms we now know&lt;br&gt;
are retired:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ci/validate-legal-packet.sh &lt;span class="nt"&gt;--selftest&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;selftest] accepts: IntentSolutions.io LLC ....................... ok
&lt;span class="o"&gt;[&lt;/span&gt;selftest] rejects: retired form A &lt;span class="o"&gt;(&lt;/span&gt;pre-normalization&lt;span class="o"&gt;)&lt;/span&gt; ........... ok
&lt;span class="o"&gt;[&lt;/span&gt;selftest] rejects: retired form B &lt;span class="o"&gt;(&lt;/span&gt;repo-normalized&lt;span class="o"&gt;)&lt;/span&gt; ............. ok
&lt;span class="o"&gt;[&lt;/span&gt;selftest] 3/3 passed

&lt;span class="nv"&gt;$ &lt;/span&gt;ci/validate-legal-packet.sh
entity string: IntentSolutions.io LLC &lt;span class="o"&gt;(&lt;/span&gt;43 files checked&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The retired forms are not printed here for the same reason the selftest labels&lt;br&gt;
them A and B: repeating a wrong name in public copy is how it gets re-derived.&lt;br&gt;
Formation screenshots live outside the repo. The EIN, street address, and phone&lt;br&gt;
never enter it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Formation state and governing law are separate questions
&lt;/h2&gt;

&lt;p&gt;The obvious move, once the formation state lands, is to sweep governing law and&lt;br&gt;
forum to Delaware and be done. We did the opposite. Alabama law and Baldwin&lt;br&gt;
County stay in the drafts, flagged as open counsel question C-14.&lt;/p&gt;

&lt;p&gt;Formation state and choice of governing law are different questions that happen&lt;br&gt;
to share a word. The business operates in Alabama, the founder is in Alabama,&lt;br&gt;
and the restrictive-covenant analysis (the clause set that actually bites in a&lt;br&gt;
dispute) is an Alabama-law question. Switching the contracts to Delaware because&lt;br&gt;
the certificate says Delaware would be a second derived conclusion stacked on&lt;br&gt;
the first one, produced by exactly the reasoning that caused the original&lt;br&gt;
problem: an inference from a nearby fact, written down with the confidence of a&lt;br&gt;
finding.&lt;/p&gt;

&lt;p&gt;The correct output of a primary-record check is a smaller set of facts and a&lt;br&gt;
larger set of explicit questions. C-14 is a question with a name and an owner.&lt;br&gt;
It is unresolved, and it is no longer silently assumed, which is where it sat&lt;br&gt;
yesterday.&lt;/p&gt;
&lt;h2&gt;
  
  
  Three star counts, none of them from GitHub
&lt;/h2&gt;

&lt;p&gt;Track two is the company homepage. The 451-line audit of the live&lt;br&gt;
intentsolutions.io found it publishing three contradictory star counts for the&lt;br&gt;
same repository, two of them above the verified figure. None of the three was&lt;br&gt;
read from GitHub. Each was typed into a component from whatever earlier copy&lt;br&gt;
the author had in front of them, and each component agreed with itself, so&lt;br&gt;
&lt;a href="https://dev.to/blog/the-lane-that-reviewed-nothing/"&gt;every review the page had passed&lt;/a&gt; was&lt;br&gt;
a review of derived numbers against other derived numbers. The same audit found a hero leading with retired Google&lt;br&gt;
infrastructure, five service lines, a booking calendar, and a contact form&lt;br&gt;
posting to an unrouted path.&lt;/p&gt;

&lt;p&gt;PR #49 shipped v3.0.0 as the fix: a static Astro rebuild derived from a written&lt;br&gt;
gateway brief, with React and the animation libraries removed, and 17 routes,&lt;br&gt;
30 dead components, 12.5 MB of unreferenced media, and 20 runtime dependencies&lt;br&gt;
deleted. The part that answers the thesis is smaller than the rebuild. Every&lt;br&gt;
figure on the page rendered from &lt;code&gt;src/data/receipts.json&lt;/code&gt;, which&lt;br&gt;
&lt;code&gt;scripts/refresh-receipts.mjs&lt;/code&gt; writes from GitHub, tonsofskills.com, skills.sh,&lt;br&gt;
the Lab results page, and the field-notes RSS. Each value carries a&lt;br&gt;
&lt;code&gt;verified_at&lt;/code&gt;. CI refreshes the file before deploy and fails the build when a&lt;br&gt;
value goes stale:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MAX_AGE_DAYS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;receipts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ageDays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;verified_at&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;86400000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ageDays&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;MAX_AGE_DAYS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; verified_at is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ageDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;d old (max &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;MAX_AGE_DAYS&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A count with a &lt;code&gt;verified_at&lt;/code&gt; is still a derived record. The difference is that&lt;br&gt;
it now expires, and the build knows the expiry. A second gate,&lt;br&gt;
&lt;code&gt;scripts/check-copy.mjs&lt;/code&gt;, failed on retired strings, dollar figures, dashes, and&lt;br&gt;
hand-typed counts, so while it was live the old failure could not be typed back&lt;br&gt;
in.&lt;/p&gt;

&lt;p&gt;PR #51 reverted the whole rebuild the same day. The owner's call, verbatim:&lt;br&gt;
"roll back to original please." The zinc theme, the React islands, all 29&lt;br&gt;
routes, the media, the dependencies, and the pre-rebuild CLAUDE.md all came&lt;br&gt;
back, with one merge conflict in the auto-generated CHANGELOG. We took a clean&lt;br&gt;
revert over a partial keep so main matches the last known live state exactly; a&lt;br&gt;
partial keep produces a fourth thing that was never live and never reviewed as&lt;br&gt;
a whole. The audit doc stayed on main, because a revert only removes what the&lt;br&gt;
reverted PR added, and the audit was independently true.&lt;/p&gt;

&lt;p&gt;This instance is a variant of the other three, and it is worth saying so. The&lt;br&gt;
brief was executed faithfully. What the revert corrected was not a false fact&lt;br&gt;
but a direction, and the only primary record for the direction is the owner.&lt;br&gt;
The second attempt did not guess at copy again. It put the live page in front&lt;br&gt;
of eight independent reader seats in one Workflow, with a ninth seat for&lt;br&gt;
synthesis, and filed the result as a 455-line review. The verdict was 8 of 8&lt;br&gt;
that the page does not represent the vision and that the fix is mostly&lt;br&gt;
subtraction. The headline vote split 6 to 2, and the merged recommendation&lt;br&gt;
ships both lines, the majority as H1 and the challenger in the eyebrow slot,&lt;br&gt;
because a 6/2 split and an 8/0 agreement are different facts about the copy&lt;br&gt;
and a single recommendation erases the difference. The synthesis escalated two&lt;br&gt;
items to the owner instead of resolving them, one being that several seats had&lt;br&gt;
written founder-biography detail into public copy against a standing&lt;br&gt;
instruction. A panel of readers is another derived record. The escalation is&lt;br&gt;
the step that reached primary.&lt;/p&gt;
&lt;h2&gt;
  
  
  A ratified record whose "no bead owed" was false
&lt;/h2&gt;

&lt;p&gt;Track three ran on &lt;code&gt;intent-longbox&lt;/code&gt;. Seven PRs on multi-tenant isolation&lt;br&gt;
merged the same day (#95 through #101: compound tenant keys, row-level security&lt;br&gt;
as a contracting shape, a single identity door, store-domain claims, membership&lt;br&gt;
policies, self-service second factor, webhook replay defense), and records 060&lt;br&gt;
through 065 were ratified. The compound key from #95 carries its whole&lt;br&gt;
isolation argument in the three lines before the close:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;scan_result&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt;          &lt;span class="n"&gt;uuid&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;shop_id&lt;/span&gt;     &lt;span class="n"&gt;uuid&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;shop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;session_id&lt;/span&gt;  &lt;span class="n"&gt;uuid&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shop_id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shop_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;scan_session&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shop_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;CASCADE&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tenant travels in the composite key, so a foreign key check cannot resolve against&lt;br&gt;
another shop's row even when the application forgets its predicate.&lt;/p&gt;

&lt;p&gt;Then the gate audit read record 065 and found its ground false. The record&lt;br&gt;
claimed no follow-up work was owed. The remaining cross-tenant edges were not&lt;br&gt;
actually exempt under record 062 section 4, which is the section the claim&lt;br&gt;
leaned on. Two beads were filed as a result, E03-D37 and E03-D38. D37 then moved&lt;br&gt;
from P3 to P2 because two of the remaining single-column tenant edges were&lt;br&gt;
reproduced as exploitable on head: a device credential revocation planted across&lt;br&gt;
shops, and a global UNIQUE on credential retirement evaluated with row-level&lt;br&gt;
security off.&lt;/p&gt;

&lt;p&gt;A ratified record is a derived record. Record 062 section 4 sits closer to&lt;br&gt;
primary, and reading it directly is what broke the claim.&lt;/p&gt;
&lt;h2&gt;
  
  
  The linter that counted a sentence
&lt;/h2&gt;

&lt;p&gt;The best small instance of the day came from the Postgres migration lint written to&lt;br&gt;
enforce the 044 index-lock rule. That rule caps how many index builds a single&lt;br&gt;
migration may take a heavy lock for. The lint counted index builds with a text&lt;br&gt;
grep, which meant it counted this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- migration 039, inside a DO block
DO $$
BEGIN
  RAISE NOTICE 'rebuilding: CREATE INDEX on inventory_item may take minutes';
END $$;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A string literal inside a log message. The grep read it as a sixth index build&lt;br&gt;
and failed the migration. A count of SQL objects was being derived from prose&lt;br&gt;
about SQL objects, inside the same file.&lt;/p&gt;

&lt;p&gt;Invariant review caught it before the lint shipped, and the note went on the&lt;br&gt;
bead so the name-collision lint being added next would avoid inheriting the same&lt;br&gt;
false positive. That bead then absorbed a second rule: &lt;code&gt;DROP CONSTRAINT&lt;/code&gt; on a&lt;br&gt;
live table takes the same lock declaration the &lt;code&gt;CREATE INDEX&lt;/code&gt; rule already&lt;br&gt;
demands. Migration 039's eleven ACCESS EXCLUSIVE locks come from &lt;code&gt;DROP&lt;br&gt;
CONSTRAINT&lt;/code&gt;, and 044 section 9 never reached that statement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cost
&lt;/h2&gt;

&lt;p&gt;One failure that day was a different shape, a rule you can step around rather&lt;br&gt;
than a wrong fact, and it belongs in the record. One commit went in with&lt;br&gt;
&lt;code&gt;--no-verify&lt;/code&gt; after four attempts to get the pre-commit hook's unit chain to&lt;br&gt;
finish under a load average above 40. The change was &lt;code&gt;.beads/issues.jsonl&lt;/code&gt;&lt;br&gt;
only, which no pre-commit stage tests, so the risk on that commit was near&lt;br&gt;
zero. The hole in the discipline is real anyway. A gate you can step around&lt;br&gt;
under load will be stepped around again, and the honest fix is making the hook&lt;br&gt;
cheap enough to always run.&lt;/p&gt;

&lt;p&gt;The day ran 6 project-days across 21.75 hours of wall span, with 25&lt;br&gt;
failure-to-fix moments and 7 course-corrections in the session digest. The&lt;br&gt;
&lt;code&gt;intent-longbox&lt;/code&gt; chain ran on Claude Fable 5.1 across 9 sessions and 967&lt;br&gt;
minutes, with 48 agent dispatches and 35 resumes. That ratio describes the work&lt;br&gt;
better than the turn count does: most of it was dispatching a reviewer and&lt;br&gt;
later resuming it for a verdict. The gate audit that refuted record 065 is one&lt;br&gt;
of those 48. The &lt;code&gt;claude-code-plugins&lt;/code&gt; thread ran on GPT-5.6 Sol via Codex, and&lt;br&gt;
every one of its five course-corrections was a containment instruction ("read&lt;br&gt;
only: do not edit, push, comment, merge, close") or a demand for a verdict from&lt;br&gt;
evidence already gathered. None corrected a wrong answer. The legal thread ran&lt;br&gt;
on Claude Fable 5.1 across 6 sessions and 1306 minutes, and included one agent&lt;br&gt;
run interrupted mid-flight because I was messaging counsel on LinkedIn in real&lt;br&gt;
time and needed a specific message sent right then.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change what the checker keys on
&lt;/h2&gt;

&lt;p&gt;When a checker is wrong, fixing the value is half the job. Change what the&lt;br&gt;
checker keys on.&lt;/p&gt;

&lt;p&gt;The legal validator stopped accepting whatever string the repo files agreed on&lt;br&gt;
and started rejecting two named retired forms. The receipts gate stopped&lt;br&gt;
trusting a committed number and started failing on &lt;code&gt;verified_at&lt;/code&gt; age; it went&lt;br&gt;
out with the revert and is the first thing the second attempt brings back. The&lt;br&gt;
migration lint is being moved off text grep onto parsed statements; that one is&lt;br&gt;
filed on a bead, not shipped. And the site copy stopped being resolved inside&lt;br&gt;
the panel and started being escalated to the owner, with the dissent preserved&lt;br&gt;
on the way up.&lt;/p&gt;

&lt;p&gt;Every one of those is the same move: take the authority away from the derived&lt;br&gt;
artifact and give it to something closer to the thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;intent-os document filing.&lt;/strong&gt; &lt;code&gt;business-plan/gateway/&lt;/code&gt; moved into
&lt;code&gt;000-docs/163-PP-gateway-vision/&lt;/code&gt; (files 164 to 171) and &lt;code&gt;legal/&lt;/code&gt; into
&lt;code&gt;000-docs/172-BL-legal-packet/&lt;/code&gt; (files 173 to 214). Two clusters instead of
one nested folder, because the standard forbids folders within folders. Every
cross-reference, lint ignore, repo index, CLAUDE.md, README, and
partner-network cockpit pointer was repointed, and source-form sha256 values
were verified identical before and after the rename before regenerating the
manifest. The validator got the same treatment as everything above: re-rooted
at the cluster and keyed by category codes instead of positional filenames,
since file position is a derived property that any rename breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five Reddit introduction posts&lt;/strong&gt; for r/ClaudeAI, r/SideProject,
r/vibecoding, r/startups, and r/Entrepreneur, value-first, with posting rules
(one account, home connection, comment before posting, and links omitted where
the sub forbids them). Five distinct story posts rather than one generic post
copied five times, because identical cross-posting is what gets flagged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legal drafts alongside the entity correction:&lt;/strong&gt; a two-member member-managed
Delaware operating agreement, a customer-facing security statement claiming no
certifications because we hold none, and a beads epic (&lt;code&gt;spine-0ce&lt;/code&gt;) with seven
children, one per purchase, filing, or decision only the owner can execute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;omarchy-omatrail-entry&lt;/strong&gt;, a frontier survival game in QML and JavaScript,
over 3,000 lines of rules and views, plus &lt;code&gt;bin/omatrail-state&lt;/code&gt;, an
end-to-end harness with save fixtures, and an &lt;code&gt;evidence/render-matrix&lt;/code&gt;
carrying per-scene PNGs next to render-proof JSON. A nine-document design
workbook landed alongside it in omarchy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does a text grep fail at counting SQL objects?
&lt;/h3&gt;

&lt;p&gt;A grep counts text, not statements. The Postgres migration lint on 2026-09-06&lt;br&gt;
searched for CREATE INDEX and matched a RAISE NOTICE message that described an&lt;br&gt;
index build in prose. It counted that sentence as a sixth index build and&lt;br&gt;
failed the migration. The fix that is filed, and not yet shipped, is to parse&lt;br&gt;
the statements instead of searching for words about them.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between a primary record and a derived record?
&lt;/h3&gt;

&lt;p&gt;A primary record is the thing itself: the state filing, the GitHub API, the&lt;br&gt;
governing section of a ratified record, the parsed SQL statement. A derived&lt;br&gt;
record is any statement of fact produced from another statement of fact rather&lt;br&gt;
than from the thing. Repo files describing an entity, an audit summarizing a&lt;br&gt;
record, a grep counting SQL. A derived record carries no expiry on its source&lt;br&gt;
unless someone builds one in.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I stop a checker from re-deriving the same wrong answer?
&lt;/h3&gt;

&lt;p&gt;Change what the checker keys on. The legal validator stopped accepting whatever&lt;br&gt;
string the repo files agreed on and started rejecting two named retired forms.&lt;br&gt;
The receipts gate keyed on &lt;code&gt;verified_at&lt;/code&gt; age instead of a committed number&lt;br&gt;
while it was live, and it comes back with the second attempt. The migration&lt;br&gt;
lint is being moved from text grep to parsed statements. Each move takes&lt;br&gt;
authority away from the derived artifact and gives it to something closer to&lt;br&gt;
the thing.&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;": "&lt;a href="https://schema.org" rel="noopener noreferrer"&gt;https://schema.org&lt;/a&gt;",&lt;br&gt;
  "@type": "FAQPage",&lt;br&gt;
  "mainEntity": [&lt;br&gt;
    {&lt;br&gt;
      "@type": "Question",&lt;br&gt;
      "name": "Why does a text grep fail at counting SQL objects?",&lt;br&gt;
      "acceptedAnswer": {&lt;br&gt;
        "@type": "Answer",&lt;br&gt;
        "text": "A grep counts text, not statements. The Postgres migration lint on 2026-09-06 searched for CREATE INDEX and matched a RAISE NOTICE message that described an index build in prose. It counted that sentence as a sixth index build and failed the migration. The fix that is filed, and not yet shipped, is to parse the statements instead of searching for words about them."&lt;br&gt;
      }&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
      "@type": "Question",&lt;br&gt;
      "name": "What is the difference between a primary record and a derived record?",&lt;br&gt;
      "acceptedAnswer": {&lt;br&gt;
        "@type": "Answer",&lt;br&gt;
        "text": "A primary record is the thing itself: the state filing, the GitHub API, the governing section of a ratified record, the parsed SQL statement. A derived record is any statement of fact produced from another statement of fact rather than from the thing. Repo files describing an entity, an audit summarizing a record, a grep counting SQL. A derived record carries no expiry on its source unless someone builds one in."&lt;br&gt;
      }&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
      "@type": "Question",&lt;br&gt;
      "name": "How do I stop a checker from re-deriving the same wrong answer?",&lt;br&gt;
      "acceptedAnswer": {&lt;br&gt;
        "@type": "Answer",&lt;br&gt;
        "text": "Change what the checker keys on. The legal validator stopped accepting whatever string the repo files agreed on and started rejecting two named retired forms. The receipts gate keyed on verified_at age instead of a committed number while it was live, and it comes back with the second attempt. The migration lint is being moved from text grep to parsed statements. Each move takes authority away from the derived artifact and gives it to something closer to the thing."&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;

&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/the-second-review-that-audits-the-claims/"&gt;Auditing Written Claims Against Their Artifacts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/we-told-the-auditors-to-refute-us/"&gt;A Closed Epic Is a Claim, Not a Fact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/stop-trusting-the-stored-claim/" rel="noopener noreferrer"&gt;When a Gate Should Re-Run the Step Instead of Trusting Its Receipt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>governance</category>
      <category>postgres</category>
      <category>dataintegrity</category>
    </item>
    <item>
      <title>Auditing Written Claims Against Their Artifacts</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Mon, 07 Sep 2026 11:30:11 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/auditing-written-claims-against-their-artifacts-3k9n</link>
      <guid>https://dev.to/jeremy_longshore/auditing-written-claims-against-their-artifacts-3k9n</guid>
      <description>&lt;p&gt;Code review asks whether the decision was correct. It almost never asks whether&lt;br&gt;
the paragraph describing the decision is accurate. On 2026-09-05 I watched that&lt;br&gt;
gap open in two places with nothing in common, neither language nor reviewer: a&lt;br&gt;
multi-tenant SaaS built under a heavy evidence discipline, and a stack of&lt;br&gt;
contract drafts with no software in them at all. The two records had reached&lt;br&gt;
different stages. The &lt;code&gt;intent-longbox&lt;/code&gt; records had been through a dispatched review and&lt;br&gt;
in some cases a ratification. The legal packet had passed only its author, who&lt;br&gt;
committed it as a finished deliverable with &lt;code&gt;[COUNSEL:]&lt;/code&gt; markers still in the&lt;br&gt;
text. Both were carrying claims that were false.&lt;/p&gt;

&lt;p&gt;Roughly twenty statements of fact got repaired across that one day. Nine in one&lt;br&gt;
commit, eight in another, one security claim withdrawn after a reviewer measured&lt;br&gt;
it false, and one use of the word "proved" downgraded to the rung its evidence&lt;br&gt;
actually reached. The count runs per false claim rather than per place it was&lt;br&gt;
written, so the withdrawn security claim counts once even though several sites in&lt;br&gt;
the record carried it, and the downgrade counts once across two register rows. Every one of those records had already been read by a&lt;br&gt;
reviewer, and in two cases had already been ratified.&lt;/p&gt;

&lt;p&gt;The thesis I came out with: a review that only checks decisions leaves the&lt;br&gt;
prose ungated, and the prose is what everyone downstream cites.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two review lanes, and only one of them reads sentences
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;intent-longbox&lt;/code&gt; repo runs work through what I call the two-lens cannon. Two&lt;br&gt;
named reviewer agents take a change from different value systems, currently&lt;br&gt;
&lt;code&gt;security-auditor&lt;/code&gt; and &lt;code&gt;martin-kleppmann-reviewer&lt;/code&gt;, and each returns a verdict.&lt;br&gt;
Alongside them sit two narrower jobs: a gate auditor, whose mandate is the&lt;br&gt;
record rather than the code, and an invariant reviewer, which checks that the&lt;br&gt;
system's stated invariants still hold. On some changes a MiniMax adversarial&lt;br&gt;
review runs on top of that.&lt;/p&gt;

&lt;p&gt;The day's volume was real. On main, 2026-09-05 changed 191 files, 42,385 lines&lt;br&gt;
added and 1,433 deleted, across 33 commits and seven merged pull requests (#88&lt;br&gt;
to #94). The features were substantial on&lt;br&gt;
their own. The seven merged that day:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PR&lt;/th&gt;
&lt;th&gt;Diff&lt;/th&gt;
&lt;th&gt;What landed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;#90&lt;/td&gt;
&lt;td&gt;+11645/-865&lt;/td&gt;
&lt;td&gt;PostgreSQL row-level security with transaction-local tenant context, plus property tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#94&lt;/td&gt;
&lt;td&gt;+9916/-330&lt;/td&gt;
&lt;td&gt;The first factor and the privileged-session shape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#92&lt;/td&gt;
&lt;td&gt;+8981/-81&lt;/td&gt;
&lt;td&gt;A Longbox-origin predicate so a staff session outside a break-glass grant is visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#88&lt;/td&gt;
&lt;td&gt;+9557/-86&lt;/td&gt;
&lt;td&gt;Least-privilege organization and location RBAC, trustworthy actor audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#93&lt;/td&gt;
&lt;td&gt;+663/-23&lt;/td&gt;
&lt;td&gt;N:1 authorization decisions under an idempotent replay, refusing the dedup key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#89&lt;/td&gt;
&lt;td&gt;+543/-158&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;noPropertyAccessFromIndexSignature&lt;/code&gt; turned on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#91&lt;/td&gt;
&lt;td&gt;+1223/-109&lt;/td&gt;
&lt;td&gt;The causal reference persisted on two tables&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two more pieces the day leaned on had merged the night before: TOTP and recovery&lt;br&gt;
codes for owner and support roles in #82, and connector OAuth with least scopes&lt;br&gt;
and uninstall revocation in #87.&lt;/p&gt;

&lt;p&gt;None of those features is the story. The story is the five commits that followed&lt;br&gt;
them, each one repairing a written record that the first review had already&lt;br&gt;
cleared.&lt;/p&gt;
&lt;h2&gt;
  
  
  Nine fact repairs from one gate audit
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;2173407&lt;/code&gt; carries the plainest version of the split, and it took two&lt;br&gt;
lanes to get there. The gate auditor returned NOT-READY. Every decision item in&lt;br&gt;
the record passed. Six statements of fact did not. The invariant reviewer, run&lt;br&gt;
against the same head, returned PASS-WITH-NOTES and found three more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gate audit verdict:        NOT-READY
  decision items:          all verified as recorded
  fact repairs:            6
  scope:                   paperwork only, no ruling moved

invariant re-verification: PASS-WITH-NOTES
  further fact repairs:    3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that verdict twice. The engineering was right. The document describing the&lt;br&gt;
engineering could not be cited. The six repairs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A test file held 21 cases, and the record said 18. That pushed the bead's
unit total from 34 to 37, and two separate registers were carrying 34.&lt;/li&gt;
&lt;li&gt;Three beads described as "proposed, not yet created" already existed. The
session had filed them while the branch was in flight, so every "proposed"
hedge got replaced with a real id.&lt;/li&gt;
&lt;li&gt;A section asserted an act that had not happened. The phrase "is corrected
accordingly" was false at the moment someone typed it, because nothing had
done the correcting. It is true now by a different route, with the who and
the when named.&lt;/li&gt;
&lt;li&gt;A residual finding, R9, had no owning bead. A residual nobody owns is a
residual nobody reads twice.&lt;/li&gt;
&lt;li&gt;A citation of the three-layers quote pointed at &lt;code&gt;034:447&lt;/code&gt; when the quote sits
at &lt;code&gt;034:449&lt;/code&gt;. The repair also named &lt;code&gt;034:445-447&lt;/code&gt; separately, which is the
K1 trigger, a different quote entirely.&lt;/li&gt;
&lt;li&gt;A register cell claimed a status its evidence did not support, reading
VERIFIED by execution across both halves when only the refusing half had
been run.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;citation repair, three-layers quote
  before: 034:447
  after:  034:449

cited separately by the same repair
  034:445-447   (the K1 trigger)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That fifth one looks like a typo and is not. A line-number citation is a promise&lt;br&gt;
that a reader who follows it lands on the sentence being quoted. Land two lines&lt;br&gt;
short and the reader meets a different claim, then either loses trust in the&lt;br&gt;
record or keeps reading and inherits the wrong quote. The commit describes the&lt;br&gt;
gap as one line; the diff shows two. I have left both readings visible rather&lt;br&gt;
than picking the tidier one.&lt;/p&gt;
&lt;h3&gt;
  
  
  The three the invariant lane found
&lt;/h3&gt;

&lt;p&gt;The gate auditor reads the record against its own citations. The invariant&lt;br&gt;
reviewer reads the record against the running system, which is why the three it&lt;br&gt;
turned up are heavier.&lt;/p&gt;

&lt;p&gt;Section 6.3 of the record claimed there was nothing to repair. That was false by&lt;br&gt;
exactly one. A UNIQUE index on &lt;code&gt;shop.shopify_domain&lt;/code&gt;, added by migration 026 back&lt;br&gt;
when &lt;code&gt;shop&lt;/code&gt; carried no policy, is precisely the shape section 6.3 warns about,&lt;br&gt;
and the bead inherited it the moment it policied &lt;code&gt;shop&lt;/code&gt;. Reproduced under shop&lt;br&gt;
B's tenant context, claiming a domain that shop A already holds returns 23505,&lt;br&gt;
and claiming an unused one returns UPDATE 1. Two different answers, decided by a&lt;br&gt;
row the caller is not allowed to see. That is a one-bit oracle on which Shopify&lt;br&gt;
stores are Longbox customers. It is latent today because no route writes&lt;br&gt;
&lt;code&gt;shopify_domain&lt;/code&gt;, and latent is a schedule rather than a verdict. Section 6.3 now&lt;br&gt;
names it and routes it to an existing bead's class instead of inventing a new&lt;br&gt;
rule for it.&lt;/p&gt;

&lt;p&gt;The second was a new residual, R10. The domain-claim check in &lt;code&gt;receiveCallback&lt;/code&gt;&lt;br&gt;
has a TOCTOU window: the SELECT runs in one scope and the write runs in a&lt;br&gt;
separate transaction under the shop's tenant context, so two concurrent installs&lt;br&gt;
of the same store can both pass the check. The commit named the window and took&lt;br&gt;
neither of the two obvious fixes. Moving the check inside the transaction puts&lt;br&gt;
it under a tenant context where other shops' rows are invisible, so it would&lt;br&gt;
fail open, which is worse than the bug. Running the whole install in the service&lt;br&gt;
scope needs exactly the policy widening the security lens had just punished. The&lt;br&gt;
durable fix is the serialization point the database already owns, which is the&lt;br&gt;
unique index above, so the residual sits and waits for the bead that covers it.&lt;/p&gt;

&lt;p&gt;The third repair is the one I would put in front of anyone who thinks this lane&lt;br&gt;
is pedantry. A register cell's reproduction command named a GUC that does not&lt;br&gt;
exist. &lt;code&gt;longbox.service_scope&lt;/code&gt; names the SQL function, while the setting itself is&lt;br&gt;
called &lt;code&gt;longbox.service&lt;/code&gt;. Run verbatim, the cell returned zero rows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;current_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'longbox.service_scope'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;rows&lt;/span&gt;
&lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;real&lt;/span&gt; &lt;span class="n"&gt;GUC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;current_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'longbox.service'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The commit called it the worst kind of evidence, because it looks checkable and&lt;br&gt;
appears to disprove the claim it supports. A reader who runs it sees an empty&lt;br&gt;
result and concludes the invariant is broken. A reader who does not run it&lt;br&gt;
carries a citation that has never worked. The cell now reproduces standalone.&lt;/p&gt;

&lt;p&gt;Six plus three is the nine. The commit message carries a line I have kept: a&lt;br&gt;
record whose decisions are right and whose facts are wrong is still a record&lt;br&gt;
that cannot be cited. The same shape showed up earlier this year in &lt;a href="https://startaitools.com/posts/a-green-result-only-covers-what-it-ran/" rel="noopener noreferrer"&gt;Every Verdict Carries the Scope It Actually Ran&lt;/a&gt;, where a green result was reporting on less than it claimed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Eight statements, and two ratified records a rebase damaged
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;af3aa84&lt;/code&gt; came out of the next gate re-audit. Same shape of verdict:&lt;br&gt;
NOT-READY on paperwork only, every ruling verified as recorded and built,&lt;br&gt;
nothing moved a decision. Eight repairs this time, and two of them were damage&lt;br&gt;
rather than drift.&lt;/p&gt;

&lt;p&gt;The first piece of damage was in an append log. A rebase reconciliation filter&lt;br&gt;
had silently dropped a ratified entry belonging to a different branch, because&lt;br&gt;
that row's own text happened to mention the current branch's bead id. The filter&lt;br&gt;
matched on a substring and took a stranger's row with it. An append log that&lt;br&gt;
loses an entry has stopped being an append log.&lt;/p&gt;

&lt;p&gt;The repair restored the row verbatim from &lt;code&gt;origin/main&lt;/code&gt; and showed the&lt;br&gt;
restoration accounted for by a set diff rather than by an eyeball:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git show origin/main:000-docs/016-OD-REGS-longbox-source-register.md &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/main-appends
&lt;span class="c"&gt;# extract entry ids from both sides, compare as sets&lt;/span&gt;
&lt;span class="c"&gt;# result: all 32 of main's appends present and accounted for on the branch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restoring the text is the easy half. Showing that nothing else went missing in&lt;br&gt;
the same filter pass is the half that makes the record citable again, and a set&lt;br&gt;
diff is the cheapest instrument that does it.&lt;/p&gt;

&lt;p&gt;The second piece of damage was subtler. A ratified record's table cell had been&lt;br&gt;
edited in place instead of appended to. The amendment was correct. Its form was&lt;br&gt;
illegal. In a record with a version and a ratification date, an in-place edit&lt;br&gt;
rewrites what a reader who cited the earlier version thought they were citing.&lt;br&gt;
The repair restored main's sentence verbatim and appended the new pin after it.&lt;br&gt;
The record's version number did not move, because the amendment is the same&lt;br&gt;
amendment; only its shape changed.&lt;/p&gt;

&lt;p&gt;Six of the other repairs in that commit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A heading cited a stale commit while the section above it had already been
corrected to a newer one.&lt;/li&gt;
&lt;li&gt;A section called a commit "the main this branch is rebased onto" when it was
the merge base, and main was a different commit.&lt;/li&gt;
&lt;li&gt;Two sections routed a decision row to a bead as OPEN when the bead was CLOSED.
The fix restated it as a closed ruling rather than deleting the row, so a
reader who met the property in the earlier version is not left hunting a fix
that is never coming.&lt;/li&gt;
&lt;li&gt;A claim of "all twelve invariants proved against a database" was really eleven
of fourteen. The record had counted twelve invariants; the real total is
fourteen, of which eleven carry database evidence. One of the remaining three
is an architecture gate and two are unit-level, so the word "all" was claiming
database evidence that three invariants do not have.&lt;/li&gt;
&lt;li&gt;"Gains five cases" was seven.&lt;/li&gt;
&lt;li&gt;Every duration quoted as a measured property (24 hours, 15 minutes, 30 days)
was relabeled a provisional constant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is the one I would defend hardest. The real argument in that&lt;br&gt;
section is that each act outlives the session that created it, and that argument&lt;br&gt;
holds whatever the constants are. Quoting the numbers as durations stated a&lt;br&gt;
property nobody had measured, and it invited a future reader to treat a config&lt;br&gt;
value as a finding.&lt;/p&gt;
&lt;h2&gt;
  
  
  The claim a reviewer measured false
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;177cd3d&lt;/code&gt; is the centerpiece, because a reviewer did not argue about&lt;br&gt;
wording. It ran the thing.&lt;/p&gt;

&lt;p&gt;The record claimed that a tighter per-identifier sign-in rate bucket "closes" a&lt;br&gt;
user-enumeration timing oracle, and that a known address and an unknown address&lt;br&gt;
"start refusing fast at the same attempt count". The reviewer measured minute&lt;br&gt;
two, the first minute after the bucket refills, which is exactly when a warmed&lt;br&gt;
known address falls out of it. 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;warmed KNOWN address:     6 to 16 ms on 4 of 5 attempts
UNKNOWN address:          about 600 ms on 5 of 5 attempts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An attacker with a stopwatch can read that difference through any amount of&lt;br&gt;
network jitter. The claim was false.&lt;/p&gt;

&lt;p&gt;The root cause was a window mismatch nobody had costed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;per-identifier sign-in rate bucket:  refills every 1 minute
LOCKOUT_WINDOW_MS:                   15 minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A warmed known address drops out of the one-minute bucket and falls back onto&lt;br&gt;
its fifteen-minute lockout path roughly fourteen times an hour, and every time&lt;br&gt;
it does, it answers cheap. What the tighter bucket actually bought was a rate&lt;br&gt;
cut on the oracle, from roughly 120 observations a minute down to roughly 5. A&lt;br&gt;
rate cut is a real security improvement. It is a different improvement from the&lt;br&gt;
one the record advertised.&lt;/p&gt;

&lt;p&gt;One section of that record, R10, had said this correctly the whole time:&lt;br&gt;
"narrows the window rather than closing the class". Six other sites in the&lt;br&gt;
record and the source contradicted it, or eight, depending on which part of the&lt;br&gt;
commit you read: it counts six and its own list names eight. All of them were&lt;br&gt;
corrected to match the one&lt;br&gt;
that was right, which is a satisfying shape for a repair: the truth was already&lt;br&gt;
in the building, outnumbered.&lt;/p&gt;
&lt;h3&gt;
  
  
  Adding nothing was the right call
&lt;/h3&gt;

&lt;p&gt;No fix shipped with that correction, and the decision was deliberate.&lt;/p&gt;

&lt;p&gt;Closing the class means hashing while blocked, so that a refused known address&lt;br&gt;
pays the same CPU as an unknown one. A ratified document in this system refuses&lt;br&gt;
that, and the bead doing the correction has no mandate to reopen it.&lt;/p&gt;

&lt;p&gt;The alternative that lost was widening the lockout window to match the bucket.&lt;br&gt;
That is a two-line change and it would have made the two paths agree. It also&lt;br&gt;
changes another ratified document's delay from inside a bead that never argued&lt;br&gt;
for touching it. Buying an accurate sentence by quietly editing somebody else's&lt;br&gt;
ratified constant is a worse trade than living with a narrowed residual.&lt;/p&gt;

&lt;p&gt;So what stands is a narrowed residual with its own row in the register. Someone&lt;br&gt;
will pick that row up with a mandate that covers it.&lt;/p&gt;

&lt;p&gt;There was a bookkeeping consequence too. Two claim ids, C47 and C48, collided:&lt;br&gt;
another bead's C47 and C48 had landed on main in parallel, so the register&lt;br&gt;
briefly carried four rows under two ids. The ratified ids kept their numbers,&lt;br&gt;
this branch's renumbered to C49 and C50, and the renumbering went into an append&lt;br&gt;
rather than happening quietly. A claim id that moves without a note is a&lt;br&gt;
citation nobody can follow backwards.&lt;/p&gt;
&lt;h2&gt;
  
  
  Downgrading "proved" to the rung the artifact reached
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;2e7f3d2&lt;/code&gt; came from a MiniMax adversarial review that pressed on a single&lt;br&gt;
word in two register rows. It was written the night before and landed on main in&lt;br&gt;
the first hour of the 5th, through PR #89. Both rows said a compiler-flag-flip result was "proved able to fail",&lt;br&gt;
while linking only to CI runs where the flag was on.&lt;/p&gt;

&lt;p&gt;That is a structural argument that flipping the flag would produce the outcome.&lt;br&gt;
The record presented it as a recording of an actual flip. The governing rule in this repo is&lt;br&gt;
narrow and useful: a claim may not use a stronger rung than the artifact it&lt;br&gt;
cites.&lt;/p&gt;

&lt;p&gt;What the CI runs actually prove is that the flag is set in the repository's&lt;br&gt;
config, and that the dot access is what the compiler refuses, since a bracket&lt;br&gt;
twin compiles right beside it. They do not prove that the flag is the reason.&lt;br&gt;
Establishing that requires flipping it, which is a local reproduction, so it got&lt;br&gt;
recorded as one, with the command that produces it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/"noPropertyAccessFromIndexSignature": true/"noPropertyAccessFromIndexSignature": false/'&lt;/span&gt; tsconfig.json
pnpm vitest run tests/contract/signature-fields-are-not-dot-accessed.test.ts
&lt;span class="c"&gt;# 2 failed | 4 passed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I re-ran that at the commit rather than quoting the earlier session's output,&lt;br&gt;
which matters more than it sounds: a number copied forward from a previous&lt;br&gt;
session is a claim about a commit nobody checked. The two that fail are&lt;br&gt;
&lt;code&gt;is set in the repository's tsconfig&lt;/code&gt; (12 ms) and &lt;code&gt;refuses fields.series in&lt;br&gt;
src/services with TS4111&lt;/code&gt; (13.68 s). &lt;code&gt;tsconfig.json&lt;/code&gt; was restored afterwards,&lt;br&gt;
which is why it is absent from the diff.&lt;/p&gt;
&lt;h3&gt;
  
  
  The seventh CI case that lost
&lt;/h3&gt;

&lt;p&gt;The obvious response is to add a seventh CI case that does the flip&lt;br&gt;
automatically. I turned it down for three reasons, and the third one decided it.&lt;/p&gt;

&lt;p&gt;A CI version has to either mutate the repository's own &lt;code&gt;tsconfig.json&lt;/code&gt;, which is&lt;br&gt;
the same hazard another bead forbids one level up for &lt;code&gt;src/&lt;/code&gt;, and this time on&lt;br&gt;
the file every other test is judged by; or compile against a modified copy of&lt;br&gt;
the config, which is exactly what an existing case named &lt;code&gt;compiles the scratch&lt;br&gt;
tree against the repository's own tsconfig&lt;/code&gt; exists to rule out. Both options&lt;br&gt;
undo a guarantee that is already paid for.&lt;/p&gt;

&lt;p&gt;The third reason is cost. It would add a fourth &lt;code&gt;tsc&lt;/code&gt; spawn to a test file the&lt;br&gt;
same reviewer had already flagged as the second slowest in the unit lane. A&lt;br&gt;
written command a reader can re-run in thirty seconds beats a permanent tax on&lt;br&gt;
every run for the same evidence.&lt;/p&gt;
&lt;h3&gt;
  
  
  The reviewer got audited back
&lt;/h3&gt;

&lt;p&gt;The same MiniMax review produced a finding I declined, and the arithmetic is&lt;br&gt;
worth showing because it is the honest half of this whole approach.&lt;/p&gt;

&lt;p&gt;It called a per-directory split HIGH severity, on the grounds that&lt;br&gt;
"65 + 9 + 63 = 77, which is 60 short of 137".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;print(65+9+63)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="mi"&gt;137&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The split reconciles exactly. The row stands as written. An adversarial reviewer&lt;br&gt;
is a model pointed at the work with a narrow mandate, and it is fallible in&lt;br&gt;
exactly the way everything else in the loop is fallible. The layer only earns&lt;br&gt;
its keep if its findings go through the same evidence test the work does. Every&lt;br&gt;
finding it raised that day got checked; one of them did not survive.&lt;/p&gt;
&lt;h2&gt;
  
  
  The review that was drafted instead of dispatched
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;91cd7c5&lt;/code&gt;, which landed in PR #94, fixed the worst process defect of the day, and it is the one I&lt;br&gt;
would have caught last if the gate auditor had not been looking.&lt;/p&gt;

&lt;p&gt;A record had shipped at v1.0.0 with a section containing two lens positions that&lt;br&gt;
the builder had written himself. The cannon was never dispatched. Somebody wrote&lt;br&gt;
what a reviewer might plausibly say instead of asking the reviewer. A draft of&lt;br&gt;
what a reviewer might say is not a review, and the record had been carrying it&lt;br&gt;
as one.&lt;/p&gt;

&lt;p&gt;When the real cannon ran, both lenses returned ACCEPT-WITH-CHANGES, the gate&lt;br&gt;
auditor returned NOT-READY on facts, and the invariant reviewer returned&lt;br&gt;
PASS-WITH-NOTES. Two of the findings were enforcement rather than prose, so the&lt;br&gt;
record went to a minor version instead of a patch, because v1.0.0 had been wrong&lt;br&gt;
about two things rather than merely silent on them.&lt;/p&gt;

&lt;p&gt;Three real behavior changes fell out of that dispatch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A privileged sign-in now revokes the person's other live privileged chains at&lt;br&gt;
that shop.&lt;/strong&gt; A session expiry bounds the session, and it does not bound the acts&lt;br&gt;
the session performed. Using the provisional constants as they stand today, a&lt;br&gt;
copied cookie mints a 24-hour invitation and a 15-minute enrollment code, and it&lt;br&gt;
leaves a permanent owner membership and a 30-day device credential standing&lt;br&gt;
after the session dies. Eviction is now an act&lt;br&gt;
the owner can perform. It is scoped to the same shop rather than sweeping a&lt;br&gt;
person globally, because the wider version would unilaterally widen another&lt;br&gt;
record's cross-tenant scope union from inside a bead that never argued for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Naming a second owner on an invitation now re-presents the second factor in&lt;br&gt;
the request&lt;/strong&gt;, and refuses without it. Of every act in that flow, this is the one&lt;br&gt;
whose damage no expiry bounds: a second owner outlives every session, every&lt;br&gt;
token, and every device. It was extracted into its own transaction rather than&lt;br&gt;
folded into the existing call, so the lock-order lint reads the two anchors&lt;br&gt;
truthfully instead of being dodged by a merge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The sign-in path took its own provisional per-identifier rate constant instead&lt;br&gt;
of borrowing the device class constant.&lt;/strong&gt; The measurement that forced it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;same-class refusals, sign-in path:   5.7 ms
device-class refusals:               449 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Constant in the body and not on the clock. On an anonymous internet-facing&lt;br&gt;
route, that is an enumeration oracle for who works at which shop.&lt;/p&gt;
&lt;h2&gt;
  
  
  The same failure outside software
&lt;/h2&gt;

&lt;p&gt;The second instance came out of &lt;code&gt;intent-os&lt;/code&gt;, in commit &lt;code&gt;03e22943&lt;/code&gt;: an&lt;br&gt;
independent adversarial audit of the partner-network legal packet. Six read-only&lt;br&gt;
streams plus eighteen scenarios, 177 findings, 25 root-cause groups.&lt;/p&gt;

&lt;p&gt;The v0.1 packet it audited had been drafted the same day, six and a half hours&lt;br&gt;
earlier, at commit &lt;code&gt;bedc4d4e&lt;/code&gt; (14:30 to 21:02). No reviewer had touched it. The&lt;br&gt;
&lt;code&gt;[COUNSEL:]&lt;/code&gt; markers in its own text say as much, and no &lt;code&gt;legal/review/&lt;/code&gt;&lt;br&gt;
directory existed until the audit commit created one. It had passed its author&lt;br&gt;
and been committed as a finished deliverable, which is a weaker gate than the&lt;br&gt;
Longbox records cleared and a more common one.&lt;/p&gt;

&lt;p&gt;What the second pass found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every document named the wrong legal entity.&lt;/li&gt;
&lt;li&gt;A signature block was pre-filled with a non-office title, for a 50/50 LLC with
no signing authority on file.&lt;/li&gt;
&lt;li&gt;A flow-down was promised with no artifact behind it, and the packet
contradicted itself on precedence.&lt;/li&gt;
&lt;li&gt;Liability caps were left blank in a way that reads as an absence of any cap.&lt;/li&gt;
&lt;li&gt;The packet contradicted the firm's own doctrine on classification.&lt;/li&gt;
&lt;li&gt;The practitioner layer carried nothing on security, data, AI, or open source.&lt;/li&gt;
&lt;li&gt;It was about to be signed by a person in Germany, on a contractor form scoped
to US individuals only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those is a false or missing statement of fact in a document that&lt;br&gt;
was already being treated as done. There is no compiler anywhere near it, and there is&lt;br&gt;
no test suite either. The failure mode transferred cleanly anyway.&lt;/p&gt;

&lt;p&gt;The remediation is the part I would reuse. Every executable draft got a&lt;br&gt;
canonical banner at the top and above every signature row: DRAFT, ATTORNEY&lt;br&gt;
REVIEW REQUIRED, NOT APPROVED FOR SIGNATURE OR USE. Signer and title were left&lt;br&gt;
blank pending an open decision. The contractor form was renamed from "member" to&lt;br&gt;
"practitioner", restructured as a master agreement plus Work Orders, and held to&lt;br&gt;
US individuals only.&lt;/p&gt;

&lt;p&gt;The discipline that makes that audit trustworthy is what it refused to do. Every&lt;br&gt;
legal judgment was registered as an open decision (D-01 through D-22) or a&lt;br&gt;
counsel question (C-01 through C-28) rather than being decided. The audit's&lt;br&gt;
authority stops where counsel's begins, and an audit that quietly rules on a&lt;br&gt;
question it has no standing to rule on has become the thing it was checking.&lt;/p&gt;

&lt;p&gt;It also shipped an enforcement script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ci/validate-legal-packet.sh     &lt;span class="c"&gt;# 12 checks&lt;/span&gt;
pnpm run validate:legal-packet  &lt;span class="c"&gt;# wired into CI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twelve checks, plus a planted-fixture self-test: every check has to be shown to&lt;br&gt;
fire against a deliberately broken fixture before it counts. A check that has&lt;br&gt;
never failed is a check nobody has tested.&lt;/p&gt;

&lt;p&gt;Source integrity was handled the same way. The files under &lt;code&gt;legal/sources/&lt;/code&gt; were&lt;br&gt;
hash-matched against a manifest recorded before any edit, and 14 of 14 matched.&lt;/p&gt;

&lt;p&gt;Two facts were explicitly marked provisional and not verified in that session:&lt;br&gt;
the Alabama statutory texts, because Justia returned 403 and the legislature&lt;br&gt;
site was unresolvable; and the Secretary of State record, because it sits behind&lt;br&gt;
an interactive form. Marking a fact as not verified, by name, with the reason,&lt;br&gt;
is the same discipline as the rest of the day pointed inward. The alternative is&lt;br&gt;
a packet where verified and assumed look identical to the next reader.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the second lane cost
&lt;/h2&gt;

&lt;p&gt;Numbers first, because this approach is not free and the bill should be visible.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure, 2026-09-05&lt;/th&gt;
&lt;th&gt;What the first review produced&lt;/th&gt;
&lt;th&gt;What the second lane added&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Statements of fact repaired&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;about 20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rulings changed by the repairs&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security claims withdrawn as measured false&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence rungs downgraded&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ratified records restored after rebase damage&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewer findings declined on arithmetic&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The zero in the second row is the interesting one. Not one repair moved a&lt;br&gt;
decision. Every ruling the first review cleared survived the second review&lt;br&gt;
intact. The code was right the whole time, and the record describing it was&lt;br&gt;
wrong in about twenty places.&lt;/p&gt;

&lt;p&gt;The other number, 42,385 lines added, deserves an honest reading too. A large fraction of&lt;br&gt;
that day's diff is records about records: registers, appends, gate audits,&lt;br&gt;
residual rows, claim ids. That is the cost line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tradeoffs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;This is expensive, and the expense is mostly wall-clock.&lt;/strong&gt; Every one of those&lt;br&gt;
four repair commits came after the feature work was already merged-quality. The&lt;br&gt;
gate auditor, the invariant reviewer, the two lenses, and the adversarial pass&lt;br&gt;
each add a round trip, and each audit cycle can come back NOT-READY on paperwork&lt;br&gt;
that changes no behavior. A team optimizing for cycle time will hate this and&lt;br&gt;
will be right to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The audit trail is load-bearing, which means it is also a liability.&lt;/strong&gt; Append&lt;br&gt;
logs, ratified records, claim ids, and version pins only work if nothing edits&lt;br&gt;
them in place. Two of the day's repairs exist because a routine rebase damaged&lt;br&gt;
records nobody was watching. The heavier the paper trail, the more surface a&lt;br&gt;
mechanical operation has to corrupt, and rebases do not read your conventions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fabricating a review is a live failure mode.&lt;/strong&gt; Commit &lt;code&gt;91cd7c5&lt;/code&gt; exists because&lt;br&gt;
somebody drafted the two lens positions instead of dispatching the cannon, and&lt;br&gt;
that got all the way to v1.0.0. A process with a named review step invites&lt;br&gt;
someone to satisfy the step's shape without paying its cost. The only defense I&lt;br&gt;
have found is a separate auditor whose mandate includes checking that the review&lt;br&gt;
happened at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The adversarial layer is itself unreliable.&lt;/strong&gt; The same MiniMax review that&lt;br&gt;
produced the best correction of the day also produced a HIGH-severity finding&lt;br&gt;
built on 65 + 9 + 63 = 77. If you take these findings on authority you will&lt;br&gt;
degrade your record instead of improving it. Every finding has to be checked,&lt;br&gt;
which means the second lane needs a third posture: audit the auditor.&lt;/p&gt;

&lt;p&gt;The scope where this pays is narrow. If nobody outside the session that wrote a&lt;br&gt;
record ever cites it, the second lane buys nothing. The value shows up once a&lt;br&gt;
claim in a document becomes an input to a later decision, a partner&lt;br&gt;
conversation, a security posture, or a signature. Most weekend projects have no&lt;br&gt;
record with that property. A multi-tenant system holding other people's data&lt;br&gt;
does, and so does a stack of contracts about to be signed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a claims audit sits in wider practice
&lt;/h2&gt;

&lt;p&gt;The idea is not new anywhere except in how it gets applied to AI-generated work.&lt;br&gt;
The analogy I keep reaching for is accounting reconciliation, where the entry&lt;br&gt;
and the check on the entry are deliberately different jobs. I have no artifact&lt;br&gt;
that says other fields adopted the split for the reason I am describing, so take&lt;br&gt;
that as a shape I find useful rather than as evidence from the day.&lt;/p&gt;

&lt;p&gt;Software collapsed those into one step called code review, and it mostly worked&lt;br&gt;
while humans wrote both the code and the paragraph describing it, because the&lt;br&gt;
person typing the paragraph had just done the work and remembered the details.&lt;/p&gt;

&lt;p&gt;That property weakens when an agent writes the paragraph. Agents produce fluent,&lt;br&gt;
plausible, well-structured prose about work at a rate no human reviewer reads&lt;br&gt;
carefully, and the failure mode is specific: the sentence is shaped exactly like&lt;br&gt;
a true sentence. "All twelve invariants proved against a database" reads&lt;br&gt;
identically to the accurate version. Only a pass that opens the artifact and&lt;br&gt;
counts can tell them apart.&lt;/p&gt;

&lt;p&gt;The rung rule generalizes better than anything else I took from the day. Every&lt;br&gt;
claim sits at a rung: argued, implied, observed, measured, proved. Every artifact&lt;br&gt;
supports some rung. Enforcing that the claim never outranks its artifact is a&lt;br&gt;
mechanical check a reviewer can perform without domain expertise, and it caught&lt;br&gt;
both the "proved" downgrade and the oracle withdrawal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;intent-os&lt;/code&gt; also carried a second track that day, ten commits of an eleven-commit&lt;br&gt;
day. A gateway&lt;br&gt;
business-plan vision cluster was filed at v0.1 verbatim with five gap beads,&lt;br&gt;
advanced to v0.2 (&lt;code&gt;dbd3cd9f&lt;/code&gt;, &lt;code&gt;8cccfbe0&lt;/code&gt;), then put through a council review (&lt;code&gt;ac07d920&lt;/code&gt;): 13 thinker-canon seats plus&lt;br&gt;
an SI practice partner and a hyperscaler partner-program director, over five&lt;br&gt;
adversarially re-verified research packets, with dissent preserved and nine&lt;br&gt;
follow-on beads opened. The recorded rationale for the shape was that a workflow&lt;br&gt;
of 26 agents beat a single synthesis pass, because the seats had to argue&lt;br&gt;
independently before any dissent existed to preserve.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;intent-solutions-landing&lt;/code&gt; took one field-notes content commit.&lt;br&gt;
&lt;code&gt;claude-code-plugins&lt;/code&gt; took seven commits on main: three dependency chores, a&lt;br&gt;
marketplace-sync fix for Windows, two plugin feature commits, and the&lt;br&gt;
dual-publish of the field note.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can code review find false claims in the documentation?
&lt;/h3&gt;

&lt;p&gt;Code review checks whether the decisions are right. It almost never checks whether the paragraph describing the decision is accurate. A review that only checks decisions leaves the prose ungated, and the prose is what everyone downstream cites. In the 2026-09-05 example, roughly twenty statements of fact got repaired across the day, and every ruling the first review cleared survived the second review intact.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is an evidence rung?
&lt;/h3&gt;

&lt;p&gt;Every claim sits at a rung (argued, implied, observed, measured, proved) and every artifact supports some rung. The rule is that a claim may not use a stronger rung than the artifact it cites. It is a mechanical check a reviewer can perform without domain expertise. On 2026-09-05 one claim moved from "proved able to fail" to a recorded local reproduction, because the artifact was a CI run with the flag already on, which never showed the flag was the reason.&lt;/p&gt;

&lt;h3&gt;
  
  
  When should you run a second review lane for claims?
&lt;/h3&gt;

&lt;p&gt;The scope where this pays is narrow. If nobody outside the session that wrote a record ever cites it, the second lane buys nothing. The value shows up once a claim in a document becomes an input to a later decision, a partner conversation, a security posture, or a signature. A multi-tenant system holding other people's data qualifies, and so does a stack of contracts about to be signed.&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;": "&lt;a href="https://schema.org" rel="noopener noreferrer"&gt;https://schema.org&lt;/a&gt;",&lt;br&gt;
  "@type": "FAQPage",&lt;br&gt;
  "mainEntity": [&lt;br&gt;
    {"@type": "Question", "name": "Can code review find false claims in the documentation?", "acceptedAnswer": {"@type": "Answer", "text": "Code review checks whether the decisions are right. It almost never checks whether the paragraph describing the decision is accurate. A review that only checks decisions leaves the prose ungated, and the prose is what everyone downstream cites. In the 2026-09-05 example, roughly twenty statements of fact got repaired across the day, and every ruling the first review cleared survived the second review intact."}},&lt;br&gt;
    {"@type": "Question", "name": "What is an evidence rung?", "acceptedAnswer": {"@type": "Answer", "text": "Every claim sits at a rung (argued, implied, observed, measured, proved) and every artifact supports some rung. The rule is that a claim may not use a stronger rung than the artifact it cites. It is a mechanical check a reviewer can perform without domain expertise. On 2026-09-05 one claim moved from proved able to fail to a recorded local reproduction, because the artifact was a CI run with the flag already on, which never showed the flag was the reason."}},&lt;br&gt;
    {"@type": "Question", "name": "When should you run a second review lane for claims?", "acceptedAnswer": {"@type": "Answer", "text": "The scope where this pays is narrow. If nobody outside the session that wrote a record ever cites it, the second lane buys nothing. The value shows up once a claim in a document becomes an input to a later decision, a partner conversation, a security posture, or a signature. A multi-tenant system holding other people's data qualifies, and so does a stack of contracts about to be signed."}}&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/wrong-mode-green-is-not-a-gate/" rel="noopener noreferrer"&gt;Wrong-Mode Green Is Not a Gate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/the-lane-that-reviewed-nothing/" rel="noopener noreferrer"&gt;Every Check Should Report What It Did Not Look At&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/the-commit-the-test-actually-installed/" rel="noopener noreferrer"&gt;Bind the Receipt to the Commit It Installed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>testing</category>
      <category>architecture</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Photo to Listing: Barcode Decoding and LLM Re-rank</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Fri, 04 Sep 2026 10:35:18 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/photo-to-listing-barcode-decoding-and-llm-re-rank-1135</link>
      <guid>https://dev.to/jeremy_longshore/photo-to-listing-barcode-decoding-and-llm-re-rank-1135</guid>
      <description>&lt;p&gt;A comic shop employee photographs a back issue on a phone. The system has to come back with the right title, the right issue number, and the right variant, because a first-print variant and a common reprint of the same book are the same picture with different economics. That is the identification problem in &lt;strong&gt;intent-longbox&lt;/strong&gt;, a photo to listing pipeline that ended 2026-09-01 at v0.2.1 after eleven commits.&lt;/p&gt;

&lt;p&gt;The research that preceded the build settled the architecture in one finding: LLM vision alone is not viable for issue-exact and variant-exact identification. Every incumbent that actually works in this space runs image-similarity retrieval against a reference cover corpus. The model is a ranker, never the source of truth.&lt;/p&gt;

&lt;p&gt;So the pipeline puts the &lt;a href="https://startaitools.com/posts/llm-legible-deterministic-architecture/" rel="noopener noreferrer"&gt;deterministic parts first&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;barcode decode → candidate retrieval → LLM re-rank → human confirm → condition + price → Shopify draft
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing publishes without a person. The Shopify product lands as a DRAFT for owner review. The pilot shop is Gotham City Limit, running free.&lt;/p&gt;

&lt;p&gt;The deterministic front of that chain is a barcode parser with no model in it at all. Post-1990 comics carry a 12-digit UPC-A that identifies the series, plus a 5-digit UPC supplement encoding issue, cover variant, and printing:&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;supp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;upc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;supplement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;supp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;supp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="na"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;supp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="na"&gt;printing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;supp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When that supplement is readable, the variant question is already answered by arithmetic. The model never gets asked.&lt;/p&gt;

&lt;p&gt;The honest version of that diagram is that the retrieval leg is not built yet. v0 ships barcode plus vision plus human pick, with no similarity index behind the candidate step. So a barcode miss (pre-1990 stock, a damaged code, a variant with no UPC) falls to vision plus the gate below plus a mandatory human confirmation, which is the weakest path in the system and the one the pilot is meant to measure. That gap is tracked as the project's top open decision, not as a solved problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The database refuses to mutate
&lt;/h2&gt;

&lt;p&gt;Every event in a scan session is a separate immutable row, which makes the table an audit trail rather than a current-state cache. &lt;code&gt;scan_session&lt;/code&gt; is the identity. &lt;code&gt;candidate_set&lt;/code&gt; holds the deterministic result (barcode decode plus similarity k-NN, FK'd to a &lt;code&gt;corpus_version&lt;/code&gt;). &lt;code&gt;llm_rerank&lt;/code&gt; holds the probabilistic value: provider, model, prompt hash, the verbatim response, confidence, band, contradiction flag, tokens, cost. It annotates the candidate set. It cannot edit it.&lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;human_confirmation&lt;/code&gt;, &lt;code&gt;condition_assessment&lt;/code&gt;, &lt;code&gt;pricing_snapshot&lt;/code&gt;, &lt;code&gt;shopify_draft&lt;/code&gt;, &lt;code&gt;cost_log&lt;/code&gt;. Every shop-scoped table carries &lt;code&gt;shop_id&lt;/code&gt;. The only UPDATE anywhere in the codebase is on &lt;code&gt;scan_session.status&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The obvious way to enforce append-only is code discipline. Write no UPDATE statements, review for them, move on. I rejected that, because it holds exactly as long as every future query is well behaved. A migration script, a hotfix, or one psql session at two in the morning ends the guarantee quietly, and the tell is that the audit trail looks fine afterward.&lt;/p&gt;

&lt;p&gt;So the rule lives in the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;forbid_mutation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;trigger&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="n"&gt;RAISE&lt;/span&gt; &lt;span class="n"&gt;EXCEPTION&lt;/span&gt; &lt;span class="s1"&gt;'table % is append-only (Hickey model): % not allowed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TG_TABLE_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TG_OP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plpgsql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="n"&gt;FOREACH&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;ARRAY&lt;/span&gt; &lt;span class="n"&gt;ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'corpus_version'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'scan_photo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'candidate_set'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'llm_rerank'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'human_confirmation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'condition_assessment'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'pricing_snapshot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'shopify_draft'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'cost_log'&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;LOOP&lt;/span&gt;
    &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s1"&gt;'CREATE TRIGGER %I_append_only BEFORE UPDATE OR DELETE ON %I FOR EACH ROW EXECUTE FUNCTION forbid_mutation()'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;LOOP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verified against a real Postgres, not asserted in a comment. An UPDATE on &lt;code&gt;cost_log&lt;/code&gt; raises &lt;code&gt;table cost_log is append-only (Hickey model)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One more schema decision belongs here. Condition is a grade range label, and no numeric grade type exists anywhere in the schema, the API, the prompts, or the UI copy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;grade_range_low&lt;/span&gt;  &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grade_range_low&lt;/span&gt;  &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'PR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'FR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'GD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'VG'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'FN'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'VF'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'NM'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="n"&gt;grade_range_high&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grade_range_high&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'PR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'FR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'GD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'VG'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'FN'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'VF'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'NM'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 9.4 is a claim a phone photo does not entitle anyone to make. If the type does not exist, nobody adds it later under deadline pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The evidence contradiction gate
&lt;/h2&gt;

&lt;p&gt;Confidence scores from a model are self-reported. Asking for one and thresholding on it is the cheap version of a quality gate, and it fails in the direction you care about, because a model is most fluent when it is wrong about a plausible thing.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;VisionProvider&lt;/code&gt; interface therefore requires structured evidence alongside the answer:&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="cm"&gt;/** REQUIRED structured evidence. The contradiction gate's raw material (R7). */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Evidence&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;issue_number_read&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;price_box_text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;logo_era_guess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prompt states the same requirement in the model's own terms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- evidence fields are REQUIRED: report exactly what you can read on the cover
  (issue number printed, cover price box text, publisher logo era guess).
  Use null only when genuinely unreadable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now there is something to check. &lt;code&gt;src/services/rerank.ts&lt;/code&gt; cross-validates each field against the top candidate's metadata. Issue number read against the candidate's issue. Cover price against a coarse US newsstand era table. Logo era decade against the candidate year:&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evidence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_box_text&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;top&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;priceMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;evidence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_box_text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;¢c&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\$\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?:\.\d{1,2})?)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;priceMatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="nx"&gt;priceMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;priceMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;priceMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;era&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;priceEraBounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cents&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;era&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;top&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;era&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;top&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;era&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;reasons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;`price_box_text "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;evidence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price_box_text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" implies ~&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;era&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;era&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, contradicts candidate year &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;top&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The era bounds are deliberately loose. The gate catches decade-scale misses and does not quibble about a two-year overlap.&lt;/p&gt;

&lt;p&gt;A contradiction then costs the model its fast path:&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;function&lt;/span&gt; &lt;span class="nf"&gt;applyContradiction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;band&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Band&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;contradiction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Band&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;contradiction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;band&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;band&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;band&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three bands drive the phone UI. High is a one-tap confirm. Medium is a candidate grid with a forced pick. Low is manual search. Downgrading high to medium means a confident but self-contradicting answer costs the employee one extra tap instead of putting a wrong book into inventory.&lt;/p&gt;

&lt;p&gt;The transferable piece has nothing to do with comics. Do not ask a model how sure it is. Make it report the specific things it read, then check those against something deterministic you already trust.&lt;/p&gt;

&lt;p&gt;Seeded cases in the test suite all flag and downgrade: a wrong issue number read, a twelve cent price box on a 1988 book, a 1960s logo on a modern year.&lt;/p&gt;

&lt;p&gt;The provider seam behind that gate is a &lt;a href="https://startaitools.com/posts/the-moat-is-the-trust-layer-nexus-byok-rag/" rel="noopener noreferrer"&gt;bring your own key provider architecture&lt;/a&gt; per shop, with an Anthropic adapter (Messages API, image blocks, &lt;code&gt;claude-sonnet-5&lt;/code&gt; as default and reference model) and an OpenAI-compatible adapter (chat completions, &lt;code&gt;image_url&lt;/code&gt; data URIs). Resolution order is a gateway override first, then a shop credential row whose &lt;code&gt;key_ref&lt;/code&gt; names an env var, then a global env fallback. Raw keys never enter the database, only refs to env var names. Two pieces of reliability lore carried over from the estate's existing provider registry shape in &lt;code&gt;@intentsolutions/refiner&lt;/code&gt; and the Transport seam in &lt;code&gt;@intentsolutions/jrig-cli&lt;/code&gt;: a 2048 max-output-token floor, and a parser that strips &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; blocks before it goes looking for JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  One snapshot per source, and no source can block
&lt;/h2&gt;

&lt;p&gt;The 23:56 commit added a second seam. A &lt;code&gt;PricingProvider&lt;/code&gt; declares a &lt;code&gt;source&lt;/code&gt;, a &lt;code&gt;kind&lt;/code&gt; of &lt;code&gt;live_asks&lt;/code&gt; or &lt;code&gt;historical_fmv&lt;/code&gt;, and returns comps plus a low/median/high summary plus &lt;code&gt;fetched_at&lt;/code&gt; plus a stub flag. Two adapters implement it: a new eBay Browse adapter (OAuth2 client-credentials app token, cached until near expiry, query built from title, issue number, and variant against the comics category) and PriceCharting refined behind the same interface.&lt;/p&gt;

&lt;p&gt;Two decisions in that step went against the obvious version.&lt;/p&gt;

&lt;p&gt;First, provider isolation over sequencing. Calling two pricing APIs in a row is simpler to write and means the second one never runs when the first one has a bad morning:&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;settled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allSettled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getComps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;shopCtx&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A failed source is reported in the outcome list with its error and writes no snapshot row, because nothing was fetched. The other source still prices the book.&lt;/p&gt;

&lt;p&gt;Second, one snapshot row per source, with the overall suggestion stamped on every row:&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;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;fulfilled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`INSERT INTO pricing_snapshot
       (scan_session_id, shop_id, source, query, comps, suggested_cents, override_cents, policy_id, fetched_at)
     VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) RETURNING id`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shopId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;queryText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;comps&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;suggested&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;overrideCents&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;policyId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetched_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per-source suggested prices would have been more honest-looking and worse to consume. The draft step would have needed to know which source wins before it could read a price, which is ordering ambiguity in a table that no one is allowed to correct afterward. Stamping the overall figure on every row keeps one rule for the draft step: the latest snapshot carries the price of record.&lt;/p&gt;

&lt;p&gt;Precedence is fixed rather than clever:&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;function&lt;/span&gt; &lt;span class="nf"&gt;pickDrivingResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PricingResult&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="nx"&gt;PricingResult&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;real&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PricingResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stub&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;comps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;historical_fmv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;real&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;live_asks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;real&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;real&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Historical fair market value beats live asking prices, because an ask is a wish. When neither source has real comps, the shop's policy floor wins. The UI shows both sources side by side, highlights the driving one, and labels stubs as stubs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance, tests, and the release cycle
&lt;/h2&gt;

&lt;p&gt;Governance came first, at 18:07, through the &lt;code&gt;/repo-dress&lt;/code&gt; pass: LICENSE, SECURITY.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SUPPORT.md, AGENTS.md, CI. The 18:12 commit authored the six master planning docs (business case, PRD with R1 through R20 MoSCoW-tagged, architecture, user journeys, technical spec, status) alongside the index and the project CLAUDE.md, which brought &lt;code&gt;000-docs/&lt;/code&gt; to eight filed documents with the competitor analysis and the approved build plan already in the tree. Then an isolated beads workspace with prefix &lt;code&gt;longbox&lt;/code&gt;. Five automated release commits took version.txt from v0.1.0 to v0.2.1.&lt;/p&gt;

&lt;p&gt;The API is shop-scoped by path prefix, &lt;code&gt;/api/shops/:shopId/scan-sessions&lt;/code&gt;, chosen over a header because a path is visible in logs, cacheable, and curl-friendly. Onboarding a shop is one command, &lt;code&gt;pnpm register-shop&lt;/code&gt;. Every model call writes a cost row from day one.&lt;/p&gt;

&lt;p&gt;Verification at end of day: &lt;code&gt;pnpm lint&lt;/code&gt;, &lt;code&gt;format:check&lt;/code&gt;, and &lt;code&gt;typecheck&lt;/code&gt; green. 118 unit tests, up from 92 at the core-pipeline commit. Coverage 99.67% of lines against a floor of 80. Fourteen integration and smoke tests green against a dockerized &lt;code&gt;postgres:16&lt;/code&gt;, including one that asserts two snapshot rows come out of a single price call. Migration &lt;code&gt;002&lt;/code&gt; extends the &lt;code&gt;shop_credentials.kind&lt;/code&gt; CHECK with &lt;code&gt;ebay&lt;/code&gt; and leaves &lt;code&gt;001&lt;/code&gt; untouched. &lt;code&gt;tests/TESTING.md&lt;/code&gt; was re-pinned with &lt;code&gt;audit-harness init&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do yet
&lt;/h2&gt;

&lt;p&gt;Both pricing sources are stubs in real terms right now. PriceCharting's live field mapping needs verification the day the Premium token lands, and eBay returns a flagged stub without credentials.&lt;/p&gt;

&lt;p&gt;No similarity index exists. That is a locked decision rather than an oversight: v0 ships barcode plus vision plus human pick, and if the pilot shows real misses the plan is to buy before building. Ximilar sells a commercial comics visual-search API and a quote is pending. A self-built cover-image index would rest on a fair-use posture instead of a granted license, which is the project's top logged risk.&lt;/p&gt;

&lt;p&gt;The CI static eval regression set is a Phase 2 exit item that has not been built. The &lt;code&gt;human_confirmation&lt;/code&gt; table is designed to grow into that eval set, and it currently holds nothing. The UI &lt;code&gt;override_cents&lt;/code&gt; smoke assertion is still pending.&lt;/p&gt;

&lt;p&gt;And none of this has met a real comic. Every number above came from a test suite and a Docker container. The pilot has not run.&lt;/p&gt;

&lt;p&gt;Also shipped that day, both routine pipeline output: the blog automation dual-published the previous day's post &lt;code&gt;working-is-not-proven&lt;/code&gt; to tonsofskills.com/blog, and the comehomealabama journal published a piece on July coastal market numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why not use a vision model alone for comic identification?
&lt;/h3&gt;

&lt;p&gt;Issue-exact and variant-exact identification is retrieval work. Every incumbent that works in this space runs image similarity against a reference cover corpus, which is why the model here sits in the re-rank seat instead of the identifier seat. A first print and a common reprint of the same book are the same picture with different economics, and that difference is carried by metadata rather than by the image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should barcode decoding run before or after the vision model?
&lt;/h3&gt;

&lt;p&gt;Before. Post-1990 comics carry a 12-digit UPC-A plus a 5-digit supplement that encodes issue, cover variant, and printing, so a readable supplement answers the variant question by arithmetic and the model is never asked. Vision is the fallback for the books that arithmetic cannot reach, and today that fallback runs without a similarity index behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you stop a vision model from confidently returning a wrong answer?
&lt;/h3&gt;

&lt;p&gt;Require structured evidence alongside the answer, then check that evidence against something deterministic. This pipeline asks for the issue number read, the cover price box text, and the logo era, then cross-validates each against the top candidate's metadata. A contradiction downgrades the confidence band from high to medium, which costs the employee one extra tap and keeps a wrong book out of inventory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/building-cad-dxf-agent-from-zero-to-v010/" rel="noopener noreferrer"&gt;Shipping a CAD Agent from Zero: DXF Parsing, Edit Engines, and LLM Planner Interfaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/every-safety-gate-has-a-failure-direction/" rel="noopener noreferrer"&gt;Every Safety Gate Has a Failure Direction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/noise-robust-signed-llm-judge-evals/" rel="noopener noreferrer"&gt;Noise-Robust LLM-Judge Evals: Don't Sign a Coin Flip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>aiagents</category>
      <category>typescript</category>
      <category>testing</category>
    </item>
    <item>
      <title>Every Claim Needs a Shipped Source and an Executable Proof</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Wed, 02 Sep 2026 14:49:15 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/every-claim-needs-a-shipped-source-and-an-executable-proof-3l0e</link>
      <guid>https://dev.to/jeremy_longshore/every-claim-needs-a-shipped-source-and-an-executable-proof-3l0e</guid>
      <description>&lt;p&gt;I told GPT 5.6 Luna, running through Codex, to &lt;code&gt;finish teh epics and beads&lt;/code&gt; on the plugins repo. It ran for about 361 minutes across 2 sessions and 187 turns, and it closed nothing. No file mutated, no Beads record touched, no GitHub state changed. Its closing line was that the worktree was clean at &lt;code&gt;origin/main&lt;/code&gt; &lt;code&gt;3c5be4a5981ed5089deedff53d18136b9848a18c&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is not a failure report. Asked to finish three epics, the honest deliverable turned out to be an inventory of what "finished" would actually require, and the five open beads had five different meanings of "not done". Two of them are closable by writing code. The other three need an owner clicking a setting, a calendar to run out, and a record corrected to match reality.&lt;/p&gt;

&lt;p&gt;The same gap kept showing up until the day ended, and three of the day's fixes were to &lt;a href="https://startaitools.com/posts/a-green-result-only-covers-what-it-ran/" rel="noopener noreferrer"&gt;proof machinery that could not be trusted&lt;/a&gt; about its own state: a gate runner manufacturing false failures, a render check poisoned by its own output, and a liveness marker that could not tell quiet from dead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five ways a finished feature is still not done
&lt;/h2&gt;

&lt;p&gt;The audit read Epics 6, 7 and 10 against Blueprint 727, the live Beads Dolt database, &lt;code&gt;origin/main&lt;/code&gt; code, tests, workflows, branches and PRs. Read-only throughout. What came back was a taxonomy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code live, acceptance failing at the platform.&lt;/strong&gt; &lt;code&gt;claude-nfzl.6&lt;/code&gt; ships in &lt;code&gt;242d8e051&lt;/code&gt;: &lt;code&gt;validate-plugins.yml&lt;/code&gt;, &lt;code&gt;check-marketplace-compliance-baseline.py&lt;/code&gt;, &lt;code&gt;.github/CODEOWNERS&lt;/code&gt;, and 13 focused tests. Then &lt;code&gt;gh api repos/.../branches/main/protection&lt;/code&gt; returns &lt;code&gt;required_approving_review_count=0&lt;/code&gt; and &lt;code&gt;require_code_owner_reviews=false&lt;/code&gt;. The gate is written, committed and switched off. Nothing in the repository can close that bead. It needs an owner clicking a setting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Calendar-gated, not code-gated.&lt;/strong&gt; &lt;code&gt;claude-nfzl.7&lt;/code&gt; has PR #1384 merged as &lt;code&gt;b786149e1&lt;/code&gt;, R2 and R4 code live, and a full-corpus run passing in about 58 seconds across 2053 live triples with zero newcomers. The only thing outstanding is a mandatory two-week R1 observation window and a flap receipt. Time closes that one. Code cannot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complete but stale.&lt;/strong&gt; &lt;code&gt;claude-jqvw.11&lt;/code&gt; runs &lt;code&gt;check-mirror-licenses.mjs&lt;/code&gt; green at 36 of 36 configured sources and 36 of 36 &lt;code&gt;.source.json&lt;/code&gt; mirrors, with sync hard-failing on a missing license include. Blueprint and Beads still carry the historical 63/63 denominator. The record is wrong, not the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Green suite, missing red run.&lt;/strong&gt; &lt;code&gt;claude-jqvw.1&lt;/code&gt; has the whole chain working: tag, GitHub Release, reassertion, npm publish, with &lt;code&gt;npm-publication-lock.test.mjs&lt;/code&gt; passing 11 of 11. What it does not have is the required fault-injection RED run proving no orphan npm publication and retained signed evidence-row proof. A passing test says the happy path holds. It says nothing about the failure mode you built the lock for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flag exists, workflow never calls it.&lt;/strong&gt; The evidence emitter supports &lt;code&gt;--certification-report&lt;/code&gt;. &lt;code&gt;.github/workflows/emit-evidence.yml&lt;/code&gt; never generates or passes a real one, so only catalog, unicode and required-context rows get signed. &lt;code&gt;claude-snmr.5&lt;/code&gt; is open because of that, and &lt;code&gt;claude-snmr.6&lt;/code&gt; is explicitly blocked behind it.&lt;/p&gt;

&lt;p&gt;The audit also decomposed a 79-entry corpus shrink (2132 pinned against 2053 live) into 78 &lt;code&gt;E-MISSING-REQUIRED-SECTION&lt;/code&gt; plus 1 &lt;code&gt;E-FRONTMATTER&lt;/code&gt;, rather than treating it as one bot-authored rule change. Last baseline commit was bot PR #1367 on Aug 27. And mid-run another agent modified &lt;code&gt;freshie/scripts/promote-to-curated.py&lt;/code&gt; and moved the branch to &lt;code&gt;fix/curated-promotion-cohort-parity&lt;/code&gt;. The auditor refused to reset or touch it and took all its Epic 6 evidence from read-only Git views of &lt;code&gt;origin/main&lt;/code&gt; instead. That is the correct call in a shared working tree, and it is a call I have watched agents get wrong.&lt;/p&gt;

&lt;p&gt;Merged in that repo the same day anyway: PR #1401 (&lt;code&gt;3c5be4a59&lt;/code&gt;, secure projections and Snowflake, the same commit the auditor later signed off as its clean baseline), PR #1403 (Snowflake operator skills), and &lt;code&gt;d6d14da83&lt;/code&gt; unifying the freshie curated promotion cohort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just close the beads
&lt;/h3&gt;

&lt;p&gt;Because a closed bead that traces back to switched-off branch protection is worse than an open one. An open bead is a question. A closed bead is an answer, and nobody re-audits an answer. Convert the first into the second and you have not finished the work, you have deleted the only record that the work is unfinished. Six hours of audit output that closes nothing is cheaper than one wrong close, because the wrong close comes back as a production surprise with no bead pointing at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing the requirement down as an enforced file
&lt;/h2&gt;

&lt;p&gt;While that audit ran, the Omarchy fleet moved: &lt;code&gt;omarchy-widget-template&lt;/code&gt; plus 15 &lt;code&gt;omarchy-*-entry&lt;/code&gt; repos: docket, quiet-queue, foundry, loose-ends, bazaar, capture-conveyor, listening-post, crew-chief, desk-transition, flow-boundary, wait-state, workspace-storyboard, x-files, mlb-booth and pit-wall. The commit shapes repeat: &lt;code&gt;test: certify &amp;lt;X&amp;gt; on Buzz&lt;/code&gt;, &lt;code&gt;chore: sync canonical Omarchy gates&lt;/code&gt;, &lt;code&gt;fix: bind &amp;lt;X&amp;gt; marketplace claims&lt;/code&gt;, &lt;code&gt;test: refresh &amp;lt;X&amp;gt; Buzz proof&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The artifact worth naming is 18 lines of markdown in the template, &lt;code&gt;contracts/marketplace.md&lt;/code&gt;, from commit &lt;code&gt;0607dcc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Marketplace claim ledger&lt;/span&gt;

Replace this template ledger before calling a generated plugin submission-ready.
Every meaningful listing claim needs a shipped source and an executable proof.
Do not infer behavior from a mockup, README, test name, or intended design.

| Claim | Shipped source | Executable proof |
|---|---|---|
| Visible bar outcome and primary panel action | &lt;span class="sb"&gt;`BarWidget.qml`&lt;/span&gt;, &lt;span class="sb"&gt;`Panel.qml`&lt;/span&gt; | plugin-specific contract and interaction tests |
| Data source, scope, cadence, and bounds | service QML, &lt;span class="sb"&gt;`Model.js`&lt;/span&gt;, or shipped helper | fixture-backed unit, boundary, and failure tests |
| Local writes, network use, credentials, and explicit exclusions | every shipped runtime path | security contract tests plus canonical gates |
| Marketplace image tells the same product story | &lt;span class="sb"&gt;`assets/banner.svg`&lt;/span&gt;, deterministic E2E fixture | hash-bound Buzz render receipt and visual approval |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two columns per claim, and both are mandatory. A test name is not a proof. A mockup is not a source. The ledger also fixes the description rule so it stops being a matter of taste: the final listing description and &lt;code&gt;barWidget.description&lt;/code&gt; must be identical, exactly 500 characters, name the product, explain what appears in the bar or panel, state what the user can do, and disclose the material trust boundary.&lt;/p&gt;

&lt;p&gt;A markdown file nobody enforces is a wish. The same commit added six lines to &lt;code&gt;tests/contract.test.js&lt;/code&gt;, five assertions plus the read, so the ledger cannot be quietly deleted or hollowed out into a heading with nothing under it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;marketplaceContract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contracts/marketplace.md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;marketplaceContract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="sr"&gt; Claim &lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="sr"&gt; Shipped source &lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="sr"&gt; Executable proof &lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;marketplaceContract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/exactly&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+500 characters/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;marketplaceContract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/bar or panel/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;marketplaceContract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/trust boundary/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;marketplaceContract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/hash-bound Buzz render receipt/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The commit touched &lt;code&gt;.harness-hash&lt;/code&gt; (+8/-7), &lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;contracts/marketplace.md&lt;/code&gt; (+18), &lt;code&gt;tests/RTM.md&lt;/code&gt;, and &lt;code&gt;tests/contract.test.js&lt;/code&gt; (+6). Small diff. It is the same move the audit was asking for, applied one layer earlier: state the requirement in a file, and make the test suite fail if the file stops saying it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two bugs where the proof machinery broke its own preconditions
&lt;/h2&gt;

&lt;p&gt;Both of these landed the same day, in the same fleet, and they are the same shape: the thing that verifies work was interfering with the work it verified.&lt;/p&gt;

&lt;h3&gt;
  
  
  A gate runner racing its own input
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;scripts/run-plugin-gates.sh&lt;/code&gt; in omarchy-docket-entry fed each gate a small JSON envelope through a pipe. A gate that exits before reading stdin races the producer into SIGPIPE, exit 141. So a deterministic invalid-verdict check became an intermittent gate crash, dependent on scheduling. Commit &lt;code&gt;240b2d6&lt;/code&gt; swaps the pipe for a here-string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-nc&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; c &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'{candidate:$c, action:"omarchy-submit", env:{repo:""}}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;gate &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GATES&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;/c&lt;span class="k"&gt;*&lt;/span&gt;.sh&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c"&gt;# Feed the small JSON envelope with a here-string. A pipe lets a gate that&lt;/span&gt;
  &lt;span class="c"&gt;# exits before reading stdin race the producer into SIGPIPE (141), turning a&lt;/span&gt;
  &lt;span class="c"&gt;# deterministic invalid-verdict check into an intermittent gate crash.&lt;/span&gt;
  &lt;span class="nv"&gt;verdict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;bash &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$gate&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="c"&gt;# A gate that emits nothing has crashed hard. Fail closed rather than&lt;/span&gt;
  &lt;span class="c"&gt;# silently counting it as clean, which is how a broken gate becomes theater.&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$verdict&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# (excerpt: the loop goes on to print CRASH, set blocked=1, and continue)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fail-closed-on-empty branch and that comment about theater were already in the file. Somebody had already thought carefully about a gate emitting nothing. What was broken was that the runner could manufacture the empty verdict itself, and then correctly fail closed on a condition it had caused. This is the inverse of the audit's problem: there the evidence was missing, here the evidence was lying. A safety check firing on its own noise is still a false alarm, and false alarms are how people learn to ignore gates.&lt;/p&gt;

&lt;h3&gt;
  
  
  A render that dirtied the source it was proving
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;scripts/rig-render.sh&lt;/code&gt; in the template will only issue a render receipt if the source tree is clean, which is the entire point of a receipt: it binds an image to a specific source state. The glob of files whose modification marks the tree dirty included &lt;code&gt;preview.png&lt;/code&gt;, the render's own output.&lt;/p&gt;

&lt;p&gt;So a failed render left a stale &lt;code&gt;preview.png&lt;/code&gt; behind. That file marked the source dirty. No retry could ever produce a clean receipt. One bad render poisoned every attempt after it. Commit &lt;code&gt;52a9d42&lt;/code&gt; removes the artifact from the precondition: the pathspec used to carry &lt;code&gt;preview.png&lt;/code&gt; between &lt;code&gt;manifest.json bin&lt;/code&gt; and &lt;code&gt;README.md&lt;/code&gt;, and after the fix it reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SOURCE_DIRTY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_COMMIT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"unknown"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
   &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; status &lt;span class="nt"&gt;--porcelain&lt;/span&gt; &lt;span class="nt"&gt;--untracked-files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="s1"&gt;'*.qml'&lt;/span&gt; &lt;span class="s1"&gt;'*.js'&lt;/span&gt; manifest.json bin README.md assets/banner.svg &lt;span class="se"&gt;\&lt;/span&gt;
     e2e scripts/rig-render.sh 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;SOURCE_DIRTY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The obvious fix is to delete &lt;code&gt;preview.png&lt;/code&gt; at the top of every run. That fix is wrong, and the reason is worth stating. The receipt exists to distinguish a render of clean source from a render of dirty source. If the script scrubs the output first, every dirty-source failure gets laundered into a clean run and the distinction the receipt sells is gone. Removing the output from the precondition is a smaller change and it keeps the signal. The same class of fix landed in two other entries that day: "keep failed Capture renders retryable" in capture-conveyor (&lt;code&gt;04ca3ae&lt;/code&gt;) and "allow clean render retry after failed capture" in loose-ends (&lt;code&gt;88054b8&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  A dead-man that could not tell quiet from dead
&lt;/h2&gt;

&lt;p&gt;At 22:12 I asked for something unrelated: &lt;code&gt;i need ezekiel to start recievinf the emails like he does withe blog backfill skill that runs the blog work u know what i mean&lt;/code&gt;. Ezekiel does the social posting. The blog pipeline already emails him a per-post packet. The real-estate content machine behind comehomealabama.com, run out of coastal-realty-ops, had been soaking unattended for 11 days and it was time to point it at him too.&lt;/p&gt;

&lt;p&gt;Claude Fable 5 ran a health check before flipping anything, on the reasoning that Ezekiel should not start receiving packets from a broken producer and should not get 11 days of backlog dropped on him in one morning. The soak verdict: five posts landed on Aug 21, 24, 26, 28 and 31, all Monday/Wednesday/Friday, every prior post packeted, liveness green, and the ledger showed exactly one unsent packet. He would start with one email.&lt;/p&gt;

&lt;p&gt;The flip itself was five minutes and nine tool calls, shipped as coastal-realty-ops PR #50 (&lt;code&gt;17394b3&lt;/code&gt;): &lt;code&gt;packet.env&lt;/code&gt; &lt;code&gt;PACKET_TO&lt;/code&gt; set to &lt;code&gt;ezekiel@intentsolutions.io&lt;/code&gt; with me on CC. The file is sourced per run, so no restart, effective at the next 05:15 sweep. That commit also banked 5 lines of &lt;code&gt;decisions.jsonl&lt;/code&gt; and 3 lines of &lt;code&gt;topics-queue.jsonl&lt;/code&gt; the producer had accumulated during the soak.&lt;/p&gt;

&lt;p&gt;The health check is what found the bug. &lt;code&gt;scripts/journal/mandy-posting-packet.sh&lt;/code&gt; had three clean no-op exits (no ledger, no packets due, no digest week) and all three returned 0 without touching &lt;code&gt;mandy-posting-packet.ok&lt;/code&gt;. The estate dead-man sweep reads a fresh &lt;code&gt;.beat&lt;/code&gt; with a stale &lt;code&gt;.ok&lt;/code&gt; as running-but-failing. So a perfectly healthy pipeline with nothing due for two days would page. It was already visible in the wild: &lt;code&gt;.ok&lt;/code&gt; stuck at Aug 29 (the Aug 28 post's packet fired that morning) while &lt;code&gt;.beat&lt;/code&gt; kept advancing.&lt;/p&gt;

&lt;p&gt;The commit message for comehomealabama PR #8 (&lt;code&gt;d87bada&lt;/code&gt;) carries the rule in one line: a clean no-op IS a successful run. Change was +5/-3 in one shell script, verified with &lt;code&gt;shellcheck -S warning&lt;/code&gt;, &lt;code&gt;bash -n&lt;/code&gt;, and a live &lt;code&gt;--sweep&lt;/code&gt; against the current ledger that logged "no packets due" and refreshed &lt;code&gt;.ok&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The tempting shortcut is to touch &lt;code&gt;.ok&lt;/code&gt; at the top of the script and stop thinking about it. That reports healthy before doing any work, which is precisely the failure the dead-man exists to catch. The marker belongs on every path that legitimately completes, no-ops included, and on no path that does not. Quiet and dead have to be distinguishable, and the only place that distinction can live is in the script that knows which one it is.&lt;/p&gt;

&lt;p&gt;The part I keep coming back to: nothing was on fire. The two-day quiet window that would have false-paged had not happened yet. It got found because Claude Fable 5 checked the system before trusting it with a person's inbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Retiring a carried patch in the Buzz fork.&lt;/strong&gt; &lt;code&gt;cb633a0c4&lt;/code&gt; plus PRs #30 and #31 emptied &lt;code&gt;CARRIED_PATCHES&lt;/code&gt; in &lt;code&gt;scripts/fork-gates/check-additive-only.sh&lt;/code&gt;, deleted the carried 311-line e2e spec &lt;code&gt;desktop/tests/e2e/manual-invite-join.spec.ts&lt;/code&gt;, replaced FORK.md's carried-patches exception with &lt;code&gt;None - empty by design&lt;/code&gt;, and filed a 131-line audit at &lt;code&gt;000-docs/009-AA-AUDR-fork-contract-breach-2026-08-16.md&lt;/code&gt;. PRs #26 and #27 had carried an invite-to-default-channel patch on fork main, the same class of fork-contract breach as the earlier PR #16 incident already documented in &lt;code&gt;000-docs/007&lt;/code&gt;. Production now runs the upstream published image (&lt;code&gt;ghcr.io/block/buzz@sha256:fe092cf9...&lt;/code&gt;), enrollment moved to an ops-side watcher in the private ops repo, and the real fix is tracked upstream as &lt;code&gt;block/buzz#4307&lt;/code&gt;. Merge-and-restore beat revert because the upstream sync supersedes the carry without rewriting history. Both &lt;code&gt;check-additive-only.sh&lt;/code&gt; and &lt;code&gt;check-must-survive.sh&lt;/code&gt; pass with &lt;code&gt;CARRIED_PATCHES&lt;/code&gt; empty, gate output pasted into the PR body. A large upstream sync (&lt;code&gt;91452d823&lt;/code&gt;) landed about 15 upstream commits the same day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A discovery that ended in deliberate non-adoption.&lt;/strong&gt; Starting 02:10, Claude Fable 5 ran a discovery on the third-party &lt;code&gt;no-mistakes&lt;/code&gt; tool against the Intent Solutions testing SOP. It is a Go git-proxy: you push to a &lt;code&gt;no-mistakes&lt;/code&gt; remote instead of origin and it runs intent, rebase, review, test, docs, lint, push, PR and CI in an isolated disposable worktree, with an LLM review stage that falls back across agents and a CI repair loop with guarded force-push. We did not adopt it. What came out was &lt;code&gt;worktree-run.sh&lt;/code&gt; built into &lt;code&gt;audit-harness&lt;/code&gt;, a verification of the read-only-test rule, and the non-adoption recorded as a decision instead of an unwritten "we looked at it once". Two incidental findings: &lt;code&gt;yamllint&lt;/code&gt; was not installed on this box, and the escape-scan expectation was inverted, since the test expects a non-zero exit (a REFUSE) when policy is being weakened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A $0 calendar stack, decided in conversation, no commits.&lt;/strong&gt; The one item of the day with neither a shipped source nor an executable proof, recorded here as the exception it is. With a Buzz VPS bill due the next day I asked what was free, then &lt;code&gt;im so confused whata the most texhnically sound optiin that would be most respected by underground linux users as my teams set up&lt;/code&gt;. Answer: Radicale on the VPS that already exists. One Python process, and the team calendar is a directory of plain &lt;code&gt;.ics&lt;/code&gt; text files you can grep and diff, backed up by borg like any other directory. khal plus vdirsyncer for the terminal, Cal.com's free tier for outward booking. The part worth recording is the refusal. Fastmail was rejected as a mail viewer, because a calendar decision should not quietly turn into a second mail migration one month after the MXroute cutover.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the day cost
&lt;/h2&gt;

&lt;p&gt;The session analyzer logged 19 failure-to-fix arcs and 2 course-corrections across four models (Claude Opus 5, Claude Sonnet 5, Claude Fable 5, GPT 5.6 Luna), over sessions spanning 1169 minutes of wall clock. GPT 5.6 Luna took &lt;code&gt;claude-code-plugins&lt;/code&gt; for 2 sessions, 187 turns, 361 minutes. Claude Fable 5 took &lt;code&gt;intent-eval-platform&lt;/code&gt; for 3 sessions, 27 turns, 8 errors and both course-corrections. Claude Opus 5 and Claude Fable 5 split the home layer across 3 sessions and 273 minutes with 9 errors. Claude Fable 5 did coastal-realty-ops in 5 minutes and 9 tool calls.&lt;/p&gt;

&lt;p&gt;The two ends of that range are the same instinct at different scales. GPT 5.6 Luna was told to finish the epics and spent six hours producing an audit that closed nothing, because closing them honestly was not on the menu. Claude Fable 5 was told to switch Ezekiel on, checked the pipeline's health first, and then did exactly what it was asked. Only one of the two delivered the literal request, and it delivered it last. Both started from the same place: find out whether the thing is true before writing down that it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/a-green-result-only-covers-what-it-ran/" rel="noopener noreferrer"&gt;A green result only covers what it ran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/scope-the-guard-to-what-the-job-writes/" rel="noopener noreferrer"&gt;Scope the guard to what the job writes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/one-corrected-check-fifteen-repos/" rel="noopener noreferrer"&gt;One corrected check, fifteen repos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;{&lt;br&gt;
  "&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;": "&lt;a href="https://schema.org" rel="noopener noreferrer"&gt;https://schema.org&lt;/a&gt;",&lt;br&gt;
  "@type": "BlogPosting",&lt;br&gt;
  "headline": "Every Claim Needs a Shipped Source and an Executable Proof",&lt;br&gt;
  "description": "Every claim needs a shipped source and an executable proof. What a six-hour audit that closed nothing found out about code that was already finished.",&lt;br&gt;
  "url": "&lt;a href="https://startaitools.com/posts/working-is-not-proven/" rel="noopener noreferrer"&gt;https://startaitools.com/posts/working-is-not-proven/&lt;/a&gt;",&lt;br&gt;
  "datePublished": "2026-08-31T10:00:00-06:00",&lt;br&gt;
  "dateModified": "2026-08-31T10:00:00-06:00",&lt;br&gt;
  "author": {&lt;br&gt;
    "@type": "Person",&lt;br&gt;
    "name": "Jeremy Longshore"&lt;br&gt;
  },&lt;br&gt;
  "publisher": {&lt;br&gt;
    "@type": "Organization",&lt;br&gt;
    "name": "Start AI Tools",&lt;br&gt;
    "url": "&lt;a href="https://startaitools.com" rel="noopener noreferrer"&gt;https://startaitools.com&lt;/a&gt;"&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>testing</category>
      <category>cicd</category>
      <category>automation</category>
      <category>devops</category>
    </item>
    <item>
      <title>One Corrected Check, Fifteen Repos</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Tue, 01 Sep 2026 10:21:25 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/one-corrected-check-fifteen-repos-51gk</link>
      <guid>https://dev.to/jeremy_longshore/one-corrected-check-fifteen-repos-51gk</guid>
      <description>&lt;p&gt;Two gates failed the same way on 2026-08-30, in systems that share no code.&lt;/p&gt;

&lt;p&gt;The first checked whether a set of run fields were non-null. A recorded discovery run could therefore declare 3,000 skills while carrying 19 rows, and the boundary would pass it, because 3,000 is not null and 19 is not null. Runs 6 through 11 all disagreed with their own row counts. Run 11 declared 3,069 against 3,678 actual rows.&lt;/p&gt;

&lt;p&gt;The second checked whether a marketplace submission description was exactly 500 characters. Which 500 characters was never asked. So 500 characters of filler passed, and 500 characters of filler is precisely the submission the gate was written to stop.&lt;/p&gt;

&lt;p&gt;A check measuring a proxy instead of the property is the house failure mode on this blog and has been for months. I am not going to pretend it was a discovery. What was actually expensive on this day was not diagnosing either gate. It was pushing one corrected gate through fifteen repos that carry it as a vendored, hash-pinned copy rather than importing it. That half is the post.&lt;/p&gt;

&lt;h2&gt;
  
  
  The evidence boundary that could not see its own run
&lt;/h2&gt;

&lt;p&gt;Epic 5, "Coherent Freshie Evidence," closed in &lt;code&gt;claude-code-plugins&lt;/code&gt; that day. The closure AAR is &lt;code&gt;000-docs/809-AA-AACR-epic-5-closure.md&lt;/code&gt;, 134 lines, filed against epic bead &lt;code&gt;claude-h05s&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The AAR states the defect in one line: "The old boundary checked whether required run fields were non-null, not whether the header and its rows described the same run." The run-6 shape is the image that sticks. Three thousand declared skills, nineteen rows, green.&lt;/p&gt;

&lt;p&gt;Five invariants replaced it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;gate_run_completeness()&lt;/code&gt; compares the run header against same-run rows before any export work begins.&lt;/li&gt;
&lt;li&gt;The grade histogram, CSV row count, CSV hash, run tag, and immutable Dolt commit must identify one export, not adjacent runs that happen to be close.&lt;/li&gt;
&lt;li&gt;Behavioral-evaluation identity is &lt;code&gt;jrig_run_id&lt;/code&gt;, held separate from discovery-run identity.&lt;/li&gt;
&lt;li&gt;Evidence class and retention are validity conditions, not annotations. Three legacy proofs are now honestly classified E0. No public verified projection remains.&lt;/li&gt;
&lt;li&gt;Blocking CI installs a pinned Dolt binary immediately before an exact guarded runner, which must execute one real hermetic cycle with zero skips against scratch SQLite, Dolt, and filesystem state, then prove live-server refusal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nine commits landed that sequence, and read as a run they are a reviewer finding bypasses faster than they could be closed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make exit evidence fail closed
reject skipped and overwritten proofs
close generator and overwrite bypasses
require executed hermetic proof
bind proof method and install order
verify guarded cycle invocation
bind receipts and harden hermetic proof
publish reproducible run 14 receipts
enforce graded corpus parity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The independent boundary review returned PASS only "after reproducing and closing skipped tests, generator no-op, lifecycle replacement, aliased mutation, and post-verification binary-overwrite attacks." Five attacks. Each one maps onto a commit in that list. &lt;code&gt;reject skipped and overwritten proofs&lt;/code&gt; is the skipped-test attack. &lt;code&gt;close generator and overwrite bypasses&lt;/code&gt; is the generator no-op. &lt;code&gt;bind proof method and install order&lt;/code&gt; is what stops the binary being swapped after verification. The commit log is not a changelog here, it is an attack transcript with the reviewer's half missing.&lt;/p&gt;

&lt;p&gt;The first commit alone touched 8 files for +1515/-256, including &lt;code&gt;run-delta.py&lt;/code&gt; at +247/-50, &lt;code&gt;measure-epic-1-scorecard.mjs&lt;/code&gt; at +382, and four test files. All nine commit bodies were empty, which is worth one dry line: the sequence that produced the most legible story of the day carried no explanation with it at all.&lt;/p&gt;

&lt;p&gt;Final receipts. Run 14 declared 3,053 against 3,053 rows, delta 0. 3,630 compliance rows against 3,630 grade rows with matching SHA-256. Run 14 is bound to immutable Dolt commit &lt;code&gt;2ljhn79ge74uj1kd7q2chqgo9ne0tulb&lt;/code&gt;, grade CSV SHA-256 &lt;code&gt;72fbb289e8451d9a4bbe95cae0b9a1797588c0197589f94ddd1cde48241e4ef0&lt;/code&gt;, histogram A 1,872 / B 1,117 / C 479 / D 157 / F 5. &lt;code&gt;pnpm run measure:e1:check&lt;/code&gt; passed 39 measurement tests and the tracked artifact matched its exact regeneration from the Git index. PR #1387 merged as &lt;code&gt;78e3580c&lt;/code&gt; after 34 reporting checks with zero failures.&lt;/p&gt;

&lt;p&gt;The AAR's own first lesson is the one to keep:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A green test command is not proof that the governed body ran. Exact test count, zero skips, and a guarded method invocation are part of the boundary now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Its second lesson is quieter and I think better: "Zero E2/E3 claims is a safe state, not a 100% retention measurement." The scorecard now reports &lt;code&gt;retention_percent&lt;/code&gt; as &lt;code&gt;null&lt;/code&gt;. A tool with nothing to measure says nothing rather than reporting a flattering 100%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five hundred characters of anything
&lt;/h2&gt;

&lt;p&gt;The second gate is &lt;code&gt;scripts/gates/c43-omarchy-marketplace-presentation.sh&lt;/code&gt;, which guards marketplace submission copy across the Omarchy widget fleet. Here is what it checked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HAS_BAR_WIDGET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BAR_DESC_LENGTH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"500"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;FINDINGS+&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"barWidget description uses &lt;/span&gt;&lt;span class="nv"&gt;$BAR_DESC_LENGTH&lt;/span&gt;&lt;span class="s2"&gt;/500 characters"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Length equality, and nothing else. A submission had to fill its allowance exactly, and filling an allowance is trivially satisfied by padding.&lt;/p&gt;

&lt;p&gt;The comment written above the replacement checks is the whole day in five lines:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Length alone is not copy quality. A submission description must identify the product, explain what the user can see or do, and state a meaningful trust boundary. These checks deliberately reject generic 500-character filler while repo-specific contract tests pin the precise claims each plugin is allowed to make.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The new checks run as an embedded &lt;code&gt;python3&lt;/code&gt; heredoc inside the bash gate, each one appending to a findings list rather than exiting early, so a bad description gets told everything wrong with it at once. Four of them, excerpted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sentences&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(?&amp;lt;=[.!?])\s+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentences&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description needs at least four readable sentences&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sentences&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentences&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;opening sentence is too thin to establish the user outcome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;surface_terms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;panel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;widget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;rf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;surface_terms&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description never explains the visible bar, panel, pill, or widget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two more term lists do the load-bearing work. An interaction list (&lt;code&gt;open&lt;/code&gt;, &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt;, &lt;code&gt;copy&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;focus&lt;/code&gt;, &lt;code&gt;refresh&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, &lt;code&gt;scan&lt;/code&gt;, and about a dozen more) fails a description that "gives no concrete user interaction or visible behavior." A boundary list (&lt;code&gt;no&lt;/code&gt;, &lt;code&gt;never&lt;/code&gt;, &lt;code&gt;only&lt;/code&gt;, &lt;code&gt;without&lt;/code&gt;, &lt;code&gt;offline&lt;/code&gt;, &lt;code&gt;local&lt;/code&gt;, &lt;code&gt;private&lt;/code&gt;, &lt;code&gt;fixed&lt;/code&gt;) fails one that "gives no privacy, network, data, or write boundary." A description can be four fluent sentences about nothing and still fail both.&lt;/p&gt;

&lt;p&gt;Then there is a banned-phrase list inside the gate, nine entries: &lt;code&gt;cutting-edge&lt;/code&gt;, &lt;code&gt;game-changer&lt;/code&gt;, &lt;code&gt;game-changing&lt;/code&gt;, &lt;code&gt;revolutionary&lt;/code&gt;, &lt;code&gt;supercharge&lt;/code&gt;, &lt;code&gt;seamless&lt;/code&gt;, &lt;code&gt;robust solution&lt;/code&gt;, &lt;code&gt;unlock your&lt;/code&gt;, &lt;code&gt;take your productivity to the next level&lt;/code&gt;. I run the same instrument against this blog's prose from a JSON deny-list, and the overlap is not coincidence. Both lists exist because the same generator produces both kinds of copy.&lt;/p&gt;

&lt;p&gt;Plus one cross-field check with the best failure message in the set: &lt;code&gt;manifest and barWidget descriptions tell different product stories&lt;/code&gt;, which fires when the two description fields disagree about what the thing is.&lt;/p&gt;

&lt;p&gt;None of that is clever, and it is worth being honest about what it does not do. A length check and a shape check are the same class of instrument, and a determined author can pad four sentences as easily as one. The gate is not proving quality. It raises the floor from "any 500 bytes" to "500 bytes that name the product, show a visible surface, describe an interaction, and state a boundary," and its own comment says where the real work goes: repo-specific contract tests pin the precise claims each plugin is allowed to make.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that actually cost the day
&lt;/h2&gt;

&lt;p&gt;Downstream repos do not import this gate. Each one carries a vendored copy. The lane is declared at &lt;code&gt;scripts/gates/.lane-manifest&lt;/code&gt;, whose header reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Vendored gate lane. Regenerate with scripts/sync-gate-lane.sh, never hand-edit.
# canonical: contributing-clanker@359a27cde21e60086f95a3ddee99c8920a3d7ca2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That header is quoted with its dash normalized to a comma, because the real file uses an em dash and this blog's own lint gate would quarantine the post for reproducing it.&lt;/p&gt;

&lt;p&gt;Below the header sit per-file SHA-256 hashes of every gate script. Alongside it, each repo carries &lt;code&gt;.harness-hash&lt;/code&gt; covering the wider audited surface: &lt;code&gt;contract.test.js&lt;/code&gt;, &lt;code&gt;run-plugin-gates.sh&lt;/code&gt;, &lt;code&gt;stryker.config.json&lt;/code&gt;, &lt;code&gt;tests/RTM.md&lt;/code&gt;, &lt;code&gt;tests/TESTING.md&lt;/code&gt;, and the rest.&lt;/p&gt;

&lt;p&gt;So the corrected conditional is not a one-line edit. The canonical pin moved from &lt;code&gt;contributing-clanker@359a27cd&lt;/code&gt; to &lt;code&gt;@81239c6e&lt;/code&gt;, and in every consuming repo four hashes had to move together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the lane manifest hash, in &lt;code&gt;.lane-manifest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;c43&lt;/code&gt; gate hash, in both &lt;code&gt;.lane-manifest&lt;/code&gt; and &lt;code&gt;.harness-hash&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run-plugin-gates.sh&lt;/code&gt;, because the gate list it dispatches changed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contract.test.js&lt;/code&gt;, because the per-repo contract test that pins the allowed claims changed with the copy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The third and fourth entries are the ones that make this expensive. The gate file itself is one hash. But correcting the gate changed which checks run, so the runner's hash moved, and tightening the copy to satisfy the gate changed each repo's contract test, so that hash moved too. One upstream edit fans out into four hashes per repo, and any repo where they drift fails its own harness verification before it fails the gate. That is the design working, and it is also the bill.&lt;/p&gt;

&lt;p&gt;Here is the shape of a single downstream repo's day, using &lt;code&gt;omarchy-listening-post-entry&lt;/code&gt;, which took four commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix: complete Listening Post marketplace copy
test: pin Listening Post marketplace story
test: enforce marketplace presentation quality
chore: repin audit harness artifacts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that in order and it is the whole propagation protocol in four steps. Rewrite the copy so the new gate passes. Pin the specific claims this plugin is allowed to make, in its own contract test. Take the corrected gate from the lane. Re-pin the harness hashes so the repo verifies against its new self. Every repo ran some subset of exactly that. The spread runs from four commits down to one: &lt;code&gt;omarchy-foundry-entry&lt;/code&gt; took a single &lt;code&gt;test:&lt;/code&gt; commit and no copy commit at all, which is what it looks like when only the gate underneath a repo moves.&lt;/p&gt;

&lt;p&gt;Fifteen entry repos took the change: bazaar, capture-conveyor, crew-chief, desk-transition, docket, flow-boundary, foundry, listening-post, loose-ends, mlb-booth, pit-wall, quiet-queue, wait-state, workspace-storyboard, x-files. Twelve of them needed a &lt;code&gt;fix: complete &amp;lt;Name&amp;gt; marketplace copy&lt;/code&gt;. The other three, desk-transition, foundry, and wait-state, needed only the proof and the re-pin. Counting the template and the canonical lane source itself, the fan-out ran to 48 commits across 17 repos. The whole day, including the freshie epic, came to 112 commits across 19 repos.&lt;/p&gt;

&lt;p&gt;The tradeoff is deliberate and I would still take it. Vendoring plus hash pinning means a downstream repo cannot silently run a gate that differs from canonical, and cannot quietly weaken one either. What it buys in tamper-evidence it charges in propagation, and the charge is not proportional to the size of the fix. A one-character change and a rewrite cost the same fifteen-repo sweep, because the sweep is the unit of work, not the edit. The implication is that batching discipline matters more than edit discipline on a lane like this one, though that follows from the design rather than from anything measured on this particular day: both corrected gates here lived in unrelated systems, so nothing rode the same sweep.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gate that forced an honesty edit
&lt;/h2&gt;

&lt;p&gt;Twelve repos needed a copy commit, and four of them needed a second pass after it. Those four are the interesting ones, because the gate did not extract more words from them on the second pass, it extracted truer ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix: state MLB Booth data boundary honestly
fix: clarify Loose Ends queue priority
fix: make Bazaar marketplace copy precise
fix: tighten Pit Wall marketplace copy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The template's own description went the same direction. One long run-on became shorter sentences. "real-shell screenshot evidence" was softened to "shell screenshot evidence." "plugin-specific SVG banner" became "product-specific SVG banner." A gate asking for four readable sentences and a stated trust boundary got four readable sentences, and the claims came out weaker and truer than they went in. That was not designed. It falls out of asking for a trust boundary at all, because you cannot state one without noticing where yours actually sits.&lt;/p&gt;

&lt;h2&gt;
  
  
  A watch that could only see page one
&lt;/h2&gt;

&lt;p&gt;Third thread, and it stays short because it is the same defect wearing different clothes. In &lt;code&gt;intent-os&lt;/code&gt;, bead &lt;code&gt;spine-lkb.12&lt;/code&gt; and PR #566 shipped &lt;code&gt;ops/plane-invite-watch/&lt;/code&gt;, a daily VPS timer that reconciles the Plane workspace invitation list against members and against its own known state, paging Buzz sys-incidents when an invitation is queued with no mail behind it, sits unclaimed past 7 days, or belongs to somebody who is already a member.&lt;/p&gt;

&lt;p&gt;Two details earn its place. Its &lt;code&gt;automations.md&lt;/code&gt; row is marked &lt;code&gt;NOT-YET-ARMED until deploy receipts&lt;/code&gt;, which is the same call as reporting &lt;code&gt;retention_percent&lt;/code&gt; as &lt;code&gt;null&lt;/code&gt;: a row describing a timer nobody has armed yet is a lie in a document people trust. And the review caught that both fetches read only the first page, because "a watch reading only page one would go blind past 100 rows," rated HIGH. Cursor and envelope pagination went in, hermetic drill 9/9 after the change, full &lt;code&gt;pnpm check&lt;/code&gt; green.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three sessions, one steer
&lt;/h2&gt;

&lt;p&gt;Three sessions ran concurrently, and the split is worth one line because it was not arbitrary. The fan-out work ran on Claude Opus 5 with Claude Opus 4.8 alongside it, 754 turns and 171 tool calls across twelve hours, because fifteen near-identical repos is exactly the job where a model holding a long invariant beats a fast one. The &lt;code&gt;intent-os&lt;/code&gt; watcher ran on Claude Fable 5, 443 turns and zero errors in about an hour.&lt;/p&gt;

&lt;p&gt;One steer is worth quoting exactly as typed, because it is the day's thesis arriving as a correction and it arrived before I had written any of the above:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;yes add the auto-stash guard that seems like a band daid whats root cause fix&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model had proposed the thing that makes the symptom go away. The correction was not "that code is wrong," it was "that is the wrong layer." Same shape as the two gates: a check that satisfies the condition in front of it without touching the property underneath. Other steers that day were shorter and in the same register: "rm -rf the decoy dirs," "verify the card shows up on ezekiels board," "and what did u decide ?"&lt;/p&gt;

&lt;h2&gt;
  
  
  What the day bought
&lt;/h2&gt;

&lt;p&gt;Two gates that now measure the property instead of a stand-in for it, and one monitor that can see past its first page. That is the cheap half.&lt;/p&gt;

&lt;p&gt;The expensive half is the fifteen repos, and what it bought there was a fleet where no consuming repo can run a gate that quietly differs from canonical. The cost of that guarantee is that every correction, however small, is a fifteen-repo sweep with four hashes moving in lockstep per repo. Forty-eight commits to move one conditional is not overhead I would call waste. It is the price of the tamper-evidence, stated in full, which is the number that belongs next to the guarantee whenever the next lane gets vendored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;An adversarial multi-seat council ran that evening against a proposed company-calendar stack for the estate, reviewing it through fault-tolerance, data-model and source-of-truth, and convention-over-configuration lenses. Separately, an external tool called "no-mistakes" (a Go git-proxy that runs an intent, review, test, docs, lint, push, PR, CI pipeline inside an isolated worktree) was evaluated against the in-house audit-harness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/the-skip-that-counted-as-a-pass/"&gt;The Skip That Counted as a Pass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/a-green-result-only-covers-what-it-ran/"&gt;A Green Result Only Covers What It Ran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/scope-the-guard-to-what-the-job-writes/"&gt;Scope the Guard to What the Job Actually Writes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cicd</category>
      <category>qualitygates</category>
      <category>governance</category>
      <category>testing</category>
    </item>
    <item>
      <title>Scope the Guard to What the Job Actually Writes</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Mon, 31 Aug 2026 10:18:23 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/scope-the-guard-to-what-the-job-actually-writes-12k8</link>
      <guid>https://dev.to/jeremy_longshore/scope-the-guard-to-what-the-job-actually-writes-12k8</guid>
      <description>&lt;p&gt;Two systems mismeasured what was in front of them. One aborted loudly on dirt that could not touch it. One returned a 200 and assigned the card to nobody. Both fixes narrowed what a piece of code claimed authority over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 04:00 producer that aborted on dirt it would never touch
&lt;/h2&gt;

&lt;p&gt;The blog pipeline runs unattended every morning at 04:00, on the same working tree that every interactive Claude Code session uses. One bash function, &lt;code&gt;preflight_branch_normalize()&lt;/code&gt; in &lt;code&gt;scripts/blog/lib-cron-common.sh&lt;/code&gt;, is the guard that decides whether the run may proceed at all.&lt;/p&gt;

&lt;p&gt;It refused to run on ANY uncommitted tracked file. Full stop. A legitimate edit left unsaved overnight took down the entire cron job.&lt;/p&gt;

&lt;p&gt;This happened three times:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2026-08-13: persona files&lt;/li&gt;
&lt;li&gt;2026-08-18: a lost image-push race condition that left the tree diverged&lt;/li&gt;
&lt;li&gt;2026-08-29: uncommitted 68-insertion doc update to &lt;code&gt;000-docs/002-REF-omarchy-plugin-promotion-reference.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two of the three were the same cascade: the dirty-tree check FATAL'd, no post got produced, and the 05:00 posting packet had nothing to send to Ezekiel. The 08-18 abort came one step later in the same function, where an ff-only pull correctly refused a tree that a lost image-push race had diverged. That one was fixed at the push, not here, and the scoping change would not have saved it. The morning of the 29th the recovery was manual: commit the legitimate content, push, re-run backfill for the 28th by hand.&lt;/p&gt;

&lt;p&gt;The issue is mechanical: a human editor can legitimately leave work uncommitted while a nightly job wants to proceed. These are not in conflict. The job writes to four specific paths. Uncommitted changes anywhere else do not touch what the job produces.&lt;/p&gt;

&lt;h3&gt;
  
  
  The fix
&lt;/h3&gt;

&lt;p&gt;Commit &lt;code&gt;605835ec&lt;/code&gt;: &lt;code&gt;scripts/blog/lib-cron-common.sh&lt;/code&gt; (+28/-12). The preflight now FATALs only on uncommitted changes to the pipeline's own write-set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;content/posts/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.blog-staging/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.claude/skills/blog-backfill/methodology/decisions.jsonl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/images/posts/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uncommitted changes anywhere else are logged and left exactly where they are. The run proceeds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not the obvious approaches
&lt;/h3&gt;

&lt;p&gt;Two alternatives were considered and rejected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-stash:&lt;/strong&gt; A band-aid. It moves someone's active mid-edit work out from under them, and then pops the change back to uncommitted. The same file re-triggers the abort the next night. Auto-stash also touches work that is not the pipeline's business to touch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A retry loop or nightly re-run:&lt;/strong&gt; The wrong tool for this shape of failure. A dirty tree is a standing condition, not a transient one. It stays dirty at 04:15, 04:30, any time you retry. Retries just multiply the failure alerts instead of fixing anything.&lt;/p&gt;

&lt;p&gt;Scoping is the real fix. The producer genuinely cannot collide with dirt outside its write-set, so it should stop caring about it. The hazard is preserved: a half-written post in &lt;code&gt;content/posts/&lt;/code&gt; or a mid-edit &lt;code&gt;decisions.jsonl&lt;/code&gt; still aborts, because building on top of those is genuinely unsafe. That distinction is the whole reason this works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Abridged from preflight_branch_normalize(); log strings shortened.&lt;/span&gt;
&lt;span class="c"&gt;# Dirt inside the write-set still aborts. Dirt outside it is logged and left alone.&lt;/span&gt;
&lt;span class="nv"&gt;_porcelain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git status &lt;span class="nt"&gt;--porcelain&lt;/span&gt; &lt;span class="nt"&gt;--untracked-files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_porcelain&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;_dangerous&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_porcelain&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'^.. (content/posts/|\.blog-staging/|static/images/posts/|\.claude/skills/blog-backfill/methodology/decisions\.jsonl)'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_dangerous&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;_log &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$log_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"FATAL: uncommitted changes to the pipeline's own files on '&lt;/span&gt;&lt;span class="nv"&gt;$current_branch&lt;/span&gt;&lt;span class="s2"&gt;', refusing to proceed"&lt;/span&gt;
    _log &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$log_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"       These paths are what the producer writes; a half-finished post or edit here is unsafe to build on. Resolve and re-run:"&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_dangerous&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$log_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;&amp;amp;1
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nv"&gt;_benign&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$_porcelain&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  _log &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$log_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"Pre-flight: &lt;/span&gt;&lt;span class="nv"&gt;$_benign&lt;/span&gt;&lt;span class="s2"&gt; uncommitted file(s) outside the pipeline write-set, ignoring, they will not be touched"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The verification: a harness over four cases on a throwaway repo. It exercises two of the four write-set paths directly; the other two share the same match arm.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Benign &lt;code&gt;000-docs&lt;/code&gt; edit: passes the dirty check, logged as "ignoring, will not be touched"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;content/posts/&lt;/code&gt; edit: FATAL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decisions.jsonl&lt;/code&gt; edit: FATAL&lt;/li&gt;
&lt;li&gt;Clean tree: passes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That morning's exact failure would now proceed untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alarm working is not the system working
&lt;/h2&gt;

&lt;p&gt;One more thing about how the morning started. The failure did not surface because someone noticed a missing post. It surfaced because a gap detector built ten days earlier caught the gap and paged with a loud "no post landed" subject instead of reporting healthy.&lt;/p&gt;

&lt;p&gt;That detector only existed for the third failure, and the reason it exists is the second one. On 2026-08-18 the producer aborted at 04:00 and the 05:00 heartbeat still called the pipeline healthy an hour later. The detector was built on 2026-08-19 precisely because detection had failed. So on 2026-08-29 it fired correctly, which is the system improving.&lt;/p&gt;

&lt;p&gt;It is still worth saying plainly that it could have gone on firing correctly indefinitely without anything getting better. Three runs failed inside seventeen days. The alarm got fixed after the second. The guard behind it stayed wrong through all three. An alarm that fires reliably on a recurring failure is a reason to go fix the cause, not evidence that the cause is handled.&lt;/p&gt;

&lt;h2&gt;
  
  
  The task board that returned HTTP 200 and assigned nobody
&lt;/h2&gt;

&lt;p&gt;Ezekiel gets the posting packet as an email at 05:00. For weeks, "done" meant "reply to the email with the URLs," and a 07:30 ingest job read those replies. But the ingest kept coming back empty.&lt;/p&gt;

&lt;p&gt;The problem with reply-as-completion: a missing reply is indistinguishable from a missing post.&lt;/p&gt;

&lt;p&gt;The fix (commit &lt;code&gt;add88e64&lt;/code&gt;): after the packet email sends and marks &lt;code&gt;packet_sent&lt;/code&gt;, the sweep also creates or updates one Plane card per post, assigned to Ezekiel. He drags it To Do to Done as he posts. A card has a state on a board. Email is the delivery; the card is the record.&lt;/p&gt;

&lt;p&gt;The failure direction matters: the card call runs after the email send and after &lt;code&gt;mark_sent&lt;/code&gt;, and it swallows every error. A Plane outage can never turn a delivered packet into a failed run.&lt;/p&gt;

&lt;h3&gt;
  
  
  The root cause
&lt;/h3&gt;

&lt;p&gt;Plane silently drops an assignee who is not a member of the destination project, as opposed to the workspace. The PATCH returns HTTP 200 even when the assignment fails. Ezekiel was a workspace member but had never been added to the CONTENT project, so every assign returned 200 and assigned nobody.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ensure_project_member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Plane silently drops an assignee who is not a member of the PROJECT (not
    just the workspace). Idempotently add him so the assignment can actually
    stick. Returns True if he is (now) a member.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;member_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;member&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/projects/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CONTENT_PROJECT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/members/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;member_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[])]:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/projects/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CONTENT_PROJECT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/members/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;member&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="c1"&gt;# 200/201 = added; 400 typically means "already a member", also fine.
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is why nine Omarchy showcase cards created on 2026-08-25 all read &lt;code&gt;assignees: []&lt;/code&gt; even though the assign job logged "assigned 9". That is why his Plane board showed no work to do.&lt;/p&gt;

&lt;p&gt;I isolated it by assigning a known-good member instead: Jeremy, a workspace admin. That worked instantly. Assign Ezekiel and it silently no-ops. Same code path, same 200. The difference was project membership.&lt;/p&gt;

&lt;p&gt;I fixed it two ways. Added Ezekiel to the CONTENT project and back-assigned all 10 existing cards, the nine broken Omarchy cards plus the one for that day's post. Then &lt;code&gt;blog-plane-card.py&lt;/code&gt; now calls &lt;code&gt;ensure_project_member&lt;/code&gt; idempotent on every run, so this cannot silently recur.&lt;/p&gt;

&lt;p&gt;One more Plane API quirk: assignees must be set in their own dedicated PATCH. Plane ignores an &lt;code&gt;assignees&lt;/code&gt; field mixed into a create or update payload.&lt;/p&gt;

&lt;p&gt;Verification: card created for the live post (HTTP 201). Re-run updates instead of duplicates (still exactly 1 card). Assignment confirmed by read-back. All 10 content cards now read &lt;code&gt;assignees=[ezekiel]&lt;/code&gt;. Clean end-to-end run prints "updated card ... (HTTP 200)" with no error note.&lt;/p&gt;

&lt;h2&gt;
  
  
  The correction that shrank the design
&lt;/h2&gt;

&lt;p&gt;The Plane card did not start out as one line in an existing job. The first pass at it was a tracking subsystem: a new state file, an ingest reconciler, its own cron entry.&lt;/p&gt;

&lt;p&gt;The correction came in voice dictation, so the transcript caught it garbled: "please dont make it comicates alproach it with simixty also." Cleaned up, that is "don't make it complicated, approach it with simplicity."&lt;/p&gt;

&lt;p&gt;What survived the correction was one sentence: add one step to the 05:00 packet job, so when Ezekiel gets his email he also gets a Plane card. Nothing else changes. The email stays. No new cron entry, no reconciler, no new state file.&lt;/p&gt;

&lt;p&gt;That is what shipped. Commit &lt;code&gt;add88e64&lt;/code&gt; is 17 changed lines in &lt;code&gt;blog-posting-packet.sh&lt;/code&gt; plus a 194-line &lt;code&gt;blog-plane-card.py&lt;/code&gt;. The rejected design would have added a fourth moving part to a pipeline whose whole problem that morning was that its existing parts were too entangled with each other.&lt;/p&gt;

&lt;p&gt;Worth being precise about what the models did here, because it was four of them across one long day. &lt;code&gt;Claude Opus 4.8&lt;/code&gt; and &lt;code&gt;Claude Opus 5&lt;/code&gt; carried the blog pipeline thread, including the preflight diagnosis and the scoping fix. &lt;code&gt;Claude Sonnet 5&lt;/code&gt; picked up shorter turns in the same tree. &lt;code&gt;Claude Fable 5&lt;/code&gt; ran the parallel Buzz investigation, which is where most of the day's errors landed: 34 of them across 847 minutes, against production Postgres auth logs over SSH. Across every session the day logged 474 tool calls, 40 failure-to-fix arcs, and 3 course-corrections in a 1112 minute span.&lt;/p&gt;

&lt;p&gt;The three corrections are the part worth keeping. None of them were "that code is wrong." All three were scope corrections: fold this into what already exists, go verify the thing actually ran, make it smaller. The elaborate version got built competently on the first pass. What it did not get was a check on whether the problem deserved that much machinery, and on this day that check is the only thing that kept a task board from becoming a subsystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The through-line
&lt;/h2&gt;

&lt;p&gt;Both fixes narrow what a piece of code claims authority over. The preflight claimed authority over the whole working tree when it only writes four paths. The assign call treated a 200 as proof the assignment happened, when all the 200 actually confirmed was that the request had been accepted.&lt;/p&gt;

&lt;p&gt;The Plane fix did not literally remove code. It added a membership check and a second PATCH. What it narrowed was the claim: the assign call stopped treating an accepted request as a completed one. In both cases the code asserted something it did not govern, and the fix was to make the claim match the control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Omarchy marketplace submission sweep.&lt;/strong&gt; Eleven widget entry repos plus the shared template: Capture Conveyor, Desk Transition, Docket, Flow Boundary, Crew Chief, Foundry, Workspace Storyboard, Wait State, Quiet Queue, Listening Post, Loose Ends. The commit subjects run to "marketplace-ready" and "production certified", which is the repos' own shorthand and worth deflating here: what was actually established is that each widget loaded in a fresh Omarchy shell on the Buzz rig, with render receipts bound to the raw shell logs and runtime evidence kept separate from visual evidence. Submission is a filing, not an approval. That was breadth rather than depth, and it is not what made the day interesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate C43, the Omarchy marketplace presentation guard.&lt;/strong&gt; Landed at 16:38 as 163 lines plus a 119-line bats suite, wired into CI, then tightened four more times the same day: 16:45, 17:41, 18:08, and 20:36. Each tightening closed something the previous version had let through. It checks that a manifest description uses the full 500-character allowance the catalog schema permits, that a bar widget description matches it rather than telling a different product story, and that the copy names the product, says what the user can see or do, and states a trust boundary. Requiring the full allowance is an unusual rule, and the reason given in the gate is blunt: every short description that escaped was generic. Five revisions in four hours is its own small lesson about writing gates, and it deserves its own post rather than a paragraph here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hermes trust boundaries hardened in &lt;code&gt;claude-code-plugins&lt;/code&gt; (PR 1383).&lt;/strong&gt; Split the contribute skill into read-only, prepare, and publish surfaces, dropped the automatic install-persistence hooks, and required explicit state and workspace paths. Merged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buzz forensics, unresolved.&lt;/strong&gt; A separate thread that started as "save my automations and plan a clean reinstall" turned into reading production Postgres auth logs over SSH, per-pubkey auth successes and full connection lifecycles. It did not resolve into a shipped fix that day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/every-safety-gate-has-a-failure-direction/" rel="noopener noreferrer"&gt;Every Safety Gate Has a Failure Direction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/a-green-result-only-covers-what-it-ran/"&gt;A Green Result Only Covers What It Ran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/gate-the-statement-not-the-tool-name/" rel="noopener noreferrer"&gt;Gate the Statement, Not the Tool Name&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>debugging</category>
      <category>cicd</category>
    </item>
    <item>
      <title>A Path Is Not Proof of Identity</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Mon, 31 Aug 2026 10:18:20 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/a-path-is-not-proof-of-identity-1ad7</link>
      <guid>https://dev.to/jeremy_longshore/a-path-is-not-proof-of-identity-1ad7</guid>
      <description>&lt;p&gt;Five marketplace submissions rejected simultaneously for the same security defect class. Every one created local state under the default umask, checked permissions with &lt;code&gt;[[ -f ]]&lt;/code&gt;, then wrote to the name later. Between the check and the write, a same-UID attacker could plant a symlink at that path, and the open would follow it. The first remediation looked like the textbook answer: &lt;code&gt;umask 077&lt;/code&gt;, &lt;code&gt;stat -c %s&lt;/code&gt; for size, &lt;code&gt;timeout 2&lt;/code&gt; on jq, and &lt;code&gt;mktemp + mv&lt;/code&gt; for atomic writes. The reviewer rejected that too.&lt;/p&gt;

&lt;p&gt;The reason is this: &lt;code&gt;[[ -f ]]&lt;/code&gt; resolves the path, &lt;code&gt;stat&lt;/code&gt; resolves it again, and &lt;code&gt;write_session()&lt;/code&gt; resolves it a third time. Nothing binds those three calls to the same inode. A path is a name. A name is resolved fresh on every syscall. Checking a name and then acting on it is a race condition, specifically a TOCTOU (time-of-check-time-of-use) bug. You cannot fix that bug in a language whose only handle is a name.&lt;/p&gt;

&lt;h2&gt;
  
  
  The defect class: a symlink race in local state
&lt;/h2&gt;

&lt;p&gt;Five Omarchy plugin submissions hit this defect simultaneously (marketplace issues #2899 through #2903). Each plugin's shell helper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;created &lt;code&gt;~/.local/state/&amp;lt;plugin&amp;gt;/&lt;/code&gt; under the default umask, so it was group/world readable during creation&lt;/li&gt;
&lt;li&gt;wrote to a state file via &lt;code&gt;&amp;gt; "$file"&lt;/code&gt; or &lt;code&gt;&amp;gt;&amp;gt; "$file"&lt;/code&gt;, which follows a pre-existing symlink&lt;/li&gt;
&lt;li&gt;read the whole mutable file into jq with no regular-file check, no byte ceiling, and no timeout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A symlink planted at the state path redirects the write to any file the user owns. That is a plain symlink attack, and nothing in the helper was positioned to notice it. A FIFO or oversized file at the path hangs the jq that the QML side polls every five seconds.&lt;/p&gt;

&lt;p&gt;The contributing-clanker lane (the shared security gate suite) told itself those places were safe. It enforced gates on network input, on QML rendering, on command construction. It never modeled filesystem object identity. A gate lane's blind spot is exactly where threat lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round one: the rejection
&lt;/h2&gt;

&lt;p&gt;The first remediation shipped what looked like a complete answer. Quiet Queue's round-one attempt (commit 5c7a817):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;umask &lt;/span&gt;077
&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_STATE_HOME&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="p"&gt;/.local/state&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/omarchy-quiet-queue"&lt;/span&gt;
&lt;span class="nv"&gt;session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="s2"&gt;/session.json"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;session_max_bytes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4096
read_session&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; size
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$default&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nv"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; %s &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;printf &lt;/span&gt;0&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$size&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^[0-9]+&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; size &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; session_max_bytes &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$default&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;timeout &lt;/span&gt;2 jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$filter&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$default&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

write_session&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;tmp
  &lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="s2"&gt;/.session.XXXXXX"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$tmp&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$tmp&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That closes a descriptor and then reopens a mutable pathname. The &lt;code&gt;[[ -f ]]&lt;/code&gt; check, then &lt;code&gt;stat&lt;/code&gt;, then &lt;code&gt;jq&lt;/code&gt; are three separate path resolutions. Nothing binds them to the same inode. Between &lt;code&gt;stat&lt;/code&gt; and &lt;code&gt;jq&lt;/code&gt;, a same-UID competitor swaps the file for a symlink. The &lt;code&gt;write_session&lt;/code&gt; function creates a temp file inside the private directory, but &lt;code&gt;mktemp&lt;/code&gt; and &lt;code&gt;mv&lt;/code&gt; each re-resolve &lt;code&gt;$root&lt;/code&gt;. Rename &lt;code&gt;$root&lt;/code&gt; to &lt;code&gt;.parked&lt;/code&gt;, plant a symlink at &lt;code&gt;$root&lt;/code&gt; pointing anywhere, and both calls land inside the attacker's target. The reviewer said no.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not the obvious approach?
&lt;/h2&gt;

&lt;p&gt;The obvious move was to keep the helpers in bash and add more checks. Bash already powers every other plugin helper. The linting infrastructure already knew how to read it. Adding &lt;code&gt;[[ -f ]]&lt;/code&gt;, &lt;code&gt;stat&lt;/code&gt;, and &lt;code&gt;timeout&lt;/code&gt; is cheap.&lt;/p&gt;

&lt;p&gt;It lost because bash has no way to hold a file descriptor across operations. There is no &lt;code&gt;fstat&lt;/code&gt;, no &lt;code&gt;O_NOFOLLOW&lt;/code&gt;, no &lt;code&gt;O_DIRECTORY&lt;/code&gt;. Every check bash can express is a check on a name, not on an object. You cannot fix a TOCTOU bug in a language whose only handle is a name. Leaving bash meant a rewrite of six helpers, a tool orthogonal to the rest of the codebase, and an interpreter that immediately tripped an existing gate banning Perl shebangs as a non-guaranteed runtime (resolved below, in the same commit that taught C41 to see the new helpers). That cost is real. But it is the only honest fix.&lt;/p&gt;

&lt;p&gt;Every round-one control has a round-two replacement, and the difference is always the same one thing: whether the check and the use touch the same object.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Round one, resolved by name&lt;/th&gt;
&lt;th&gt;Round two, bound to a descriptor&lt;/th&gt;
&lt;th&gt;What changes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;[[ -f "$session" ]]&lt;/code&gt; then read&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sysopen($fh, ...)&lt;/code&gt; then &lt;code&gt;stat($fh)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The thing checked is the thing read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;mkdir -p&lt;/code&gt; plus &lt;code&gt;umask 077&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sysopen(O_DIRECTORY, O_NOFOLLOW)&lt;/code&gt; then &lt;code&gt;chdir&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The parent cannot be swapped after the check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;mktemp&lt;/code&gt; then &lt;code&gt;mv&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sysopen(O_CREAT, O_EXCL, O_NOFOLLOW)&lt;/code&gt; then &lt;code&gt;rename&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No window to adopt a file you did not create&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;stat -c %s&lt;/code&gt; then &lt;code&gt;jq&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;byte ceiling taken from &lt;code&gt;stat($fh)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The size checked is the size read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timeout 2 jq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;O_NONBLOCK&lt;/code&gt; at open, then the &lt;code&gt;-f&lt;/code&gt; test on &lt;code&gt;stat($fh)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A FIFO cannot stall the open, and the regular-file check rejects it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Descriptor-bound lifecycles
&lt;/h2&gt;

&lt;p&gt;Round two (commit 229d6d4) rewrote the runtime helpers from bash to Perl. The key move: hold the state directory open from the start and never let it go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;umask&lt;/span&gt; &lt;span class="mo"&gt;0077&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File::&lt;/span&gt;&lt;span class="nv"&gt;Spec&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;catdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;omarchy-quiet-queue&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt;
&lt;span class="nv"&gt;make_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mo"&gt;0700&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt; &lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;sysopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;O_RDONLY&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;O_DIRECTORY&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;O_NOFOLLOW&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unsafe state directory&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unsafe state directory&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nv"&gt;@ds&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;d&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$ds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="vg"&gt;$&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="mo"&gt;0700&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;chdir&lt;/span&gt; &lt;span class="nv"&gt;$dir&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cannot pin state directory&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;O_NOFOLLOW&lt;/code&gt; refuses a planted symlink at open time instead of after. &lt;code&gt;O_DIRECTORY&lt;/code&gt; means the kernel will not open this if it is not a directory. &lt;code&gt;O_RDONLY&lt;/code&gt; is the minimum. &lt;code&gt;stat($dir)&lt;/code&gt; on the open filehandle (the &lt;code&gt;$dir&lt;/code&gt; object you hold, not the name) proves you own it. &lt;code&gt;chdir $dir&lt;/code&gt; pins the parent so later relative opens like &lt;code&gt;session.json&lt;/code&gt; resolve inside the object you hold, not inside a path an attacker swapped.&lt;/p&gt;

&lt;p&gt;The read side stats the open descriptor, not the name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;read_session&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;until&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;owned&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;JSON::PP::&lt;/span&gt;&lt;span class="nv"&gt;false&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt; &lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;until&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;owned&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;JSON::PP::&lt;/span&gt;&lt;span class="nv"&gt;false&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;sysopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;O_RDONLY&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;O_NONBLOCK&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;O_NOFOLLOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@st&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt; &lt;span class="nv"&gt;_&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$st&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="vg"&gt;$&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$st&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$st&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nv"&gt;$max_bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;close&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;until&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;owned&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;JSON::PP::&lt;/span&gt;&lt;span class="nv"&gt;false&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;# read from $fh...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;stat($fh)&lt;/code&gt; interrogates the object you actually hold. &lt;code&gt;O_NONBLOCK&lt;/code&gt; means a FIFO cannot stall the open, which a blocking &lt;code&gt;O_RDONLY&lt;/code&gt; on a FIFO would do until a writer showed up. It does not reject the FIFO by itself. The &lt;code&gt;-f _&lt;/code&gt; test against &lt;code&gt;stat($fh)&lt;/code&gt; on the next line does that. The &lt;code&gt;$st[4] == $&amp;lt;&lt;/code&gt; check verifies you own this inode. The byte ceiling is enforced against the object, not a name that could be swapped between the check and the enforcement.&lt;/p&gt;

&lt;p&gt;The write side uses &lt;code&gt;O_EXCL&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;open_temp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sprintf&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.session.%d.%08x&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="vg"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xffffffff&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;sysopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;O_WRONLY&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;O_CREAT&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;O_EXCL&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;O_NOFOLLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mo"&gt;0600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cannot create private session temp&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;write_session&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;open_temp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;encode_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$offset&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;syswrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$offset&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session write failed&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$offset&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nv"&gt;$fh&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;sync&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session fsync failed&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
  &lt;span class="nb"&gt;close&lt;/span&gt; &lt;span class="nv"&gt;$fh&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session close failed&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
  &lt;span class="nb"&gt;rename&lt;/span&gt; &lt;span class="nv"&gt;$temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$session&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session replace failed&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
  &lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="mo"&gt;0600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;O_EXCL&lt;/code&gt; means you created it or you failed. There is no window where you adopt someone else's file. &lt;code&gt;fsync&lt;/code&gt; guarantees the data hits disk. &lt;code&gt;rename&lt;/code&gt; is atomic. Every flag is load-bearing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proving it with an adversary
&lt;/h2&gt;

&lt;p&gt;This is the second time this bug class has come up here. &lt;a href="https://startaitools.com/posts/codeql-caught-the-race-i-dismissed/" rel="noopener noreferrer"&gt;CodeQL caught the race I dismissed&lt;/a&gt; covers the same shape in TypeScript, where the fix was a same-descriptor &lt;code&gt;openSync&lt;/code&gt;, &lt;code&gt;fstatSync&lt;/code&gt;, &lt;code&gt;writeSync&lt;/code&gt; chain. Different language, identical lesson.&lt;/p&gt;

&lt;p&gt;A unit test that asserts "the file has mode 0600 and valid JSON" does not catch this bug. The bash version would pass that assertion while remaining vulnerable. The test had to become an attacker.&lt;/p&gt;

&lt;p&gt;Tests acquired a fixture that races the helper in a tight loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;victim&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.parked`&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(;;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renameSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;parked&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;symlinkSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;victim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unlinkSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renameSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parked&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parked&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renameSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parked&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This racer swaps the parent directory itself. The helper opens a relative path inside the state directory; if that directory is suddenly a symlink to somewhere else, the relative open lands elsewhere. The suite asserts the Perl helper holds under it. The bash version would not, by construction: nothing in it survives losing the parent, because everything in it is a fresh path lookup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encoding the lesson so it cannot recur
&lt;/h2&gt;

&lt;p&gt;Two gates joined the contributing-clanker lane on the same day (commit a3ab4eb):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C41: Fail-closed mutable state lifecycle&lt;/strong&gt; (204 lines). It blocks any helper that persists mutable state without a descriptor-bound primitive, testing for &lt;code&gt;openat&lt;/code&gt;, &lt;code&gt;renameat&lt;/code&gt;, &lt;code&gt;O_NOFOLLOW&lt;/code&gt; or a declared secure-state helper. &lt;code&gt;mktemp + mv&lt;/code&gt; and pathname &lt;code&gt;-f&lt;/code&gt; checks stop counting as proof, which is the whole point: they were the round-one answer. It separately refuses the lane unless the test corpus carries hostile final-entry, temp-entry, parent-swap and FIFO coverage. The gate blocks, it is not advisory, and its own regression case proves a state helper that trusts mutable pathnames after &lt;code&gt;mktemp&lt;/code&gt; now fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C42: Bounded local recurring scans&lt;/strong&gt; (134 lines). It targets the second class in the same review: a scan on a 5 or 20 second timer that buffers or sorts local input before applying its cap. &lt;code&gt;find | sort -z | head -25&lt;/code&gt; looks safe because the final output is capped, but &lt;code&gt;sort&lt;/code&gt; has already enumerated the whole directory. C42 warns rather than blocks, so it flags the shape without failing a submission on it.&lt;/p&gt;

&lt;p&gt;Widget template commit 516ccd8 vendored both gates so new plugins inherit them. The &lt;code&gt;/omarchy-ship&lt;/code&gt; submission auditor now refuses CLEAN status without descriptor-bound lifecycle evidence and hostile parent-swap, temp-entry, final-entry, FIFO, and oversized-input proofs.&lt;/p&gt;

&lt;p&gt;Then the new gate had to be debugged against the code it had just forced into existence.&lt;/p&gt;

&lt;p&gt;Commit 6d924f3: C41 selected runtime files by &lt;code&gt;.sh&lt;/code&gt;/&lt;code&gt;.bash&lt;/code&gt; extension or by a shell shebang, which covered the extensionless bash helpers fine. Then the helpers stopped being shell. A &lt;code&gt;#!/usr/bin/perl&lt;/code&gt; first line matches neither test, so the newly rewritten helpers were invisible to the gate written to check them. The fix extended the shebang match to &lt;code&gt;#!/usr/bin/perl&lt;/code&gt;. The same commit had to settle a second collision. C35 (runtime-dependency, an older gate) banned Perl shebangs outright as an interpreter a stock Omarchy install does not guarantee, so the safe rewrite tripped a different gate. Perl was unbanned there because it is a base dependency on the Buzz image, but only with an absolute system shebang, never &lt;code&gt;env&lt;/code&gt;, so the session PATH cannot swap the interpreter.&lt;/p&gt;

&lt;p&gt;Commit c9c52ed: C41's redirect heuristic was &lt;code&gt;&amp;gt;&amp;gt;?\s*"?\$\w+&lt;/code&gt;, matching &lt;code&gt;&amp;gt; $file&lt;/code&gt; and &lt;code&gt;&amp;gt;&amp;gt; $file&lt;/code&gt;. It also matched Perl's fat comma &lt;code&gt;key =&amp;gt; $value&lt;/code&gt; as a shell redirection. A negative lookbehind fixed it: &lt;code&gt;(?&amp;lt;!=)&amp;gt;&amp;gt;?\s*"?\$\w+&lt;/code&gt;. Do not flag &lt;code&gt;=&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Commit 7d22a5c: That lookbehind was then replaced with a simpler rule. The heuristic was being ported to Perl, and porting a regex to a second language keeps its syntax assumptions. &lt;code&gt;@items &amp;gt; $limit&lt;/code&gt; is not a redirection either. The honest fix was to scope the heuristic: run the redirect check on shell helpers only. Perl lifecycle safety is established by the descriptor checks themselves, not by a regex that keeps collecting exceptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The audit that refused the claim
&lt;/h2&gt;

&lt;p&gt;The gate work has a mirror at the estate level, and it ran the same night. A gate that passes on a file it never opened and a green CI badge for a check that never ran are the same error: a name standing in for the thing itself. Late the same evening came a 168-line estate readiness audit (omarchy &lt;code&gt;000-docs/004-AA-AUDT-omarchy-estate-readiness-2026-08-29.md&lt;/code&gt;). It found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;16/16 worktrees clean, git fsck clean, 444/444 local tests pass across 16 repos, all hosted gates green&lt;/li&gt;
&lt;li&gt;but: CI proves static and unit tests, NOT a running Omarchy shell. No repo's GitHub workflow executes &lt;code&gt;rig-verify.sh&lt;/code&gt; or &lt;code&gt;rig-render.sh&lt;/code&gt;. A green hosted workflow does not prove a plugin loads. Current-source rig proof exists only for Desk Transition, Foundry, and Crew Chief. Widget Template has no proof receipt at all.&lt;/li&gt;
&lt;li&gt;9 live listings, but only Listening Post's validated commit matches its current head. The other eight reference older snapshots.&lt;/li&gt;
&lt;li&gt;None of the 16 mains has branch protection. 15/16 use mutable action tags. Six repos declare coverage thresholds but invoke raw &lt;code&gt;node --test&lt;/code&gt;, bypassing the threshold command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The audit explicitly refused a "best in class" or "fully production certified" claim. It prescribed the honest public status instead: "16 maintained Omarchy plugin repositories; 9 live marketplace listings; all local suites currently green; marketplace verification and production-render certification are tracked per exact commit."&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;claude-code-plugins ed4765e43: enforce marketplace compliance metric ratchets in CI&lt;/li&gt;
&lt;li&gt;intent-blueprint-docs b9297e0: model-neutral documentation platform; 29c2fd8 made package validation race-free (another race, same week)&lt;/li&gt;
&lt;li&gt;omarchy-desk-transition-entry 2e06d94: capture desk transition with active outputs&lt;/li&gt;
&lt;li&gt;omarchy-crew-chief-entry 0ef344e: harden process arguments, proven on the real rig, validator and QML-lint receipts both zero-error, local suite 25/25&lt;/li&gt;
&lt;li&gt;omarchy-workspace-storyboard-entry e597cdc: pin current Node 24 actions&lt;/li&gt;
&lt;li&gt;omarchy-widget-template 868d0f5: land governance scaffolding (editorconfig, gitattributes, issue and PR templates, dependabot, CODE_OF_CONDUCT, CONTRIBUTING, SECURITY)&lt;/li&gt;
&lt;li&gt;omarchy 6f2e2b7 and bfdabf5: refresh live marketplace metrics from scripts/refresh-metrics.sh&lt;/li&gt;
&lt;li&gt;github-profile 6630095 and 23f4930: swap in the cityscape avatar, remove dead embeds, drop a Projects badge GitHub already renders&lt;/li&gt;
&lt;li&gt;comehomealabama 4dea5f5: a journal post shipped through the sibling pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those touched a descriptor. The ones that did were the six helpers a reviewer had already sent back twice, and the gate that had to be taught to see them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/gate-the-statement-not-the-tool-name/" rel="noopener noreferrer"&gt;Gate the Statement, Not the Tool Name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/every-safety-gate-has-a-failure-direction/" rel="noopener noreferrer"&gt;Every Safety Gate Has a Failure Direction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://startaitools.com/posts/honor-the-gate-when-the-verdict-is-inconvenient/" rel="noopener noreferrer"&gt;Honor the Gate When the Verdict Is Inconvenient&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>testing</category>
      <category>debugging</category>
      <category>devops</category>
    </item>
    <item>
      <title>Bind the Receipt to the Commit It Installed</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Sat, 29 Aug 2026 11:30:12 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/bind-the-receipt-to-the-commit-it-installed-110m</link>
      <guid>https://dev.to/jeremy_longshore/bind-the-receipt-to-the-commit-it-installed-110m</guid>
      <description>&lt;p&gt;An end to end lane that installs your plugin from GitHub is testing whatever GitHub happened to&lt;br&gt;
serve. That is usually your latest push. It is sometimes a push from twenty minutes ago, a cached&lt;br&gt;
object, or a branch you forgot you were on. The lane passes either way, and the receipt it writes&lt;br&gt;
looks identical either way.&lt;/p&gt;

&lt;p&gt;That is the gap I closed on the Foundry rig lane. The receipt now carries the commit hash of the&lt;br&gt;
artifact that was actually installed, and the harness refuses to write the file unless that hash&lt;br&gt;
equals local &lt;code&gt;HEAD&lt;/code&gt;. Test provenance is now checkable, not decorative.&lt;/p&gt;
&lt;h2&gt;
  
  
  How do you verify an E2E test installed the correct commit?
&lt;/h2&gt;

&lt;p&gt;Read &lt;code&gt;HEAD&lt;/code&gt; out of the installed tree on the rig, put it on the receipt line, parse that line on the&lt;br&gt;
local side with an anchored regex, and compare the captured hash against local &lt;code&gt;HEAD&lt;/code&gt;. The receipt&lt;br&gt;
must carry both commits and pass both checks before the proof file is written. A fixed string&lt;br&gt;
receipt proves only that &lt;code&gt;echo&lt;/code&gt; works.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Foundry is, so the test makes sense
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;omarchy-foundry-entry&lt;/code&gt; is a new repo, created this day, twelve commits on first parent. It is an&lt;br&gt;
Omarchy plugin that generates a starter plugin tree for a small bar widget: manifest, QML entry&lt;br&gt;
point, a pure data &lt;code&gt;Model.js&lt;/code&gt;, an offline test, README, license, SVG banner.&lt;/p&gt;

&lt;p&gt;The README is blunt about the boundary. Foundry is "intentionally a scaffold and proof surface,&lt;br&gt;
not an autonomous shell agent, plugin store, or publisher," and it "never installs, enables,&lt;br&gt;
commits, pushes, sends telemetry, or files a marketplace issue." Runtime dependencies are &lt;code&gt;bash&lt;/code&gt;&lt;br&gt;
and &lt;code&gt;jq&lt;/code&gt;. Node is development only. It runs the generated test suite and is never needed by the&lt;br&gt;
widget at runtime. Until a validation lane runs, Foundry reports its proof state as &lt;code&gt;UNPROVEN&lt;/code&gt;,&lt;br&gt;
which is not the same word as failing.&lt;/p&gt;

&lt;p&gt;The initial commit was 2,614 insertions across 32 files, including nine gate scripts under&lt;br&gt;
&lt;code&gt;scripts/gates/&lt;/code&gt; (&lt;code&gt;c28-voice-no-dashes&lt;/code&gt;, &lt;code&gt;c29-private-names&lt;/code&gt;, &lt;code&gt;c30-md-strikethrough&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;c31-omarchy-qml-security&lt;/code&gt;, &lt;code&gt;c34-omarchy-exec-injection&lt;/code&gt;, &lt;code&gt;c35-omarchy-runtime-dependency&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;c36-omarchy-qml-overflow&lt;/code&gt;, &lt;code&gt;c38-omarchy-ssrf-host-allowlist&lt;/code&gt;, &lt;code&gt;c40-omarchy-panel-design&lt;/code&gt;) plus a&lt;br&gt;
293 line &lt;code&gt;minimax-review.yml&lt;/code&gt;. The scaffold itself landed in &lt;code&gt;43e5b11&lt;/code&gt;: &lt;code&gt;bin/omarchy-foundry&lt;/code&gt; at&lt;br&gt;
+135, &lt;code&gt;tests/foundry.test.js&lt;/code&gt; at +72, &lt;code&gt;Panel.qml&lt;/code&gt; at +66/-124, &lt;code&gt;Model.js&lt;/code&gt; at +23/-32.&lt;/p&gt;
&lt;h2&gt;
  
  
  The receipt that could not fail
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;scripts/rig-e2e.sh&lt;/code&gt; arrived at +45 lines in &lt;code&gt;615e61b&lt;/code&gt;, got hardened to +44/-36 in &lt;code&gt;ae779f9&lt;/code&gt;, and&lt;br&gt;
grew the real runtime certification at +81/-31 in &lt;code&gt;8b009f5&lt;/code&gt;. Its whole job is to prove something&lt;br&gt;
&lt;code&gt;rig-render.sh&lt;/code&gt; cannot: &lt;code&gt;rig-render&lt;/code&gt; tests Foundry's own panel, &lt;code&gt;rig-e2e&lt;/code&gt; tests the artifact&lt;br&gt;
Foundry generates.&lt;/p&gt;

&lt;p&gt;The first two of those had no receipt line at all, just a PASS echo. &lt;code&gt;8b009f5&lt;/code&gt; introduced one,&lt;br&gt;
and for three commits it was a fixed string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"E2E_RECEIPT foundry=github generated=file-git node=shadowed hostile_id=refused shell=loaded"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the local side matched it against the same fixed string. Read that line as an assertion and it&lt;br&gt;
says nothing. &lt;code&gt;foundry=github&lt;/code&gt; is not a measurement of where the plugin came from. It is a literal&lt;br&gt;
I typed, reprinted back to me by a shell that would have printed it regardless. Every field on the&lt;br&gt;
line was load bearing except the two that described provenance, and those were decorative.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;9d6cfc8&lt;/code&gt; fixed it in +9/-3 on the harness and +15 on &lt;code&gt;bin/omarchy-foundry&lt;/code&gt;. The remote side now&lt;br&gt;
reads the installed tree's HEAD, the generated tree's HEAD, and puts both on the wire:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;foundry_commit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$foundry&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; rev-parse HEAD&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# ...&lt;/span&gt;
&lt;span class="nv"&gt;generated_commit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$generated&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; rev-parse HEAD&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"E2E_RECEIPT installed_foundry=&lt;/span&gt;&lt;span class="nv"&gt;$foundry_commit&lt;/span&gt;&lt;span class="s2"&gt; generated_tree=&lt;/span&gt;&lt;span class="nv"&gt;$generated_commit&lt;/span&gt;&lt;span class="s2"&gt; node=shadowed hostile_id=refused shell=loaded"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The local side stopped comparing strings and started parsing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LINE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^E2E_RECEIPT&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nv"&gt;installed_foundry&lt;/span&gt;&lt;span class="o"&gt;=([&lt;/span&gt;0-9a-f]&lt;span class="o"&gt;{&lt;/span&gt;40&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nv"&gt;generated_tree&lt;/span&gt;&lt;span class="o"&gt;=([&lt;/span&gt;0-9a-f]&lt;span class="o"&gt;{&lt;/span&gt;40&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nv"&gt;node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;shadowed&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nv"&gt;hostile_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;refused&lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="nv"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;loaded&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"rig-e2e: missing or malformed receipt line"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;INSTALLED_COMMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASH_REMATCH&lt;/span&gt;&lt;span class="p"&gt;[1]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;GENERATED_COMMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASH_REMATCH&lt;/span&gt;&lt;span class="p"&gt;[2]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INSTALLED_COMMIT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMMIT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"rig-e2e: installed GitHub artifact (&lt;/span&gt;&lt;span class="nv"&gt;$INSTALLED_COMMIT&lt;/span&gt;&lt;span class="s2"&gt;) does not match local commit (&lt;/span&gt;&lt;span class="nv"&gt;$COMMIT&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The anchored regex matters as much as the equality check. A receipt that can be matched loosely is&lt;br&gt;
a receipt that can be matched by a partial line, and the failure mode of a partial line is a pass.&lt;/p&gt;

&lt;p&gt;Only after both checks does &lt;code&gt;jq&lt;/code&gt; write &lt;code&gt;.rig-e2e-proof.json&lt;/code&gt;. Here is what landed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9d6cfc8316b4e58695057027bdd16cb0a891c5ff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"installedFoundryCommit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9d6cfc8316b4e58695057027bdd16cb0a891c5ff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"generatedTreeCommit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0d4a667e408a4aac56ce91c9ef490fe348dacfe3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"intent-ops-buzz/omarchy-rig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"foundryOrigin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"generatedOrigin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file-git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shadowed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hostileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"refused"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"generatedShell"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"loaded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"completedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-28T04:13:20Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two fields with the same forty characters. That repetition is the entire assertion, and it is&lt;br&gt;
visible in the artifact instead of buried in the harness. A reader can check it without reading&lt;br&gt;
the script. Being honest about the sequence: the first receipt landed in &lt;code&gt;f7be14d&lt;/code&gt; without an&lt;br&gt;
&lt;code&gt;installedFoundryCommit&lt;/code&gt; field at all, and the version above was refreshed into place three commits&lt;br&gt;
later in &lt;code&gt;1ccaa75&lt;/code&gt;. The proof got the field before the proof was correct.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.rig-proof.json&lt;/code&gt; sits alongside it, written by a different script for a different reason.&lt;br&gt;
&lt;code&gt;scripts/rig-verify.sh&lt;/code&gt; does its own round trip to the rig and records&lt;br&gt;
&lt;code&gt;omarchyPluginValidate: 0&lt;/code&gt;, &lt;code&gt;qmllintErrors: 0&lt;/code&gt;, and fingerprint &lt;code&gt;913620eb&lt;/code&gt;. Its header explains&lt;br&gt;
why it has to exist: gates C32 and C33 in the shared runner (not among the nine in this repo) call &lt;code&gt;gate_skip&lt;/code&gt; when &lt;code&gt;omarchy-plugin-validate&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;qmllint&lt;/code&gt; are not on the local box, and they never are, because they live on the rig. The gate&lt;br&gt;
runner counts SKIP as pass, so the submission lane "happily printed verdict PASS, 0 BLOCK for a&lt;br&gt;
plugin that had never run on Omarchy at all." That is the same failure the E2E receipt had, one&lt;br&gt;
layer down. (&lt;code&gt;rig-render.sh&lt;/code&gt; is a third lane again: it screenshots the panel and writes&lt;br&gt;
&lt;code&gt;preview.png&lt;/code&gt;.)&lt;/p&gt;
&lt;h2&gt;
  
  
  What the lane actually does on the rig
&lt;/h2&gt;

&lt;p&gt;It SSHes to a real Omarchy rig (&lt;code&gt;intent-ops-buzz&lt;/code&gt;, container &lt;code&gt;omarchy-rig&lt;/code&gt;) and runs a chain where&lt;br&gt;
each step's failure is a real exit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installs the plugin from its GitHub URL, not from the local working tree.&lt;/li&gt;
&lt;li&gt;Reads the installed commit and compares it to local HEAD.&lt;/li&gt;
&lt;li&gt;Generates a starter plugin and runs its offline tests, &lt;code&gt;omarchy-plugin-validate&lt;/code&gt;, and &lt;code&gt;qmllint&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Git commits the generated tree and installs that via &lt;code&gt;file://&lt;/code&gt;, then confirms it reports
enabled in &lt;code&gt;omarchy plugin list --json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Shadows Node and boots the real Quickshell session headless under sway.&lt;/li&gt;
&lt;li&gt;Greps the shell log for load errors, filtering known headless noise.&lt;/li&gt;
&lt;li&gt;Screenshots with &lt;code&gt;grim&lt;/code&gt; and asserts the PNG is at least 4000 bytes.&lt;/li&gt;
&lt;li&gt;Asserts a hostile plugin id is refused.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 5 is the one I like. The README claims Node is development only. That claim is cheap to write&lt;br&gt;
and easy to be wrong about, because a machine that has Node installed will never tell you when&lt;br&gt;
something quietly reached for it. So the lane makes the claim expensive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# A stock graphical session does not need Node. Put a failing node first on the&lt;/span&gt;
&lt;span class="c"&gt;# path and prove the generated plugin still loads in a real shell.&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/foundry-nonode
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'#!/bin/sh\nexit 127\n'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/tmp/foundry-nonode/node
&lt;span class="nb"&gt;chmod &lt;/span&gt;755 /tmp/foundry-nonode/node
&lt;span class="c"&gt;# ... conditional headless sway launch, then pkill any running qs ...&lt;/span&gt;
&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/foundry-nonode:/root/omarchy/bin:/usr/bin:/bin qs &lt;span class="nt"&gt;-p&lt;/span&gt; /root/omarchy/shell &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/tmp/foundry-generated-qs.log 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A fake &lt;code&gt;node&lt;/code&gt; that exits 127, first on PATH, and then a real shell session on top of it. If the&lt;br&gt;
widget touches Node at runtime, the session tells you. The hostile id (&lt;code&gt;io.github.e2e.bad;dispatch&lt;/code&gt;)&lt;br&gt;
gets the same treatment: the test passes only when the create call fails.&lt;/p&gt;

&lt;p&gt;Step 6 deserves an honest note. The noise filter is the one place where this lane can quietly stop&lt;br&gt;
failing. &lt;code&gt;c033583&lt;/code&gt; is a single changed line that added &lt;code&gt;pw_loop_new&lt;/code&gt; and &lt;code&gt;pw.loop&lt;/code&gt; to the exclude&lt;br&gt;
list and made that second grep case insensitive, because pipewire on a headless rig emits errors&lt;br&gt;
that have nothing to do with the plugin. That is a correct fix and also a widening of the blind&lt;br&gt;
spot. Every entry in that exclude list is a category of real error the lane will now swallow, and&lt;br&gt;
the list only ever grows. I would rather write that down than pretend the filter is free.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;926835f&lt;/code&gt; on the same day is 0 insertions and 0 deletions: a mode change restoring the executable&lt;br&gt;
bit on the harness. A test that cannot execute is not a failing test, it is an absent one.&lt;/p&gt;

&lt;p&gt;The obvious alternatives all lose for the same reason. Installing from the local working tree is&lt;br&gt;
the easiest lane to write and it tests the wrong artifact: nobody installs your working tree.&lt;br&gt;
Trusting the git ref you just pushed proves what you intended to publish, not what the remote&lt;br&gt;
served back. And comparing the receipt against a fixed string, which is what this lane did for&lt;br&gt;
three commits, proves that &lt;code&gt;echo&lt;/code&gt; works. Only reading HEAD out of the installed tree and comparing&lt;br&gt;
it locally closes the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The badge that was allowed to be wrong
&lt;/h2&gt;

&lt;p&gt;The day's other decision was on the GitHub profile README, and it went the other way for the same&lt;br&gt;
reason.&lt;/p&gt;

&lt;p&gt;Session one: seven stargazer badges rendering broken. The obvious guess is that repos went private&lt;br&gt;
or got renamed, so that got checked first. All seven were public with stars (2,679 / 0 / 37 / 5 /&lt;br&gt;
12 / 1 / 27), which eliminated the repo hypothesis and pointed at the URL. Root cause was a raw&lt;br&gt;
star emoji in the shields.io query string. Unencoded it returns HTTP 400 and zero bytes. As&lt;br&gt;
&lt;code&gt;%E2%AD%90&lt;/code&gt; it returns HTTP 200 and renders. One character, seven badges. Two hero counts were also&lt;br&gt;
understating, so they were bumped to 3k+ and 150+ (stars read 2.5k+ against 3,016 actual,&lt;br&gt;
projects read 125+ against 151), and every&lt;br&gt;
badge in the file got re-fetched afterward, not just the changed ones: 27 OK, 0 broken.&lt;/p&gt;

&lt;p&gt;Session two, the ask was to make both hero badges dynamic. Only one of them became dynamic.&lt;/p&gt;

&lt;p&gt;Stars has a shields built in account level endpoint, &lt;code&gt;github/stars/jeremylongshore?affiliations=OWNER&lt;/code&gt;,&lt;br&gt;
served from shields' own authenticated GitHub tokens. Six consecutive fetches, six returned 3.1k.&lt;br&gt;
That is a different number from session one's 3,016 for two reasons: the non-fork count had&lt;br&gt;
ticked to 3,017 by then, and the account level endpoint also counts forks, which takes it to&lt;br&gt;
3,076.&lt;br&gt;
Projects has no built in equivalent. The only route is the generic &lt;code&gt;dynamic/json&lt;/code&gt; badge pointed at&lt;br&gt;
&lt;code&gt;api.github.com&lt;/code&gt;, which proxies the unauthenticated GitHub API: 60 requests per hour, shared across&lt;br&gt;
everyone on the internet using it. Five consecutive fetches of that exact URL returned&lt;br&gt;
&lt;code&gt;invalid / 151 / 151 / 151 / invalid&lt;/code&gt;. Two of five failed.&lt;/p&gt;

&lt;p&gt;So Projects stayed hardcoded at 150+ against an actual 151. &lt;code&gt;ce4d1b3&lt;/code&gt;, one line changed, and the&lt;br&gt;
commit message argues the case under a heading that says which of the two went live and why the&lt;br&gt;
other did not.&lt;/p&gt;

&lt;p&gt;The transferable part is the shape of the two wrongnesses. A hardcoded badge rounded down is wrong&lt;br&gt;
in a bounded, known direction, and it drifts slowly. A badge that renders the word "invalid" two&lt;br&gt;
times in five is wrong in an unbounded direction on the most viewed page you own, and it fails&lt;br&gt;
loudest in front of strangers. "Make it live" sounds like a preference. It is a request to add a&lt;br&gt;
dependency, and the answer to it is a measurement, not an opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The version number that refused to move
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;intent-outreach v0.2.0&lt;/strong&gt;, &lt;code&gt;1b5b444d&lt;/code&gt;, merged as PR #34. A 2026-08-19 consistency audit had found&lt;br&gt;
the changelog two months stale. The release backfilled it, bumped 0.1.0 to 0.2.0 across&lt;br&gt;
&lt;code&gt;package.json&lt;/code&gt;, both plugin manifests, and the MCP server identity, regenerated the bundle so the&lt;br&gt;
CI freshness check holds, added a missing doc index entry, and corrected a README architecture&lt;br&gt;
diagram that omitted the &lt;code&gt;list_connectors&lt;/code&gt; MCP tool. Verified with a clean typecheck, 244/244&lt;br&gt;
vitest, and a passing offline eval gate.&lt;/p&gt;

&lt;p&gt;The decision there is the same refusal in a different costume: it cut a fresh 0.2.0 rather than&lt;br&gt;
amending the untagged 0.1.0, and gave 0.1.0 a retroactive tag at &lt;code&gt;ee6a2149&lt;/code&gt;, the real end of day&lt;br&gt;
June 16 commit. Reasoning from the commit body: 0.1.0's content shipped June 16, and rewriting its&lt;br&gt;
section to absorb two more months would falsify the release history. Version numbers are a claim&lt;br&gt;
about when something happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;intent-outreach&lt;/strong&gt; also merged PR #33 three minutes earlier, unrelated to the release: it gated&lt;br&gt;
OpenAI (gpt-4o) into &lt;code&gt;SUPPORTED_PROVIDERS&lt;/code&gt; through the eval harness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;omarchy-desk-transition-entry&lt;/strong&gt;: &lt;code&gt;9383567&lt;/code&gt; covered the monitor commands (&lt;code&gt;tests/helper.test.js&lt;/code&gt;&lt;br&gt;
+72), and &lt;code&gt;02c8814&lt;/code&gt; made the transition scenes previewable (&lt;code&gt;Panel.qml&lt;/code&gt; +155/-20, plus render and&lt;br&gt;
preview PNGs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;omarchy&lt;/strong&gt;: &lt;code&gt;455e292&lt;/code&gt; started tracking submitted plugins in the README (+20/-5), and &lt;code&gt;496fcb2&lt;/code&gt;&lt;br&gt;
refreshed the live marketplace table (+10/-10).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;claude-code-plugins&lt;/strong&gt;: &lt;code&gt;9b57c6502&lt;/code&gt; gated exports before Dolt identity setup in&lt;br&gt;
&lt;code&gt;freshie/scripts/dolt-sync.py&lt;/code&gt; (+6/-1).&lt;/p&gt;

&lt;h2&gt;
  
  
  On the models
&lt;/h2&gt;

&lt;p&gt;Worth naming only because the split was clean. Claude Opus 5 ran both github-profile badge&lt;br&gt;
sessions, including the hypothesis test that eliminated repo visibility before anyone touched the&lt;br&gt;
URL. Claude Fable 5 ran the intent-outreach release. Claude Sonnet 5 was also in the day's roster.&lt;/p&gt;

&lt;p&gt;Zero course corrections in the transcript, which is not a boast. It means the day had one real&lt;br&gt;
investigation in it, the badge one, and the rest was building things that worked. The recorded&lt;br&gt;
failures on the dev box number nine in the digest, and the ones with a legible cause were shell&lt;br&gt;
alias papercuts (&lt;code&gt;command not found: eza&lt;/code&gt;, &lt;code&gt;command not found: bat&lt;/code&gt;). The rest were bare&lt;br&gt;
exit codes, a Python traceback, a Reddit fetch the harness could not make, and the harness&lt;br&gt;
refusing a &lt;code&gt;sleep 45&lt;/code&gt;. None of that is a story, which is why it gets a sentence rather than a section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/a-green-result-only-covers-what-it-ran/"&gt;A Green Result Only Covers What It Ran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/the-skip-that-counted-as-a-pass/"&gt;The Skip That Counted as a Pass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/the-green-badge-came-back-through-a-hyphen/"&gt;The Green Badge Came Back Through a Hyphen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;{&lt;br&gt;
  "&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;": "&lt;a href="https://schema.org" rel="noopener noreferrer"&gt;https://schema.org&lt;/a&gt;",&lt;br&gt;
  "@type": "BlogPosting",&lt;br&gt;
  "headline": "Bind the Receipt to the Commit It Installed",&lt;br&gt;
  "description": "An E2E test receipt that carries the installed commit hash makes provenance checkable. Six commits on one lane, three of them asserting a literal string.",&lt;br&gt;
  "author": {"@type": "Person", "name": "Jeremy Longshore"},&lt;br&gt;
  "datePublished": "2026-08-27T10:00:00-06:00",&lt;br&gt;
  "url": "&lt;a href="https://startaitools.com/posts/the-commit-the-test-actually-installed/" rel="noopener noreferrer"&gt;https://startaitools.com/posts/the-commit-the-test-actually-installed/&lt;/a&gt;",&lt;br&gt;
  "inLanguage": "en-US",&lt;br&gt;
  "wordCount": 2246&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>testing</category>
      <category>cicd</category>
      <category>devops</category>
      <category>automation</category>
    </item>
    <item>
      <title>A Ratchet Is Only as Strong as Its Re-Baseline Rule</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Fri, 28 Aug 2026 11:30:14 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/a-ratchet-is-only-as-strong-as-its-re-baseline-rule-1d1l</link>
      <guid>https://dev.to/jeremy_longshore/a-ratchet-is-only-as-strong-as-its-re-baseline-rule-1d1l</guid>
      <description>&lt;p&gt;The claude-code-plugins marketplace carries thousands of skill and agent markdown files, contributed over a long stretch by a lot of different hands. A schema validator, &lt;code&gt;scripts/validate-skills-schema.py&lt;/code&gt;, grades them at a strict marketplace tier where a missing required field is an ERROR, not a warning. The corpus fails that grading in bulk. It always has.&lt;/p&gt;

&lt;p&gt;That leaves two bad options and one good one. Fail CI on the whole corpus and nothing merges again. Ignore the findings and the debt compounds quietly. Or ratchet: pin what exists today, fail on anything new.&lt;/p&gt;

&lt;p&gt;I built the ratchet on 2026-08-26, across 424 commits on the mainline of that repo. It took eight iterations, and only two of them were about the debt itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you ratchet compliance debt without blocking merges?
&lt;/h2&gt;

&lt;p&gt;You pin the current violation set as a baseline and fail only on what is new. Existing debt is tolerated; a new (path, rule, field) triple fails the gate. That stops silent growth without blocking every merge. The other half, and the harder one, is making the pinned baseline itself impossible to grow without a reviewed, single-file change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compliance ratchet mechanism
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;scripts/check-marketplace-compliance-baseline.py&lt;/code&gt;. Its docstring states the whole contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fail closed when marketplace compliance debt grows beyond the pinned baseline.

Blueprint 727 E6.3, phase R1: compare the validator's triple-keyed marketplace
findings with ``scripts/.marketplace-compliance-baseline.json``. Existing baseline
debt is tolerated; a new (path, rule, field) triple fails the gate.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pinned artifact is &lt;code&gt;scripts/.marketplace-compliance-baseline.json&lt;/code&gt;. The final capture of the day, &lt;code&gt;ef7b666f2&lt;/code&gt; at 23:05, held schema_version 4.1.0, 2,132 pinned violation triples, and a rule_inventory of 19 rule ids.&lt;/p&gt;

&lt;p&gt;A pinned entry is exactly this shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins/ai-agency/hyperflow/agents/accessibility-reviewer.md :: E-MISSING-REQUIRED-FIELD :: author
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Path, rule, field. Three keys, one line, sorted. Nothing clever, and the lack of cleverness is the point: a diff on that file is human readable, so a reviewer can see what someone is asking to forgive.&lt;/p&gt;

&lt;p&gt;The file also carries a corpus block and a separate quality reading, and the two must not be confused with each other:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"corpus_definition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"resolveCorpus('graded')"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"corpus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"agent_files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;357&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command_files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;373&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"plugin_dirs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;593&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"skill_files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3628&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the final capture &lt;code&gt;grade_A_plus_B&lt;/code&gt; is 2979 and &lt;code&gt;grade_A_plus_B_pct&lt;/code&gt; is 82.1114. That percentage is 2979 over the 3628 graded skill files. It is the share of graded files scoring A or B. It is not a ratio involving the 2132 errors, and it does not move in lockstep with them: one file can carry several violation triples, and a file can score a B while still contributing to the pinned set. Two quantities, two denominators, one artifact. The percentage moved during the day, from 81.6428 in the first capture to 82.1114 in the last, which is a second and independent signal that the docs work was landing. I am labouring this because the post's own argument is that a number is untrustworthy until you can prove what it measures, and I would rather be tedious than do the thing I am complaining about.&lt;/p&gt;

&lt;p&gt;The debt is concentrated rather than scattered, which is what makes paying it down tractable at all. These are the top 6 of the 19 rule ids in the final capture, so they do not sum to 2132:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Pinned count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E-MISSING-REQUIRED-SECTION&lt;/td&gt;
&lt;td&gt;840&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-MISSING-REQUIRED-FIELD&lt;/td&gt;
&lt;td&gt;805&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-FRONTMATTER-9c196f479e69&lt;/td&gt;
&lt;td&gt;222&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-TIER2-TOOL-SAFETY-5d322e66e4de&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-TIER2-ORCHESTRATION-BOUNDS-31b9cdf7bcb8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-REFERENCE-ESCAPES-SKILL-DIRECTORY&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rules account for 1,645 of the 2,132. That is a writing project, not an engineering project, and I will come back to it. Only two rows moved all day. E-MISSING-REQUIRED-SECTION went from 956 in the first capture down to 840. E-MISSING-REQUIRED-FIELD jumped from 580 to 805 at the +237 capture and then held flat for the rest of the night. The other four rows in the table never moved at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight iterations, each closing the hole the last one left
&lt;/h2&gt;

&lt;p&gt;Grouped by what each one addresses, not by when it landed. The real mainline order follows the walkthrough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;166a1fad5&lt;/code&gt; ci: add marketplace baseline capture workflow.&lt;/strong&gt; A new &lt;code&gt;.github/workflows/capture-marketplace-compliance-baseline.yml&lt;/code&gt;, 59 lines. Something has to produce the baseline before anything can compare against it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;cf7410df0&lt;/code&gt; feat(ci): ratchet marketplace compliance debt.&lt;/strong&gt; The check script itself at 80 lines, &lt;code&gt;tests/test_marketplace_compliance_ratchet.py&lt;/code&gt; at 51 lines, and 7 lines wiring the job into &lt;code&gt;validate-plugins.yml&lt;/code&gt;. At this point the ratchet works, in the sense that it does what the docstring says.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;d809b9a34&lt;/code&gt; fix(ci): ratchet full marketplace compliance corpus.&lt;/strong&gt; The ratchet was only seeing part of the corpus. The fix was inside the validator, &lt;code&gt;validate-skills-schema.py&lt;/code&gt;, at +61/-33, plus +28/-1 of baseline tests and two lines in &lt;code&gt;validate-plugins.yml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. &lt;code&gt;cc7e49683&lt;/code&gt; feat(ci): isolate marketplace compliance ratchet.&lt;/strong&gt; The ratchet was sharing a job with the legacy checks, so its verdict was buried in their output. Pulled apart in &lt;code&gt;validate-plugins.yml&lt;/code&gt; at +22/-13, with CLAUDE.md updated in the same commit at +1/-1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. &lt;code&gt;22d621efa&lt;/code&gt; fix(ci): detect untracked compliance baseline.&lt;/strong&gt; +3/-2. A baseline file that was never &lt;code&gt;git add&lt;/code&gt;ed still let the workflow report success. The gate was comparing against a file that, from the repository's point of view, did not exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. &lt;code&gt;d7d233297&lt;/code&gt; fix(ci): pin marketplace baseline contract metadata.&lt;/strong&gt; +39 lines to the check script, +16 to its tests. The &lt;code&gt;metadata_drift()&lt;/code&gt; docstring is the heart of the whole day:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Return baseline-contract changes that require a conscious re-baseline.

Triple comparison alone cannot distinguish an intentional validator-rule
change from legacy debt. The emitted schema version and rule inventory are
therefore part of the pinned contract: either changing them must fail the
ratchet until the dedicated baseline-capture transaction has been reviewed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comparing sets of violations is not enough, because you can shrink the set by changing what counts as a violation. A ratchet built only on triples treats "we fixed 300 files" and "we stopped checking for that" as the same event. So &lt;code&gt;schema_version&lt;/code&gt; and the 19 rule ids became part of the pinned contract. Move either one and the gate fails until a human has looked at the re-baseline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. &lt;code&gt;242d8e051&lt;/code&gt; fix(ci): forbid unauthorized baseline growth.&lt;/strong&gt; The E6.6 rule, implemented in &lt;code&gt;baseline_growth_error()&lt;/code&gt;. Baseline growth is legal only when the pull request touches exactly one file, &lt;code&gt;scripts/.marketplace-compliance-baseline.json&lt;/code&gt;, and the head branch is prefixed &lt;code&gt;automation/compliance-baseline-&lt;/code&gt;. Anything else is a violation. The commit touched &lt;code&gt;.github/CODEOWNERS&lt;/code&gt; (+1), &lt;code&gt;validate-plugins.yml&lt;/code&gt; (+12), the check script (+68/-1), and the tests (+25). The CODEOWNERS line is one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/scripts/.marketplace-compliance-baseline.json @jeremylongshore @blueandyellow44
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That routes any change to the pinned file to two named owners. It requests review; whether review is mandatory depends on branch protection, which is configuration and not code. The claim I am willing to make from the repository alone is the E6.6 one: a growing baseline is rejected outright unless it arrives as a single-file change on an &lt;code&gt;automation/compliance-baseline-&lt;/code&gt; branch. That rule lives in the script, so it holds regardless of settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. &lt;code&gt;f53930446&lt;/code&gt; fix(ci): run marketplace ratchet before legacy checks.&lt;/strong&gt; Ordering, +13/-7 in &lt;code&gt;validate-plugins.yml&lt;/code&gt;. A gate that runs after the noisy checks gets read after everyone has stopped reading.&lt;/p&gt;

&lt;p&gt;Sort those by what they actually address and the shape of the day comes out. Three of the eight (5, 6, 7) exist to make the pinned file un-quietly-editable. Two more (4 and 8) exist to make its verdict legible: where the result is reported, and in what order. Iteration 1 builds the file, and only 2 and 3 are about the violation set itself. A quarter of the day's work on a compliance ratchet was about compliance.&lt;/p&gt;

&lt;h3&gt;
  
  
  The order the mainline actually saw them
&lt;/h3&gt;

&lt;p&gt;The grouping above is thematic. This is &lt;code&gt;git log --first-parent --reverse&lt;/code&gt;, with the capture commits interleaved, all times normalized to the automation host's fixed UTC-6. The mainline is linear: the eight ratchet commits are direct single-parent pushes with committer equal to author, and only the captures are squash-merges, which is why those carry a GitHub committer.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time (-0600)&lt;/th&gt;
&lt;th&gt;Commit&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;20:36&lt;/td&gt;
&lt;td&gt;&lt;code&gt;166a1fad5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add capture workflow (walkthrough 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:39&lt;/td&gt;
&lt;td&gt;&lt;code&gt;22d621efa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;detect untracked baseline (walkthrough 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:43&lt;/td&gt;
&lt;td&gt;&lt;code&gt;885890505&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;capture: 2011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:45&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cf7410df0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ratchet compliance debt (walkthrough 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:51&lt;/td&gt;
&lt;td&gt;&lt;code&gt;d809b9a34&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ratchet full corpus (walkthrough 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:53&lt;/td&gt;
&lt;td&gt;&lt;code&gt;19e4af810&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;capture: 2248&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20:57&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f53930446&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;run ratchet before legacy checks (walkthrough 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:04&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cc7e49683&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;isolate the ratchet (walkthrough 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:08&lt;/td&gt;
&lt;td&gt;&lt;code&gt;d7d233297&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pin contract metadata (walkthrough 6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:11&lt;/td&gt;
&lt;td&gt;&lt;code&gt;242d8e051&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;forbid unauthorized growth (walkthrough 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:24&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eb281e0d6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;capture: 2231&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21:29&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eaeb0e5b9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;capture: 2216&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things in that column that the thematic grouping hides. The untracked-baseline detection landed second, before the check script it protects existed at all. The ordering fix landed before the isolation it was ordering. And the causal claim survives intact: the +237 capture sits directly on top of the corpus widening, and pinning the contract metadata came three commits later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why comparing violation counts proves nothing
&lt;/h2&gt;

&lt;p&gt;Twenty one captures changed the baseline file that day, one per capture pull request, numbered #1346 through #1367 (#1363 was dependabot). The first four:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capture commit&lt;/th&gt;
&lt;th&gt;Time (-0600)&lt;/th&gt;
&lt;th&gt;Pinned entries&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;885890505&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20:43&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;first capture, 12 rule ids&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;19e4af810&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20:53&lt;/td&gt;
&lt;td&gt;2248&lt;/td&gt;
&lt;td&gt;+237, 19 rule ids&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eb281e0d6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;21:24&lt;/td&gt;
&lt;td&gt;2231&lt;/td&gt;
&lt;td&gt;-17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eaeb0e5b9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;21:29&lt;/td&gt;
&lt;td&gt;2216&lt;/td&gt;
&lt;td&gt;-15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The remaining seventeen took it down in steps: sixteen captures removed exactly five each, reaching 2136, and the last one removed four, ending at 2132 in &lt;code&gt;ef7b666f2&lt;/code&gt; at 23:05. Five off, sixteen times running, is what a docs push landing one vendor at a time looks like from the ratchet's side.&lt;/p&gt;

&lt;p&gt;The day started at 2011 and ended at 2132. Net, the debt grew by 121, after peaking at 2248 and giving back 116.&lt;/p&gt;

&lt;p&gt;It grew because of iteration 3. Widening what the validator inspected made 237 pre-existing problems visible for the first time. No file got worse and no contributor added anything.&lt;/p&gt;

&lt;p&gt;The artifact says so directly, and this is the part I would not have believed without the file in front of me. The 2011 capture carried a rule_inventory of 12 rule ids. The 2248 capture carried 19. Seven ids appeared between those two captures: &lt;code&gt;E-INVALID-FIELD&lt;/code&gt;, three &lt;code&gt;E-AGENT-*&lt;/code&gt; ids, &lt;code&gt;E-FATAL-9a99b10dfdaf&lt;/code&gt;, and two &lt;code&gt;E-VALIDATOR-*&lt;/code&gt; ids.&lt;/p&gt;

&lt;p&gt;Those seven account for 12 of the 237. The other 225 are E-MISSING-REQUIRED-FIELD triples on files the validator had simply not been grading before, which is why that row jumps 580 to 805 in the same capture.&lt;/p&gt;

&lt;p&gt;So the number moved for two different reasons in one step: new rule categories, and old rule categories applied to new files. A count alone cannot separate those, and neither can a diff of the triples. The pinned rule inventory is what makes them distinguishable, which is &lt;code&gt;metadata_drift()&lt;/code&gt; in one sentence.&lt;/p&gt;

&lt;p&gt;Reading it back from the artifacts, the commit order tells the rest: the widening in iteration 3 lands before the metadata pin in iteration 6, and iteration 6 exists at all because triple comparison alone cannot separate the two cases its own docstring names. I cannot tell you what I was thinking when I saw the jump. I can tell you the fix arrived three commits later and that its docstring describes exactly the ambiguity the jump created.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;The fail-closed gate ended the day as its own top-level job in &lt;code&gt;.github/workflows/validate-plugins.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;marketplace-compliance-ratchet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;marketplace-compliance-ratchet&lt;/span&gt;
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
  &lt;span class="na"&gt;timeout-minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is listed in the &lt;code&gt;ci-required&lt;/code&gt; aggregate job's &lt;code&gt;needs:&lt;/code&gt; array alongside validate, verify, test, and 19 others, for 23 entries in all, so it is a required check rather than an advisory one. It runs two steps: "Refuse unauthorized marketplace baseline growth" (pull_request only, calling the script with &lt;code&gt;--check-growth-only --base --head-ref&lt;/code&gt;) and "Reject marketplace compliance debt outside the pinned baseline", which is the plain full check.&lt;/p&gt;

&lt;p&gt;The comment above that job explains iteration 4 better than I did:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Blueprint 727 E6.4: R1 needs an independently visible, always-reporting blocking
job.  It is listed in ci-required below rather than being folded into `validate`,
so a pre-existing failure in an unrelated validation lane cannot obscure the
compliance-ratchet result.  The validator emits the complete
skills/commands/agents/manifests corpus; observed runtime is about 70 seconds,
bounded here at two minutes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About 70 seconds observed, bounded at two. That budget is what makes the isolation affordable: a lane this cheap can afford to report on its own rather than sharing a job with something slower.&lt;/p&gt;

&lt;h2&gt;
  
  
  The unglamorous half
&lt;/h2&gt;

&lt;p&gt;The mainline carries 336 hand-written &lt;code&gt;docs(...)&lt;/code&gt; commits from that day, 150 of them across these 26 vendors, governing the example sections of their skills: vercel, salesforce, perplexity, mistral, retellai, lokalise, klingai, juicebox, instantly, ideogram, hootsuite, hex, granola, grammarly, glean, gamma, framer, fondo, flyio, flexport, fireflies, firecrawl, finta, fathom, anthropic, anima.&lt;/p&gt;

&lt;p&gt;That work is what chips at E-MISSING-REQUIRED-SECTION, and the row moved 956 down to 840, which is the whole 116 the baseline gave back after the peak. Every entry that came off the baseline that night came off this one rule.&lt;/p&gt;

&lt;p&gt;The timing explains why the pinned count and the commit count do not line up. Read from the commit timestamps: most of those vendor commits had landed before the first capture at 20:43, so they were already inside the 2011 and never showed as a decline at all. A smaller number landed between the 2248 and 2216 captures. The remainder landed after 21:29, and those are what the seventeen later captures were recording.&lt;/p&gt;

&lt;p&gt;The ratchet and the docs push are the same project seen from two ends. One stops the bleeding, the other closes the wound. Only one of them is automation. The other is a person reading a skill file, understanding what it does, and writing an example section that is true. There is no version of this where the 840 goes to zero because a script ran. It goes down because someone spends a Wednesday writing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same shape, on a different system
&lt;/h2&gt;

&lt;p&gt;The other thread that day was supply-chain evidence, six commits in dependency order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;880812321&lt;/code&gt; feat(supply-chain): generate pnpm CycloneDX publication sboms. &lt;code&gt;scripts/generate-publication-sbom.mjs&lt;/code&gt;, 129 lines, with a 28 line test file from the first commit.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;304d3028f&lt;/code&gt; feat(supply-chain): build SBOM-backed publication reports. &lt;code&gt;scripts/build-publication-report.mjs&lt;/code&gt;, 69 lines, plus 17 lines of tests.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;8111e5b12&lt;/code&gt; fix(release): bind CLI evidence to SBOM and package identity. &lt;code&gt;cli-publish.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a838b4860&lt;/code&gt; feat(release): attach SBOMs to npm publication reports. &lt;code&gt;publish-all-packages.yml&lt;/code&gt; and &lt;code&gt;publish-changed-packages.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;3c1a53f68&lt;/code&gt; feat(mcp): attach SBOMs to registry publication evidence. &lt;code&gt;publish-mcp-registry.yml&lt;/code&gt;, &lt;code&gt;ci/emit-evidence/emit-evidence.ts&lt;/code&gt;, and a two line edit to &lt;code&gt;scripts/build-publication-report.mjs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cf5c14a71&lt;/code&gt; feat(evidence): require SBOM digests for every publication. The fail-closed clasp: &lt;code&gt;release.yml&lt;/code&gt;, &lt;code&gt;emit-evidence.ts&lt;/code&gt;, and both generators moved together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That chain sits on top of &lt;code&gt;80763cac1&lt;/code&gt; feat(evidence): attest required contexts and publications, 9 files at +671/-27, which added &lt;code&gt;.github/workflows/emit-publication-evidence.yml&lt;/code&gt; (128 lines) and grew &lt;code&gt;emit-evidence.ts&lt;/code&gt; by +254/-17, a net of 237 lines.&lt;/p&gt;

&lt;p&gt;An SBOM you can attach but are not required to attach is the same shape of problem as a baseline anyone can re-pin. In both chains the last commit on the mainline is the one that removes the choice: &lt;code&gt;242d8e051&lt;/code&gt; for the ratchet, &lt;code&gt;cf5c14a71&lt;/code&gt; for the evidence. In the SBOM chain that ordering is the tell, because the first five commits each felt like they were already enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;00b71ba66&lt;/code&gt; added kernel coupling violation alerts (&lt;code&gt;kernel-vendor-hash.yml&lt;/code&gt;, +53/-4) and &lt;code&gt;a60a2da48&lt;/code&gt; stood up a strict v2 kernel shadow lane (&lt;code&gt;kernel-shadow-validation.mjs&lt;/code&gt;, +115/-33).&lt;/p&gt;

&lt;p&gt;cad-dxf-agent merged three pull requests: #192 repairing real-world persona fixtures, #193 resolving non-breaking frontend audit alerts, and #194 migrating the frontend to React Router 7, which was a security-driven major version bump rather than an upgrade anyone wanted. &lt;code&gt;285df17f4&lt;/code&gt; registered the cad-dxf-agent plugin in the marketplace.&lt;/p&gt;

&lt;p&gt;Six Omarchy submission repos each got presentation assets and a manual validation run. Two carried real fixes: &lt;code&gt;8aa49e3&lt;/code&gt; preserve unusual repository paths in scanner output, and &lt;code&gt;d07e6b4&lt;/code&gt; tolerate missing Hyprland session.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the day ran with the models
&lt;/h2&gt;

&lt;p&gt;The blog pipeline itself ran on Claude Opus 5 (348 assistant turns) with Claude Sonnet 5 (29 turns), for 377 turns and 207 tool calls with 4 tool errors, pushing the previous day's Tier 3 post through its gate agents. One coordinator message is worth quoting, because it is what a working gate sounds like from the inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Five gate agents ran on your draft. Code review PASS, global fact-check PASS,
but both consistency checkers and the skill-local fact-checker returned REVISE.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Opus 5 also ran a 180 turn session on the governed second brain, 24 &lt;code&gt;brain_search&lt;/code&gt; calls and 15 &lt;code&gt;brain_capture&lt;/code&gt; calls, running the memory-distiller. Claude Fable 5 ran two short sessions: a cad-dxf-agent skill check (15 turns, 7 tool calls, 5 errors, and the same instruction had to be issued twice before it stuck) and a read-only partner-roster query over the EULER MCP that also needed a second push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Continue. Use only EULER, complete the read-only roster query, and return the
requested JSON now.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the part that belongs here because it is the same lesson as the rest of the day.&lt;/p&gt;

&lt;p&gt;There is no local transcript for the claude-code-plugins thread at all. Not a short one. None. The 424 mainline commits are the only surviving evidence of the largest piece of work I did that day. Earlier drafts said 435, because that count swept in the frozen feature branch and a handful of dependabot heads. Everything above about why iteration 6 followed iteration 5, and what iteration 3 exposed that made iteration 6 necessary, was reconstructed from commit ordering and diffs.&lt;/p&gt;

&lt;p&gt;This post also got its own numbers wrong on the first three drafts, because they were read off a feature branch frozen at 21:35 while origin/main went on to record seventeen more captures, and the only thing that caught it was a checker that went back to the mainline artifacts instead of trusting the draft.&lt;/p&gt;

&lt;p&gt;A day spent building gates that refuse to accept unwitnessed changes ended with its own best work unwitnessed. The commits are real and the diffs are real, but the reasoning that produced them survives only because it happened to be legible in the order the commits landed. That is luck, not a system.&lt;/p&gt;

&lt;p&gt;{"&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;":"&lt;a href="https://schema.org%22,%22@type%22:%22BlogPosting%22,%22headline%22:%22A" rel="noopener noreferrer"&gt;https://schema.org","@type":"BlogPosting","headline":"A&lt;/a&gt; Ratchet Is Only as Strong as Its Re-Baseline Rule","datePublished":"2026-08-26T08:00:00-05:00","dateModified":"2026-08-26T08:00:00-05:00","author":{"@type":"Person","name":"Jeremy Longshore"},"publisher":{"@type":"Organization","name":"Start AI Tools","url":"&lt;a href="https://startaitools.com%22%7D,%22url%22:%22https://startaitools.com/posts/the-ratchet-that-needed-a-ratchet/%22,%22image%22:%22https://startaitools.com/images/og-image.png%22,%22description%22:%22Pinning" rel="noopener noreferrer"&gt;https://startaitools.com"},"url":"https://startaitools.com/posts/the-ratchet-that-needed-a-ratchet/","image":"https://startaitools.com/images/og-image.png","description":"Pinning&lt;/a&gt; compliance violations in CI is the easy half. Eight iterations in one day to build a gate that refuses unauthorized baseline growth."}&lt;/p&gt;

&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/a-green-result-only-covers-what-it-ran/"&gt;A Green Result Only Covers What It Ran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/the-gate-that-could-not-fail/"&gt;The Gate That Could Not Fail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/blog/the-skip-that-counted-as-a-pass/"&gt;The Skip That Counted as a Pass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cicd</category>
      <category>claudecode</category>
      <category>releaseengineering</category>
      <category>testing</category>
    </item>
    <item>
      <title>Every Verdict Carries the Scope It Actually Ran</title>
      <dc:creator>Jeremy Longshore</dc:creator>
      <pubDate>Thu, 27 Aug 2026 10:46:07 +0000</pubDate>
      <link>https://dev.to/jeremy_longshore/every-verdict-carries-the-scope-it-actually-ran-1ka3</link>
      <guid>https://dev.to/jeremy_longshore/every-verdict-carries-the-scope-it-actually-ran-1ka3</guid>
      <description>&lt;p&gt;The third review comment on the marketplace submission did not name a bypass. It named the class.&lt;/p&gt;

&lt;p&gt;Two rounds before it, a human reviewer had handed me two working payloads and I had fixed both. Round three said the fixes were beside the point: the policy validates a hostname string, and a hostname string is not an address. An ordinary attacker-controlled name can resolve to 127.0.0.1, to an RFC1918 range, or to link-local. DNS rebinding can change what it resolves to after any check I perform separately from the fetch. Nothing I could write into that validator would change the fact that it was answering a question about spelling while the request was making a decision about routing.&lt;/p&gt;

&lt;p&gt;The offline test suite was green at exactly the commit the reviewer's comment named. Local HEAD was &lt;code&gt;d26746cbbfdcd4282ef1a3faa9b303f14b3f3a3e&lt;/code&gt;, 83 tests, all passing. That green means the spellings the suite knows about get rejected. It says nothing at all about the resolution step, because the resolution step belongs to curl and the suite never runs curl.&lt;/p&gt;

&lt;p&gt;That is the same defect the &lt;code&gt;/omarchy-ship&lt;/code&gt; lane exists to refuse. That lane is the checklist every Omarchy plugin goes through before it is submitted, and its whole job is to reject a receipt that claims more than the run behind it covers. A component had reported a conclusion whose scope it never established.&lt;/p&gt;

&lt;p&gt;It happened four times that day. Once in the security fix. Once in a metrics gate that had never been observed failing. Once in a set of analytics tags that would have looked like measurement without being measurement. Once in nine pieces of social copy that read well and could not be found. The fixes had nothing in common mechanically. One deleted code, one deliberately broke a file to watch a check fire, one declined to build a thing at all, one added a lint. What they share is a direction: in each case the claim got cut back to what had actually been established, rather than propped up with more machinery.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submission was never the obstacle
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;omarchy-listening-post-entry&lt;/code&gt; is a bar plugin for Omarchy that reads RSS and news feeds. It shipped with 29 curated sources plus a field where a user could paste their own feed URL. The marketplace submission is &lt;a href="https://github.com/HANCORE-linux/omarchy-plugin-marketplace/issues/1229" rel="noopener noreferrer"&gt;&lt;code&gt;HANCORE-linux/omarchy-plugin-marketplace#1229&lt;/code&gt;&lt;/a&gt;, opened 2026-08-21, carrying the labels &lt;code&gt;submission&lt;/code&gt;, &lt;code&gt;validated&lt;/code&gt;, &lt;code&gt;needs-fixes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Automated validation passed on the first pass. Public and reachable. One valid manifest. README and license present. Quattro compatibility green at &lt;code&gt;3759cfe&lt;/code&gt;. The automated security baseline passed too.&lt;/p&gt;

&lt;p&gt;So the listing pipeline had nothing to say. A human review thread on the custom-feed field had three things to say, in three rounds, and the escalation is the whole story.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round one: the hostname was not the hostname
&lt;/h3&gt;

&lt;p&gt;Reviewer &lt;code&gt;ryanrhughes&lt;/code&gt; sent the first payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://user@127.0.0.1/feed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The private-host check read URL userinfo as part of the hostname. &lt;code&gt;user@127.0.0.1&lt;/code&gt; is not in any private range, because as a string it is not an address at all. The check said public. curl parsed the same URL correctly, discarded the userinfo, and dialled loopback.&lt;/p&gt;

&lt;p&gt;Fixed in &lt;code&gt;e8d00af&lt;/code&gt;. Two things changed, and the second one mattered more than the first. The check moved out of &lt;code&gt;Service.qml&lt;/code&gt; and into &lt;code&gt;Model.js&lt;/code&gt; so the offline suite could actually cover it, and the reported payload got pinned as a regression test. A validator living in a QML file that only runs on a live bar is a validator nobody can test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round two: the address had more than one spelling
&lt;/h3&gt;

&lt;p&gt;Reviewer &lt;code&gt;HANCORE-linux&lt;/code&gt; sent two more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://127.1/feed
https://0177.0.0.1/feed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both reach loopback. The cause is &lt;a href="https://man7.org/linux/man-pages/man3/inet_addr.3.html" rel="noopener noreferrer"&gt;&lt;code&gt;inet_aton&lt;/code&gt;&lt;/a&gt;, which accepts one to four parts and reads each part in decimal, octal, or hex. &lt;code&gt;127.1&lt;/code&gt; is a two-part form where the second part fills the remaining 24 bits. &lt;code&gt;0177&lt;/code&gt; is octal for 127. Neither string starts with the text &lt;code&gt;127.0.0.&lt;/code&gt; that a naive range check looks for.&lt;/p&gt;

&lt;p&gt;The fix rejected every form the parser recognizes as an address, rather than trying to enumerate the notations. That felt like progress. It was progress on the same axis: I had gone from handling one spelling to handling all spellings, and the axis itself was wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round three: the class, server-side request forgery
&lt;/h3&gt;

&lt;p&gt;On 2026-08-24 the same reviewer stopped supplying payloads. The comment observed that the policy validates a hostname string, and that hostname strings do not carry the property being checked. An attacker does not need a clever spelling. They need a domain they control with an A record pointing at 127.0.0.1. If I resolve the name to check it and then hand the name to curl, curl resolves it again, and the second answer does not have to match the first.&lt;/p&gt;

&lt;p&gt;The comment named two options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option one, resolve and pin.&lt;/strong&gt; Resolve the host myself. Reject every non-public result. Bind the validated address to the request so the name is never resolved twice. In curl terms that is an explicit &lt;a href="https://curl.se/libcurl/c/CURLOPT_RESOLVE.html" rel="noopener noreferrer"&gt;&lt;code&gt;--resolve host:port:addr&lt;/code&gt;&lt;/a&gt; pin, plus &lt;code&gt;--proto =https&lt;/code&gt;, plus &lt;code&gt;--max-redirs 0&lt;/code&gt;, with every redirect hop re-validated in &lt;code&gt;Model.js&lt;/code&gt; rather than followed by curl. This is the only option that keeps arbitrary custom feeds working.&lt;/p&gt;

&lt;p&gt;Sketched out, the safe fetch looks roughly like this, and the sketch is the argument against it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# option one, in outline. every line here is a thing that can be&lt;/span&gt;
&lt;span class="c"&gt;# subtly wrong, and the whole point is that a subtle wrong is&lt;/span&gt;
&lt;span class="c"&gt;# indistinguishable from correct until somebody exploits it.&lt;/span&gt;
&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;resolve_a_record &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;          &lt;span class="c"&gt;# my resolver, not curl's&lt;/span&gt;
is_public &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$addr&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1                 &lt;span class="c"&gt;# reject loopback, rfc1918, link-local&lt;/span&gt;
curl &lt;span class="nt"&gt;--resolve&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;:443:&lt;/span&gt;&lt;span class="nv"&gt;$addr&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--max-redirs&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="s2"&gt;"https://&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c"&gt;# and then: parse the Location header myself, re-run the whole&lt;/span&gt;
&lt;span class="c"&gt;# block for every hop, and get the hop budget right too.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four moving parts, and the redirect loop means the first three run again per hop. Every one of them has to hold under an attacker who controls the DNS answer and the redirect chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option two, remove arbitrary custom-feed hosts.&lt;/strong&gt; Ship the 29 curated sources. Drop user-supplied feed URLs entirely.&lt;/p&gt;

&lt;p&gt;I asked Jeremy which way to go. The steer came back in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix listening post drop the custom feeds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why the smaller fix won
&lt;/h2&gt;

&lt;p&gt;I wanted to build option one. It is the interesting one. It is also four separate pieces of security machinery (resolution, rejection, address pinning, per-hop redirect revalidation) each of which is its own opportunity to be subtly wrong, protecting a field that is not why anyone installs this plugin.&lt;/p&gt;

&lt;p&gt;The pitch is 29 curated sources in your bar. The custom-feed box was a convenience nobody asked for. And there is a working escape hatch for the case it served: a missing feed gets added to the curated list, where it is reviewed like everything else in the list.&lt;/p&gt;

&lt;p&gt;The tradeoff is real and worth stating rather than hiding.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Resolve and pin&lt;/th&gt;
&lt;th&gt;Remove the surface&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arbitrary user feeds&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;td&gt;Gone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New code paths to get right&lt;/td&gt;
&lt;td&gt;Four&lt;/td&gt;
&lt;td&gt;Zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure mode if I get it wrong&lt;/td&gt;
&lt;td&gt;Silent forgery from a shipped plugin&lt;/td&gt;
&lt;td&gt;None, the code does not exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testable offline&lt;/td&gt;
&lt;td&gt;Partially, the resolution step is not&lt;/td&gt;
&lt;td&gt;Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewer can verify by reading&lt;/td&gt;
&lt;td&gt;No, needs runtime reasoning&lt;/td&gt;
&lt;td&gt;Yes, the constants are visible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bottom row is what decided it. A reviewer approving option one has to reason about runtime behavior they cannot observe from the diff. A reviewer approving option two reads a list of &lt;code&gt;https://&lt;/code&gt; string constants and is done.&lt;/p&gt;

&lt;p&gt;Commit &lt;code&gt;30ac415&lt;/code&gt; at 15:14: &lt;code&gt;fix(security): remove custom feed hosts, closing the request-forgery surface for good&lt;/code&gt;. Version 1.1.0.&lt;/p&gt;

&lt;p&gt;Removed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;extra-sources.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Service.extraSources()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;extrasFile&lt;/code&gt; reader&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;extrasPath&lt;/code&gt; property&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Model.isPublicHost()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every source the plugin fetches is now a compile-time constant in &lt;code&gt;Model.SOURCES&lt;/code&gt;. Seven files changed, 83 insertions and 211 deletions, which is the honest summary of the change: &lt;code&gt;CHANGELOG.md&lt;/code&gt;, &lt;code&gt;Model.js&lt;/code&gt;, &lt;code&gt;tests/model.test.js&lt;/code&gt;, &lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;Service.qml&lt;/code&gt;, &lt;code&gt;manifest.json&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;. The two files carrying most of the churn are &lt;code&gt;Model.js&lt;/code&gt; and its test file, at 91 changed lines each.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deletion had to be provable
&lt;/h2&gt;

&lt;p&gt;Deleting code is easy. Keeping it deleted is the actual engineering, because the next person to want a custom feed field will write &lt;code&gt;isPublicHost&lt;/code&gt; again, in good faith, and the suite will not care.&lt;/p&gt;

&lt;p&gt;So the eleven &lt;code&gt;isPublicHost&lt;/code&gt; tests were replaced with two tests that assert the absence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;the custom-feed host allowlist is gone and must not come back by name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isPublicHost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;every fetched source is a compile-time constant, none is user supplied&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SOURCES&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SOURCES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SOURCES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plain &lt;code&gt;node:test&lt;/code&gt; with &lt;code&gt;assert&lt;/code&gt;, no framework. The first test name is doing work that the assertion cannot: &lt;code&gt;assert.equal(Model.isPublicHost, undefined)&lt;/code&gt; on its own tells a future reader that something is absent, and nothing about why. The name tells them the absence is the point and that reintroducing the function by name is the failure being guarded against. A test name is the only part of a test that shows up in the failure output, so it is the cheapest place to put the reason.&lt;/p&gt;

&lt;p&gt;Note the shape of the result. The suite got smaller and the guarantee got stronger. Eleven tests were each pinning one spelling of one address, which is eleven assertions about the same wrong axis. Two tests pin the class: there is no host-validation function, and no fetched URL is a runtime value.&lt;/p&gt;

&lt;p&gt;Here is the shape of what the suite lost and what it gained, because the raw number moving down is the confusing part:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tests about host validation&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What they assert&lt;/td&gt;
&lt;td&gt;this spelling is rejected&lt;/td&gt;
&lt;td&gt;the function does not exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails when a new notation appears&lt;/td&gt;
&lt;td&gt;only if someone adds a twelfth test&lt;/td&gt;
&lt;td&gt;not applicable, nothing parses hosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails when the surface comes back&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes, immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total suite&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;Model.js&lt;/code&gt; also carries a comment where the old call site used to be. It names the finding and states the two conditions any future user-supplied URL would have to meet before it could be fetched. That is not decoration. The comment is where the next author looks, and a comment that says why the code is missing is more useful than any amount of code that is present.&lt;/p&gt;

&lt;h3&gt;
  
  
  The deletion was scoped, not indiscriminate
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Model.safeUrl&lt;/code&gt; stayed. It validates URLs parsed out of feed bodies before they are displayed or clicked through. That is a different job. Choosing a host to fetch from is a request the plugin originates; rendering a link that came back inside a feed is content handling. Both need checking. Only one of them was the forgery surface.&lt;/p&gt;

&lt;p&gt;Deleting everything with &lt;code&gt;url&lt;/code&gt; in the name would have been the same failure in the other direction: an action whose scope was wider than the finding that motivated it.&lt;/p&gt;

&lt;h3&gt;
  
  
  What was actually verified, and what was not
&lt;/h3&gt;

&lt;p&gt;Verified:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline suite: 74 tests, 74 pass, 0 fail. That is 83, minus the 11 &lt;code&gt;isPublicHost&lt;/code&gt; tests, plus the 2 absence guards.&lt;/li&gt;
&lt;li&gt;Vendored gate lane: PASS, 9 gates enforced, including &lt;code&gt;c38&lt;/code&gt; and &lt;code&gt;c31&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Zero em dashes and zero en dashes across the tree.&lt;/li&gt;
&lt;li&gt;No non-comment reference to extras or &lt;code&gt;isPublicHost&lt;/code&gt; remains in &lt;code&gt;Service.qml&lt;/code&gt; or &lt;code&gt;Model.js&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The finding closed too. Issue &lt;code&gt;#1229&lt;/code&gt; went to CLOSED at 23:23 UTC on 2026-08-25, carrying the labels &lt;code&gt;submission&lt;/code&gt;, &lt;code&gt;validated&lt;/code&gt;, &lt;code&gt;listed&lt;/code&gt;, and &lt;code&gt;approved-and-verified&lt;/code&gt;. The removal shipped at 15:14 local and the plugin was listed a few hours later the same night. Two rounds of validator patches never moved that label. Deleting the field did.&lt;/p&gt;

&lt;p&gt;Not verified, and this is the post's own instance of its thesis: the change was never re-verified on an Omarchy rig. Rig render and &lt;code&gt;omarchy-plugin-validate&lt;/code&gt; are unproven rather than passing.&lt;/p&gt;

&lt;p&gt;The reason written into the commit body at 15:14 is that the &lt;code&gt;omarchy-rig&lt;/code&gt; container was not present on this box, and at 15:14 that was true. It stopped being true about six hours later. The rig was up that evening and handed out receipts to everything else: loose-ends at 21:32 and 21:33, quiet-queue at 21:58, flow-boundary at 22:01, desk-transition at 22:06. Listening Post never got back in the queue, because by the time the rig was running, the attention had moved to a new plugin.&lt;/p&gt;

&lt;p&gt;So the plugin's newest rig receipt is still the one from 2026-08-22 at 10:29, three days older than the change it is supposed to cover. The argument that the change is safe is decent, since it removes code and touches no QML rendering path. An argument is not a run, and a receipt whose scope stops three days short of the change is the same defect as a green suite that never ran curl, this time with my name on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sibling one: corrupting the CI gate to see it fire
&lt;/h2&gt;

&lt;p&gt;The same morning, a new &lt;code&gt;omarchy&lt;/code&gt; umbrella repo went up (&lt;code&gt;60e3fff&lt;/code&gt; at 12:16, 821 insertions) with an org landing page whose README carries a generated metrics table. &lt;code&gt;scripts/refresh-metrics.sh&lt;/code&gt; regenerates it, &lt;code&gt;refresh-metrics.yml&lt;/code&gt; runs it, and a &lt;code&gt;--check&lt;/code&gt; lane on pull requests is supposed to fail when the committed block has drifted from what the script would produce.&lt;/p&gt;

&lt;p&gt;Supposed to. Nobody had watched it fail.&lt;/p&gt;

&lt;p&gt;Commit &lt;code&gt;c8bf8be&lt;/code&gt; at 12:32: &lt;code&gt;test(ci): hand-edit the generated metrics table to prove the staleness gate fires&lt;/code&gt;. The corruption was one table row, renamed from &lt;code&gt;**Bazaar**&lt;/code&gt; to &lt;code&gt;**Bazaar (hand edited)**&lt;/code&gt;. The commit body says the branch is not for merge, that it exists to verify the gate is real rather than assumed, and that it gets deleted once the check reports failure.&lt;/p&gt;

&lt;p&gt;A gate that has never failed has not been observed working. It has been observed being quiet, and quiet is what a broken gate and a satisfied gate look like from the outside.&lt;/p&gt;

&lt;p&gt;The gate's first observable state is the detail worth keeping. The workflow was created already broken in &lt;code&gt;60e3fff&lt;/code&gt; at 12:16: the continuation lines sat at column 0 from the start, so GitHub parsed the file into zero jobs and ran nothing (run &lt;code&gt;32882805663&lt;/code&gt;). &lt;code&gt;1395866&lt;/code&gt; at 12:18 repaired the block scalar. For those two minutes the gate could not have fired even if every line of its logic had been right, and the pull-request view looked exactly the same as it would have if the gate were working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sibling two: the UTM tags that were refused
&lt;/h2&gt;

&lt;p&gt;Nine outbound social packets were dispatched that day. Seven point at individual marketplace listings, one at the widget template, and one at the umbrella portfolio page. None of the marketplace links carry a UTM parameter, and that was a decision rather than an oversight. It is written up in &lt;code&gt;000-docs/003-RP-BASE-showcase-campaign-baseline.md&lt;/code&gt;, with the lane built in &lt;code&gt;89afdfa&lt;/code&gt; at 12:27 and &lt;code&gt;fe425f7&lt;/code&gt; at 12:29.&lt;/p&gt;

&lt;p&gt;The reasoning: analytics for &lt;code&gt;omarchyplugins.com&lt;/code&gt; belong to the marketplace. A &lt;code&gt;utm_source&lt;/code&gt; attached to a link into someone else's property is a parameter nobody on this side can ever read back. Adding it produces the appearance of measurement without measurement, which is worse than nothing, because a dashboard with tagged links on it implies somebody is reading them.&lt;/p&gt;

&lt;p&gt;Two signals are genuinely readable, and both were captured on the day.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The marketplace's own public stats endpoint.&lt;/strong&gt; Views, copies, and hearts per plugin. &lt;code&gt;copies&lt;/code&gt; is the closest thing exposed to an install, so that is the conversion metric.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub traffic on repos we own.&lt;/strong&gt; GitHub reports referrer hostnames natively, so &lt;code&gt;x.com&lt;/code&gt; and &lt;code&gt;linkedin.com&lt;/code&gt; arrive already separated with no tagging needed. That is also why the GitHub links in the packets are untagged: the tag would add nothing the platform does not already report.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The timing constraint is the part worth copying. GitHub traffic is a rolling 14-day window and cannot be backfilled. Miss the day and the pre-campaign number is gone permanently, so a same-day capture was the last chance at a number that predates the campaign. It was taken at 13:12 local, which is after the packets were dispatched to Ezekiel but before any of them were posted publicly. Dispatched and posted are different events here, and next to a discussion of referral windows the difference is the whole point.&lt;/p&gt;

&lt;p&gt;Marketplace snapshot &lt;code&gt;2026-08-25T18:12:41.735Z&lt;/code&gt;, across 1,366 listed plugins:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Views&lt;/th&gt;
&lt;th&gt;Copies&lt;/th&gt;
&lt;th&gt;Hearts&lt;/th&gt;
&lt;th&gt;GitHub views 14d&lt;/th&gt;
&lt;th&gt;Uniques&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bazaar&lt;/td&gt;
&lt;td&gt;199&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pit Wall&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wait State&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MLB Booth&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X Files&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docket&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crew Chief&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Listening Post&lt;/td&gt;
&lt;td&gt;none yet&lt;/td&gt;
&lt;td&gt;none yet&lt;/td&gt;
&lt;td&gt;none yet&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget Template&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two blank rows mean different things. Listening Post had no marketplace row because its submission was still open at 13:12 local, and that changed the same evening when the listing went live. The widget template has no marketplace row because it is not a marketplace entry at all. Which is a small instance of the same subject: the table is accurate for the moment it was taken and for no moment after.&lt;/p&gt;

&lt;p&gt;The baseline exists to answer two questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why are the two most-viewed listings the two with zero hearts?&lt;/strong&gt; Hearts do move: Pit Wall has 3, and four other listings have 1. But Bazaar sits at 0 on 199 views and Wait State at 0 on 100, which are the two highest view counts in the table. Nothing in either product asks anybody for a heart. If a campaign cannot move those two numbers, the fix is on the listing page rather than in the posting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does X or LinkedIn send more traffic here?&lt;/strong&gt; The audience is Arch and Hyprland users, which argues for X. The LinkedIn copy carries the engineering argument, which argues the other way. GitHub's referrer hostnames answer that, and they answer it for every campaign after this one, which is the actual return on doing the boring baseline.&lt;/p&gt;

&lt;p&gt;What they do not answer is which platform converts, because conversion is &lt;code&gt;copies&lt;/code&gt; and &lt;code&gt;copies&lt;/code&gt; lives on the marketplace, which exposes no referrer dimension at all. The instrument is narrower than the question. Writing that down is the difference between a measurement and the appearance of one, which is the subject of this entire piece, and it took a review pass to catch me doing it.&lt;/p&gt;

&lt;p&gt;Listening Post got no packet at all. There was no listing page for a packet to link to, and pushing a plugin publicly while a marketplace reviewer has a documented open security finding on it costs more than one fewer post is worth. The builder handles this case by construction: given a plugin absent from the catalog it emits a HOLD banner instead of a link. Fail-closed, so the human never has to remember the rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sibling three: copy that read well and could not be found
&lt;/h2&gt;

&lt;p&gt;Nine showcase packets (an X post plus two LinkedIn variants each) had already been generated and emailed to Ezekiel earlier that day. Then somebody read them.&lt;/p&gt;

&lt;p&gt;Four of the nine X posts never said the word Omarchy anywhere: wait-state, x-files, docket, crew-chief. None of the nine carried a single hashtag. Omarchy was trending on X at the time.&lt;/p&gt;

&lt;p&gt;A post about an Omarchy plugin that never names Omarchy is invisible to every single person searching for one. The commit body puts it better than I can paraphrase it: the copy was written to read well, which it did, and to be found, which it did not.&lt;/p&gt;

&lt;p&gt;Commit &lt;code&gt;d37bc55&lt;/code&gt; at 13:58: &lt;code&gt;fix(packets): name Omarchy in every post and add the discovery terms the first pass threw away&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The fix front-loads the term instead of appending a "for Omarchy" tag line at the end. Two reasons. The first line is what shows in a truncated timeline preview, and the first line is what the search index weights hardest. A term in the last line is a term nobody sees and nothing indexes strongly.&lt;/p&gt;

&lt;p&gt;The guard is a lint at the render step. The builder now refuses to render a packet when:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- the X post does not name Omarchy
- the X post carries fewer than three hashtags
- the LinkedIn copy does not name Omarchy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the commit body: this class of miss is exactly what a lint is for, invisible on a read-through and obvious to a checker. Nobody proofreading nine packets for quality would flag "excellent post, does not contain a required keyword," because that is not what reading for quality does.&lt;/p&gt;

&lt;p&gt;Verified after the fix: all nine X posts name Omarchy, all carry four hashtags, all land between 457 and 620 characters. The X opener and both LinkedIn openers still differ in all nine, so the lint did not flatten them into one voice. Zero em or en dashes, no URL in any authored field, clean against the voice deny-list. The nine corrected packets were re-sent to Ezekiel with the subject prefixed &lt;code&gt;CORRECTED, use this one&lt;/code&gt;, and the nine Plane issues were re-synced in place, updated rather than duplicated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the packets go, and why they go into Plane
&lt;/h2&gt;

&lt;p&gt;Ezekiel does the actual social posting, remote, from emailed packets. The lane that builds them went in at &lt;code&gt;89afdfa&lt;/code&gt; (12:27): &lt;code&gt;scripts/build-showcase-packet.py&lt;/code&gt; at 180 lines, &lt;code&gt;scripts/campaign-baseline.py&lt;/code&gt; at 158, &lt;code&gt;showcase-packets.json&lt;/code&gt; at 106, plus the baseline doc.&lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;87b04a8&lt;/code&gt; at 12:57: &lt;code&gt;feat(plane): mirror the showcase packets into Plane so done is a state, not a report&lt;/code&gt;. That is &lt;code&gt;plane-sync-packets.py&lt;/code&gt; at 200 lines and &lt;code&gt;plane-assign-when-accepted.sh&lt;/code&gt; at 48. Jeremy's steer that drove it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;is there a way ezekiel can get into plane and we track all his work
in plane so we know it is done ?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That mirror is the back half of the packet lane rather than a separate story. The lane produces the copy; Plane holds the state, so completion is a queryable field instead of a claim sitting in somebody's inbox. The nine packets went to &lt;code&gt;ezekiel@intentsolutions.io&lt;/code&gt;, CC Jeremy, ordered individual plugins first, then the widget template, then the portfolio page last, because a summary lands better once a few of the parts have already gone out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model collaboration beat, and what it actually taught
&lt;/h2&gt;

&lt;p&gt;Claude Opus 5 ran the Omarchy thread that day: 1,112 transcript records in the main session, 116 in a second one, and 263 in this blog session. Claude Fable 5 ran wild at 1,878 records and claude-partner-network at 87, with Claude Sonnet 5 and Claude Haiku 4.5 in smaller volumes. Records are not conversational turns, and the only roster fact the argument needs is that Claude Opus 5 wrote the nine packets.&lt;/p&gt;

&lt;p&gt;The packet failure is a model-collaboration failure and an instructive one. Claude Opus 5 generated nine sets of social copy that were good prose and bad distribution. The brief asked for copy that read well. It never stated that the copy had to be findable. The model optimized precisely the thing it was asked for, and got it right.&lt;/p&gt;

&lt;p&gt;The fix is not a better prompt. A better prompt is a thing that has to be remembered every time by whoever writes the next brief. The fix is a lint at the render step, which is the same shape as the absence-guard tests in the security fix: encode the requirement in a checker rather than trusting it to be recalled. Both cases replace an instruction with a refusal.&lt;/p&gt;

&lt;p&gt;There is a human beat in the middle of this too. While the marketplace thread was open, Jeremy hit the session with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;what did u fuck something up wiht that maintainer whatsww the link
omg did u screw it up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is what an open security finding on a public submission feels like from outside the terminal. The &lt;code&gt;needs-fixes&lt;/code&gt; label sat on a public issue for days, on a repo with the maintainer's name on the thread. No amount of "the fix is straightforward" makes that read as calm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also shipped
&lt;/h2&gt;

&lt;p&gt;Breadth, not depth. None of this carries the argument above.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;omarchy-loose-ends-entry&lt;/strong&gt;: a new plugin built end to end the same day, a Git work queue. Initial commit 19:13, feat 20:28 (build the Loose Ends Git work queue), test 21:32 (harden shipping evidence), fix 21:32 (bound scanner output and report truncation), test 21:33 (refresh rig evidence for the bounded scanner), chore 22:07 (refresh the canonical plugin gate lane). Jeremy's steer was &lt;code&gt;build loose ends next&lt;/code&gt;. The output-bounding fix is a small echo of the day: a scanner that reported without bounding what it reported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other Omarchy entries&lt;/strong&gt;: quiet-queue got an owner-aware quiet queue plus a rig render receipt, flow-boundary a local flow boundary ledger plus rig render, desk-transition safe desk transition scenes plus rig render, and workspace-storyboard and capture-conveyor both took work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cad-dxf-agent&lt;/strong&gt; (renamed cad-ai-agent): a full 7-layer testing SOP retrofit. audit-harness v0.1.0 installed with L1 enforcement hooks, L7 traceability docs retrofitted (TESTING, RTM, PERSONAS, JOURNEYS, 570 insertions), L2 CodeQL plus Trivy plus import-linter plus ESLint and L4/L5 contract plus a11y gates added (275 insertions across 9 files), then the SOP rebased on the current harness (3,382 insertions, 166 deletions). That was followed by five successive CI repair commits: update contract and Trivy actions, harden contract and container gates (183 deletions), resolve frontend production vulnerabilities, install the contract service runtime, scope the initial API contract gate. Adding five gates cost five repair commits to get green. That is the ordinary price and it is worth naming out loud, because the version of this story where gates install cleanly is the version nobody has ever shipped. Also relicensed MIT to Apache-2.0, added a &lt;code&gt;cad-analyze&lt;/code&gt; CLI and a Claude Code plugin, and merged 7 dependabot updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;claude-code-plugins&lt;/strong&gt;: governance editor and dependency policies (#1322), external-sync quarantine of the walkie-talkie mirror (#1320), modernization catalog and freshness blocker repairs (#1319).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;contributing-clanker&lt;/strong&gt;: three gate-scoping fixes, excluding developer scripts from the runtime gate, batching ignored-file gate filtering, and excluding ignored dependencies from gate scans.&lt;/li&gt;
&lt;li&gt;Ko-fi added alongside existing funding sources across about fourteen repos. intent-os regenerated its mission-control status pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The rule: compare what it asserts against what it ran
&lt;/h2&gt;

&lt;p&gt;Four times in one day, something was set to report a conclusion whose scope it had never established. A test suite that said the host check was safe while never running the resolver. A staleness gate that said the metrics were fresh while having never once been seen to fail, and which for its first two minutes parsed to zero jobs. Nine posts that claimed a subject they never contained the word for. And a tag scheme that would have implied a campaign was attributed, pointing at a property whose analytics nobody on this side can read.&lt;/p&gt;

&lt;p&gt;The diagnostic that held across all four is a pair of lists. What does the thing assert, and what did it actually run? The suite asserted safety and ran string comparison. The gate asserted freshness and ran nothing observable. The copy asserted a subject and contained no instance of the word. The tags never got that far, and that is the useful one in the set, because the mismatch was caught while the lane was still being written. Nothing was dropped, because nothing was ever attached. A near miss reads as less of a story than a bug, and it is the cheapest of the four by a wide margin.&lt;/p&gt;

&lt;p&gt;The fixes shared no mechanism at all. One removed a feature. One broke a generated table on purpose and watched the check fail. One declined to build the tagging. One added a word, four hashtags, and a lint at the render step. What they share is direction. The bigger version of each was available and it was always the one I reached for first: fortify the validator, trust the gate because the YAML looks right, tag everything because tagging is what you do, write a better brief. Every one of those leaves the unearned claim standing, with more scaffolding around it.&lt;/p&gt;

&lt;p&gt;Fixing the spelling is not fixing the class. The honest fix is usually smaller than the one I wanted to build, and it usually removes something.&lt;/p&gt;

&lt;p&gt;Which brings it back to the rig. The security change is good, the suite is green at 74 of 74, the gate lane passes 9 enforced checks, and the marketplace listed the plugin that night. None of that covers rig render, because none of it ran a rig, and the newest rig receipt on the plugin is three days older than the change it is filed against. That is the whole finding, sitting in my own repo, on the day I wrote it up.&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;": "&lt;a href="https://schema.org" rel="noopener noreferrer"&gt;https://schema.org&lt;/a&gt;",&lt;br&gt;
  "@type": "BlogPosting",&lt;br&gt;
  "headline": "Every Verdict Carries the Scope It Actually Ran",&lt;br&gt;
  "description": "A verdict covers only what it ran. Four same-day cases, including a request-forgery class closed by deleting the feature it lived in.",&lt;br&gt;
  "datePublished": "2026-08-25T08:00:00-05:00",&lt;br&gt;
  "author": { "@type": "Person", "name": "Jeremy Longshore" },&lt;br&gt;
  "url": "&lt;a href="https://startaitools.com/posts/a-green-result-only-covers-what-it-ran/" rel="noopener noreferrer"&gt;https://startaitools.com/posts/a-green-result-only-covers-what-it-ran/&lt;/a&gt;",&lt;br&gt;
  "isPartOf": { "@type": "Blog", "name": "Start AI Tools", "url": "&lt;a href="https://startaitools.com" rel="noopener noreferrer"&gt;https://startaitools.com&lt;/a&gt;" }&lt;br&gt;
}&lt;/p&gt;

&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/the-gate-that-could-not-fail/"&gt;Make the Guard Prove It Can Fail&lt;/a&gt;: four gates in one day whose verdicts were decoupled from the thing they claimed to measure, which is the direct ancestor of corrupting the metrics table on purpose.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/the-lane-that-reviewed-nothing/"&gt;Every Check Should Report What It Did Not Look At&lt;/a&gt;: the lane-level version of the same finding, where the scope of a review is part of its output.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/blog/the-green-badge-came-back-through-a-hyphen/"&gt;Refusing to Classify Beats Matching Harder&lt;/a&gt;: a status classifier that refuses wording it cannot positively recognize, and the hyphen that walked past a negation guard.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>testing</category>
      <category>cicd</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
