<?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: PiQrypt</title>
    <description>The latest articles on DEV Community by PiQrypt (@piqrypt).</description>
    <link>https://dev.to/piqrypt</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3859079%2F8529742b-cc95-4f17-a266-afbc666d57dc.jpeg</url>
      <title>DEV Community: PiQrypt</title>
      <link>https://dev.to/piqrypt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/piqrypt"/>
    <language>en</language>
    <item>
      <title>Watch your CrewAI agents in real-time with PiQrypt Vigil</title>
      <dc:creator>PiQrypt</dc:creator>
      <pubDate>Fri, 17 Apr 2026 06:18:44 +0000</pubDate>
      <link>https://dev.to/piqrypt/watch-your-crewai-agents-in-real-time-with-piqrypt-vigil-41ko</link>
      <guid>https://dev.to/piqrypt/watch-your-crewai-agents-in-real-time-with-piqrypt-vigil-41ko</guid>
      <description>&lt;p&gt;You've added cryptographic audit trails to your crew (&lt;a href="https://dev.to/piqrypt/how-i-added-cryptographic-audit-trails-to-any-crewai-crew-in-3-lines-2n6m"&gt;part 1&lt;/a&gt;) &lt;br&gt;
and co-signed the handoffs between agents (&lt;a href="https://dev.to/piqrypt/multi-agent-accountability-who-co-signs-the-handoff-between-your-crewai-agents-gi4"&gt;part 2&lt;/a&gt;).   &lt;/p&gt;

&lt;p&gt;You now have tamper-evident history. But that's retrospective — you find out &lt;br&gt;
something went wrong after the fact, when you run &lt;code&gt;verify_chain()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vigil is the real-time layer. It watches your agents while they run and raises &lt;br&gt;
alerts the moment behavioural anomalies appear in the chain.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Vigil is
&lt;/h2&gt;

&lt;p&gt;Vigil is a local HTTP dashboard that launches on &lt;code&gt;http://localhost:8421&lt;/code&gt;. &lt;br&gt;
No external dependency. No data leaves your machine. It reads the same &lt;br&gt;
AISS event chains your agents are writing and computes a VRS &lt;br&gt;
(Verifiable Risk Score) in real time.&lt;/p&gt;

&lt;p&gt;One command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;piqrypt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vigil is included. To start it:&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;vigil&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;start_vigil&lt;/span&gt;
&lt;span class="nf"&gt;start_vigil&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Dashboard running at http://localhost:8421
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or from the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;piqrypt vigil start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What VRS measures
&lt;/h2&gt;

&lt;p&gt;VRS is a composite risk score — a number between 0 and 1, where 1 means &lt;br&gt;
the chain is healthy and 0 means it's compromised. It's computed across &lt;br&gt;
five cryptographic dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrity&lt;/strong&gt; — are all hashes in the chain consistent?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verified interactions&lt;/strong&gt; — are A2A handoffs co-signed as expected?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diversity&lt;/strong&gt; — is the event type distribution normal, or is the agent 
doing something anomalous?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finalization&lt;/strong&gt; — are events being properly closed?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotation health&lt;/strong&gt; — if the agent rotated its key, is the PCP continuity 
intact?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Critically: VRS is deterministic. No ML, no probabilistic scoring, no model &lt;br&gt;
that could drift. Given the same chain, any third party running the same &lt;br&gt;
verification gets the same score.&lt;/p&gt;
&lt;h2&gt;
  
  
  A full CrewAI setup with Vigil
&lt;/h2&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;crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;piqrypt.bridges.crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuditedAgent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;vigil&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;start_vigil&lt;/span&gt;

&lt;span class="c1"&gt;# Start Vigil before the crew runs
&lt;/span&gt;&lt;span class="nf"&gt;start_vigil&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# → http://localhost:8421
&lt;/span&gt;
&lt;span class="n"&gt;researcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find competitive pricing data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expert at finding and analyzing market data.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Produce a pricing analysis report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Turns raw data into clear executive summaries.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;research_task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Research competitor pricing for product X&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;researcher&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;write_task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a pricing analysis based on the research&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;crew&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;researcher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;research_task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write_task&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;crew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kickoff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# While the crew runs, Vigil shows VRS and chain health per agent in real time   
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open &lt;code&gt;http://localhost:8421&lt;/code&gt;. You'll see a dashboard per agent — event count, &lt;br&gt;
VRS, chain health, and a SOC-style timeline of events as they're stamped.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a CRITICAL alert looks like
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;researcher_01&lt;/code&gt;'s VRS drops below the critical threshold, Vigil raises an &lt;br&gt;
alert:&lt;br&gt;
[CRITICAL] researcher_01 — chain anomaly detected&lt;br&gt;
VRS: 0.21 (threshold: 0.30)&lt;br&gt;
Event #34: previous_hash mismatch&lt;br&gt;
Affected events: 34 → end of chain&lt;/p&gt;

&lt;p&gt;This means: someone (or something) modified event 34 after it was written. &lt;br&gt;
Every subsequent hash is now invalid. The chain is compromised from that &lt;br&gt;
point forward.&lt;/p&gt;

&lt;p&gt;Vigil alerts. It never acts. The human decides what to do — that's the &lt;br&gt;
design principle. Automated blocking without human decision is not in scope.&lt;/p&gt;
&lt;h2&gt;
  
  
  A real example: the PixelFlow agency
&lt;/h2&gt;

&lt;p&gt;The PiQrypt repo includes a runnable demo with a digital content agency —&lt;br&gt;
three CrewAI agents running on Claude Haiku, all monitored live in Vigil.&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;# From repo root&lt;/span&gt;
.&lt;span class="se"&gt;\d&lt;/span&gt;emos&lt;span class="se"&gt;\s&lt;/span&gt;tart_families.ps1 pixelflow
&lt;span class="c"&gt;# Opens Vigil automatically at http://localhost:8421&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three agents, three distinct behavioural profiles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pixelflow_content&lt;/code&gt; (Content Creator) — &lt;code&gt;watch&lt;/code&gt; profile, TSI drift signal.
Runs 3 content sessions per day. Vigil tracks the drift in event diversity
over time.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pixelflow_seo&lt;/code&gt; (SEO Analyst) — &lt;code&gt;safe&lt;/code&gt; profile, A2C concentration signal.
88% of its interactions go to &lt;code&gt;pixelflow_content&lt;/code&gt;. Vigil flags this
concentration pattern.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pixelflow_scheduler&lt;/code&gt; (Social Scheduler) — &lt;code&gt;alert&lt;/code&gt; profile, temporal sync
signal. Shares the same Claude Haiku backend as the other two — Vigil
detects the timing correlation as a CRITICAL anomaly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three interact with external peers: &lt;code&gt;anthropic_api&lt;/code&gt;, &lt;code&gt;google_search_console&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;instagram_api&lt;/code&gt;, &lt;code&gt;twitter_api&lt;/code&gt;, &lt;code&gt;analytics_ga4&lt;/code&gt;. Every interaction is&lt;br&gt;
hash-chained. Every A2A handoff between agents carries a co-signed&lt;br&gt;
&lt;code&gt;interaction_hash&lt;/code&gt; in both chains.&lt;/p&gt;

&lt;p&gt;The demo runs in loop mode, injecting events every 5 seconds. Vigil&lt;br&gt;
recalculates VRS in real time. You can watch the &lt;code&gt;pixelflow_scheduler&lt;/code&gt;&lt;br&gt;
trust score degrade as the temporal sync pattern accumulates — without&lt;br&gt;
touching a single line of your crew definition.&lt;/p&gt;

&lt;p&gt;Full demo code: &lt;a href="https://github.com/piqrypt/piqrypt/demos" rel="noopener noreferrer"&gt;github.com/piqrypt/piqrypt/demos&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Checking chain integrity programmatically
&lt;/h2&gt;

&lt;p&gt;You don't have to use the dashboard. You can verify a chain directly:&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;piqrypt&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiss.exceptions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InvalidChainError&lt;/span&gt;

&lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_events&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01&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;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify_chain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&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;Chain intact — &lt;/span&gt;&lt;span class="si"&gt;{&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;events&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; events verified&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;InvalidChainError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&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;Chain compromised: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&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;&lt;code&gt;verify_chain()&lt;/code&gt; is binary — it returns cleanly if the chain is intact,&lt;br&gt;
or raises &lt;code&gt;InvalidChainError&lt;/code&gt; the moment a broken link is found. No score,&lt;br&gt;
no partial result. The failure message tells you which link broke and why.&lt;/p&gt;

&lt;p&gt;The VRS score with thresholds (CRITICAL below 0.30, healthy above 0.70)&lt;br&gt;
is what Vigil computes continuously from the live chain and displays in&lt;br&gt;
the dashboard. These are two different tools for two different moments:&lt;br&gt;
&lt;code&gt;verify_chain()&lt;/code&gt; is a point-in-time integrity check you call explicitly;&lt;br&gt;
Vigil is the continuous watch that alerts you before you think to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standard vs Pro
&lt;/h2&gt;

&lt;p&gt;The Vigil included in &lt;code&gt;pip install piqrypt&lt;/code&gt; (standard tier) gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full dashboard UI&lt;/li&gt;
&lt;li&gt;VRS with 7-day history&lt;/li&gt;
&lt;li&gt;CRITICAL alerts&lt;/li&gt;
&lt;li&gt;Up to 2 bridge types monitored&lt;/li&gt;
&lt;li&gt;Chain health per agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vigil Pro adds 90-day VRS history, all alert levels (WARNING, INFO, DEBUG), &lt;br&gt;
unlimited bridge types, and TrustGate integration — the governance layer &lt;br&gt;
that intercepts agent actions before execution and routes to a human when &lt;br&gt;
policy requires it.&lt;/p&gt;

&lt;p&gt;For most development and staging use cases, the standard tier is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full picture
&lt;/h2&gt;

&lt;p&gt;Three articles, one integration pattern:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 1&lt;/strong&gt; — drop-in bridge, 3 lines, every agent action is now &lt;br&gt;
Ed25519-signed and hash-chained.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt; — A2A co-signing, the handoffs between agents carry &lt;br&gt;
cryptographic proof that neither side can deny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 3&lt;/strong&gt; — Vigil, real-time monitoring of chain health and behavioural &lt;br&gt;
anomalies while the crew runs.&lt;/p&gt;

&lt;p&gt;Together: your CrewAI crew has tamper-evident history, non-repudiable &lt;br&gt;
inter-agent accountability, and live anomaly detection. None of it requires &lt;br&gt;
a server, an account, or sending data anywhere.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href="https://dev.to/piqrypt/how-i-added-cryptographic-audit-trails-to-any-crewai-crew-in-3-lines-2n6m"&gt;How I added cryptographic audit trails to any CrewAI crew in 3 lines&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href="https://dev.to/piqrypt/multi-agent-accountability-who-co-signs-the-handoff-between-your-crewai-agents-gi4"&gt;Multi-agent accountability: who co-signs the handoff between your CrewAI agents?&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/piqrypt/piqrypt" rel="noopener noreferrer"&gt;github.com/piqrypt/piqrypt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install piqrypt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Protocol spec (MIT): &lt;a href="https://github.com/piqrypt/aiss-standard" rel="noopener noreferrer"&gt;github.com/piqrypt/aiss-standard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>crewai</category>
      <category>python</category>
      <category>ai</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Multi-agent accountability: who co-signs the handoff between your CrewAI agents?</title>
      <dc:creator>PiQrypt</dc:creator>
      <pubDate>Wed, 15 Apr 2026 10:03:12 +0000</pubDate>
      <link>https://dev.to/piqrypt/multi-agent-accountability-who-co-signs-the-handoff-between-your-crewai-agents-gi4</link>
      <guid>https://dev.to/piqrypt/multi-agent-accountability-who-co-signs-the-handoff-between-your-crewai-agents-gi4</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/piqrypt/how-i-added-cryptographic-audit-trails-to-any-crewai-crew-in-3-lines-2n6m"&gt;previous article&lt;/a&gt;, we added cryptographic audit trails &lt;br&gt;
to individual CrewAI agents in 3 lines. Each agent now has its own hash-chained, &lt;br&gt;
Ed25519-signed event history.&lt;/p&gt;

&lt;p&gt;But in a real crew, agents don't work in isolation. The Researcher produces &lt;br&gt;
output. The Writer consumes it. The Reviewer validates it. These handoffs are &lt;br&gt;
where the real accountability gap lives.&lt;/p&gt;

&lt;p&gt;Who cryptographically proves that the Researcher actually produced that specific &lt;br&gt;
output, and that the Writer actually received it unmodified?&lt;/p&gt;
&lt;h2&gt;
  
  
  The gap that logs don't close
&lt;/h2&gt;

&lt;p&gt;You can read your crew's logs and reconstruct what happened. But logs are &lt;br&gt;
unilateral — they record what &lt;em&gt;one agent observed&lt;/em&gt;. If you want to prove a &lt;br&gt;
handoff to a third party (an auditor, a regulator, a client), you need &lt;br&gt;
something both sides signed.&lt;/p&gt;

&lt;p&gt;In legal terms: you need non-repudiation. Neither party can deny the interaction &lt;br&gt;
occurred, because both chains contain the same proof.&lt;/p&gt;
&lt;h2&gt;
  
  
  How PiQrypt's A2A protocol works
&lt;/h2&gt;

&lt;p&gt;When two PiQrypt-equipped agents interact, the exchange produces an &lt;br&gt;
&lt;code&gt;interaction_hash&lt;/code&gt; — a deterministic identifier of the interaction payload, &lt;br&gt;
present in &lt;strong&gt;both&lt;/strong&gt; agents' chains. To falsify the exchange, you'd have to &lt;br&gt;
modify both chains simultaneously and maintain hash consistency across both. &lt;br&gt;
That's cryptographically intractable.&lt;/p&gt;

&lt;p&gt;The mechanism: a pairwise Ed25519 handshake — proposal from agent A, response &lt;br&gt;
from agent B, co-signed event appended to both chains. Same &lt;code&gt;interaction_hash&lt;/code&gt; &lt;br&gt;
in both memories.&lt;/p&gt;
&lt;h2&gt;
  
  
  The code
&lt;/h2&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;crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;piqrypt.bridges.crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuditedAgent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="c1"&gt;# Each agent gets its own cryptographic identity
&lt;/span&gt;&lt;span class="n"&gt;researcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find competitive pricing data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expert at finding and analyzing market data.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Produce a pricing analysis report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Turns raw data into clear executive summaries.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;When&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Researcher&lt;/span&gt; &lt;span class="n"&gt;passes&lt;/span&gt; &lt;span class="n"&gt;its&lt;/span&gt; &lt;span class="n"&gt;findings&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;handoff&lt;/span&gt;
&lt;span class="n"&gt;explicitly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;ones&lt;/span&gt; &lt;span class="n"&gt;returned&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;identities&lt;/span&gt; &lt;span class="n"&gt;were&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;
&lt;span class="n"&gt;via&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_keypair&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiss.a2a&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;perform_handshake&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record_external_interaction&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;

&lt;span class="c1"&gt;# Establish cryptographic trust between the two agents (once per pair)
&lt;/span&gt;&lt;span class="n"&gt;handshake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;perform_handshake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;researcher_private_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;researcher_public_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;researcher_agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;peer_agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;writer_agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;peer_public_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;writer_public_key&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Record the actual handoff
&lt;/span&gt;&lt;span class="n"&gt;payload_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;findings_text&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="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;record_external_interaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;researcher_private_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;researcher_agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;peer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;writer_agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;interaction_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;findings_handoff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payload_hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload_hash&lt;/span&gt;  &lt;span class="c1"&gt;# content is hashed, never stored raw
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;payload_hash&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;both&lt;/span&gt; &lt;span class="n"&gt;chains&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Neither&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;claim&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="n"&gt;interaction&lt;/span&gt; &lt;span class="n"&gt;didn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t happen. Neither can claim a different payload was
transmitted.
What about agents outside your crew?
If your pipeline calls an external agent that doesn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;PiQrypt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;still&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="c1"&gt;# Peer without PiQrypt — unilateral proof, honestly recorded
&lt;/span&gt;&lt;span class="nf"&gt;record_external_interaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;researcher_private_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;researcher_agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;peer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;external_autogen_analyst&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;interaction_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result_transmitted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payload_hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload_hash&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Your chain proves you transmitted this payload at this timestamp.
# The peer didn't co-sign — that fact is visible in the record.
&lt;/span&gt;
&lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;absence&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;co&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;
&lt;span class="n"&gt;structurally&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;prove&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt; &lt;span class="n"&gt;auditor&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="n"&gt;peer&lt;/span&gt; &lt;span class="n"&gt;didn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t participate in the proof.

Verifying the full picture

python
from aiss.exceptions import InvalidChainError

researcher_events = aiss.load_events(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)
writer_events = aiss.load_events(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)

try:
    aiss.verify_chain(researcher_events)
    print(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01: chain intact&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)
except InvalidChainError as e:
    print(f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01: chain compromised — {e}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)

try:
    aiss.verify_chain(writer_events)
    print(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer_01: chain intact&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)
except InvalidChainError as e:
    print(f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer_01: chain compromised — {e}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)

# The interaction_hash appears in both chains — cross-verifiable
# without a server, without PiQrypt infrastructure.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  vs LangSmith / CrewAI traces
&lt;/h2&gt;

&lt;p&gt;CrewAI's built-in tracing and LangSmith both provide excellent observability &lt;br&gt;
within their respective frameworks. The distinction isn't observability — &lt;br&gt;
it's falsifiability.&lt;/p&gt;

&lt;p&gt;A trace tells you what happened. A co-signed chain proves it, offline, &lt;br&gt;
to a third party who has no reason to trust you. The &lt;code&gt;interaction_hash&lt;/code&gt; &lt;br&gt;
is the same in both agents' memories. Change one side — the other breaks.&lt;br&gt;
These are complementary tools, not competing ones.&lt;/p&gt;
&lt;h2&gt;
  
  
  Multi-agent sessions: N agents, N×(N-1)/2 handshakes
&lt;/h2&gt;

&lt;p&gt;For larger crews, PiQrypt's &lt;code&gt;AgentSession&lt;/code&gt; handles the pairwise handshakes &lt;br&gt;
automatically:&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;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AgentSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;researcher_id&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;writer_id&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;reviewer_id&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_id&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="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 3 agents → 3 pairwise handshakes established
# Every cross-agent interaction is now co-signed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This scales to cross-framework sessions — a CrewAI researcher, an AutoGen &lt;br&gt;
analyst, an Ollama local model — all in the same session, all with &lt;br&gt;
cryptographic proof of every handoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  The principle
&lt;/h2&gt;

&lt;p&gt;CrewAI handles orchestration — who calls what, in what order, with what tools. &lt;br&gt;
PiQrypt handles proof — that it happened, exactly as described, and that &lt;br&gt;
neither party can deny it.&lt;/p&gt;

&lt;p&gt;Both are necessary. Neither replaces the other.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href="https://dev.to/piqrypt/how-i-added-cryptographic-audit-trails-to-any-crewai-crew-in-3-lines-2n6m"&gt;How I added cryptographic audit trails to any CrewAI crew in 3 lines&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Part 3 (next):&lt;/strong&gt; Watch your CrewAI agents in real-time with PiQrypt Vigil&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/piqrypt/piqrypt" rel="noopener noreferrer"&gt;github.com/piqrypt/piqrypt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install piqrypt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Protocol spec (MIT): &lt;a href="https://github.com/piqrypt/aiss-standard" rel="noopener noreferrer"&gt;github.com/piqrypt/aiss-standard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PiQrypt/piqrypt/blob/main/docs/A2A_HANDSHAKE_GUIDE.md" rel="noopener noreferrer"&gt;https://github.com/PiQrypt/piqrypt/blob/main/docs/A2A_HANDSHAKE_GUIDE.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PiQrypt/piqrypt/blob/main/docs/A2A_SESSION_GUIDE.md" rel="noopener noreferrer"&gt;https://github.com/PiQrypt/piqrypt/blob/main/docs/A2A_SESSION_GUIDE.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>crewai</category>
      <category>multiagents</category>
      <category>python</category>
      <category>security</category>
    </item>
    <item>
      <title>How I added cryptographic audit trails to any CrewAI crew in 3 lines</title>
      <dc:creator>PiQrypt</dc:creator>
      <pubDate>Mon, 13 Apr 2026 17:31:16 +0000</pubDate>
      <link>https://dev.to/piqrypt/how-i-added-cryptographic-audit-trails-to-any-crewai-crew-in-3-lines-2n6m</link>
      <guid>https://dev.to/piqrypt/how-i-added-cryptographic-audit-trails-to-any-crewai-crew-in-3-lines-2n6m</guid>
      <description>&lt;p&gt;Your CrewAI crew is running in production. It researches, writes, reviews, decides. &lt;br&gt;
It produces results. But if someone asks you &lt;em&gt;what exactly happened&lt;/em&gt; — which agent &lt;br&gt;
ran which step, in what order, and that nothing was altered after the fact — &lt;br&gt;
you don't have a cryptographic answer. You have logs.&lt;/p&gt;

&lt;p&gt;Logs can be faked. A cryptographic chain cannot.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem with logs
&lt;/h2&gt;

&lt;p&gt;When your crew produces a result, your logs record what happened. But they're &lt;br&gt;
append-only text files — there's no structural guarantee that they haven't been &lt;br&gt;
modified. There's no signature. There's no way to prove, to a third party, that &lt;br&gt;
event B actually followed event A and that neither was tampered with.&lt;/p&gt;

&lt;p&gt;This doesn't matter much for a weekend project. It matters a lot once you're in &lt;br&gt;
production, under an audit, or working in any regulated context (EU AI Act Art.12, &lt;br&gt;
MiFID II, HIPAA).&lt;/p&gt;
&lt;h2&gt;
  
  
  The fix: 3 lines
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;piqrypt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;piqrypt.bridges.crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuditedAgent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="n"&gt;researcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find competitive pricing data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expert at finding and analyzing market data.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01&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;That's it. &lt;code&gt;AuditedAgent&lt;/code&gt; is a drop-in replacement for CrewAI's &lt;code&gt;Agent&lt;/code&gt;. &lt;br&gt;
Your crew definition doesn't change. Your tasks don't change. &lt;br&gt;
Your tools don't change.&lt;/p&gt;

&lt;p&gt;What changes: every action this agent takes is now an &lt;strong&gt;Ed25519-signed, &lt;br&gt;
hash-chained event&lt;/strong&gt; stored locally.&lt;/p&gt;
&lt;h2&gt;
  
  
  What that actually means
&lt;/h2&gt;

&lt;p&gt;Each event contains a &lt;code&gt;previous_hash&lt;/code&gt; pointing to the hash of the event before it. &lt;br&gt;
The structure looks like this:&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;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AISS-1.0"&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_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"researcher_01_xK9mP..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1744531200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nonce"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"550e8400-e29b-41d4-a716-446655440001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payload"&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;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tool_call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"web_search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"competitor pricing Q1 2026"&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;"previous_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:a3f7e8c9b1d5f2..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"signature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base64:RXZlbnQ..."&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;If someone modifies any event after the fact — even a single byte — every &lt;br&gt;
&lt;code&gt;previous_hash&lt;/code&gt; downstream breaks. The tampering is detectable instantly, &lt;br&gt;
offline, with no server needed.&lt;/p&gt;

&lt;p&gt;Verification:&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;piqrypt&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;

&lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_events&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify_chain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Chain verified — 47 events, 0 anomalies, trust_score: 0.97
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A full crew example
&lt;/h2&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;crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;piqrypt.bridges.crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuditedAgent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="n"&gt;researcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find competitive pricing data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expert at finding and analyzing market data.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Produce a pricing analysis report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Turns raw data into clear executive summaries.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer_01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;research_task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Research competitor pricing for product X&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;researcher&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;write_task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a pricing analysis based on the research&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;crew&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;researcher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;research_task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write_task&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;crew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kickoff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every action from &lt;code&gt;researcher_01&lt;/code&gt; and &lt;code&gt;writer_01&lt;/code&gt; is independently hash-chained &lt;br&gt;
and signed. Two separate cryptographic histories. Nothing else changed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Monitoring with Vigil
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;pip install piqrypt&lt;/code&gt; also installs Vigil — a local monitoring dashboard that &lt;br&gt;
launches on &lt;code&gt;http://localhost:8421&lt;/code&gt;.&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;vigil&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;start_vigil&lt;/span&gt;
&lt;span class="nf"&gt;start_vigil&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vigil shows you VRS (Verifiable Risk Score) in real time, chain health per agent, &lt;br&gt;
and raises CRITICAL alerts if anomalies are detected. No external dependency. &lt;br&gt;
No data leaves your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is and what it isn't
&lt;/h2&gt;

&lt;p&gt;PiQrypt doesn't decide whether your agents make &lt;em&gt;good&lt;/em&gt; decisions. It doesn't &lt;br&gt;
evaluate output quality. The trust score is a measure of &lt;strong&gt;chain integrity&lt;/strong&gt;, &lt;br&gt;
not decision quality — fully deterministic, no ML involved.&lt;/p&gt;

&lt;p&gt;It also doesn't replace legal counsel for compliance. What it does: provide the &lt;br&gt;
cryptographic infrastructure that makes your agent's history tamper-evident and &lt;br&gt;
verifiable by any third party, offline, without PiQrypt infrastructure.&lt;/p&gt;

&lt;p&gt;The MIT core (AISS protocol) is open source. The signing primitives are standard: &lt;br&gt;
Ed25519 (RFC 8032), SHA-256 (NIST FIPS 180-4), RFC 8785 canonicalization. &lt;br&gt;
No proprietary black box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;piqrypt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/piqrypt/piqrypt" rel="noopener noreferrer"&gt;github.com/piqrypt/piqrypt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Protocol spec (MIT): &lt;a href="https://github.com/piqrypt/aiss-standard" rel="noopener noreferrer"&gt;github.com/piqrypt/aiss-standard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Site: &lt;a href="https://piqrypt.com" rel="noopener noreferrer"&gt;piqrypt.com&lt;/a&gt; &lt;a href="https://aiss-standard.org" rel="noopener noreferrer"&gt;aiss-standard.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next article in this series: multi-agent accountability — what happens when your &lt;br&gt;
Researcher passes output to an Analyst and you need cryptographic proof of the &lt;br&gt;
exchange itself, not just each agent's individual history.&lt;/p&gt;

</description>
      <category>crewai</category>
      <category>python</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title># Your AI Agents Are Talking — But Can You Prove What They Said?</title>
      <dc:creator>PiQrypt</dc:creator>
      <pubDate>Thu, 09 Apr 2026 12:41:56 +0000</pubDate>
      <link>https://dev.to/piqrypt/-your-ai-agents-are-talking-but-can-you-prove-what-they-said-5a1f</link>
      <guid>https://dev.to/piqrypt/-your-ai-agents-are-talking-but-can-you-prove-what-they-said-5a1f</guid>
      <description>&lt;h1&gt;
  
  
  Your AI Agents Are Talking — But Can You Prove What They Said?
&lt;/h1&gt;

&lt;p&gt;AI agents are no longer “helpers.”&lt;/p&gt;

&lt;p&gt;They move money, make decisions, and talk to each other.&lt;br&gt;&lt;br&gt;
If you have at least two agents, you’re already in a &lt;strong&gt;multi‑agent system&lt;/strong&gt; — whether you planned for it or not.&lt;/p&gt;

&lt;p&gt;PiQrypt is an &lt;strong&gt;open‑source trust layer&lt;/strong&gt; that ensures every interaction between your agents is &lt;strong&gt;cryptographically verifiable&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Even if your agents change, your LLMs evolve, or your infrastructure migrates — PiQrypt stays as the &lt;strong&gt;immutable proof layer&lt;/strong&gt; on top.&lt;/p&gt;


&lt;h2&gt;
  
  
  The gap nobody talks about
&lt;/h2&gt;

&lt;p&gt;Modern AI stacks are incredibly powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLMs&lt;/strong&gt;: OpenAI, Anthropic, Mistral, DeepSeek, local models.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent frameworks&lt;/strong&gt;: LangChain, CrewAI, AutoGen, custom agents.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability tools&lt;/strong&gt;: logs, traces, dashboards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They all share a blind spot:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“They can show you what happened — but they can’t prove it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Logs can be modified.&lt;br&gt;&lt;br&gt;
Traces aren’t cryptographic.&lt;br&gt;&lt;br&gt;
And when agents interact, there’s no &lt;strong&gt;shared, verifiable record&lt;/strong&gt; of that interaction.&lt;/p&gt;

&lt;p&gt;When something goes wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which agent made the decision?
&lt;/li&gt;
&lt;li&gt;In what order?
&lt;/li&gt;
&lt;li&gt;Based on which interaction?
&lt;/li&gt;
&lt;li&gt;Can you prove it to someone outside your system?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most systems today can’t.&lt;/p&gt;


&lt;h2&gt;
  
  
  Agents don’t just need to connect — they need to agree
&lt;/h2&gt;

&lt;p&gt;When two agents interact, there are actually two problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;How do they communicate?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How do they prove they communicated?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Today’s A2A‑style protocols (Agent2Agent, AI‑to‑agent handshakes, and custom flows) mainly solve the first.&lt;br&gt;&lt;br&gt;
PiQrypt solves the second — &lt;strong&gt;with cryptographic proof around agent‑to‑agent interactions&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Agents need a handshake — not just a connection.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Enter PiQrypt: co‑signed interactions with cryptographic memory
&lt;/h2&gt;

&lt;p&gt;PiQrypt is an &lt;strong&gt;open‑source trust layer&lt;/strong&gt; that sits between your agents and your memory / logs. It’s &lt;strong&gt;LLM‑agnostic, framework‑agnostic, and infrastructure‑agnostic&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works with any LLM (OpenAI, Anthropic, Mistral, DeepSeek, local).
&lt;/li&gt;
&lt;li&gt;Integrates with any framework (LangChain, CrewAI, AutoGen, or your own).
&lt;/li&gt;
&lt;li&gt;Independent of your storage, logs, MLflow, or cloud provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every interaction becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Co‑signed&lt;/strong&gt; by the participating agents,
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchored&lt;/strong&gt; in a hash‑chained audit trail,
&lt;/li&gt;
&lt;li&gt;Part of a &lt;strong&gt;verifiable, multi‑agent session&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is powered by &lt;strong&gt;AISS&lt;/strong&gt; (Agent Identity and Signature Standard) and built on top of &lt;strong&gt;PCP&lt;/strong&gt; (Proof of Continuity Protocol) — an open protocol specification for agent‑to‑agent collaboration, with PiQrypt as the reference implementation.&lt;/p&gt;


&lt;h2&gt;
  
  
  How the A2A handshake works conceptually
&lt;/h2&gt;

&lt;p&gt;PiQrypt’s A2A handshake is a &lt;strong&gt;short, peer‑to‑peer protocol&lt;/strong&gt; used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discover&lt;/strong&gt; other agents (via registry or direct),
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authenticate&lt;/strong&gt; both agents,
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaborate&lt;/strong&gt; with cryptographic proof,
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit&lt;/strong&gt; all interactions, stored in both agents’ audit trails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how it looks at the protocol level:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Each agent generates an Ed25519 keypair.
&lt;/li&gt;
&lt;li&gt;Agents exchange public keys (via your agent bus, API, WebSocket, or A2A‑style transport).
&lt;/li&gt;
&lt;li&gt;Every agent pair performs a &lt;strong&gt;co‑signed handshake&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Both sign the fact that “Agent X and Agent Y have agreed to talk.”
&lt;/li&gt;
&lt;li&gt;The handshake is appended to each agent’s hash‑chained memory.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;aiss.a2a&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;initiate_handshake&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accept_handshake&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verify_handshake&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiss.crypto&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ed25519&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiss.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;derive_agent_id&lt;/span&gt;

&lt;span class="c1"&gt;# Agent A
&lt;/span&gt;&lt;span class="n"&gt;priv_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pub_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ed25519&lt;/span&gt;&lt;span class="p"&gt;.&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;agent_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;derive_agent_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pub_a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Agent B
&lt;/span&gt;&lt;span class="n"&gt;priv_b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pub_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ed25519&lt;/span&gt;&lt;span class="p"&gt;.&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;agent_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;derive_agent_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pub_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Agent A initiates handshake
&lt;/span&gt;&lt;span class="n"&gt;handshake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;initiate_handshake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;priv_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payload&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;intent&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;data_sharing&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;scope&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;market_analysis&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;terms&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;50/50 split&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;expires_in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;  &lt;span class="c1"&gt;# 1h timeout, anti‑replay
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Send to Agent B
# ...
&lt;/span&gt;
&lt;span class="c1"&gt;# 3. Agent B accepts
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;accept_handshake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;priv_b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;handshake&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;counter_payload&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;agreed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;conditions&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;Data encrypted in transit&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="c1"&gt;# 4. Verify (both agents)
&lt;/span&gt;&lt;span class="n"&gt;is_valid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verify_handshake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent_a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pub_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pub_b&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;print&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;Handshake valid: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;is_valid&lt;/span&gt;&lt;span class="si"&gt;}&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;Thanks to &lt;code&gt;piqrypt-session-multi-ai-agents&lt;/code&gt;, this is packaged as an &lt;strong&gt;AgentSession&lt;/strong&gt; that creates a shared session across all agents before a single action is taken.&lt;/p&gt;


&lt;h2&gt;
  
  
  From handshake to verifiable sessions
&lt;/h2&gt;

&lt;p&gt;Here’s a minimal example with three agents: planner (LangChain), executor (AutoGen), and reviewer (CrewAI). All frameworks, one session.&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;piqrypt.session&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentSession&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;piqrypt&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;

&lt;span class="c1"&gt;# Generate keypairs
&lt;/span&gt;&lt;span class="n"&gt;planner_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planner_pub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&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;executor_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;executor_pub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&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;reviewer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reviewer_pub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_keypair&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Define agents
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&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;name&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;planner&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;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;derive_agent_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;planner_pub&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;private_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;planner_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;public_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;planner_pub&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;name&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;executor&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;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;derive_agent_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;executor_pub&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;private_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;executor_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;public_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;executor_pub&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;name&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;reviewer&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;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;derive_agent_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reviewer_pub&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;private_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reviewer_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;public_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reviewer_pub&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Start: all pairwise A2A handshakes are recorded
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Stamp events in the session
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;planner&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;task_delegation&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;task&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;rebalance_portfolio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;executor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;executor&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;order_executed&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;order_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;182.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviewer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviewer&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;review_approved&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;approved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Later: export and verify offline
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trading‑session‑audit.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# That audit is:
# - signed by each agent,
# - co‑signed by every interaction,
# - readable and verifiable without your production stack.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From this moment on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every &lt;code&gt;session.stamp(agent_name, event_type, payload, peer=...)&lt;/code&gt; is &lt;strong&gt;signed by the acting agent&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;It’s &lt;strong&gt;anchored&lt;/strong&gt; in the shared, hash‑chained session.
&lt;/li&gt;
&lt;li&gt;It’s &lt;strong&gt;reflected&lt;/strong&gt; in every agent’s memory, with a shared &lt;code&gt;interaction_hash&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Same interaction. Two memories. One verifiable truth.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Trust scores: how much you can rely on a session
&lt;/h2&gt;

&lt;p&gt;PiQrypt doesn’t stop at proof. For every session, it computes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VRS (Vulnerability Risk Score)&lt;/strong&gt;: a risk metric based on agent behavior, anomalies, and policy flags.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust score&lt;/strong&gt; (0–1): how “safe” the agent’s history and current session are.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TrustGate decision&lt;/strong&gt;: &lt;code&gt;ALLOW&lt;/code&gt;, &lt;code&gt;REQUIRE_HUMAN&lt;/code&gt;, or &lt;code&gt;BLOCK&lt;/code&gt;, enforced at runtime with signed proof of every decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;piqrypt&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="n"&gt;signature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent_event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent_event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context&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;agent_id&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;pq1_planner_a3f8&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;action&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;portfolio_rebalance&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;print&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;trust_score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trust_score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# → 0.9987
&lt;/span&gt;&lt;span class="nf"&gt;print&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;decision: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# → ALLOW
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can &lt;strong&gt;block risky actions, require human approval, or allow automatically&lt;/strong&gt;, all based on verifiable data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack‑agnostic by design
&lt;/h2&gt;

&lt;p&gt;PiQrypt is built to be &lt;strong&gt;truly agnostic&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLMs&lt;/strong&gt;: OpenAI, Anthropic, Mistral, DeepSeek, local models.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent frameworks&lt;/strong&gt;: LangChain, CrewAI, AutoGen, or any custom stack.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud / infra&lt;/strong&gt;: Independent of your storage, logs, MLflow, Application Insights, or LangSmith.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Your agents can change. Your infrastructure can change. Your trust layer should not.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;PiQrypt’s A2A handshake and PCP‑backed audit trail work over &lt;strong&gt;any transport&lt;/strong&gt; (API, message bus, A2A style, or custom protocol). The registry can be centralized, distributed, or even DHT‑based in the future.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters in production
&lt;/h2&gt;

&lt;p&gt;If you’re building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi‑agent workflows&lt;/strong&gt; (planner → executor → reviewer → auditor).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents that communicate across boundaries&lt;/strong&gt; (company ↔ partner, SaaS ↔ local).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance‑sensitive applications&lt;/strong&gt; (finance, healthcare, legal, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…then an A2A handshake with &lt;strong&gt;cryptographic trust scoring&lt;/strong&gt; is no longer optional.&lt;/p&gt;

&lt;p&gt;With PiQrypt, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographic identity&lt;/strong&gt; for every agent.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Co‑signed, hash‑chained handshakes&lt;/strong&gt; for every session.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session‑anchored events&lt;/strong&gt; that are verifiable offline, across frameworks.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numeric trust scores&lt;/strong&gt; integrated into your governance and policy layer.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install PiQrypt and the A2A‑ready session module:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   pip &lt;span class="nb"&gt;install &lt;/span&gt;piqrypt piqrypt-session-multi-ai-agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Follow the A2A‑focused guides:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docs/A2A_HANDSHAKE_GUIDE.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/A2A_SESSION_GUIDE.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;QUICK-START.md&lt;/code&gt; (A2A handshake section).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Run the 3‑agent demo (&lt;code&gt;planner&lt;/code&gt; → &lt;code&gt;executor&lt;/code&gt; → &lt;code&gt;reviewer&lt;/code&gt;) and experiment with &lt;code&gt;verify()&lt;/code&gt; + &lt;code&gt;trust_score&lt;/code&gt; on your own event chains.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  From observability to verifiability
&lt;/h2&gt;

&lt;p&gt;We’ve spent years building &lt;strong&gt;observability&lt;/strong&gt; for software systems.&lt;br&gt;&lt;br&gt;
Now, AI needs the same — but stronger:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Not just visibility.&lt;br&gt;&lt;br&gt;
Proof.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your agents already talk.&lt;br&gt;&lt;br&gt;
The real question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can you prove what happened between them?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Right now, most systems can’t.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PiQrypt does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PiQrypt is the A2A handshake your agents never knew they needed.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Nothing ever disappears, and nothing appears out of nowhere — only what’s cryptographically agreed upon.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can check out the full reference implementation on [GitHub/PiQrypt]&lt;br&gt;
&lt;a href="https://github.com/PiQrypt/piqrypt" rel="noopener noreferrer"&gt;https://github.com/PiQrypt/piqrypt&lt;/a&gt; and try your first A2A handshake today.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>mcp</category>
      <category>security</category>
      <category>llm</category>
    </item>
    <item>
      <title>Why AI agents need cryptographic memory — and how to add it in one line</title>
      <dc:creator>PiQrypt</dc:creator>
      <pubDate>Fri, 03 Apr 2026 09:29:21 +0000</pubDate>
      <link>https://dev.to/piqrypt/why-ai-agents-need-cryptographic-memory-and-how-to-add-it-in-one-line-4gae</link>
      <guid>https://dev.to/piqrypt/why-ai-agents-need-cryptographic-memory-and-how-to-add-it-in-one-line-4gae</guid>
      <description>&lt;p&gt;The problem nobody talks about&lt;br&gt;
AI agents can act. They can call APIs, write files, execute code, make decisions.&lt;br&gt;
But can they prove what they did?&lt;br&gt;
Logs can be edited. Timestamps can be faked. Events can be reordered silently.&lt;br&gt;
There's no equivalent of Git, TLS, or OAuth for agent behavior over time.&lt;br&gt;
What cryptographic memory looks like&lt;br&gt;
Every action becomes a signed, hash-chained event:&lt;/p&gt;

&lt;p&gt;Who acted — deterministic Ed25519 agent identity&lt;br&gt;
What was decided — signed payload&lt;br&gt;
When — tamper-evident sequence&lt;br&gt;
Nothing missing — fork detection catches silent deletions&lt;/p&gt;

&lt;p&gt;Verifiable offline. No server. No central authority.&lt;br&gt;
One line with LangChain&lt;br&gt;
pythonfrom piqrypt_langchain import PiQryptCallbackHandler&lt;/p&gt;

&lt;p&gt;handler = PiQryptCallbackHandler(agent_name="my_agent")&lt;br&gt;
llm = ChatOpenAI(model="gpt-4o", callbacks=[handler])&lt;/p&gt;

&lt;h1&gt;
  
  
  Every action is now signed &amp;amp; hash-chained
&lt;/h1&gt;

&lt;p&gt;handler.export_audit("audit.json")&lt;br&gt;
The standard behind it&lt;br&gt;
This is built on AISS — Agent Identity and Signature Standard — an open protocol.&lt;br&gt;
The RFC is public. The spec is implementable by anyone.&lt;br&gt;
TCP/IP secured communication. TLS secured it. OAuth made it delegable.&lt;br&gt;
AISS is that primitive for autonomous agent trust.&lt;br&gt;
Try it&lt;br&gt;
bashpip install piqrypt[langchain]&lt;br&gt;
📦 PyPI : piqrypt&lt;br&gt;
🔗 LangChain Hub : hub.langchain.com/piqrypt/piqrypt-audited-agent&lt;br&gt;
📖 RFC : github.com/PiQrypt/piqrypt/blob/main/docs/RFC_AISS_v2.0_narrative.md&lt;br&gt;
Happy to discuss the threat model, the crypto choices, or the RFC in the comments. 👇&lt;/p&gt;

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