<?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: Baby Blue Viper</title>
    <description>The latest articles on DEV Community by Baby Blue Viper (@babyblueviper1).</description>
    <link>https://dev.to/babyblueviper1</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%2F4055908%2F0feffccf-94a7-45c5-9832-e4be36d2caeb.png</url>
      <title>DEV Community: Baby Blue Viper</title>
      <link>https://dev.to/babyblueviper1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/babyblueviper1"/>
    <language>en</language>
    <item>
      <title>We checked OpenAI's own Sora and ChatGPT files for Content Credentials. Two of our results were wrong at first</title>
      <dc:creator>Baby Blue Viper</dc:creator>
      <pubDate>Wed, 14 Oct 2026 11:57:42 +0000</pubDate>
      <link>https://dev.to/babyblueviper1/we-checked-openais-own-sora-and-chatgpt-files-for-content-credentials-two-of-our-results-were-174</link>
      <guid>https://dev.to/babyblueviper1/we-checked-openais-own-sora-and-chatgpt-files-for-content-credentials-two-of-our-results-were-174</guid>
      <description>&lt;p&gt;Everyone looking at a clip online now asks the same thing: was this changed, and was it made by AI? Detection models answer with a score nobody can audit. There's another way to ask, at least for files that carry it: read the file's own signed provenance record, C2PA Content Credentials, and report exactly what that record establishes and what it doesn't.&lt;/p&gt;

&lt;p&gt;We built a free checker that does that, and before telling anyone about it we ran it on real public files from OpenAI, Adobe, Capture One and Truepic. Two of the results were wrong at first, in instructive ways. Here's what we found.&lt;/p&gt;

&lt;h2&gt;
  
  
  One state per claim, never one verdict
&lt;/h2&gt;

&lt;p&gt;A Content Credentials record makes several different claims, and they don't stand or fall together. So the checker reports each one separately, as one of four states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VERIFIED&lt;/strong&gt;: established cryptographically or against an official list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DECLARED_ONLY&lt;/strong&gt;: the signer says so; nothing independent backs it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CONTRADICTED&lt;/strong&gt;: the evidence says otherwise, for example the bytes don't match the signature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INSUFFICIENT&lt;/strong&gt;: there's nothing to decide on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The claims: does the signature match these exact bytes (binding), who signed and is that signer on the official C2PA trust list (signer), what edits the signer declares, and whether the signer declares the content AI-generated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Binding&lt;/th&gt;
&lt;th&gt;Signer&lt;/th&gt;
&lt;th&gt;Edits declared&lt;/th&gt;
&lt;th&gt;AI label declared&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Sora video&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT image&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;td&gt;INSUFFICIENT&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adobe Firefly image&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photo signed by Capture One&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;td&gt;INSUFFICIENT&lt;/td&gt;
&lt;td&gt;INSUFFICIENT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Truepic camera-app photo&lt;/td&gt;
&lt;td&gt;VERIFIED&lt;/td&gt;
&lt;td&gt;DECLARED_ONLY&lt;/td&gt;
&lt;td&gt;INSUFFICIENT&lt;/td&gt;
&lt;td&gt;INSUFFICIENT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every file's signature matches its bytes. Both OpenAI files and the Firefly image declare themselves AI-generated. None of the signers is VERIFIED against the official C2PA trust list. These sample files were signed before the official list replaced the interim one at the start of 2026, or by certificates that aren't on it, so a photo here reads "valid signature, signer not on the list", which is the honest answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 1: an expired certificate looked like tampering
&lt;/h2&gt;

&lt;p&gt;Our first pass marked the Sora video's and ChatGPT image's signers &lt;strong&gt;CONTRADICTED&lt;/strong&gt;, our strongest negative. The only reason was that their signing certificates have expired since they signed. That is not evidence against the signature, and calling it "contradicted" would have told people OpenAI's own content looked forged.&lt;/p&gt;

&lt;p&gt;Now an expired certificate never reads as tampering. If a validated timestamp shows the claim was signed while the certificate was valid (the Sora file has one), the signer is DECLARED_ONLY with that explanation. Without one (the ChatGPT image), it's INSUFFICIENT: "signer trust cannot be established; an expired certificate is not evidence of tampering." Only a revoked or invalid credential contradicts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 2: we missed OpenAI's own AI label
&lt;/h2&gt;

&lt;p&gt;The ChatGPT image's top-level manifest only records that the file was opened. The AI-generation label (&lt;code&gt;trainedAlgorithmicMedia&lt;/code&gt;) sits in the manifest of the ingredient it was made from. Reading only the top level, we reported "no AI label", which was wrong.&lt;/p&gt;

&lt;p&gt;The fix reads ingredient manifests too. Our own review then pointed out that this opens an attack: anyone could reference a forged ingredient to plant a label. So a label only counts from an ingredient the C2PA tool confirms is hash-bound to the file and whose own manifest has no mismatch, walking the chain recursively through validated manifests only. The page names the ingredient the label came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't establish
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It never says content is true. A valid signature binds bytes to a signer, not the pictured event to reality.&lt;/li&gt;
&lt;li&gt;A capture label is the device's own attestation, and a camera can film a screen.&lt;/li&gt;
&lt;li&gt;A file with no credentials is not evidence of fakery. Most files have none.&lt;/li&gt;
&lt;li&gt;A re-encode changes the bytes, so a platform re-upload no longer matches the original's signature or hash.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://invinoveritas.dev/check" rel="noopener noreferrer"&gt;invinoveritas.dev/check&lt;/a&gt; hashes a file in your browser, so it never leaves your device, and looks it up. To check the credentials themselves, upload it (free, up to 2 GB):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@clip.mp4"&lt;/span&gt; https://api.babyblueviper.com/verify-media
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's also a free MCP tool, &lt;code&gt;verify_media&lt;/code&gt;, for agents. Two paid pieces are live at 100 sats per file. A publisher can register an original (a signed verdict plus a Bitcoin timestamp), so anyone with a copy can check it without uploading. And an AI deployer can register a file it generated as "declared synthetic" by its SHA-256 alone. Each declaration is attributed to whoever made it, several can coexist, and none can overwrite another, so nobody can label someone else's genuine recording as synthetic and lock them out.&lt;/p&gt;

&lt;p&gt;That last piece matters for AI audio and video in particular. The EU AI Act's Article 50 asks providers of synthetic audio and video to mark output in a machine-readable way, and the two public showcase clips we checked from one popular TTS provider carried no credentials at all.&lt;/p&gt;

</description>
      <category>c2pa</category>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The verification layer for autonomous agents</title>
      <dc:creator>Baby Blue Viper</dc:creator>
      <pubDate>Fri, 31 Jul 2026 03:51:09 +0000</pubDate>
      <link>https://dev.to/babyblueviper1/the-verification-layer-for-autonomous-agents-3bp3</link>
      <guid>https://dev.to/babyblueviper1/the-verification-layer-for-autonomous-agents-3bp3</guid>
      <description>&lt;p&gt;Most agent tooling optimizes for capability: better memory, better tools, better reasoning. But the one thing an agent can't self-serve is trust in &lt;em&gt;another&lt;/em&gt; agent's output — you can't self-issue a verdict on your own correctness.&lt;/p&gt;

&lt;p&gt;invinoveritas is a neutral second opinion before an irreversible action, and a signed, checkable proof after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/review&lt;/code&gt; — capital-scale-aware verdict before an agent acts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/prove&lt;/code&gt; — a signed proof of the verdict, after&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/ledger&lt;/code&gt; — the public, Nostr-anchored track record of every verdict issued, wins and losses both&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're a named co-author on ERC-8299 (WYRIWE), and &lt;code&gt;/ledger&lt;/code&gt; is its production reference implementation. Everything here is independently verifiable — no need to trust us, just recompute it.&lt;/p&gt;

&lt;p&gt;More: &lt;a href="https://api.babyblueviper.com/ledger" rel="noopener noreferrer"&gt;https://api.babyblueviper.com/ledger&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>verification</category>
    </item>
  </channel>
</rss>
