<?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: Laziz Kironov</title>
    <description>The latest articles on DEV Community by Laziz Kironov (@lazizkironov).</description>
    <link>https://dev.to/lazizkironov</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%2F4100400%2F53260ef3-575a-4160-b5b8-66c957fba558.png</url>
      <title>DEV Community: Laziz Kironov</title>
      <link>https://dev.to/lazizkironov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lazizkironov"/>
    <language>en</language>
    <item>
      <title>The five blind spots in AI governance nobody instruments for</title>
      <dc:creator>Laziz Kironov</dc:creator>
      <pubDate>Thu, 24 Sep 2026 07:15:22 +0000</pubDate>
      <link>https://dev.to/lazizkironov/the-five-blind-spots-in-ai-governance-nobody-instruments-for-1ek4</link>
      <guid>https://dev.to/lazizkironov/the-five-blind-spots-in-ai-governance-nobody-instruments-for-1ek4</guid>
      <description>&lt;h2&gt;
  
  
  Most AI governance stops at the dashboard. But the gaps that actually bite in production are the ones between the layers — shadow AI, agent delegation, prompt-level leaks, expiry, and unprovable audit trails. A field guide
&lt;/h2&gt;

&lt;p&gt;Most "AI governance" I've seen — and I've been building in this space — converges on the same shape: a dashboard, a log, a policy page. That's necessary. It's also where the thinking usually stops, and the gaps that actually cause incidents live between those pieces, not inside them.&lt;br&gt;
This is a field guide to five blind spots I keep running into. None of them are exotic. They're the boring, structural gaps that don't show up until an agent does something nobody authorized and you're trying to reconstruct why. For each one I'll describe the problem, why the common approach misses it, and the shape of a fix. I'll mention what I've built where it's relevant, but the point here is the problem, not a product — most of these you can address with tools you already have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blind spot 1: Shadow AI is a network problem, not a policy problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every company has a policy about AI use. Almost none can tell you what AI is actually running. Someone spun up a local Ollama instance. A team wired an unsanctioned API into a cron job. A browser extension is quietly shipping prompts somewhere.&lt;br&gt;
Why the common approach misses it: policies govern sanctioned usage — the tools you already know about. Shadow AI is by definition the stuff you don't. You can't write a policy for a model you can't see.&lt;br&gt;
The shape of a fix: treat discovery as a detection problem, the way you'd treat rogue devices on a network. Endpoint signals (processes like ollama/vllm, listening ports, model-weight files on disk) plus passive network discovery surface what's actually running, independent of anyone declaring it. The key design rule: discovery must be read-only. Finding a service is not the same as connecting to it — nothing should auto-attach to a discovered endpoint without an explicit human decision, or your discovery tool becomes its own attack surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blind spot 2: Prompt-level leaks happen before your logs ever see them&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You log the request. Good. But by the time it's in your log, the secret has already left — the API key, the customer PII, the internal hostname — pasted into a prompt and shipped to a third-party provider.&lt;br&gt;
Why the common approach misses it: observability is downstream. It records what happened; it doesn't intervene. Logging a leak is not preventing a leak.&lt;br&gt;
The shape of a fix: put a masking chokepoint before the prompt leaves. Scrub secrets (cards, keys, IDs, PII) at the gateway, so the provider never receives raw sensitive input in the first place. A subtle upside: gateway-level masking protects you from the provider itself, not just from your own traces. App-level redaction only protects your logs; the prompt still leaves your building intact. (This one bites hardest with LLM providers — the data's gone the moment the request fires.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blind spot 3: Agent delegation has no subset guarantee&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Single agents were easy to reason about. Now an orchestrator calls a researcher, which calls a writer, which calls a tool. Each hop hands some authority to the next — and in most setups, nothing structurally prevents a sub-agent from using a capability it was never granted.&lt;/p&gt;

&lt;p&gt;Why the common approach misses it: prompt instructions ("you may only read, never write") get reasoned around. A capability boundary enforced in text is a suggestion. Under enough pressure — a retry, a clever completion, a tool that reframes "delete" as "cleanup" — it leaks.&lt;br&gt;
The shape of a fix: enforce capability subsetting at every hop, structurally. A sub-agent can never hold more than the agent that spawned it. If the parent can't deploy, nothing it spawns can deploy, regardless of how the chain grows. This turns a prompt rule into an invariant. And log every rejected escalation separately with the exact over-requested capability — the rejections are the signal, because the attacker or bug doesn't know which check failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blind spot 4: Delegations don't expire, so revocation is a fantasy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Say you do scope a delegation correctly. A parent hands a sub-agent a credential for a three-minute task. Then the sub-agent spawns an async job, or retries against a queue, and the work outlives the authorization. Now that credential is either expired mid-flight, or scoped so wide in duration that "revoking" it means manually hunting it down.&lt;/p&gt;

&lt;p&gt;Why the common approach misses it: capability subsetting handles what, not for how long. Time is the dimension everyone forgets, and it behaves differently — capabilities only ever shrink down a chain, but time, once you introduce async work, doesn't stay neat.&lt;br&gt;
The shape of a fix: monotonic TTL — a delegation can't outlive the one that authorized it, the temporal twin of the subset check. Enforce it at delegation time (a longer TTL is a violation) and again at action time (an action under an expired delegation is denied). The async case is genuinely hard and I don't think it's fully solved — the cleanest direction I've found is treating a queued job as a new delegation request at execution time rather than reusing the original grant, but that just relocates the question to "who signs the re-delegation."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blind spot 5: A log you control is not proof&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the one that reframes all the others. When an auditor — or a regulator under something like the EU AI Act — asks "who authorized this agent to do that?", you point at your audit trail. But your audit trail is a claim. If your server wrote the log, your server could have written anything. Monitoring tells you what a system says happened. It doesn't let anyone verify it independently.&lt;br&gt;
Why the common approach misses it: the entire industry equates "observable" with "accountable." They're not the same. A dashboard is evidence to you. It is not evidence to someone who doesn't trust you.&lt;br&gt;
The shape of a fix: make the authorization itself cryptographically verifiable. Sign each delegation (Ed25519 is a good fit — small keys, fast verification, deterministic). Store the exact signed payload so nothing has to be reconstructed. Then anyone can verify the signature against the signer's public key in their own browser, without trusting the server — the server holds only the public key, so it can verify but never forge. "Trust me, here's my log" becomes "here's the math, check it yourself." Put the delegation's expiry inside the signed payload too, so a lifetime can't be extended after the fact.&lt;/p&gt;

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

&lt;p&gt;Notice that four of the five aren't about any single system being wrong. They're about the seams — between sanctioned and shadow, between logging and intervening, between one agent and the next, between authorization and time. Governance tools tend to instrument the boxes and ignore the lines connecting them, which is exactly where autonomy leaks.&lt;br&gt;
I've been building an open-source, self-hosted platform (Provenza) that tries to close these seams — the name is from provenance, because the thread running through all five is making the origin of an AI action provable rather than merely observed. It's early and I'm figuring plenty out, especially the async-expiry case above. But you don't need my project to take the ideas: discovery as detection, masking before the prompt leaves, subset-at-every-hop, monotonic TTL, and signed authorizations are all things you can build into what you already run.&lt;br&gt;
If you're working on agent infrastructure, I'd genuinely like to hear which of these you've hit — and how you're handling the ones I clearly haven't fully solved. The comments on my last posts&lt;br&gt;
thought me more than the posts ded.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks to &lt;a href="https://dev.to/pushpendraagrawal"&gt;Pushpendra Agrawal&lt;/a&gt; and &lt;a href="https://dev.to/reidmarlow"&gt;Reid Marlow&lt;/a&gt; — their comments on my earlier posts directly shaped blind spots #3 and #4 here. The rejected-escalation logging and the monotonic-TTL framing both came out of those conversations. This is the kind of feedback that turns a post into a feature.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/kironovlaziz-del/provenza" rel="noopener noreferrer"&gt;https://github.com/kironovlaziz-del/provenza&lt;/a&gt; &lt;br&gt;
git clone: &lt;a href="https://github.com/kironovlaziz-del/provenza.git" rel="noopener noreferrer"&gt;https://github.com/kironovlaziz-del/provenza.git&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>governance</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why 'monitoring' isn't enough for AI agents — and how I made delegation cryptographically verifiable</title>
      <dc:creator>Laziz Kironov</dc:creator>
      <pubDate>Tue, 22 Sep 2026 01:24:51 +0000</pubDate>
      <link>https://dev.to/lazizkironov/why-monitoring-isnt-enough-for-ai-agents-and-how-i-made-delegation-cryptographically-verifiable-5bad</link>
      <guid>https://dev.to/lazizkironov/why-monitoring-isnt-enough-for-ai-agents-and-how-i-made-delegation-cryptographically-verifiable-5bad</guid>
      <description>&lt;h2&gt;
  
  
  The problem nobody talks about with AI agents
&lt;/h2&gt;

&lt;p&gt;We're rushing to give AI agents autonomy. An orchestrator agent calls a research agent, which calls a writer agent, which calls a tool. Each hop, one agent hands some of its authority to another.&lt;br&gt;
Every "AI governance" tool I looked at solves this the same way: it logs everything. You get a dashboard, a timeline, an audit trail. Which sounds great — until you ask one uncomfortable question:&lt;br&gt;
When an auditor asks "who authorized this agent to spend money / delete data / call that API?", is a log you control actually proof?&lt;br&gt;
It isn't. A log is a claim. If the server writes the log, the server can write anything. Monitoring tells you what a system says happened. It doesn't let anyone prove it independently.&lt;br&gt;
As agents get more autonomous — and as regulation like the EU AI Act starts demanding "verifiable accountability" — I think this gap becomes a real problem. So I tried to close it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The idea: sign the delegation, not just log it
&lt;/h2&gt;

&lt;p&gt;Instead of recording that Agent A delegated to Agent B, what if the delegation itself were cryptographically signed by A? Then:&lt;br&gt;
Anyone can verify the signature against A's public key&lt;br&gt;
The server holds only public keys — it can verify a delegation, but it can never forge one&lt;br&gt;
An auditor can check the proof on their own machine, without trusting my server at all&lt;br&gt;
That last point is the whole game. "Trust me, here's my log" becomes "here's the math, check it yourself."&lt;br&gt;
I built this into an open-source platform (AI Control Tower), but the technique is general. Let me show the core of it. &lt;/p&gt;
&lt;h2&gt;
  
  
  Why Ed25519
&lt;/h2&gt;

&lt;p&gt;For signing delegations you want:&lt;br&gt;
Small keys and signatures (32-byte public keys, 64-byte signatures) — these get stored and passed around a lot&lt;br&gt;
Fast verification — you may verify a whole chain of hops&lt;br&gt;
Deterministic signatures — no per-signature randomness to get wrong&lt;br&gt;
Available everywhere — including natively in the browser via WebCrypto&lt;br&gt;
Ed25519 checks every box. It's modern, boring in the good way, and — crucially for the "verify in your browser" goal — supported by the WebCrypto API.&lt;/p&gt;
&lt;h2&gt;
  
  
  The tricky part: canonical bytes
&lt;/h2&gt;

&lt;p&gt;Here's the bug that will silently break everything if you're not careful.&lt;br&gt;
To verify a signature, the verifier must hash exactly the same bytes the signer signed. If your backend signs a JSON object and your frontend re-serializes it even slightly differently — different key order, extra whitespace, different number formatting — the bytes differ, and every verification fails, even though nothing was tampered with.&lt;br&gt;
The fix is a canonical serialization both sides agree on. In Python (signing side):&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;canonical_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# sort_keys + no whitespace = deterministic output
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;separators&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;,&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;:&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="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&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;And the matching thing in JavaScript (verifying side) has to produce byte-for-byte the same output. JSON.stringify with manually sorted keys and no spaces gets you there for simple payloads — but test it against real data, because nested objects and unicode will bite you.&lt;br&gt;
Lesson learned: write a test that signs on the backend and verifies with the exact frontend serializer, using awkward payloads (unicode, nested objects, numbers). That one test caught more bugs than anything else.&lt;/p&gt;
&lt;h2&gt;
  
  
  Signing (backend, Python)
&lt;/h2&gt;

&lt;p&gt;Using the cryptography library (no exotic deps):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cryptography.hazmat.primitives.asymmetric.ed25519&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Ed25519PrivateKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Ed25519PublicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_keypair&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;private_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Ed25519PrivateKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;public_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;private_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;public_key&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;private_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;public_key&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sign_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;private_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Ed25519PrivateKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bytes&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;private_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;canonical_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Agent A delegates, you build a payload describing the delegation (who, to whom, what capabilities, when), sign it with A's private key, and store the payload + signature + A's public key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying — in the browser, offline
&lt;/h2&gt;

&lt;p&gt;This is the part that makes it verifiable rather than trust-me. Using WebCrypto in the browser:&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="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyDelegation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publicKeyRaw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;canonicalPayloadBytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// import the raw 32-byte Ed25519 public key&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&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;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;importKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;raw&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;publicKeyRaw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ed25519&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;verify&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ed25519&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;canonicalPayloadBytes&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 browser fetches the delegation's payload, signature, and the signer's public key, rebuilds the canonical bytes, and verifies — locally. The server never gets a chance to lie, because the proof is checked on the client. If the math checks out, you see a green "verified" badge; if anything was altered by a single byte, it fails.&lt;br&gt;
(Note: browser Ed25519 support via WebCrypto is now widespread, but if you need to support older browsers, keep a graceful fallback that verifies server-side and clearly labels it as such — don't pretend a server-side check is the same guarantee.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The other half: capabilities can only shrink
&lt;/h2&gt;

&lt;p&gt;Verifiable signatures answer "did A really authorize this?". But there's a second rule that matters for agent safety:&lt;br&gt;
An agent can never delegate more authority than it holds.&lt;br&gt;
If A can call read and search, it must not be able to hand B write or delete. So every delegation runs a subset check: the delegated capabilities must be a subset of the delegator's own effective capabilities. If B tries to escalate, the delegation is rejected and an incident is raised. Combine that with the signatures, and you get a chain where every hop is both authorized (subset) and provable (signed).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more every month
&lt;/h2&gt;

&lt;p&gt;Single-agent systems were easy to reason about. Multi-agent systems — where agents spawn and delegate to other agents — are not. As they spread into companies, "show me the log" stops being good enough. People will start asking "prove it." Verifiable delegation is one way to have an answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it / steal the idea
&lt;/h2&gt;

&lt;p&gt;The full implementation — signing service, capability validator, a live delegation graph where you click any edge and verify the signature in your browser — is open-source (Apache-2.0), self-hosted, and runs with one Docker command:&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/kironovlaziz-del/provenza.git" rel="noopener noreferrer"&gt;https://github.com/kironovlaziz-del/provenza.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/kironovlaziz-del/provenza" rel="noopener noreferrer"&gt;https://github.com/kironovlaziz-del/provenza&lt;/a&gt;&lt;br&gt;
I'm a solo developer and this is an early, honest MVP — I'd genuinely love feedback, especially on the canonicalization approach and the capability model. If you're working on agent infrastructure, I'd like to hear how you're thinking about the accountability problem.&lt;br&gt;
Have you hit the "monitoring isn't proof" wall with agents yet? How are you handling it? Let me know in the comments.&lt;/p&gt;

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