<?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: Emek Can Doğru</title>
    <description>The latest articles on DEV Community by Emek Can Doğru (@dogrucanemekalt).</description>
    <link>https://dev.to/dogrucanemekalt</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%2F4130532%2F0c40f603-a75a-4c36-b21c-311f391f4d66.png</url>
      <title>DEV Community: Emek Can Doğru</title>
      <link>https://dev.to/dogrucanemekalt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dogrucanemekalt"/>
    <language>en</language>
    <item>
      <title>The EU AI Act's logging rule moved to December 2027. The logs did not get easier.</title>
      <dc:creator>Emek Can Doğru</dc:creator>
      <pubDate>Thu, 17 Sep 2026 22:23:22 +0000</pubDate>
      <link>https://dev.to/dogrucanemekalt/the-eu-ai-acts-logging-rule-moved-to-december-2027-the-logs-did-not-get-easier-2eb8</link>
      <guid>https://dev.to/dogrucanemekalt/the-eu-ai-acts-logging-rule-moved-to-december-2027-the-logs-did-not-get-easier-2eb8</guid>
      <description>&lt;p&gt;The Digital Omnibus on AI (Regulation (EU) 2026/1744) was published in the Official Journal on 24 July 2026 and entered into force three days later. The obligations for high-risk AI systems, including record-keeping, now apply from 2 December 2027 for the stand-alone systems in Annex III and from 2 August 2028 for AI built into regulated products. If you read a post this summer that said "August 2026", that date is gone. The rule is not.&lt;/p&gt;

&lt;p&gt;Article 12 of the Act is short. A high-risk system must technically allow the automatic recording of events over its lifetime, and those records must be good enough to trace a situation that turned risky, to support monitoring after the system is on the market, and to follow how the system operates. That is the whole requirement, and it is a requirement about what the system can record, not about what a dashboard shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an agent's logs do not pass this today
&lt;/h2&gt;

&lt;p&gt;Most agent stacks log. Almost none of them keep records. The difference is what is missing from the line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Who asked.&lt;/strong&gt; A log line names a service account, not the agent, its scopes, or the human who was behind it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What was asked.&lt;/strong&gt; The prompt is there, the actual tool call with its arguments often is not, and nothing ties the two together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which rule decided.&lt;/strong&gt; The line says the call ran. It does not say which policy, at which version, allowed it, or why a refused call was refused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happened.&lt;/strong&gt; The result is somewhere else, in another log, with another timestamp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether the line is still the original.&lt;/strong&gt; A text log can be edited, trimmed, or lost, and afterwards nobody can tell.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the logs sit in a vendor's cloud. When the question is asked, the answer belongs to someone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a record needs
&lt;/h2&gt;

&lt;p&gt;We ended up with five parts, and each one answers a question an auditor actually asks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identity and scope.&lt;/strong&gt; The agent connects with a token, and the token names what it may do: read, memory, act, pay, approve, audit. No default token; the gate does not open until this is configured.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The request.&lt;/strong&gt; A hash of the exact call, so the record and the call cannot drift apart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The decision.&lt;/strong&gt; Allow, deny, or wait for a human, with the policy hash and a reason code. A refusal is written the same way as an approval; silence is not a record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The effect.&lt;/strong&gt; After the call runs, an effect row with the result hash, reconciled against the decision that allowed it. &lt;code&gt;audit.explain&lt;/code&gt; reads a decision back with its chain, its signatures and its findings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A signature and a chain.&lt;/strong&gt; Each record is signed, each carries the hash of the one before it, and a copy of the ledger is kept beside the original. &lt;code&gt;verax doctor&lt;/code&gt; says when the copy and the ledger disagree.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How Verax does it
&lt;/h2&gt;

&lt;p&gt;Verax is an open-source MCP server (Apache-2.0) that sits between an agent and its tools. Every tool call passes a policy gate and leaves a signed decision record before anything runs. Every call that ran leaves an effect row that is reconciled against its record afterwards. A call the policy will not decide alone is held until an operator on that machine approves it, from the panel or the command line. The ledger stays on the machine the body runs on, and the record does not leave it.&lt;/p&gt;

&lt;p&gt;A few things we had to build this week to make that hold under load, measured on one laptop with 150 agents over 30 days of synthetic traffic (200,000 decisions), and shipped in 0.1.2: the ledger is cut into pieces of 50,000 rows with a persistent ref index, so a restart reads the open piece and the index rather than every record ever written (1.9 s and 518 MB at 200k with both pieces closed); a day's window costs the day's rows, not the ledger's age; &lt;code&gt;verax doctor&lt;/code&gt; compares the evidence copy and the index to the pieces and says when they disagree. The same release closes six faults an outside review reproduced on the earlier code: parallel calls passing a rate limit, one ref running a tool more than once, a daily spend cap passed by parallel requests, one request approved more than once, a tenant's own memory record hidden by another tenant's, and a retry running on an approval after the token had lost its scope. Each has a guard now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;p&gt;We keep this list on the website and it belongs here too. Today the same system keeps the record and signs it; a separate witness process exists, an independent one does not. There is no tenant boundary. On a single-copy ledger, silence cannot be told from nothing happening. Payloads sit in plaintext. No independent audit has been done. And whether a given deployment meets Article 12 is a conformity question for your assessor, not a claim we make.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;npm install -g @verax-ai/body&lt;/code&gt; (0.1.2, published with provenance from the repository), then &lt;code&gt;verax doctor&lt;/code&gt; names what the body still needs before it listens (Node 22.6 or newer). The entry in the official MCP Registry is &lt;code&gt;io.github.verax-ai/verax&lt;/code&gt;; the code is at &lt;a href="https://github.com/verax-ai/verax" rel="noopener noreferrer"&gt;https://github.com/verax-ai/verax&lt;/a&gt; and the site is &lt;a href="https://verax-ai.com" rel="noopener noreferrer"&gt;https://verax-ai.com&lt;/a&gt;. The free tier is the open-source install; the pilot is how companies run it with us. Questions and disagreements welcome in the comments; the record format is Cedulon's, and it is open too.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>compliance</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
