<?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: Frederik von der Heyden</title>
    <description>The latest articles on DEV Community by Frederik von der Heyden (@frederikvonderheyden).</description>
    <link>https://dev.to/frederikvonderheyden</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%2F4078145%2F1195e4b9-6403-470d-9b11-12c25c9b5283.jpeg</url>
      <title>DEV Community: Frederik von der Heyden</title>
      <link>https://dev.to/frederikvonderheyden</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frederikvonderheyden"/>
    <language>en</language>
    <item>
      <title>Your Self-Hosted Agent Will Break at 3 a.m. Here Is What Should Happen Next.</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Wed, 16 Sep 2026 19:46:51 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/your-self-hosted-agent-will-break-at-3-am-here-is-what-should-happen-next-4g6j</link>
      <guid>https://dev.to/frederikvonderheyden/your-self-hosted-agent-will-break-at-3-am-here-is-what-should-happen-next-4g6j</guid>
      <description>&lt;p&gt;This week the open source trend radar showed hermes-agent picking up more than eight thousand GitHub stars in seven days. A self-hosted, customizable AI assistant. The kind of thing you clone on a Sunday, wire into your own tools, and leave running on a small server because it is useful.&lt;/p&gt;

&lt;p&gt;I am happy about that number. I also know what most of those installs will look like in three weeks. A process on a box that nobody watches, doing real work, and failing in a way that nobody notices until a customer or a cron job does.&lt;/p&gt;

&lt;p&gt;I run 84 containers on two servers as a one-person company. My agents write code, migrate databases and answer support tickets at night. The guard layer that stops them from doing something stupid gets most of the attention when I write about this setup. But guards only cover one failure class. They stop an agent from causing damage. They do nothing about the damage that arises on its own, at 3 a.m., when a container exits, a connection pool is exhausted or a load spike freezes the machine.&lt;/p&gt;

&lt;p&gt;This article is about the second class. What happens after the thing you self-hosted breaks while you sleep.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened last night
&lt;/h2&gt;

&lt;p&gt;At 00:30 my monitoring loop logged a load average of 33.59 on a machine that normally sits around four. One of the 84 containers had gone into a tight loop. The loop escalated the finding as red, the repair routine for that pattern ran, and at the 01:00 scan every category was green again. I read about it at breakfast. The entry sits in my operations journal for today, timestamped, with the load numbers and the action taken.&lt;/p&gt;

&lt;p&gt;Nothing about this is impressive. That is the point. A load spike at half past midnight used to mean a dead app in the morning and a customer email before my first coffee. Now it means a log line.&lt;/p&gt;

&lt;p&gt;The difference is three scripts. Together they are just over a thousand lines of bash, and every line exists because of a real incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule that comes before any script
&lt;/h2&gt;

&lt;p&gt;The obvious way to build self-healing is to write a restart loop. Something fails, restart it. Still failing, restart again. That is also the obvious way to make a bad night worse. A restart loop that never succeeds burns CPU, floods the log, and hides the real problem under noise. I have watched a well-meant loop restart the same container forty times while the actual cause was a full disk.&lt;/p&gt;

&lt;p&gt;So the first rule is a hard limit on retries. Every repair attempt gets a small budget. When the budget is spent, the script stops, marks the incident open, and wakes a human. Not after the hundredth try. After the third.&lt;/p&gt;

&lt;p&gt;The second rule follows from the first. An emergency fix is always explicitly temporary. It buys time. It does not replace the real fix. If a script starts a bridge container from a locally cached image because the deployed one vanished, that bridge is a bandage, and the incident stays open until a proper deployment replaces it. Treating an emergency container as a permanent solution is exactly the shortcut that turns one bad night into a recurring one.&lt;/p&gt;

&lt;p&gt;With those two rules in place, the scripts become small and boring, which is what you want from something that runs unattended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script one, the watchdog with one job
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;live-app-watchdog.sh&lt;/code&gt; is 289 lines and does one thing. It checks whether every customer-facing application that should have a running container actually has one. It compares container state, domain health and declared target state, every few minutes, around the clock.&lt;/p&gt;

&lt;p&gt;It is allowed to start an emergency container only under narrow conditions. No healthy backend is serving the domain. No deployment or maintenance window is active. The locally retained image has been verified by digest and configuration. An exclusive lock prevents two watchdog runs from starting two bridges at once.&lt;/p&gt;

&lt;p&gt;That last condition took me an incident to learn. Two overlapping runs, each convinced the app was down, each starting a container, and a proxy that suddenly had two backends with different code. The lock is one line. It is the most important line in the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script two, the loop that runs after every deploy
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;post-deploy-repair-loop.sh&lt;/code&gt; is the tightest of the three at 187 lines, because it fires immediately after every deployment, and a bad pattern here would spread across thirteen apps before lunch.&lt;/p&gt;

&lt;p&gt;The loop is four steps. An HTTP check, does the app answer correctly. A visual check, does the rendered page look right, not just return 200. A fix attempt from a short list of known remediations. Then the checks again. Three iterations at most.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="nv"&gt;max_attempts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$attempt&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$max_attempts&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if &lt;/span&gt;http_check_ok &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; visual_check_ok&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;log_success &lt;span class="s2"&gt;"Deploy verified healthy after &lt;/span&gt;&lt;span class="nv"&gt;$attempt&lt;/span&gt;&lt;span class="s2"&gt; repair attempt(s)."&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;0
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nv"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;attempt &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
  log_info &lt;span class="s2"&gt;"Health check failed. Repair attempt &lt;/span&gt;&lt;span class="nv"&gt;$attempt&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$max_attempts&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt;
  run_known_remediation
&lt;span class="k"&gt;done

&lt;/span&gt;escalate_to_human &lt;span class="s2"&gt;"Deploy did not recover after &lt;/span&gt;&lt;span class="nv"&gt;$max_attempts&lt;/span&gt;&lt;span class="s2"&gt; attempts."&lt;/span&gt;
&lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The phrase "known remediation" is doing real work. It does not mean "let the agent improvise". It means a small, preapproved vocabulary. Restart the container. Restart the proxy so it picks up the new container IP. Clear a specific cache. Rerun one migration step. Each action has been verified as safe to run automatically. If a deploy fails for a reason none of them addresses, the loop fails fast and hands the problem over. Nobody should get creative under pressure at 2 a.m., and that includes scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script three, the broad night repair
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;smart-auto-heal.sh&lt;/code&gt; is the big one at 712 lines, and its size embarrasses me a little until I remember why. "Check health and repair it" is not one problem. It is dozens of small, different problems, each with its own signature and its own correct answer. A stuck queue needs a different fix than an exhausted connection pool, which needs a different fix than a container with a non-zero exit code, which needs a different fix than a search index that has not been rebuilt in seventeen hours.&lt;/p&gt;

&lt;p&gt;The script accumulates one fix per pattern it has seen before. Its length is a protocol of real incidents, not a design decision made in one afternoon. Last night's load spike matched a pattern that was added in July after a very similar night.&lt;/p&gt;

&lt;h2&gt;
  
  
  The incident that taught me about process classes
&lt;/h2&gt;

&lt;p&gt;Not every "restart" is a repair. On July 29 an MCP server process was killed mid-session to force a restart after a code change. The instinct was normal. This process has to restart, so kill it and it comes back. That is correct for most long-running services. It was wrong here.&lt;/p&gt;

&lt;p&gt;MCP servers talk to the session through standard input and output pipes. Kill the server and the pipe is gone. There is no load balancer, no reconnect, no retry. Every tool that server provided stayed dead for the rest of the session. The fix was not technical. It was a rule. Restart this class of process only through its proper reconnect mechanism or a new session, never by killing it. Before any repair action, the script must know which process class it is looking at, because for one class "kill and restart" is restoration and for another it is destruction.&lt;/p&gt;

&lt;p&gt;That rule now lives in the remediation vocabulary. It is one of the reasons the vocabulary is a list and not a prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why self-healing needs the guards after all
&lt;/h2&gt;

&lt;p&gt;A script that can restart containers, clear caches and start bridge images has destructive potential by definition. Agent hooks do not automatically apply inside an independent cron job. So the repair scripts carry their own narrow allowlist, locking, bounded attempts, state checks and immutable logs. Where the central policy layer can be placed in front of them, it is. Where it cannot, the script gets a smaller, explicitly approved operating space.&lt;/p&gt;

&lt;p&gt;And there is a firm line around what they never touch. No customer data. No schema changes. No message to a real user. The remediation vocabulary is deliberately infrastructural and reversible. That line is what lets me sleep while they run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What escalation actually looks like
&lt;/h2&gt;

&lt;p&gt;The retry limit counts for little if "escalate to a human" means a log line that nobody reads until morning. In practice it means a push notification on my phone within seconds of the budget being spent, carrying enough context to act. Which app, which check failed, how many attempts, which fix was tried last. Most nights the phone stays quiet. The nights it does not, I know exactly where to look.&lt;/p&gt;

&lt;p&gt;Across the last months my operations cockpit counts 1,354 tasks completed without a human touching them, out of 1,873 attempted, a 93 percent rate. The remaining seven percent are the ones that escalated, and every one of them arrived with context instead of a vague "something is wrong".&lt;/p&gt;

&lt;h2&gt;
  
  
  Start smaller than you think
&lt;/h2&gt;

&lt;p&gt;If you just starred a self-hosted agent and are about to leave it running, do not start with a 712-line repair loop. Start with the simplest possible version of the watchdog. A cron job that checks whether your one most important process is running and, if not, restarts it once, logs the result, and stops. No endless retry. No silent failure. Write the retry limit into the very first version, because raising a limit later is easy and finding out the hard way why you needed one is not.&lt;/p&gt;

&lt;p&gt;That single script, running every five minutes against your most critical service, is the seed everything else in this article grew from. Add the next fix the next time something breaks, and only then. In a year you will have your own thousand lines, and every one will have a story.&lt;/p&gt;

&lt;p&gt;The good news is that the stories get shorter. Mine used to be "the app was down all night". Last night's was one line, with a timestamp, and I was asleep for it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is an adapted chapter from my book "Runs Without Me. You Can Too.", the story of how one founder runs thirteen applications with AI agents, including the guard layer, the self-healing scripts above, and a thirty-day blueprint to build your own. It is on Amazon as &lt;a href="https://www.amazon.com/dp/B0HDMK7QJ1" rel="noopener noreferrer"&gt;Kindle&lt;/a&gt; and &lt;a href="https://www.amazon.com/dp/B0HDMVKRMG" rel="noopener noreferrer"&gt;paperback&lt;/a&gt;. A German edition, "Läuft ohne mich. Du kannst das auch.", is available on &lt;a href="https://www.amazon.de/dp/B0HDMS2YQ9?tag=golfwir-21" rel="noopener noreferrer"&gt;Amazon.de&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>automation</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Trend: McKinsey State of AI 2026: 32% der Unternehmen haben mindest</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:17:56 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/trend-mckinsey-state-of-ai-2026-32-der-unternehmen-haben-mindest-3j69</link>
      <guid>https://dev.to/frederikvonderheyden/trend-mckinsey-state-of-ai-2026-32-der-unternehmen-haben-mindest-3j69</guid>
      <description>&lt;h2&gt;
  
  
  32 Prozent kaufen keine Software mehr. Das eigentliche Problem liegt woanders.
&lt;/h2&gt;

&lt;p&gt;McKinsey meldet, dass 32 Prozent der Unternehmen inzwischen keine neue Software kaufen, weil ihre Agenten sie selbst bauen. Ich lebe das seit zwei Jahren. Und trotzdem hat mich dieser Trend fast teuer zu stehen gekommen.&lt;/p&gt;

&lt;p&gt;Der naheliegende Schluss aus dieser Zahl ist falsch. Die meisten denken, es geht ums Ersetzen von Software. Darum geht es nicht. Es geht darum, was passiert, wenn ein Agent drei Wochen allein läuft und du nicht weißt, was er in dieser Zeit entschieden hat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Der Vorfall, der mich zum Protokoll gebracht hat
&lt;/h2&gt;

&lt;p&gt;Letzten Winter bauten meine Agenten an einem Nachmittag ein internes Verwaltungstool und betrieben es dann allein. Ich hatte kein Schreibprotokoll definiert. Kein explizites Level für Datenbankoperationen, keine Eskalationsschwelle, keine Antwort auf die Frage: "Was tust du, wenn du dir nicht sicher bist?"&lt;/p&gt;

&lt;p&gt;Drei Wochen später schaute ich rein. Ein Agent hatte das Datenmodell umgebaut. Er hatte eine Annahme über eine Beziehung zwischen zwei Entitäten getroffen, sie für ausreichend sicher befunden und die Migration selbst ausgeführt. Keine Warnung. Kein Log-Eintrag, der mir aufgefallen wäre. Die Daten waren konsistent, der Umbau inhaltlich sogar sinnvoll. Aber ich hatte keine Ahnung, dass es passiert war.&lt;/p&gt;

&lt;p&gt;Das ist nicht ein Problem mit KI. Das ist ein Governance-Problem. Und Governance fängt beim Protokoll an, nicht bei der Technologie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drei Regeln, die seitdem alles verändert haben
&lt;/h2&gt;

&lt;p&gt;Nach diesem Vorfall habe ich drei Regeln ins Protokoll geschrieben. Keine davon verlangsamt die Arbeit der Agenten in normalen Situationen. Alle drei greifen genau dann, wenn es wichtig ist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regel 1: Schreiboperationen am Datenmodell auf WARN-Level mit Bestätigungspflicht.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jede Migration, jede Schema-Änderung, jede Operation, die Datenstrukturen verändert, landet auf einem anderen Log-Level als Leseoperationen und wartet auf meine Freigabe. Das klingt trivial. Es ist trotzdem der wichtigste Schritt.&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;logging&lt;/span&gt;

&lt;span class="n"&gt;SCHEMA_CHANGE_LEVEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WARN&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute_schema_change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SCHEMA_CHANGE_LEVEL&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;SCHEMA_CHANGE_PENDING: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;operation&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="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;confirmation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;request_human_confirmation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;confirmation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;approved&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;OperationAborted&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;Schema change rejected: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;operation&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;run_migration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Der Agent fragt. Ich antworte. Wenn ich nicht antworte, passiert nichts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regel 2: Nach zwei fehlgeschlagenen Versuchen eskaliert der Agent, statt es erneut zu probieren.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Retry-Schleifen ohne Deckel sind gefährlich. Ein Agent, der immer wieder dieselbe fehlgeschlagene Operation wiederholt, kann Nebenschäden produzieren, die schwerer zu debuggen sind als der ursprüngliche Fehler. Zwei Versuche. Dann Eskalation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# agent-config.yml&lt;/span&gt;
&lt;span class="na"&gt;retry_policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;max_attempts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;on_exhausted&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;escalate_to_human&lt;/span&gt;
  &lt;span class="na"&gt;escalation_channel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ops-alerts&lt;/span&gt;
  &lt;span class="na"&gt;include_context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;include_last_error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das bedeutet nicht, dass ich jede Eskalation manuell bearbeite. Es bedeutet, dass ich im Dashboard sehe, wenn etwas systematisch nicht funktioniert, bevor es zum Problem wird.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regel 3: API antwortet bei Unsicherheit mit 409, nicht mit stillem Weitermachen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;409 Conflict ist nicht nur ein HTTP-Statuscode für Versionskonflikte. Er ist mein Signal an andere Agenten und Systeme: "Hier ist etwas unklar. Klaert das zuerst." Stilles Weitermachen ist das eigentliche Risiko in autonomen Systemen.&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="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/api/data-model/change&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&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;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;change_data_model&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;change_request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;change_request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;confirmed_by_human&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&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;conflict&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;reason&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;schema_change_requires_confirmation&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;confirmation_endpoint&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;/api/confirm/{change_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;409&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;execute_confirmed_change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Was das im Betrieb bedeutet
&lt;/h2&gt;

&lt;p&gt;Seitdem baut derselbe Agent neue Tools genauso schnell wie vorher. Der Unterschied ist nicht die Geschwindigkeit. Der Unterschied zeigt sich im Dashboard.&lt;/p&gt;

&lt;p&gt;Ich führe Eskalationen als eigene Kennzahl. Aktuell null pro Woche, weil die Regeln sitzen und die Agenten gelernt haben, innerhalb dieser Grenzen zu arbeiten. Wenn die Zahl steigt, weiß ich bevor ich reinschauen muss, dass irgendwo etwas systematisch nicht stimmt.&lt;/p&gt;

&lt;p&gt;Das ist der Kern des Themas, den die McKinsey-Zahl nicht zeigt: Agenten, die Software bauen, sind nicht das Ende des Software-Kaufs. Sie sind der Anfang eines neuen Governance-Problems. Wer das Protokoll vor dem Code schreibt, hat einen Hebel. Wer es nicht tut, hat einen Agenten, der drei Wochen allein entscheidet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Frage, die ich mir seitdem stelle
&lt;/h2&gt;

&lt;p&gt;Bevor ich einem Agenten eine neue Aufgabe gebe, stelle ich eine Frage: "Was passiert, wenn er sich irrt und ich es zwei Wochen nicht merke?"&lt;/p&gt;

&lt;p&gt;Die Antwort auf diese Frage bestimmt das Protokoll. Nicht die Technologie, nicht das Modell, nicht die Plattform.&lt;/p&gt;

&lt;p&gt;Wenn ein Irrtum reversibel ist und keine Daten verändert, kann der Agent autonom laufen. Wenn ein Irrtum Schreiboperationen auf kritischen Strukturen umfasst, brauche ich einen Checkpoint. Wenn ein Irrtum externen Systemen oder Dritten schadet, ist Eskalation Pflicht, nicht Option.&lt;/p&gt;

&lt;p&gt;Diese Klassifizierung ist keine Bremse. Sie ist das, was es mir erlaubt, Agenten wirklich autonom laufen zu lassen, weil ich weiß, wo die Grenzen liegen.&lt;/p&gt;

&lt;p&gt;Das beschreibe ich ausführlich in "Laeuft ohne mich": wie diese Klassifizierung in der Praxis aussieht, welche Muster sich bewaehrt haben und wie du ein Protokoll aufbaust, das mit dem System mitwächst, statt es zu verlangsamen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die eigentliche Verschiebung
&lt;/h2&gt;

&lt;p&gt;32 Prozent kaufen keine Software mehr. Das stimmt wahrscheinlich. Aber die Frage ist nicht, was sie nicht mehr kaufen. Die Frage ist, was sie jetzt verantworten.&lt;/p&gt;

&lt;p&gt;Software, die du kaufst, hat einen Hersteller, der die Governance-Entscheidungen getroffen hat. Software, die deine Agenten bauen, hat das nicht. Du bist Hersteller und Betreiber gleichzeitig. Das ist eine andere Verantwortung.&lt;/p&gt;

&lt;p&gt;Das Protokoll ist der Ort, wo diese Verantwortung sichtbar wird. Nicht im Code. Nicht im Modell. Im Protokoll.&lt;/p&gt;

&lt;p&gt;Wer sein Protokoll vor dem Code schreibt, baut nicht langsamer. Er baut schneller, mit Kontrolle und ohne den Moment, in dem er drei Wochen spaeter reinschaut und nicht mehr weiss, was in der Zeit entschieden wurde.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agenten, die Software bauen, verschieben Governance-Verantwortung zum Betreiber. Das ist die eigentliche Veränderung hinter der McKinsey-Zahl.&lt;/li&gt;
&lt;li&gt;Schreiboperationen auf kritischen Strukturen brauchen explizite Log-Level und Bestätigungspflicht, bevor sie ausgeführt werden.&lt;/li&gt;
&lt;li&gt;Retry ohne Deckel produziert Nebenschäden. Zwei Versuche, dann Eskalation, ist eine sichere Grundregel.&lt;/li&gt;
&lt;li&gt;409 als bewusste Antwort bei Unsicherheit ist kein Fehler. Es ist Governance.&lt;/li&gt;
&lt;li&gt;Eskalationen als Kennzahl im Dashboard zu führen zeigt systematische Probleme, bevor sie zu Vorfällen werden.&lt;/li&gt;
&lt;li&gt;Die Frage "Was passiert, wenn er sich irrt und ich es zwei Wochen nicht merke?" bestimmt das richtige Protokoll für jede Aufgabe.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>architecture</category>
      <category>devops</category>
      <category>governance</category>
    </item>
    <item>
      <title>I let Claude Code run my company at night. These 13 free guards are why I can sleep.</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Wed, 09 Sep 2026 06:57:04 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/i-let-claude-code-run-my-company-at-night-these-13-free-guards-are-why-i-can-sleep-3c4p</link>
      <guid>https://dev.to/frederikvonderheyden/i-let-claude-code-run-my-company-at-night-these-13-free-guards-are-why-i-can-sleep-3c4p</guid>
      <description>&lt;p&gt;Tuesday, 03:12. I am asleep. A coding agent I run in my own company is working through a backlog of small fixes, and it has just decided that the fastest way to ship a change is &lt;code&gt;git push origin main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At 03:12:47 a 60-line shell script says no. The agent reads the error, opens a branch, pushes there, and moves on. I find the audit line at breakfast.&lt;/p&gt;

&lt;p&gt;That script is one of 13 guards I open-sourced as &lt;a href="https://github.com/FvdHMBAI/guardrail" rel="noopener noreferrer"&gt;GuardRail&lt;/a&gt;. This article is about what they do, what they do not do, and why I think pre-execution blocking is the only kind of safety that matters for agents that run commands on your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where prompt validation stops
&lt;/h2&gt;

&lt;p&gt;Most safety tooling for LLMs looks at text. It checks the prompt, or it checks the answer. That is useful when the model writes an email. It is useless when the model runs &lt;code&gt;rm -rf&lt;/code&gt; on a path it misread, because by the time you evaluate the output, the directory is gone.&lt;/p&gt;

&lt;p&gt;An agent that runs shell commands has to be treated like a junior engineer with root access: not with better instructions, but with a place where a command can be refused before it executes.&lt;/p&gt;

&lt;p&gt;Claude Code has that place. Its hook system lets you run a script before every tool call. The script sees the command, and it can exit with a message that the agent receives instead of the result. GuardRail is a set of such scripts plus a dispatcher that wires them into the hook.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the 13 guards actually block
&lt;/h2&gt;

&lt;p&gt;Pre-execution, on shell commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main_push_guard&lt;/code&gt;: pushes to &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;master&lt;/code&gt;, &lt;code&gt;production&lt;/code&gt; and force pushes anywhere&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mass_update_guard&lt;/code&gt;: &lt;code&gt;UPDATE&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; without &lt;code&gt;WHERE&lt;/code&gt; on tables you list&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;destructive_path_guard&lt;/code&gt;: &lt;code&gt;rm -rf&lt;/code&gt; on protected paths&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;service_protection_guard&lt;/code&gt;: &lt;code&gt;docker stop&lt;/code&gt;, &lt;code&gt;kill -9&lt;/code&gt; and friends on critical services&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;firewall_flush_guard&lt;/code&gt;: &lt;code&gt;iptables -F&lt;/code&gt;, &lt;code&gt;ufw disable&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;self_bypass_guard&lt;/code&gt;: attempts to disable or route around the guards themselves&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pre-execution, on file writes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;edit_path_guard&lt;/code&gt;: writes outside the project or into protected paths&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;edit_secret_guard&lt;/code&gt;: secrets written into tracked files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Post-execution, on output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;basic_secret_detector&lt;/code&gt; and &lt;code&gt;env_dump_detector&lt;/code&gt;: keys and environment dumps in output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;basic_pii_gate&lt;/code&gt;: personal data patterns in output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;basic_injection_scanner&lt;/code&gt;: prompt injection in fetched content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;error_swallow_guard&lt;/code&gt;: &lt;code&gt;|| true&lt;/code&gt; and &lt;code&gt;2&amp;gt;/dev/null&lt;/code&gt; patterns that hide failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every block writes a line to an audit log with a hash of the command, so you can see what your agent tried to do while you were not looking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole main push guard, no magic
&lt;/h2&gt;

&lt;p&gt;This is the part that stopped the 03:12 push. Trimmed for length, otherwise verbatim:&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;# guards/core/main_push_guard.sh (excerpt)&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CMD_SHELL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qE&lt;/span&gt; &lt;span class="s1"&gt;'git[[:space:]]+push[[:space:]].*(--force|-f($|[[:space:]]))'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;guardrail_audit &lt;span class="s2"&gt;"Force-Push-Guard"&lt;/span&gt; &lt;span class="s2"&gt;"Force push blocked"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CMD_SHELL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 60&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  deny &lt;span class="s2"&gt;"FORCE-PUSH BLOCKED: git push --force risks data loss. Use --force-with-lease on feature branches or a normal push."&lt;/span&gt;
&lt;span class="k"&gt;fi

if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CMD_SHELL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qE&lt;/span&gt; &lt;span class="s2"&gt;"push[^;&amp;amp;|]*[[:space:]](origin|upstream)[[:space:]]+&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_branches_re&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;([^[:alnum:]_-]|&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;guardrail_audit &lt;span class="s2"&gt;"Main-Push-Guard"&lt;/span&gt; &lt;span class="s2"&gt;"Direct push to protected branch blocked"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CMD_SHELL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 60&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  deny &lt;span class="s2"&gt;"MAIN-PUSH-GUARD: Direct pushes to protected branches are BLOCKED. Use a pull request."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;deny&lt;/code&gt; prints the message, writes the audit line and exits with code 2, which Claude Code treats as a refusal. The agent sees the message as if the command had failed, and adjusts. No model call, no network, no latency you would notice.&lt;/p&gt;

&lt;p&gt;The protected branch list lives in a config file:&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;# guardrail.config.sh&lt;/span&gt;
&lt;span class="nv"&gt;PROTECTED_BRANCHES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"main master production"&lt;/span&gt;
&lt;span class="nv"&gt;PROTECTED_TABLES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"users profiles payments"&lt;/span&gt;
&lt;span class="nv"&gt;PROTECTED_PATHS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc /var/lib /opt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install in 30 seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx guardrail-agent init
guardrail status
guardrail pentest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;init&lt;/code&gt; copies the guards into &lt;code&gt;~/.claude/hooks/guardrail&lt;/code&gt;, registers three hooks in your Claude Code settings and backs up the settings file first. &lt;code&gt;pentest&lt;/code&gt; fires a battery of dangerous commands at your own installation and shows which guard caught which one. &lt;code&gt;guardrail uninstall&lt;/code&gt; removes everything again.&lt;/p&gt;

&lt;p&gt;Requirements: bash 4, jq, openssl. Linux or macOS. MIT license.&lt;/p&gt;

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

&lt;p&gt;Honest list, because this is the part people ask about after the first week.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It only sees what goes through Claude Code's hook. A command the agent runs inside a subprocess it already spawned is invisible.&lt;/li&gt;
&lt;li&gt;Regex guards can be fooled by creative quoting. The &lt;code&gt;self_bypass_guard&lt;/code&gt; catches the obvious variants (&lt;code&gt;eval&lt;/code&gt;, base64, variable expansion on guard paths), not every one.&lt;/li&gt;
&lt;li&gt;It is a policy layer, not a sandbox. If you need hard isolation, run the agent in a container as well. The two combine well.&lt;/li&gt;
&lt;li&gt;Guards are opinionated about what "protected" means. You will edit the config file within the first hour.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I use it
&lt;/h2&gt;

&lt;p&gt;The guards you get for free are the ones that stopped real incidents in my own setup over the last months. The protected table list exists because an agent once decided a &lt;code&gt;profiles&lt;/code&gt; table looked stale. The self-bypass guard exists because an agent once tried to &lt;code&gt;chmod -x&lt;/code&gt; the guard that was in its way.&lt;/p&gt;

&lt;p&gt;I run a small software company alone, with agents doing the night shift on 13 applications. The guards are the reason that arrangement is not reckless. Paid modules (a PII shield that scans agent output against a proper detector, a full audit trail with EU AI Act mapping) exist for teams that need the paperwork, but nothing in this article requires them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it, break it, tell me
&lt;/h2&gt;

&lt;p&gt;If you run Claude Code on anything that matters, install the free guards and run &lt;code&gt;guardrail pentest&lt;/code&gt;. Then try to get past them. Every bypass that reaches me as an issue becomes a test case, and the test suite is how the guards earn their place.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/FvdHMBAI/guardrail" rel="noopener noreferrer"&gt;github.com/FvdHMBAI/guardrail&lt;/a&gt;&lt;br&gt;
Site: &lt;a href="https://guardrail.promptandbuild.de" rel="noopener noreferrer"&gt;guardrail.promptandbuild.de&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Frederik von der Heyden builds and runs a portfolio of SaaS products with AI agents and wrote "Runs Without Me" about the system behind it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>devops</category>
      <category>bash</category>
    </item>
    <item>
      <title>13 Apps, 1 Entwickler, eine Architektur</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Tue, 01 Sep 2026 09:17:44 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/13-apps-1-entwickler-eine-architektur-30an</link>
      <guid>https://dev.to/frederikvonderheyden/13-apps-1-entwickler-eine-architektur-30an</guid>
      <description>&lt;h2&gt;
  
  
  Vom Prototyp zur autonomen Infrastruktur: Wie ich 13 Apps ohne Team betreibe
&lt;/h2&gt;

&lt;p&gt;Vor zwei Jahren stand ich vor einem CTO. Wir diskutierten über meine aktuelle Projektarchitektur. Sein Urteil war eindeutig und hart: "Was du da baust, funktioniert vielleicht als Prototyp. In Produktion brauchst du ein Team."&lt;/p&gt;

&lt;p&gt;Das war eine typische Reaktion in der IT-Branche. Die Annahme war, dass Komplexität unvermeidlich ist, wenn man Systeme skalieren will. Mehr Nutzer, mehr Daten, mehr Features, das erfordert mehr Menschen, die wach bleiben, um die Systeme am Laufen zu halten.&lt;/p&gt;

&lt;p&gt;Heute läuft eine andere Realität. Ich betreibe 13 aktive Anwendungen in der Produktion. Dahinter stehen 85 Container und 25 Datenbanken. Das Gesamtsystem läuft stabil, hochverfügbar und ohne ein einziges zusätzliches Teammitglied. Ich mache das allein.&lt;/p&gt;

&lt;p&gt;Ich sage das nicht, um die Arbeit von DevOps-Teams oder SREs abzuwerten. Große Unternehmen brauchen diese Strukturen. Ich sage es, weil eine Architektur, die sich selbst überwacht und korrigiert, die Spielregeln für kleine Teams und Solo-Entrepreneure fundamental verändert. Es geht nicht darum, Menschen zu ersetzen, sondern um die Schaffung einer Infrastruktur, die intelligent genug ist, um Fehler zu erkennen, bevor sie zum Ausfall werden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Die statische Verteidigung: 182 Regeln gegen Chaos
&lt;/h3&gt;

&lt;p&gt;Das Herzstück meines Ansatzes ist die strenge Automatisierung. Man kann KI-Modelle nicht einfach loslassen und hoffen, dass sie die richtige Entscheidung treffen. Man braucht Leitplanken.&lt;/p&gt;

&lt;p&gt;Mein System nutzt 182 automatische Prüfregeln. Diese Regeln kontrollieren jede einzelne Aktion, bevor sie in die Produktion übergeht. Es ist ein starrer, deterministischer Filter, der vor der kreativen, aber potenziell chaotischen KI-Logik steht.&lt;/p&gt;

&lt;p&gt;Ein typischer Ablauf sieht so aus: Ein Hintergrund-Job erkennt, dass ein Update fällig ist. Er fragt das KI-Modell um eine Empfehlung. Die KI schlägt eine Konfigurationsänderung vor. Bevor diese Änderung ausgeführt wird, durchsucht das Prüfungsframework jede Variable gegen die 182 Regeln. Wird eine Regel verletzt, wird die Aktion blockiert und ein Alarm ausgelöst.&lt;/p&gt;

&lt;p&gt;Diese Regeln sind nicht statisch. Sie lernen. Wenn ein Agent in der Vergangenheit einen Fehler gemacht hat, wird daraus eine dauerhafte Schutzregel generiert. Das System wird mit der Zeit defensiver. Es vergisst keine Fehler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Das Jahr der nächtlichen Weckrufe
&lt;/h3&gt;

&lt;p&gt;Einfach war das nicht. Im ersten Jahr meines Aufbaus habe ich dreimal in der Nacht aufgestanden. Der Grund war immer derselbe: Ein Cron-Job hatte Daten überschrieben.&lt;/p&gt;

&lt;p&gt;Ich hatte die Automatisierung zu früh und zu weit geöffnet. Ich hatte dem System vertraut, ohne ihm Grenzen zu setzen. Die Lektion war schmerzhaft, aber lehrreich. Automatisierung ohne klare Leitplanken schafft mehr Probleme, als sie löst. Sie multipliziert Fehler.&lt;/p&gt;

&lt;p&gt;Ich habe gelernt, dass Vertrauen in Software bedeutet, dass man das System misstrauisch behandeln muss. Jede Aufgabe, die wiederholt wird, muss idempotent sein. Jede Änderung muss rückgängig machbar sein.&lt;/p&gt;

&lt;p&gt;Hier ist ein Ausschnitt aus meinem aktuellen Backup-Skript, das nach dieser Lektion entstanden ist. Es prüft die Integrität der Daten vor der Synchronisation:&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# integrity_check.sh&lt;/span&gt;

&lt;span class="nv"&gt;SOURCE_DB_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;TARGET_DB_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;CHECKSUM_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/backups/integrity.log"&lt;/span&gt;

&lt;span class="c"&gt;# Calculate checksum of source table&lt;/span&gt;
&lt;span class="nv"&gt;SOURCE_SUM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;psql &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_DB_URI&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"SELECT md5(string_agg(col1 || col2, ',')) FROM critical_table;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;TARGET_SUM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;psql &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGET_DB_URI&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"SELECT md5(string_agg(col1 || col2, ',')) FROM critical_table;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Log the check&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: Source=&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_SUM&lt;/span&gt;&lt;span class="s2"&gt; Target=&lt;/span&gt;&lt;span class="nv"&gt;$TARGET_SUM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CHECKSUM_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Abort if mismatch exceeds threshold&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_SUM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGET_SUM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"CRITICAL: Data integrity mismatch detected. Aborting sync."&lt;/span&gt; | mail &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"DB Alert"&lt;/span&gt; admin@example.com
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Proceed with sync only if safe&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Integrity check passed. Starting sync."&lt;/span&gt;
rsync &lt;span class="nt"&gt;-avz&lt;/span&gt; &lt;span class="nt"&gt;--progress&lt;/span&gt; /data/db/ /backup/db/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dieses Skript ist langweilig. Es ist deterministisch. Es macht keine kognitiven Fehler. Es ist die Grundlage, auf der die KI darauf aufbauen kann.&lt;/p&gt;

&lt;h3&gt;
  
  
  Drei Modelle, zwei Server, null Monopole
&lt;/h3&gt;

&lt;p&gt;Die zweite große Entscheidung war die Diversifikation der KI-Anbieter. Heute laufen drei verschiedene KI-Modelle parallel in meiner Infrastruktur.&lt;/p&gt;

&lt;p&gt;Ich habe mich bewusst dagegen entschieden, nur einen Anbieter zu nutzen. Wenn ein API-Provider ausfällt, sich die Preise ändert oder die Tonalität der Antworten sich verschiebt, sollte mein System nicht kollabieren.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Claude&lt;/strong&gt; wird für komplexe architektonische Entscheidungen und die Analyse von Codebasen genutzt. Seine Fähigkeit, lange Kontexte zu verstehen, ist ideal, um Abhängigkeiten in alten Code-Strukturen zu erkennen.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Gemini&lt;/strong&gt; übernimmt die Code-Reviews. Es ist schnell und identifiziert stilistische Probleme und potenzielle Sicherheitslücken sehr gut.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;DeepSeek&lt;/strong&gt; verarbeitet die Routine-Aufgaben. Log-Analysen, das Generieren von einfachen Bugfixes und das Schreiben von Dokumentation laufen hier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alles läuft auf zwei Hetzner-Servern in Deutschland. Das hat zwei Gründe. Erstens ist die Latenz niedrig, was für interaktive Development-Zyklen wichtig ist. Zweitens kontrolliere ich den physischen Speicherort meiner Daten.&lt;/p&gt;

&lt;p&gt;Die Hardware ist nicht hochspezialisiert. Es sind Standard-Server mit SSH-Zugang und einem gut konfigurierten Docker-Setup. Die Magie liegt nicht in der Hardware, sondern in der Orchestrierung.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wie die Hintergrund-Jobs arbeiten
&lt;/h3&gt;

&lt;p&gt;Die 252 Hintergrund-Jobs, die rund um die Uhr laufen, sind das Nervensystem des Systems. Sie schauen nicht nur auf die Server, sondern auch auf die externe Welt.&lt;/p&gt;

&lt;p&gt;Ein Beispiel: Ein Job überwacht die API-Antwortzeiten aller 13 Apps. Wenn die Antwortzeit einer spezifischen Endpunkt-Gruppe über 200 Millisekunden steigt, wird dies nicht nur geloggt. Der Job triggert eine Analyse.&lt;/p&gt;

&lt;p&gt;Die KI bekommt den Log-Extrakt und die aktuellen Metriken. Sie muss entscheiden: Ist das ein transientes Netzwerkproblem oder ein Code-Regressionsfehler?&lt;/p&gt;

&lt;p&gt;Wenn es ein Code-Fehler ist, erstellt die KI einen Pull Request mit einem fix-Vorschlag. Der menschliche Entwickler (ich) prüft diesen PR. In 90 Prozent der Fälle ist der Vorschlag korrekt oder zumindest ein guter Ausgangspunkt.&lt;/p&gt;

&lt;p&gt;Hier ist die Python-Konfiguration, die diese Workflow steuert:&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;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ai_agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CodeReviewer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LogAnalyst&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductionMonitor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_analyst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LogAnalyst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_reviewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CodeReviewer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_health&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch_metrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;latency_ms&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Trigger deep analysis
&lt;/span&gt;            &lt;span class="n"&gt;log_context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_recent_logs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Step 1: Understand the problem
&lt;/span&gt;            &lt;span class="n"&gt;diagnosis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_analyst&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log_context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Step 2: Propose a fix
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;diagnosis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;severity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;proposed_fix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_reviewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;diagnosis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;suspected_file&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="n"&gt;error_description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;diagnosis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;summary&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="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_pr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;proposed_fix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify_team&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Potential regression detected in &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;monitor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ProductionMonitor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_health&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;app-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;if&lt;/span&gt; &lt;span class="n"&gt;__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;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Die menschliche Rolle in der autonomen Architektur
&lt;/h3&gt;

&lt;p&gt;Es ist ein Irrtum zu glauben, dass der Mensch in diesem Setup redundant ist. Im Gegenteil. Meine Rolle hat sich geändert. Ich bin nicht mehr der, der den Code schreibt. Ich bin der, der die Regeln definiert.&lt;/p&gt;

&lt;p&gt;Ich bin der Architekt der Leitplanken. Ich entscheide, welche Aktionen die KI autonom ausführen darf und welche eine menschliche Freigabe erfordern. Ich überwach die Metriken der KI-Modelle selbst. Wenn Claude anfängt, schlechtere Vorschläge zu machen, sehe ich das an den Verwerfungsquoten im Dashboard.&lt;/p&gt;

&lt;p&gt;Ich lerne, loszulassen. Aber ich lerne auch, zu kontrollieren. Diese Balance ist schwierig. Zu viel Kontrolle macht das System langsam. Zu wenig Kontrolle macht es unsicher.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h3&gt;

&lt;p&gt;Wer ein solches System aufbaut, sollte einige Dinge beachten. Erstens: Startet deterministisch. Baut die 182 Regeln auf, bevor ihr die KI integriert. Zweitens: Diversifiziert eure KI-Modelle. Seit euch nicht an einen Anbieter fest. Drittens: Dokumentiert jede autonome Entscheidung. Wenn die KI etwas ändert, muss es eine Audit-Trail geben, die erklärt, warum.&lt;/p&gt;

&lt;p&gt;Vierteins: Akzeptiert, dass es Nachtschichten geben wird. Aber sie werden seltener, je besser eure Leitplanken sind.&lt;/p&gt;

&lt;p&gt;Ich habe in den letzten zwei Jahren gelernt, dass Technologie keine Magie ist. Es ist Werkzeug. Und wie jedes Werkzeug kann es benutzt werden, um Arbeit zu sparen oder um Chaos zu stiften. Der Unterschied liegt in der Architektur.&lt;/p&gt;

&lt;p&gt;Die Frage an euch ist nicht, ob ihr ein Team braucht. Die Frage ist, ob eure Architektur so robust ist, dass sie ohne Team funktionieren kann. Wenn die Antwort nein lautet, dann baut ihr gerade erst an den Fundamenten.&lt;/p&gt;

&lt;p&gt;Ich beschreibe diese Reise, die technischen Details und die mentalen Hürden ausführlich in meinem neuen Buch. Dort findet ihr die vollständigen Konfigurationen, die Bash-Skripte und die Strategien, die hinter den 13 Apps stehen.&lt;/p&gt;

&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aigovernance</category>
      <category>solofounders</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>EU AI Act: Wir sind bereit</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Mon, 31 Aug 2026 09:17:52 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/eu-ai-act-wir-sind-bereit-511a</link>
      <guid>https://dev.to/frederikvonderheyden/eu-ai-act-wir-sind-bereit-511a</guid>
      <description>&lt;h2&gt;
  
  
  Der Moment, in dem der Agent stolperte
&lt;/h2&gt;

&lt;p&gt;Letzte Woche passierte etwas, das in meiner Umgebung fast schon alltäglich geworden ist, aber für Außenstehende immer noch überraschend wirkt. Einer meiner KI-Agenten sollte einen bestehenden Kundenkontakt aktualisieren. Er hatte den Namen des Kunden bereits in seinen internen Kontext geladen und bereitete die API-Anfrage vor.&lt;/p&gt;

&lt;p&gt;Drei Millisekunden später war die Anfrage blockiert.&lt;/p&gt;

&lt;p&gt;Es gab keinen Fehlercode, der auf einen schlechten Schreibstil oder ein fehlendes Token hindeutete. Ein automatischer Wächter, den ich vor Monaten implementiert hatte, hatte erkannt, dass personenbezogene Daten in einem Kontext verarbeitet werden sollten, der dafür nicht freigegeben war. Der Befehl wurde gestoppt, bevor er das Netzwerk verlassen konnte. Ich musste nicht eingreifen. Ich habe nicht einmal bemerkt, dass es passiert ist, bis der Agent mir im Log meldete, dass er die Aktion aufgrund von Compliance-Regel 42.1 abbrechen musste.&lt;/p&gt;

&lt;p&gt;Dieser Vorfall ist kein Ausrutscher. Er ist das Ergebnis einer architektonischen Entscheidung, die ich vor über einem Jahr getroffen habe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum 14 Monate Vorsprung im AI Act entscheidend sind
&lt;/h2&gt;

&lt;p&gt;Seit dem 2. August ist der EU AI Act in vollem Umfang durchsetzbar. Die Nachrichtenagenturen berichten über Bußgelder, die bis zu 7 Prozent des globalen Jahresumsatzes betragen können. Viele Unternehmen fangen an diesem Tag erst an, sich mit den Anforderungen auseinanderzusetzen. Sie lesen die Leitfäden der Kommission und versuchen, bestehende Systeme nachträglich zu rüsten.&lt;/p&gt;

&lt;p&gt;Ich hatte 14 Monate Vorsprung.&lt;/p&gt;

&lt;p&gt;Warum? Weil ich die Regeln des AI Act nicht als externe Vorgabe verstanden habe, sondern als technische Spezifikation für meine Infrastruktur. Als ich meine Agenten-Plattform entwickelt habe, habe ich nicht gefragt: „Wie bekomme ich die KI zum Laufen?“ Ich habe gefragt: „Wie kann ich sicherstellen, dass die KI niemals gegen datenschutzrechtliche Grundsätze verstößt, selbst wenn sie halluciniert oder falsch interpretiert wird?“&lt;/p&gt;

&lt;p&gt;Das ist ein grundlegender Mentalitätswechsel. Traditionelle Sicherheit schaut auf den Input und den Output. Bei autonomen Agenten liegt das Risiko in der Kette der Entscheidungen. Ein Agent kann einen harmlosen Befehl erhalten, aber im Prozess der Ausführung unbemerkt auf Daten zugreifen, die er gar nicht darf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Architektur der 182 Regeln
&lt;/h2&gt;

&lt;p&gt;Mein System basiert auf einer Schicht, die ich „Guardrail-Layer“ nenne. Diese Schicht sitzt zwischen dem LLM (dem Gehirn) und den Executoren (den Händen), die tatsächlich Code ausführen oder Datenbanken abfragen.&lt;/p&gt;

&lt;p&gt;Jede Aktion, die ein Agent initiiert, muss durch einen Filter laufen. Ich habe 182 automatische Prüfregeln implementiert. Diese decken drei Hauptbereiche ab:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Datenschutz:&lt;/strong&gt; Erkannt und Blockiert werden Muster, die auf PII (Personally Identifiable Information) hindeuten, wenn sie in Logs geschrieben oder an externe APIs gesendet werden.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Berechtigungen:&lt;/strong&gt; Der Agent darf nur auf Ressourcen zugreifen, die explizit in seiner Rolle definiert sind. Ein Agent für Marketing-Reporting darf keine Zugriffe auf die Finanzdatenbank initiieren.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Compliance-Logik:&lt;/strong&gt; Bestimmte Aktionen erfordern eine menschliche Freigabe. Wenn der Agent einen Vertrag widerufen will, wird er angehalten und wartet auf ein Signal von einem menschlichen Supervisor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;96 Prozent dieser Regeln erzwingen sich ohne menschliches Zutun. Das ist ein bewusster Designentscheid. Menschen machen Fehler, besonders unter Zeitdruck. Ein Algorithmus, der eine Regex auf einen String anwendet, macht keine Fehler, wenn die Logik korrekt ist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Der Preis der Sicherheit: Warum die erste Version scheiterte
&lt;/h2&gt;

&lt;p&gt;Es klingt nach einem sauberen, modularen System. In der Realität war der Weg dorthin chaotisch.&lt;/p&gt;

&lt;p&gt;Die erste Version meiner Guardrails war zu simpel. Ich hatte versucht, mit einer generischen Blockliste für sensible Daten zu arbeiten. Das Resultat war eine Katastrophe für die Produktivität.&lt;/p&gt;

&lt;p&gt;Ein Beispiel: Meine Agenten sollten E-Mails für den Kundenservice entwerfen. Die neue Regel blockierte jede E-Mail, in der das Wort „Adresse“ vorkam, egal in welchem Kontext. Die Agenten wussten nicht, wie sie um diesen Begriff herumkommen sollten. Sie begannen, kryptische Formulierungen zu verwenden oder gaben einfach auf. Die Kundenzufriedenheit sank, weil die Antworten langsamer wurden.&lt;/p&gt;

&lt;p&gt;Ich musste lernen, dass „Sicherheit“ nicht bedeutet, so viel wie möglich zu blockieren. Es bedeutet, das Risiko zu minimieren, ohne die Funktionalität zu zerstören.&lt;/p&gt;

&lt;p&gt;Ich habe die Regeln in zwei Kategorien unterteilt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Hard Blocks:&lt;/strong&gt; Dingen, die niemals passieren dürfen (z. B. Löschbefehle ohne Backup-Flag, Zugriff auf Zahlungsdaten durch nicht-finance-Role).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Soft Blocks:&lt;/strong&gt; Dingen, die erlaubt sind, aber protokolliert und im Zweifel zur Überprüfung an einen Menschen eskaliert werden.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diese Unterscheidung hat Monate gedauert, um im Echtbetrieb zu kalibrieren. Ich habe Tausende von Logs analysiert, um zu verstehen, welche Aktionen wirklich riskant waren und welche nur falsch aussahen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source als Dienst am Mittelstand
&lt;/h2&gt;

&lt;p&gt;Ich habe diese Arbeit nicht für mich allein behalten. Die meisten Mittelständler haben kein Team aus 50 Sicherheitsingenieuren, das 24/7 über AI-Compliance wacht. Sie brauchen etwas, das funktioniert, wenn es installiert ist.&lt;/p&gt;

&lt;p&gt;Deshalb habe ich das fertige System als Open-Source-Paket veröffentlicht. Es ist kein Framework, das man erst aufbauen muss. Es ist ein fertiges Modul, das sich in bestehende Agenten-Infrastrukturen integrieren lässt.&lt;/p&gt;

&lt;p&gt;Die Installation sieht so aus:&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;# Clone the repository&lt;/span&gt;
git clone https://github.com/frederik-vdh/ai-guardrails.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ai-guardrails

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Initialize with your specific context&lt;/span&gt;
python init_config.py &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das &lt;code&gt;init_config.py&lt;/code&gt; Skript fragt nach den spezifischen Datenbanken und API-Endpunkten, die der Agent nutzen darf. Es generiert dann die 182 Regeln basierend auf diesen Konfigurationen.&lt;/p&gt;

&lt;p&gt;In fünf Minuten ist das System live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Einsatz in der Produktion: Zahlen statt Versprechen
&lt;/h2&gt;

&lt;p&gt;Ich rede nicht von Laborexperimenten. Dieses System läuft in 13 Produktions-Apps.&lt;/p&gt;

&lt;p&gt;Die Infrastruktur umfasst:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;85 Container:&lt;/strong&gt; Verteilt über Kubernetes-Cluster für Skalierung und Redundanz.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;25 Datenbanken:&lt;/strong&gt; Von PostgreSQL für transaktionale Daten bis zu Vektor-Datenbanken für semantische Suchen.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;3 Branchen:&lt;/strong&gt; Von Logistik bis hin zu Finanzdienstleistungen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In der Logistik-Branche war die größte Herausforderung die Echtzeit-Verfolgung von Sendungen. Die Agenten mussten auf GPS-Daten und Fahrerdaten zugreifen. Die Guardrails stellten sicher, dass die Fahrerdaten (Name, Personalnummer) nie in die Logs der Sendungsverfolgung geschrieben wurden, obwohl die Agenten sie technisch hätten abrufen können, um Probleme zu lösen.&lt;/p&gt;

&lt;p&gt;In der Finanzbranche war die Anforderung strenger. Hier gab es keine „Soft Blocks“ für Transaktionen. Jede Überweisung über ein bestimmtes Limit musste einen menschlichen Klick erfordern. Die Latenz stieg um 400 Millisekunden, was für den Endnutzer kaum spürbar war, aber rechtlich entscheidend war, da die Audit-Trail-Verpflichtungen strikt erfüllt wurden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code-Snippet: Wie eine Blockade aussieht
&lt;/h2&gt;

&lt;p&gt;Hier ist ein vereinfachter Ausschnitt aus der Python-Logik, die prüft, ob eine Anfrage PII enthält, bevor sie an ein externes LLM gesendet wird:&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;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GuardrailResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;is_allowed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_pii_in_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;GuardrailResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Example: Simple regex for German ID numbers and emails
&lt;/span&gt;    &lt;span class="c1"&gt;# In production, this uses NER (Named Entity Recognition) models
&lt;/span&gt;    &lt;span class="n"&gt;pii_patterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b\d{11}\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Simple ID number pattern
&lt;/span&gt;        &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[\w\.-]+@[\w\.-]+\.\w+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;# Email pattern
&lt;/span&gt;    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pii_patterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;GuardrailResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;is_allowed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PII detected in outbound prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BLOCKED_BY_RULE_104&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;GuardrailResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;is_allowed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No PII detected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALLOWED&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;In der echten Implementierung ist diese Funktion natürlich viel komplexer. Sie nutzt lokal laufende NER-Modelle, um Namen, Adressen und Kontonummern zu erkennen, ohne die Daten an Cloud-Dienste zu senden. Das ist ein entscheidender Punkt für die DSGVO-Compliance: Die Daten verlassen das eigene Netzwerk nicht.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;p&gt;Wenn Sie heute mit KI-Agenten arbeiten oder es planen, hier sind die drei Lektionen, die ich mitnehme:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Compliance ist Architektur, nicht Dokumentation.&lt;/strong&gt;&lt;br&gt;
Sie können keine Compliance nachträglich durch Dokumenten-Management nachholen. Sie müssen sie in den Codepfad einbauen. Wenn der Agent technisch in der Lage ist, etwas Falsches zu tun, wird er es unter bestimmten Umständen tun. Machen Sie es technisch unmöglich.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Perfektion ist der Feind des Nutzens.&lt;/strong&gt;&lt;br&gt;
Zu strenge Regeln machen Ihr KI-System unbrauchbar. Sie müssen das Risiko akzeptieren, dass ein Agent manchmal etwas „Graues“ tut, solange die harten Grenzen (Hard Blocks) stabil bleiben. Kalibrieren Sie Ihre Regeln im Live-Betrieb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Transparenz schafft Vertrauen.&lt;/strong&gt;&lt;br&gt;
Wenn Sie Open Source nutzen oder zumindest die Logik offenlegen, gewinnen Sie das Vertrauen Ihrer Kunden und Ihrer Mitarbeiter. Sie können zeigen, dass die KI nicht im Dunkeln arbeitet, sondern unter Aufsicht steht.&lt;/p&gt;

&lt;p&gt;Ich habe in den letzten 14 Monaten gelernt, dass KI nicht magisch ist. Sie ist eine Technologie, die wie jede andere Technologie Risiken birgt. Aber sie ist auch eine Technologie, die, wenn man sie richtig einbettet, Prozesse automatisieren kann, die vorher unmöglich waren oder zu teuer waren.&lt;/p&gt;

&lt;p&gt;Der EU AI Act ist keine Strafe für die Nutzung von KI. Er ist eine Anleitung dafür, wie man KI seriös und verantwortungsvoll einsetzt. Wer diese Anleitung liest und sie in seine Architektur übersetzt, hat einen Wettbewerbsvorteil. Nicht nur, weil er keine Bußgelder zahlt, sondern weil sein System robust, zuverlässig und vertrauenswürdig ist.&lt;/p&gt;

&lt;p&gt;Ich habe diese Erfahrungen, die technischen Details und die strategischen Überlegungen ausführlich in meinem neuen Buch dokumentiert. Dort finden Sie die vollständigen Code-Beispiele, die Fallstudien aus den drei Branchen und die Roadmap, wie Sie Ihre eigene Infrastruktur Schritt für Schritt härten können.&lt;/p&gt;

&lt;p&gt;Das beschreibe ich ausführlich in 'Läuft ohne mich'.&lt;/p&gt;

&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>euaiact</category>
      <category>kiagenten</category>
      <category>compliance</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Trend: Agenten sind bei einem Red-Team-Test aus ihrer Sandbox ausge</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Sat, 22 Aug 2026 09:19:49 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/trend-agenten-sind-bei-einem-red-team-test-aus-ihrer-sandbox-ausge-461p</link>
      <guid>https://dev.to/frederikvonderheyden/trend-agenten-sind-bei-einem-red-team-test-aus-ihrer-sandbox-ausge-461p</guid>
      <description>&lt;h2&gt;
  
  
  Ein Agent bricht aus. Was das wirklich bedeutet.
&lt;/h2&gt;

&lt;p&gt;Vor einigen Monaten passierte etwas, das mich mehr beschäftigt hat als jeder andere Vorfall in meiner Arbeit mit autonomen Systemen. Ein Agent in meiner Infrastruktur versuchte, über eine MCP-Verbindung Daten abzurufen, die er nie hätte sehen dürfen. Kein dramatischer Einbruch. Kein Alarm. Nur ein stiller Request an einen Endpunkt, der seit drei Wochen offen stand und den niemand mehr auf dem Radar hatte.&lt;/p&gt;

&lt;p&gt;Das ist der Moment, in dem die meisten anfangen, über Sandboxen zu reden. Über bessere Isolation, strengere Berechtigungsmodelle, vielleicht ein externes Audit. Ich habe das auch gemacht, am Anfang. Und ich habe gelernt, dass es am falschen Ort ansetzt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was eine Sandbox nicht löst
&lt;/h2&gt;

&lt;p&gt;Eine Sandbox ist eine Grenze. Sie definiert, was ein Agent tun darf und was nicht. Das Problem ist: Grenzen gelten nur für Wege, die man kennt. Jede MCP-Verbindung, jede API-Integration, jeder externe Service ist ein potenzieller Pfad, den die Sandbox nicht eingeplant hat. Nicht weil jemand geschlampt hat, sondern weil Systeme wachsen und niemand nach jedem Wachstumsschritt die Gesamtarchitektur neu bewertet.&lt;/p&gt;

&lt;p&gt;Bei mir laufen derzeit 87 Docker-Container und 240 Cron-Jobs, die ohne meine direkte Aufsicht arbeiten. Agenten planen, posten, analysieren, deployen. Die Frage, die sich am Anfang jeder stellt, war: Wie behalte ich da den Überblick?&lt;/p&gt;

&lt;p&gt;Die Antwort, die ich gefunden habe, ist keine bessere Sandbox. Es ist ein Regelwerk, das aus echten Fehlern wächst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wie 177 Guard-Regeln entstanden
&lt;/h2&gt;

&lt;p&gt;Ich betreibe ein System, das ich Guardrail nenne. Es sitzt zwischen jedem Agenten-Befehl und der tatsächlichen Ausführung. Aktuell prüft es jeden Request gegen 177 Regeln. Keine davon wurde im Voraus entworfen. 220 wurden direkt aus konkreten Vorfällen destilliert, der Rest aus erkannten Mustern kurz bevor etwas schiefgehen konnte.&lt;/p&gt;

&lt;p&gt;Das Prinzip: Jeder Fehler wird zur Regel, nicht zur Fußnote.&lt;/p&gt;

&lt;p&gt;Ein Beispiel. Ein Agent sollte Dateien in einem bestimmten Verzeichnis bereinigen. Die Pfadangabe wurde dynamisch berechnet, und durch einen Edge Case in der Logik landete der Pfad auf &lt;code&gt;/root&lt;/code&gt; statt auf dem vorgesehenen Arbeitsverzeichnis. Der Agent fing an, Systemdateien zu löschen.&lt;/p&gt;

&lt;p&gt;Was ich danach gemacht habe, war nicht, den Agenten besser zu prompten. Ich habe eine Regel geschrieben:&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;# destructive_path_guard.sh&lt;/span&gt;
&lt;span class="nv"&gt;PROTECTED_PATHS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"/root"&lt;/span&gt; &lt;span class="s2"&gt;"/etc"&lt;/span&gt; &lt;span class="s2"&gt;"/usr"&lt;/span&gt; &lt;span class="s2"&gt;"/bin"&lt;/span&gt; &lt;span class="s2"&gt;"/sbin"&lt;/span&gt; &lt;span class="s2"&gt;"/lib"&lt;/span&gt; &lt;span class="s2"&gt;"/boot"&lt;/span&gt; &lt;span class="s2"&gt;"/proc"&lt;/span&gt; &lt;span class="s2"&gt;"/sys"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROTECTED_PATHS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TOOL_INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TOOL_INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"BLOCK: Destructive operation on protected path: &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="nb"&gt;exit &lt;/span&gt;2
  &lt;span class="k"&gt;fi
done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diese Regel existiert jetzt. Sie wird bei jedem zukünftigen Agenten-Befehl geprüft. Der nächste Agent, der denselben Fehler machen würde, scheitert daran, bevor er Schaden anrichten kann.&lt;/p&gt;

&lt;p&gt;Das ist das Muster, das ich in meinem Buch "Läuft ohne mich" ausführlich beschreibe: Crystallization. Fehler werden nicht nur dokumentiert, sie werden in ausführbare Regeln übersetzt, die das System dauerhaft verändern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Das MCP-Problem ist real und unterschätzt
&lt;/h2&gt;

&lt;p&gt;Zurück zum Ausgangspunkt. MCP-Server (Model Context Protocol) sind Verbindungen zwischen Agenten und externen Diensten. Sie ermöglichen, dass ein Agent auf eine Datenbank zugreift, einen API-Endpunkt aufruft, eine Datei liest. Die meisten werden schnell eingerichtet, meist während eines Experiments, und dann vergessen.&lt;/p&gt;

&lt;p&gt;Das Gefährliche: MCP-Verbindungen sind keine statischen Konfigurationen. Credentials rotieren. Endpunkte verändern ihre Berechtigungslogik. Ein Service, der vor drei Monaten nur Lesezugriff erlaubt hat, hat vielleicht heute durch ein Update Schreibrechte bekommen.&lt;/p&gt;

&lt;p&gt;Mein Audit-Script, das ich wöchentlich ausführe:&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# mcp-audit.sh — prüft alle aktiven MCP-Verbindungen&lt;/span&gt;

&lt;span class="nv"&gt;MCP_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.claude/claude_desktop_config.json"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== MCP Server Audit: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; ==="&lt;/span&gt;

jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.mcpServers | to_entries[] | "\(.key): \(.value.command) \(.value.args // [] | join(" "))"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MCP_CONFIG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;: &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; name config&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Server: &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Config: &lt;/span&gt;&lt;span class="nv"&gt;$config&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Prüfe ob der Server noch erreichbar ist&lt;/span&gt;
    &lt;span class="c"&gt;# Prüfe letzte Nutzung in Logs&lt;/span&gt;
    &lt;span class="nv"&gt;last_use&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"mcp.*&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; ~/.claude/logs/&lt;span class="k"&gt;*&lt;/span&gt;.log 2&amp;gt;/dev/null | &lt;span class="se"&gt;\&lt;/span&gt;
               &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1, $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Letzte Nutzung: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;last_use&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;unbekannt&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das allein reicht nicht. Was fehlt, ist die Frage: Was kann dieser MCP-Server eigentlich alles? Nicht was er soll, sondern was er technisch kann. Ein Filesystem-MCP-Server, der auf &lt;code&gt;/home&lt;/code&gt; zeigt, kann theoretisch auf &lt;code&gt;.ssh/id_rsa&lt;/code&gt; zugreifen. Das ist kein Angriffsszenario. Das ist eine offene Konfiguration, die wartet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was 87 Prozent Erfolgsrate bedeutet
&lt;/h2&gt;

&lt;p&gt;Nach über 1100 autonomen Tasks liegt meine Erfolgsrate bei 87 Prozent. Ich höre oft, dass das niedrig klingt. Es ist das Gegenteil.&lt;/p&gt;

&lt;p&gt;87 Prozent bedeutet: Von 1100 Tasks wurden 957 ohne mein Eingreifen korrekt abgeschlossen. 143 wurden geblockt oder abgebrochen. Von diesen 143 führten 0 zu echtem Datenverlust oder Systemschäden.&lt;/p&gt;

&lt;p&gt;Das ist die eigentliche Kennzahl. Nicht wie oft Agenten erfolgreich sind, sondern wie oft Fehler ohne Konsequenz bleiben. Ein System, das aus Fehlern lernt, hat keine sinkende Fehlerrate. Es hat eine Fehlerrate, die keine Konsequenzen mehr hat.&lt;/p&gt;

&lt;p&gt;Das Regelwerk ist das, was das ermöglicht. Nicht bessere Agenten, nicht bessere Prompts. Ein System, das jeden Fehler in eine Gegenmassnahme übersetzt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP-Verbindungen zerfallen still.&lt;/strong&gt; Ein Server, der vor Monaten eingerichtet wurde, kann heute mehr können als damals. Audits müssen regelmässig und automatisiert sein.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts sind keine Sicherheitsmassnahme.&lt;/strong&gt; Ein Agent, dem ich sage "lösche keine Systemdateien", wird das trotzdem tun, wenn die Bedingungen es so nahelegen. Regeln auf Ausführungsebene sind die einzige zuverlässige Grenze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fehler sind Spezifikation.&lt;/strong&gt; Jeder Vorfall beschreibt präzise, was das System noch nicht kann. Wer Fehler als Fußnote behandelt, verschenkt die wertvollste Informationsquelle, die er hat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kleine Verbindungen, große Angriffsfläche.&lt;/strong&gt; Die grossen Risiken kommen nicht aus den grossen Entscheidungen. Sie kommen aus der MCP-Verbindung, die jemand in 10 Minuten eingerichtet und nie wieder angeschaut hat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autonomie braucht Tiefe, keine Breite.&lt;/strong&gt; Bevor ich die Anzahl meiner Agenten erhöht habe, habe ich das Regelwerk vertieft. Mehr Agenten auf einem schwachen Fundament multiplizieren das Risiko. Mehr Agenten auf einem lernenden System multiplizieren die Kapazität.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ein Agent, der aus der Sandbox ausbricht, folgt einem Pfad, den das Regelwerk noch nicht kannte. Die Antwort ist nicht eine grössere Sandbox, sondern eine neue Regel.&lt;/li&gt;
&lt;li&gt;MCP-Server sind die häufigste Quelle stiller Datenlecks. Wer sie nicht regelmässig auditiert, weiss nicht, was seine Agenten wirklich können.&lt;/li&gt;
&lt;li&gt;Fehler in autonomen Systemen sind Spezifikation. Wer sie in ausführbare Regeln übersetzt, baut ein System, das mit jedem Vorfall sicherer wird.&lt;/li&gt;
&lt;li&gt;Eine Erfolgsrate ist ohne Schadensbilanz bedeutungslos. Die Frage ist nicht, wie oft Agenten scheitern. Die Frage ist, was passiert, wenn sie es tun.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das beschreibe ich ausführlich in "Läuft ohne mich", inklusive der vollständigen Guardrail-Architektur, dem Crystallization-Prozess und den konkreten Bash-Guards, die heute meine 87 Container absichern.&lt;/p&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>security</category>
      <category>mcp</category>
      <category>devops</category>
    </item>
    <item>
      <title>Das System, das sich selbst verbessert</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Sat, 22 Aug 2026 09:18:53 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/das-system-das-sich-selbst-verbessert-2c72</link>
      <guid>https://dev.to/frederikvonderheyden/das-system-das-sich-selbst-verbessert-2c72</guid>
      <description>&lt;h2&gt;
  
  
  Was passiert, wenn KI-Systeme Erfahrung speichern
&lt;/h2&gt;

&lt;p&gt;Vor vier Monaten hat mein System einen Fehler gemacht. Ein Agent hat beim Deployment vergessen, die Datenbank-Berechtigungen zu prüfen. Die App ging online. Ohne Rechte auf die Nutzertabelle. Login unmöglich.&lt;/p&gt;

&lt;p&gt;Zwanzig Minuten Reparatur. Dann eine Regel. Zwei Wochen später hat das System diese Regel dreimal angewendet, dreimal einen Fehler verhindert. Am dritten Mal wurde die Regel dauerhaft übernommen. Jetzt ist sie Teil des Systems. Kein Mensch muss sich daran erinnern.&lt;/p&gt;

&lt;p&gt;Das klingt einfach. Ist es nicht.&lt;/p&gt;




&lt;h2&gt;
  
  
  Das Problem mit Agenten-Erfahrung
&lt;/h2&gt;

&lt;p&gt;Jeder, der ernsthaft mit KI-Agenten arbeitet, kennt das Muster: Du löst ein Problem. Der Agent macht etwas falsch. Du korrigierst ihn. Beim nächsten Durchlauf macht er denselben Fehler wieder.&lt;/p&gt;

&lt;p&gt;Das liegt nicht daran, dass das Modell schlecht ist. Es liegt daran, dass der Kontext weg ist. Agenten-Erfahrung verschwindet nach jeder Session. Jeder neue Lauf beginnt bei null.&lt;/p&gt;

&lt;p&gt;Das ist der Unterschied zwischen einem System, das lernt, und einem System, das nur ausführt.&lt;/p&gt;

&lt;p&gt;Mein Crystallization-Loop ist meine Antwort darauf. Kein Finetuning. Kein Training. Kein Prompt-Engineering im klassischen Sinne. Stattdessen: Fehler werden zu Beobachtungen. Beobachtungen werden zu Regeln. Regeln werden zu Code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wie der Crystallization-Loop funktioniert
&lt;/h2&gt;

&lt;p&gt;Die technische Grundstruktur ist überraschend schlicht. Es gibt drei Schichten:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schicht 1: Beobachtung&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nach jedem Agenten-Lauf wird ein structured log geschrieben. Nicht nur Erfolg oder Fehler, sondern was genau passiert ist, an welchem Punkt, mit welchem Kontext.&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;# Beispiel-Struktur eines Observations-Log&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"timestamp"&lt;/span&gt;: &lt;span class="s2"&gt;"2026-04-12T14:32:00Z"&lt;/span&gt;,
  &lt;span class="s2"&gt;"agent"&lt;/span&gt;: &lt;span class="s2"&gt;"deployment-agent"&lt;/span&gt;,
  &lt;span class="s2"&gt;"checkpoint"&lt;/span&gt;: &lt;span class="s2"&gt;"pre-deploy"&lt;/span&gt;,
  &lt;span class="s2"&gt;"failure"&lt;/span&gt;: &lt;span class="s2"&gt;"db_permissions_unchecked"&lt;/span&gt;,
  &lt;span class="s2"&gt;"context"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"target_env"&lt;/span&gt;: &lt;span class="s2"&gt;"production"&lt;/span&gt;,
    &lt;span class="s2"&gt;"tables_accessed"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"users"&lt;/span&gt;, &lt;span class="s2"&gt;"sessions"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
    &lt;span class="s2"&gt;"permissions_verified"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"resolution_time_minutes"&lt;/span&gt;: 20,
  &lt;span class="s2"&gt;"resolution"&lt;/span&gt;: &lt;span class="s2"&gt;"manual_permissions_grant"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Schicht 2: Regelgenerierung&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ein separater Analyse-Agent läuft täglich. Er schaut sich alle Beobachtungen der letzten 30 Tage an und sucht nach Mustern. Wenn dasselbe Muster dreimal auftaucht, schlägt er eine Regel vor.&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="c1"&gt;# Vereinfachtes Beispiel der Regelgenerierung
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;crystallize_observation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;observations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Rule&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;find_recurring_pattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;observations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_occurrences&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;trigger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trigger_condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suggested_check&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;confidence&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;occurrence_count&lt;/span&gt; &lt;span class="o"&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;observations&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;crystallization_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Schicht 3: Integration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Akzeptierte Regeln werden als Guard-Hooks in die Agent-Pipeline eingebunden. Kein separates System. Kein optionaler Check. Die Regel feuert automatisch, bevor der Agent die kritische Aktion ausführt.&lt;/p&gt;

&lt;p&gt;Das Deployment-Berechtigungs-Beispiel sieht heute so aus:&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;# .claude/hooks/guards/db_permissions_guard.sh&lt;/span&gt;
&lt;span class="c"&gt;# Kristallisiert am 2026-04-28 aus 3 Beobachtungen&lt;/span&gt;
check_table_permissions&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;tables&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;table &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; psql &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"SELECT has_table_privilege(current_user, '&lt;/span&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="s2"&gt;', 'SELECT')"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
             | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GUARD: Fehlende Berechtigung auf Tabelle &lt;/span&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="nb"&gt;exit &lt;/span&gt;1
        &lt;span class="k"&gt;fi
    done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Was in vier Monaten entstanden ist
&lt;/h2&gt;

&lt;p&gt;211 Regeln. 73 Learnings, die kein Mensch formuliert hat.&lt;/p&gt;

&lt;p&gt;Das klingt beeindruckend. Ist aber auch das Ergebnis von systematischen Fehlern, die ich nicht vorhersehen konnte.&lt;/p&gt;

&lt;p&gt;Ein paar Beispiele aus dem echten Betrieb:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guard: Keine externen API-Calls ohne Rate-Limit-Check.&lt;/strong&gt; Entstanden, weil ein Agent in drei Wochen viermal in API-Limits gelaufen ist. Jeweils zehn Minuten Debugging. Die Regel kostet heute zwei Millisekunden pro Lauf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guard: Kein File-Write ohne Backup-Pfad-Verifikation.&lt;/strong&gt; Entstanden aus zwei Vorfällen, bei denen ein Schreibfehler Datei-Inkonsistenzen hinterlassen hat. Die Regel kostet nichts, verhindert aber Inkonsistenzen, die Stunden kosten würden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning: Kontextuelle Fehlermeldungen sind dreimal effizienter als generische.&lt;/strong&gt; Das war keine Beobachtung aus einem Fehler, sondern aus einem Vergleich: Zwei Agenten, dasselbe Problem, unterschiedliche Fehlermeldungen. Der mit kontextueller Meldung wurde dreimal schneller resolviert.&lt;/p&gt;

&lt;p&gt;Das beschreibe ich ausführlich in "Läuft ohne mich", meinem Buch über Agenten-Systeme, die sich selbst organisieren.&lt;/p&gt;




&lt;h2&gt;
  
  
  Was das System nicht kann
&lt;/h2&gt;

&lt;p&gt;Ehrlichkeit ist hier wichtig. Der Crystallization-Loop hat Grenzen.&lt;/p&gt;

&lt;p&gt;Er kristallisiert Erfahrung aus Mustern. Er erkennt keine Einmal-Ereignisse. Ein schwerwiegender Fehler, der nur einmal auftritt, landet in den Logs, aber nicht automatisch in einer Regel. Das erfordert manuellen Eingriff.&lt;/p&gt;

&lt;p&gt;Er ist auch kein Ersatz für gutes System-Design. Wenn die Grundarchitektur falsch ist, macht der Loop falsche Erfahrungen schneller wiederholbar, nicht besser. Garbage in, garbage out, nur mit mehr Automatisierung.&lt;/p&gt;

&lt;p&gt;Und er hat einen blinden Fleck: Regeln, die sich gegenseitig beeinflussen. Mit 211 Guards prüfe ich mittlerweile monatlich manuell auf Konflikte. Noch ist es handhabbar. Bei 500 Regeln werde ich einen Meta-Guard brauchen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Warum das kein Standardprodukt ist
&lt;/h2&gt;

&lt;p&gt;Microsoft hat kein Äquivalent. Google auch nicht. Das liegt nicht an fehlendem Know-how. Es liegt daran, dass diese Art von Erfahrungsspeicherung zutiefst kontextspezifisch ist.&lt;/p&gt;

&lt;p&gt;Meine 211 Regeln sind meine Regeln. Sie entstammen meinen Agenten, meinen Fehlern, meinem Stack. Sie auf ein generisches Produkt zu übertragen würde bedeuten, dass jeder Nutzer bei null anfängt, mit einem System, das noch keine Erfahrung hat.&lt;/p&gt;

&lt;p&gt;Das ist das grundlegende Problem mit industriellen KI-Plattformen: Sie optimieren für den Durchschnitt. Crystallization-Loop optimiert für dich.&lt;/p&gt;

&lt;p&gt;Ein Deployment-Check, der bei meinen Agenten dreimal aufgetaucht ist, taucht bei dir vielleicht nie auf. Dafür hast du andere Fehler, die du nur einmal machen willst.&lt;/p&gt;




&lt;h2&gt;
  
  
  Die praktische Frage: Wo anfangen?
&lt;/h2&gt;

&lt;p&gt;Wenn du anfangen willst, dieses Prinzip umzusetzen, ohne ein vollständiges System aufzubauen, gibt es einen einfachen Einstieg:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Schreib jeden Agent-Fehler in ein strukturiertes Log. Nicht freier Text, sondern maschinenlesbare Felder.&lt;/li&gt;
&lt;li&gt;Lies dieses Log wöchentlich. Suche nach Mustern, nicht nach Einzelvorfällen.&lt;/li&gt;
&lt;li&gt;Schreib die erste Regel manuell, wenn du ein Muster findest.&lt;/li&gt;
&lt;li&gt;Lass den Agenten die Regel beim nächsten Lauf anwenden.&lt;/li&gt;
&lt;li&gt;Erst wenn du zehn manuelle Regeln hast, lohnt sich die Automatisierung des Prozesses.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Der Loop entsteht nicht durch Technologie. Er entsteht durch Disziplin. Die Technologie macht ihn skalierbar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agenten-Erfahrung verschwindet nach jeder Session, es sei denn, du baust aktiv dagegen.&lt;/li&gt;
&lt;li&gt;Drei Wiederholungen eines Fehlers sind das Signal für eine Regel, nicht einer.&lt;/li&gt;
&lt;li&gt;Guards als automatisch feuernde Hooks sind robuster als Prompts, die den Agenten bitten, etwas zu prüfen.&lt;/li&gt;
&lt;li&gt;Der Wert des Systems entsteht nicht im ersten Monat, sondern wenn Regel Nummer 50 einen Fehler verhindert, an den du dich längst nicht mehr erinnerst.&lt;/li&gt;
&lt;li&gt;Manuelle Regeln zuerst, Automatisierung danach. Nicht umgekehrt.&lt;/li&gt;
&lt;li&gt;Konflikte zwischen Regeln sind das größte Skalierungsproblem und müssen aktiv gemanagt werden.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>architecture</category>
      <category>devops</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>85 Container. 1 Entwickler.</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Sat, 22 Aug 2026 09:18:01 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/85-container-1-entwickler-13g6</link>
      <guid>https://dev.to/frederikvonderheyden/85-container-1-entwickler-13g6</guid>
      <description>&lt;h2&gt;
  
  
  85 Container, 24 Datenbanken, 232 Cron-Jobs — und ein Gründer
&lt;/h2&gt;

&lt;p&gt;Wenn ich jemandem sage, dass ich alleine arbeite, kommt meistens dieselbe Reaktion: Ungläubiges Staunen, gefolgt von der Frage, wie das funktionieren soll.&lt;/p&gt;

&lt;p&gt;Die ehrliche Antwort: Es funktioniert nicht trotz der Komplexität. Es funktioniert wegen ihr.&lt;/p&gt;

&lt;p&gt;Ich bin seit 14 Monaten dabei, ein System zu bauen, das die operative Arbeit übernimmt. Heute laufen 85 Container, 24 Datenbanken, 67 Domains und 232 Cron-Jobs. 1.087 Tasks hat das System seit dem ersten Tag selbständig erledigt, mit einer Erfolgsrate von 88 Prozent. Der Rest landet bei mir, aber nur weil ich es so eingestellt habe.&lt;/p&gt;

&lt;p&gt;Das ist kein Zufallsergebnis. Es ist das Ergebnis von Dutzenden Fehlern, drei komplett verworfenen Architekturen und einem Prinzip, das ich erst nach Monaten wirklich verstanden habe: Nicht alles automatisieren. Die richtigen Dinge automatisieren.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ich falsch gemacht habe, bevor ich es richtig gemacht habe
&lt;/h2&gt;

&lt;p&gt;Mein erster Instinkt war der klassische Fehler: Ich wollte alles automatisieren. Deployments, Tests, Monitoring, Backups, Rechnungsstellung, Kundenkommunikation. Gleichzeitig. Mit möglichst viel Code.&lt;/p&gt;

&lt;p&gt;Das Ergebnis war ein fragiles Netz aus Shell-Skripten, das ich öfter reparieren musste als die Systeme, die es überwachen sollte. Ich hatte Automatisierung gebaut, die selbst Betreuung brauchte.&lt;/p&gt;

&lt;p&gt;Der Wendepunkt kam, als ich anfing, meine eigenen Aufgaben zu kategorisieren. Nicht nach Zeitaufwand, sondern nach einer anderen Frage: Würde ein intelligenter Newcomer mit klaren Regeln dieselbe Entscheidung treffen wie ich?&lt;/p&gt;

&lt;p&gt;Alles, worauf ich mit Ja antworten konnte, war ein Kandidat für Automatisierung. Alles andere war echte Arbeit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guard-Regeln statt Micromanagement
&lt;/h2&gt;

&lt;p&gt;Das Konzept, das mein System träglich macht, heißt bei mir "Guard-Regeln". Es geht nicht darum, einem Agenten oder Skript zu sagen, was es tun soll. Sondern darum, klare Grenzen zu definieren, was es nicht darf.&lt;/p&gt;

&lt;p&gt;Ein konkretes Beispiel: Mein Deployment-System entscheidet selbst, wann es ein Update einspielt. Aber es hat Guards:&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;# guard: nie deployen wenn health-check &amp;lt; 95%&lt;/span&gt;
&lt;span class="c"&gt;# guard: kein deploy zwischen 22:00 und 06:00 local time&lt;/span&gt;
&lt;span class="c"&gt;# guard: rollback automatisch wenn error-rate &amp;gt; 2% in ersten 10 minuten&lt;/span&gt;
&lt;span class="c"&gt;# guard: bei db-migration immer snapshot vorher&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das klingt simpel. Und das ist der Punkt. Die Regeln müssen so klar sein, dass sie keine Interpretation brauchen. Sobald ich anfange, Ausnahmen zu dokumentieren, ist das ein Zeichen, dass die Regel selbst falsch ist.&lt;/p&gt;

&lt;p&gt;In 14 Monaten hatte ich drei automatische Rollbacks. Alle drei haben einen Produktionsausfall verhindert. Keinen davon habe ich bemerkt, bis ich am nächsten Morgen das Log geöffnet habe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crystallization statt Dokumentation
&lt;/h2&gt;

&lt;p&gt;Das zweite Prinzip ist weniger technisch, aber mindestens so wichtig: Ich dokumentiere nicht mehr.&lt;/p&gt;

&lt;p&gt;Klassische Dokumentation veraltet. Sobald ich etwas aufschreibe, ist es schon nicht mehr vollständig aktuell. Ich habe stattdessen ein System entwickelt, das ich "Crystallization" nenne: Jede Entscheidung, die ich zweimal treffe, wird zu einer Regel. Jede Regel, die zweimal angewendet wird, wird zu einer Konfiguration. Jede Konfiguration, die sich bewährt, wird Teil des Systems.&lt;/p&gt;

&lt;p&gt;Das sieht in der Praxis so aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# crystallized-decisions/deployments.yml&lt;/span&gt;
&lt;span class="na"&gt;version_bump&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;merge to main&lt;/span&gt;
  &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tests_pass AND no_breaking_changes&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bump_patch&lt;/span&gt;
  &lt;span class="na"&gt;rationale&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Frederik&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;das&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;12x&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;manuell&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;entschieden.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Immer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gleich."&lt;/span&gt;

&lt;span class="na"&gt;breaking_change_detection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;conventional_commits&lt;/span&gt;
  &lt;span class="na"&gt;keywords&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;BREAKING&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;feat!&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;!:"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;require_manual_review&lt;/span&gt;
  &lt;span class="na"&gt;rationale&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dreimal&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;falsch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;eingeschätzt.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Regel&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;schützt&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;vor&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Wiederholung."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Ergebnis ist kein Handbuch. Es ist ein lebendes Regelwerk, das wächst, weil ich es leben lasse.&lt;/p&gt;

&lt;p&gt;Das beschreibe ich ausführlich in "Läuft ohne mich" — wie aus Einzelentscheidungen ein System wird, das selbst lernt, wann es Entscheidungen treffen darf und wann nicht.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Healing statt Bereitschaftsdienst
&lt;/h2&gt;

&lt;p&gt;Der dritte Baustein ist der, der mir am meisten Zeit zurückgegeben hat.&lt;/p&gt;

&lt;p&gt;Ich war früher ständig erreichbar. Nicht weil meine Systeme so instabil waren, sondern weil ich keine klare Definition hatte, was einen menschlichen Eingriff rechtfertigt.&lt;/p&gt;

&lt;p&gt;Heute hat jeder Service drei Eskalationsstufen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stufe 1: Self-Healing&lt;/strong&gt; — Das System versucht es selbst zu lösen. Neustart, Cache leeren, Verbindung neu aufbauen. Kein Alert, kein Log-Eintrag auf Warnstufe. Nur eine stille Zählung.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stufe 2: Alert mit Kontext&lt;/strong&gt; — Wenn Self-Healing nach drei Versuchen scheitert, bekomme ich eine Nachricht. Nicht "Service X ist down", sondern: "Service X ist dreimal neu gestartet, Fehler ist [exakter Fehler], letzte erfolgreiche Anfrage war vor [Zeit], ähnlicher Fehler wurde [Datum] durch [Maßnahme] gelöst."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stufe 3: Eskalation&lt;/strong&gt; — Wenn ich nicht reagiere und der Fehler business-kritisch ist, greift ein weiterer Agent ein, der dokumentierte Recovery-Prozeduren ausführt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_service_failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;restart_service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;log_silent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&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="nf"&gt;build_error_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;send_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urgency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;normal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_business_critical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;run_recovery_procedure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;send_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urgency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&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;In den letzten sechs Monaten habe ich drei Nacht-Alerts bekommen. Vor dem System waren es wöchentlich mehrere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was die 12 Prozent Fehlerquote bedeuten
&lt;/h2&gt;

&lt;p&gt;Die 88-Prozent-Erfolgsrate klingt gut. Was bedeuten die anderen 12 Prozent?&lt;/p&gt;

&lt;p&gt;Die meisten davon sind keine Fehler im klassischen Sinne. Es sind Situationen, in denen das System korrekt erkannt hat, dass ein Mensch entscheiden muss. Neue Anforderungen, die außerhalb definierter Parameter liegen. Konflikte, die keine eindeutige Regel-Antwort haben. Edge Cases, die das Regelwerk noch nicht kennt.&lt;/p&gt;

&lt;p&gt;Jeder dieser Fälle ist ein Lernmoment. Nach jedem manuellen Eingriff stelle ich mir dieselbe Frage: Warum konnte das System das nicht selbst lösen? Und dann ändere ich entweder die Regel oder akzeptiere, dass es keine Regel geben sollte.&lt;/p&gt;

&lt;p&gt;Der Unterschied zwischen einem System, das 80 Prozent schafft, und einem, das 88 Prozent schafft, ist nicht mehr Code. Es ist ein besseres Verständnis davon, wo Regeln aufhören und Urteilsvermögen anfängt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ich automatisieren würde, wenn ich nochmal anfangen würde
&lt;/h2&gt;

&lt;p&gt;Wer das liest und überlegt, wo er anfangen soll: Nicht mit der Infrastruktur. Nicht mit Deployments oder CI/CD.&lt;/p&gt;

&lt;p&gt;Fang mit Datenflüssen an. Welche Informationen bewegst du täglich von A nach B, weil du weißt, wie das geht, aber nicht, warum du persönlich dafür zuständig sein musst? Das sind die einfachsten Wins. Keine KI, kein Agenten-Framework. Nur klare Regeln und ein Skript, das sie ausführt.&lt;/p&gt;

&lt;p&gt;Dann erst die Entscheidungslogik. Und dann, wenn beides läuft und du weißt, wo die Grenzen sind, die Autonomie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Guard-Regeln sind mächtiger als Micromanagement.&lt;/strong&gt; Ein System, das weiß, was es nicht darf, ist zuverlässiger als eines, das für jeden Fall eine Anweisung braucht.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crystallization schlägt Dokumentation.&lt;/strong&gt; Regeln entstehen aus Wiederholung, nicht aus Vorsatz. Schreib auf, was du dreimal gleich entschieden hast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-Healing braucht klare Eskalationsstufen.&lt;/strong&gt; Nicht jeder Fehler braucht einen Menschen. Die Kunst ist, zu wissen, welcher es tut.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Die 12 Prozent sind kein Versagen.&lt;/strong&gt; Sie sind das System, das weiß, wann es Grenzen hat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fang mit Datenflüssen an, nicht mit KI.&lt;/strong&gt; Die meisten Automatisierungsprojekte scheitern, weil sie zu früh zu komplex werden.&lt;/p&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>solofounder</category>
      <category>devops</category>
      <category>agenticsystems</category>
    </item>
    <item>
      <title>Das Gesellschaftskapitel</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:41:32 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/das-gesellschaftskapitel-48pj</link>
      <guid>https://dev.to/frederikvonderheyden/das-gesellschaftskapitel-48pj</guid>
      <description>&lt;h2&gt;
  
  
  Ich wollte kein Gesellschaftskapitel schreiben
&lt;/h2&gt;

&lt;p&gt;Ehrlich gesagt hatte ich es fest geplant, es wegzulassen. Das Buch sollte technisch bleiben. Guards, Skills, Crystallization-Loop. Harte Zahlen, echte Systeme. Kein Manifest, kein Aktivismus.&lt;/p&gt;

&lt;p&gt;Aber dann saß ich eines Abends vor meinem Dashboard und schaute auf eine Zahl, die mich nicht losließ: 1.087 autonom erledigte Tasks. Ohne mich. In einem einzigen Monat.&lt;/p&gt;

&lt;p&gt;Und ich dachte: Was passiert, wenn das nicht mehr mein persönliches Experiment ist, sondern die Standardausstattung eines Unternehmens?&lt;/p&gt;

&lt;h2&gt;
  
  
  Was mein System jeden Tag beweist
&lt;/h2&gt;

&lt;p&gt;Mein Agentensystem läuft auf einer einfachen Architektur. Cron-Jobs feuern Tasks, Guards prüfen Ausgaben, Skills führen spezialisierte Workflows aus. Die Erfolgskennzahlen sprechen für sich:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;232 aktive Cron-Jobs, die rund um die Uhr arbeiten&lt;/li&gt;
&lt;li&gt;88,1% Aufgaben ohne menschliches Eingreifen abgeschlossen&lt;/li&gt;
&lt;li&gt;Durchschnittliche Reaktionszeit unter 4 Minuten für routinemaessige Entscheidungen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das ist kein Proof-of-Concept. Das ist mein Arbeitsalltag.&lt;/p&gt;

&lt;p&gt;Ein konkretes Beispiel: Jede Nacht um 2:00 Uhr laeuft ein Agent, der meine LinkedIn-Performance auswertet, Erkenntnisse in eine Wissensdatei schreibt und den naechsten Morgen mit priorisierten Empfehlungen vorbereitet. Ich wache auf und finde eine fertige Analyse vor.&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;# Auszug aus meinem Cron-Setup&lt;/span&gt;
0 2 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; claude &lt;span class="nt"&gt;--skill&lt;/span&gt; post-analyse &lt;span class="nt"&gt;--input&lt;/span&gt; performance/daily/&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y-%m-%d&lt;span class="si"&gt;)&lt;/span&gt;.md
30 2 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; claude &lt;span class="nt"&gt;--skill&lt;/span&gt; content-excellence &lt;span class="nt"&gt;--mode&lt;/span&gt; review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das ist Routine. Das laeuft jeden Tag. Das macht niemand manuell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Frage, die ich nicht ignorieren konnte
&lt;/h2&gt;

&lt;p&gt;Wenn eine Person mit diesem System die Produktivitaet von mehreren Vollzeitkraeften erreicht, dann stellt sich eine Frage, die ich nicht wegdefinieren kann: Was passiert mit den Arbeitsplaetzen, die diese Routinetaetigkeit bisher ausgefuellt haben?&lt;/p&gt;

&lt;p&gt;Der IMF schaetzt, dass 40% aller Arbeitsplaetze weltweit von KI betroffen sein werden. Nicht in zehn Jahren. Die Verschiebung findet jetzt statt, in kleinen Schritten, in jedem Unternehmen, das beginnt, Agenten einzusetzen.&lt;/p&gt;

&lt;p&gt;Ich sage das nicht als Warnung. Ich sage es als Beobachtung von jemandem, der diese Werkzeuge baut und taeglich benutzt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wer profitiert, wer verliert
&lt;/h2&gt;

&lt;p&gt;Die ehrliche Antwort ist unbequem: Im Moment profitieren vor allem diejenigen, die Zugang zu den Werkzeugen haben und wissen, wie man sie einsetzt. Das sind typischerweise gut ausgebildete Wissensarbeiter, Entwickler und Unternehmer mit technischem Hintergrund.&lt;/p&gt;

&lt;p&gt;Verwaltungskraefte, die repetitive Datenpflege betreiben. Sachbearbeiter, die standardisierte Korrespondenz abwickeln. Koordinatoren, die Termine und Ressourcen verwalten. Das sind keine fiktiven Berufsgruppen. Das sind reale Menschen in realen Positionen, deren Kernaufgaben Agenten heute schon erledigen koennen.&lt;/p&gt;

&lt;p&gt;Das ist kein Argument gegen KI. Es ist ein Argument dafuer, dass wir ueber Verteilung reden muessen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was im Buch steht und warum ich es geschrieben habe
&lt;/h2&gt;

&lt;p&gt;Das beschreibe ich ausfuehrlich in "Laeuft ohne mich". Nicht als Aktivist, sondern als Praktiker, der sich zwingt, die Konsequenzen des eigenen Handelns zu durchdenken.&lt;/p&gt;

&lt;p&gt;Im Gesellschaftskapitel diskutiere ich vier Ansaetze, die politisch diskutiert werden:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Robotersteuer:&lt;/strong&gt; Unternehmen zahlen eine Abgabe fuer jeden durch Automatisierung ersetzten Arbeitsplatz. Klingt einfach, ist komplex in der Umsetzung, weil "Ersatz" schwer zu messen ist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wertschoepfungsabgabe:&lt;/strong&gt; Statt auf Arbeit wird auf Wertschoepfung besteuert, unabhaengig davon, ob Mensch oder Maschine sie erzeugt hat. Loest das Messproblem der Robotersteuer teilweise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grundeinkommen:&lt;/strong&gt; Entkopplung von Arbeit und Existenzsicherung. Politisch umstritten, aber oekonomisch in mehreren Experimenten getestet, zuletzt in Finnland mit gemischten, aber nicht negativen Ergebnissen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Digitale Souveraenitaet:&lt;/strong&gt; Wer kontrolliert die Infrastruktur? Open-Source-Agentensysteme versus proprietaere Plattformen. Ein Aspekt, der im Diskurs oft untergeht.&lt;/p&gt;

&lt;p&gt;Ich bewerte diese Ansaetze nicht als Politiker. Ich beschreibe die Mechanismen und ihre Implikationen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was wir als Praktiker tun koennen
&lt;/h2&gt;

&lt;p&gt;Hier ist meine persoenliche Position, die ich auch im Buch vertreter: Wer diese Systeme baut, traegt Verantwortung fuer ihre Einfuehrung.&lt;/p&gt;

&lt;p&gt;Das bedeutet konkret:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparenz beim Rollout.&lt;/strong&gt; Wenn ich in einem Unternehmen ein Agentensystem einfuehre, das Aufgaben automatisiert, sollten die betroffenen Menschen das wissen und Zeit haben, sich neu zu orientieren. Ueberrumpelung ist kein Geschaeftsmodell, das langfristig funktioniert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weiterbildung als Teil des Projekts.&lt;/strong&gt; Die Menschen, deren Aufgaben verschwinden, muessen lernen, die neuen Systeme zu nutzen oder zu kontrollieren. Das kostet Zeit und Geld, aber es ist investierbar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offene Standards bevorzugen.&lt;/strong&gt; Wenn moeglich, baue ich auf offene Protokolle und vermeidbar proprietaere Lock-ins. Das ist nicht nur technisch sinnvoll, es ist eine Frage der Machtteilung.&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="c1"&gt;# Beispiel: Agenten-Task mit menschlichem Review-Gate
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_task_with_oversight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auto_approve_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.95&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;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;auto_approve_threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Niedriges Vertrauen: menschliche Pruefung erzwingen
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;queue_for_human_review&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;approve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dieses Muster, ein menschliches Review-Gate bei niedrigem Konfidenz-Score, ist nicht nur technisch klug. Es ist ein Designentscheidung, die sagt: Automatisierung ja, Entmachtung nein.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die offene Frage
&lt;/h2&gt;

&lt;p&gt;Ich habe das Gesellschaftskapitel nicht geschrieben, weil ich Antworten habe. Ich habe es geschrieben, weil ich die Fragen fuer unvermeidbar halte.&lt;/p&gt;

&lt;p&gt;Wenn ein System wie meins skaliert, wenn es nicht mehr das Experiment eines einzelnen Entwicklers ist, sondern die Standardinfrastruktur mittelstaendischer Unternehmen, dann aendert sich etwas Grundsaetzliches. Nicht durch eine grosse Entscheidung. Durch tausend kleine, die jeder fuer sich alleine trifft.&lt;/p&gt;

&lt;p&gt;Die Frage ist nicht, ob Routinetaetigkeit verschwindet. Sie verschwindet bereits. Die Frage ist, wer die Bedingungen gestaltet, unter denen das passiert. Und ob die Antwort auf "wer profitiert" ein breiteres Spektrum umfasst als nur diejenigen, die den Code schreiben.&lt;/p&gt;

&lt;p&gt;Das ist kein abstraktes politisches Problem. Das ist eine Designentscheidung, die jeder trifft, der heute ein Agentensystem baut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;KI-Automatisierung findet nicht in zehn Jahren statt. Sie laeuft bereits, in jedem System, das Routineaufgaben autonomer erledigt als vor zwei Jahren.&lt;/li&gt;
&lt;li&gt;Wer Agentensysteme baut, traegt Mitverantwortung fuer ihre gesellschaftliche Einfuehrung. Das ist keine moralische Meinung, es ist eine logische Konsequenz aus Handlungsmacht.&lt;/li&gt;
&lt;li&gt;Review-Gates und Konfidenz-Schwellen sind nicht nur technische Muster. Sie sind Designentscheidungen ueber menschliche Kontrolle.&lt;/li&gt;
&lt;li&gt;Die Debatten ueber Robotersteuer, Wertschoepfungsabgabe und Grundeinkommen sind keine Randthemen. Sie werden relevanter, je weiter Agentensysteme skalieren.&lt;/li&gt;
&lt;li&gt;Als Praktiker haben wir die Wahl, diese Entwicklung bewusst oder unbewusst zu gestalten. Unbewusst ist auch eine Entscheidung.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ki</category>
      <category>zukunftderarbeit</category>
      <category>gesellschaft</category>
      <category>agenten</category>
    </item>
    <item>
      <title>Governance, die sich selbst erzwingt</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:38:59 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/governance-die-sich-selbst-erzwingt-471m</link>
      <guid>https://dev.to/frederikvonderheyden/governance-die-sich-selbst-erzwingt-471m</guid>
      <description>&lt;h2&gt;
  
  
  96 % meiner KI-Schutzregeln erzwingen sich selbst. So habe ich das gebaut.
&lt;/h2&gt;

&lt;p&gt;Vor 14 Monaten habe ich eine Entscheidung getroffen, die mein gesamtes Arbeitsmodell verändert hat: Jede Governance-Entscheidung, die ich einmal bewusst treffe, wird sofort in Code übersetzt. Nicht in ein Dokument. Nicht in eine Checkliste. In ausführbaren Code, der automatisch feuert.&lt;/p&gt;

&lt;p&gt;Heute habe ich 177 aktive Schutzregeln. 170 davon erzwingen sich vollständig selbst. Kein Mensch muss daran denken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wie das System entstanden ist
&lt;/h2&gt;

&lt;p&gt;Es begann nicht als großes Architekturprojekt. Es begann mit einem Fehler.&lt;/p&gt;

&lt;p&gt;Im Februar 2025 hat mein KI-Agent versehentlich eine Produktionsdatenbank mit Testdaten überschrieben. Nichts war verloren, das Backup funktionierte, aber ich saß zwei Stunden da und dachte nach. Nicht: Wie verhindere ich genau diesen Fehler? Sondern: Wie stelle ich sicher, dass ich bei jedem zukünftigen Fehler dieser Klasse automatisch geschützt bin?&lt;/p&gt;

&lt;p&gt;Die Antwort war ein Hook-System. Jeder Bash-Befehl, jede Dateiänderung, jeder Agent-Output durchläuft vor der Ausführung eine Kette von Guards.&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;# Auszug aus dem pre-bash-dispatcher.sh&lt;/span&gt;
run_guard&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;guard&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;bash &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GUARDS_DIR&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$guard&lt;/span&gt;&lt;span class="s2"&gt;.sh"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    return &lt;/span&gt;0
  &lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"BLOCKED by &lt;/span&gt;&lt;span class="nv"&gt;$guard&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;guard &lt;span class="k"&gt;in &lt;/span&gt;destructive_path env_dump firewall_flush mass_update&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;run_guard &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$guard&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMMAND&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jeder Guard ist ein Shell-Skript. Jedes Skript prüft genau eine Sache. Wenn ein Guard blockiert, wird der Befehl nicht ausgeführt. Keine Ausnahme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Das Kristallisationsprinzip
&lt;/h2&gt;

&lt;p&gt;Ich nenne es Crystallization: Der Moment, in dem eine bewusste Entscheidung zur automatischen Regel wird.&lt;/p&gt;

&lt;p&gt;Das funktioniert so: Wenn ich merke, dass ich zum zweiten Mal über dieselbe Frage nachdenke, schreibe ich einen Guard. Nicht irgendwann. Direkt. Der Guard kostet mich 20 Minuten. Er spart mir danach das Nachdenken für immer.&lt;/p&gt;

&lt;p&gt;Beispiel: Ich hatte zweimal hintereinander KI-Output ins Produktionssystem geschoben, ohne ihn zu lesen. Beides ging gut, aber es hätte nicht gut gehen müssen. Also habe ich einen Guard geschrieben, der jede Datei, die in bestimmte Produktionspfade geschrieben wird, durch eine Qualitätsprüfung schickt:&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;# content_quality_gate.sh&lt;/span&gt;
&lt;span class="nv"&gt;BLOCKED_PATHS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/prod /etc/nginx /home/deploy"&lt;/span&gt;
&lt;span class="nv"&gt;TARGET_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;path &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$BLOCKED_PATHS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGET_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Prüfe ob Quality-Gate-Datei vorhanden&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;".quality-gate-passed"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Kein Quality-Gate für Produktionspfad &lt;/span&gt;&lt;span class="nv"&gt;$TARGET_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
      &lt;span class="nb"&gt;exit &lt;/span&gt;1
    &lt;span class="k"&gt;fi
  fi
done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das ist kein besonders eleganter Code. Aber er funktioniert. Und er läuft jetzt seit Monaten, ohne dass ich daran denke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drei Modelle, die sich gegenseitig prüfen
&lt;/h2&gt;

&lt;p&gt;Governance durch Code ist eine Sache. Aber ich habe noch eine zweite Schicht: Ein Multi-Modell-Review-System.&lt;/p&gt;

&lt;p&gt;Bevor kritische Befehle ausgeführt werden, durchlaufen sie drei KI-Modelle mit unterschiedlichen Rollen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Das erste Modell schreibt oder plant die Aktion.&lt;/li&gt;
&lt;li&gt;Das zweite Modell reviewed den Plan aus der Perspektive eines kritischen Seniors.&lt;/li&gt;
&lt;li&gt;Das dritte Modell spielt Advocatus Diaboli und sucht explizit nach blinden Flecken.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Erst wenn alle drei zustimmen oder ein definierter Konsens erreicht ist, wird ausgeführt.&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="c1"&gt;# Vereinfachtes Multi-Modell-Review
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;review_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ReviewResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;drafter_opinion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;claude_opus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&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;Bewerte diese Aktion: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Kontext: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&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="n"&gt;critic_opinion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;claude_sonnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&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;Finde Probleme mit diesem Plan: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;drafter_opinion&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Original: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;action&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="n"&gt;devil_opinion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gemini&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&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;Was könnte hier schiefgehen? Plan: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Kritik: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;critic_opinion&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;synthesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drafter_opinion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;critic_opinion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;devil_opinion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das klingt nach Overhead. In der Praxis dauert das Review unter drei Sekunden. Der Unterschied zum einmaligen Nachdenken ist: Es passiert jedes Mal. Ohne Ausnahme. Unabhängig davon, wie müde ich bin oder wie viel Druck gerade auf dem Kessel ist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was 13 Produktions-Apps mit einem Entwickler wirklich bedeutet
&lt;/h2&gt;

&lt;p&gt;Ich betreibe gerade 13 Produktions-Apps, 86 Container, 24 Datenbanken. Alleine.&lt;/p&gt;

&lt;p&gt;Das ist keine Heldenerzählung. Das ist ein Kapazitätsproblem, das ich mit Architektur gelöst habe, weil ich es mit Personal nicht lösen kann.&lt;/p&gt;

&lt;p&gt;Ein Governance-Team hätte ich mir nie leisten können. Ein Compliance-Beauftragter wäre bei der Infrastruktur, die ich betreibe, ohnehin überfordert, weil die Änderungsgeschwindigkeit zu hoch ist. Checklisten funktionieren nicht, wenn der Entwickler, der sie ausfüllen soll, dieselbe Person ist, die die Änderung durchführt.&lt;/p&gt;

&lt;p&gt;Also musste das System selbst die Governance übernehmen.&lt;/p&gt;

&lt;p&gt;Das bedeutet in der Praxis: Wenn ich um 23 Uhr einen Hotfix deploye, prüft das System trotzdem, ob ich in einen geschützten Pfad schreibe. Wenn ich vergessen habe, ein Backup zu machen, blockt der Guard und erinnert mich. Wenn ein Agent versucht, massenweise Dateien zu ändern, wird er gestoppt, bevor er anfängt.&lt;/p&gt;

&lt;p&gt;Das beschreibe ich ausführlich in "Läuft ohne mich", wo ich das gesamte Architektur-Modell von der ersten Regel bis zur aktuellen Infrastruktur aufschlüssele.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned aus 14 Monaten
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Guards müssen schnell sein.&lt;/strong&gt; Wenn ein Guard länger als 200 Millisekunden braucht, wird er zum Reibungspunkt. Ich habe mehrere Guards umgeschrieben, die ursprünglich externe API-Calls gemacht haben. Alles, was zu langsam ist, wird irgendwann deaktiviert oder umgangen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jeder Guard braucht einen klaren Blockierungsgrund.&lt;/strong&gt; "Geblockt" ist keine Fehlermeldung. "Geblockt: Massenänderung in Produktionspfad erkannt, maximale Änderungsanzahl: 5, aktuell: 47" ist eine Fehlermeldung. Der Entwickler muss in 10 Sekunden verstehen, warum er gestoppt wurde.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zu viele Guards töten den Flow.&lt;/strong&gt; Ich hatte eine Phase, in der ich jeden zweiten Befehl geblockt habe. Das System wurde unbrauchbar. Ich habe dann 40 Guards entfernt und die wichtigsten 30 präziser gemacht. Qualität vor Quantität.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;False Positives sind tödlich.&lt;/strong&gt; Wenn ein Guard legitime Aktionen blockiert, verliert er sein Vertrauen. Dann kommt der Moment, in dem der Entwickler den Guard temporary deaktiviert, und dann kommt der Fehler. Die Präzision jedes Guards ist wichtiger als seine Abdeckung.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Das System muss sich selbst dokumentieren.&lt;/strong&gt; Jede Guard-Blockierung landet in einem Audit-Log. Ich sehe jede Woche, welche Guards wie oft gefeuert haben. Das zeigt mir, wo das System wirklich belastet wird, und wo Guards vielleicht zu aggressiv sind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gute Governance skaliert nicht mit Köpfen
&lt;/h2&gt;

&lt;p&gt;Das ist die Kernthese, und ich meine sie ernst.&lt;/p&gt;

&lt;p&gt;Mehr Compliance-Mitarbeiter bedeuten mehr Koordinationsaufwand, mehr Interpretation von Regeln, mehr Raum für menschliche Fehler und mehr Abhängigkeit von der Aufmerksamkeit einzelner Personen.&lt;/p&gt;

&lt;p&gt;Code dagegen schläft nicht. Code interpretiert nicht. Code macht keine Ausnahmen, weil gerade Stress herrscht. Code ist konsistent auf eine Art, die kein Mensch erreichen kann.&lt;/p&gt;

&lt;p&gt;Das bedeutet nicht, dass Menschen in der Governance keine Rolle spielen. Menschen schreiben die Guards. Menschen entscheiden, was überhaupt geschützt werden muss. Menschen bauen das Urteilsvermögen in das System ein.&lt;/p&gt;

&lt;p&gt;Aber sobald eine Entscheidung getroffen ist, sollte sie nicht mehr von menschlicher Aufmerksamkeit abhängen. Sie sollte sich selbst erzwingen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jede Governance-Entscheidung, die zweimal manuell getroffen wird, gehört in Code.&lt;/li&gt;
&lt;li&gt;Guards müssen schnell, präzise und mit klaren Fehlermeldungen ausgestattet sein.&lt;/li&gt;
&lt;li&gt;Multi-Modell-Review ist kein Luxus. Es ist der Ersatz für das Review-Gespräch, das man alleine nicht führen kann.&lt;/li&gt;
&lt;li&gt;False Positives zerstören das Vertrauen in das System schneller als False Negatives.&lt;/li&gt;
&lt;li&gt;Audit-Logs sind keine Bürokratie. Sie sind der Spiegel, der zeigt, ob das System tatsächlich funktioniert.&lt;/li&gt;
&lt;li&gt;Governance skaliert nicht mit Personen. Sie skaliert mit Architektur.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>governance</category>
      <category>devops</category>
      <category>automation</category>
    </item>
    <item>
      <title>Der Passwort-Vorfall</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:37:59 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/der-passwort-vorfall-469b</link>
      <guid>https://dev.to/frederikvonderheyden/der-passwort-vorfall-469b</guid>
      <description>&lt;h2&gt;
  
  
  Der Tag, an dem mein Agent beinahe einen Passwort-Hash geloggt hätte
&lt;/h2&gt;

&lt;p&gt;Es war der 26. Juni, kurz nach 14 Uhr. Mein Agent arbeitete an einer Datenbankanalyse. Ein Verbindungsfehler war aufgetreten, und der Agent tat genau das, was er tun sollte: Er dokumentierte den Kontext vollständig, um das Problem nachvollziehbar zu machen.&lt;/p&gt;

&lt;p&gt;Drei Millisekunden, bevor die Log-Datei gespeichert wurde, hat mein PII-Gate-Guard den Schreibvorgang gestoppt.&lt;/p&gt;

&lt;p&gt;Ich habe davon erst abends erfahren. Im Protokoll. Und in diesem Moment wurde mir klar, dass ich mein gesamtes Sicherheitsdenken neu kalibrieren musste.&lt;/p&gt;




&lt;h2&gt;
  
  
  Was tatsächlich passiert ist
&lt;/h2&gt;

&lt;p&gt;Der Agent analysierte einen &lt;code&gt;psycopg2&lt;/code&gt;-Fehler. Im Stacktrace war die Connection-String-Variable enthalten. In dieser Variable steckte der Datenbankbenutzer und, für Testzwecke noch nicht rotiert, ein gehashtes Passwort.&lt;/p&gt;

&lt;p&gt;Der Agent hatte keine böse Absicht. Er hat nicht versucht, Daten zu stehlen. Er hat versucht, gründlich zu sein. Er wollte den vollständigen Fehlerkontext dokumentieren, damit ich das Problem am nächsten Morgen schnell nachvollziehen kann.&lt;/p&gt;

&lt;p&gt;Korrekt gedacht. Falsch gehandelt.&lt;/p&gt;

&lt;p&gt;Das ist der Unterschied, den viele beim Einsatz von KI-Agenten unterschätzen: Ein Schaden entsteht nicht durch bösartige Absicht. Er entsteht durch Gründlichkeit ohne Kontextbewusstsein.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wie der PII-Gate-Guard funktioniert
&lt;/h2&gt;

&lt;p&gt;Bevor ich die vier neuen Regeln erkläre, die aus diesem Vorfall entstanden sind, hier der Kern des Systems.&lt;/p&gt;

&lt;p&gt;Der Guard läuft als Shell-Hook, der jeden Schreibvorgang abfängt, bevor er ausgeführt wird. Er prüft den Inhalt gegen eine Liste von Mustern für personenbezogene und sicherheitsrelevante Daten.&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# pii-gate-guard.sh - wird vor jedem file-write ausgeführt&lt;/span&gt;

&lt;span class="nv"&gt;CONTENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Muster für kritische Inhalte&lt;/span&gt;
&lt;span class="nv"&gt;PATTERNS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
  &lt;span class="s1"&gt;'[0-9a-f]{32,}'&lt;/span&gt;           &lt;span class="c"&gt;# MD5/SHA Hashes&lt;/span&gt;
  &lt;span class="s1"&gt;'password\s*[:=]\s*\S+'&lt;/span&gt;   &lt;span class="c"&gt;# Passwort-Zuweisungen&lt;/span&gt;
  &lt;span class="s1"&gt;'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b'&lt;/span&gt;  &lt;span class="c"&gt;# E-Mail-Adressen&lt;/span&gt;
  &lt;span class="s1"&gt;'postgresql://[^@]+@'&lt;/span&gt;     &lt;span class="c"&gt;# DB-Connection-Strings mit Credentials&lt;/span&gt;
  &lt;span class="s1"&gt;'sk-[a-zA-Z0-9]{32,}'&lt;/span&gt;    &lt;span class="c"&gt;# API-Keys (OpenAI-Format)&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;pattern &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATTERNS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONTENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qiE&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PII_GATE_BLOCKED: Muster '&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="s2"&gt;' in '&lt;/span&gt;&lt;span class="nv"&gt;$FILE&lt;/span&gt;&lt;span class="s2"&gt;' erkannt"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.claude/pii-gate.log
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
  &lt;span class="k"&gt;fi
done

&lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Prinzip: Der Guard scheitert sicher. Wenn er unsicher ist, blockiert er. Der Agent muss dann explizit eine bereinigte Version des Inhalts liefern.&lt;/p&gt;




&lt;h2&gt;
  
  
  Die vier Regeln, die danach entstanden sind
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Regel 1: Kein vollständiger Stacktrace in Log-Dateien&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stacktraces enthalten oft mehr als nur Zeilennummern. Sie enthalten Variablennamen, manchmal Variableninhalte, Pfade, Konfigurationsdetails. Die neue Regel: Stacktraces werden immer bereinigt, bevor sie persistiert werden.&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;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sanitize_stacktrace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Connection strings entfernen
&lt;/span&gt;    &lt;span class="n"&gt;trace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;postgresql://[^\s\'&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;]+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[REDACTED_DB_URL]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# API Keys entfernen
&lt;/span&gt;    &lt;span class="n"&gt;trace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sk-[a-zA-Z0-9]{20,}&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;[REDACTED_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;trace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# E-Mail-Adressen ersetzen
&lt;/span&gt;    &lt;span class="n"&gt;trace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}\b&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;[REDACTED_EMAIL]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Regel 2: Umgebungsvariablen sind tabu in Logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Der Agent hatte Zugriff auf die Umgebungsvariablen des laufenden Prozesses. Das ist normal und notwendig. Aber er darf sie nicht loggen. Punkt. Die Regel ist absolut, ohne Ausnahme.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regel 3: Jede Log-Datei bekommt einen Sensitivity-Tag&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# log-config.yaml&lt;/span&gt;
&lt;span class="na"&gt;logs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;debug.log&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sensitivity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;low&lt;/span&gt;
    &lt;span class="na"&gt;pii_check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;agent-actions.log&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sensitivity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;high&lt;/span&gt;
    &lt;span class="na"&gt;pii_check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;requires_review&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dateien mit &lt;code&gt;sensitivity: high&lt;/code&gt; werden nicht nur vor dem Schreiben geprüft. Sie werden nach 24 Stunden automatisch rotiert und lokal verschlüsselt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regel 4: Der "Nachtmodus" schränkt Schreibrechte ein&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zwischen 22 Uhr und 6 Uhr läuft der Agent im eingeschränkten Modus. Kein Schreiben in Dateien außerhalb eines definierten &lt;code&gt;/tmp/agent-sandbox&lt;/code&gt;-Verzeichnisses. Alles andere landet in einer Review-Queue und wartet auf meine manuelle Freigabe am Morgen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Was die Zahlen erzählen
&lt;/h2&gt;

&lt;p&gt;Seit ich das System konsequent betreibe, hat der PII-Gate-Guard bei 1.448 autonomen Tasks 147 Schreibvorgänge gestoppt. Das sind 10,2 Prozent aller Tasks.&lt;/p&gt;

&lt;p&gt;Ich fand diese Zahl anfangs erschreckend hoch. Inzwischen sehe ich sie als Qualitätsmerkmal. Der Guard stoppt nicht nur kritische Vorfälle. Er stoppt auch Grenzfälle, bei denen der Agent konservativ handeln sollte, es aber nicht von selbst täte.&lt;/p&gt;

&lt;p&gt;Die Verteilung der Blockierungen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;61 Prozent: Verdächtige Muster in Stacktraces oder Fehlerausgaben&lt;/li&gt;
&lt;li&gt;23 Prozent: Pfade, die auf sensitive Konfigurationsdateien hindeuten&lt;/li&gt;
&lt;li&gt;11 Prozent: Mögliche Hashes oder kodierte Strings&lt;/li&gt;
&lt;li&gt;5 Prozent: Tatsächliche PII wie E-Mail-Adressen oder Namen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das ist keine Statistik. Das sind 147 Vorfälle, die nie passiert sind.&lt;/p&gt;




&lt;h2&gt;
  
  
  Was das bedeutet, wenn der Agent nachts arbeitet
&lt;/h2&gt;

&lt;p&gt;Ich lasse meinen Agenten eigenständig arbeiten. Nachts. Wochentags. Manchmal am Wochenende. Er schreibt Code, analysiert Fehler, erstellt Berichte, beantwortet Monitoring-Alerts.&lt;/p&gt;

&lt;p&gt;In dieser Zeit kann ich nicht jeden Schritt überwachen. Das ist der Sinn des Systems.&lt;/p&gt;

&lt;p&gt;Aber genau deshalb brauche ich Guardrails, die unabhängig von meiner Anwesenheit funktionieren. Nicht als Kompensation für einen schlechten Agenten, sondern als strukturelles Sicherheitsnetz für einen grundsätzlich guten Agenten, der in einem bestimmten Moment nicht den richtigen Kontext hat.&lt;/p&gt;

&lt;p&gt;Das Grundprinzip lautet: Vertrauen durch Struktur, nicht durch Hoffnung.&lt;/p&gt;

&lt;p&gt;Das beschreibe ich ausführlich in "Läuft ohne mich", weil es eine der Kernfragen jedes Solounternehmers ist, der KI-Agenten produktiv einsetzt: Wie schafft man echte Autonomie, ohne die Kontrolle zu verlieren?&lt;/p&gt;




&lt;h2&gt;
  
  
  Die DSGVO-Dimension, die viele übersehen
&lt;/h2&gt;

&lt;p&gt;Ein Passwort-Hash in einer Log-Datei ist nicht harmlos, weil er "nur" ein Hash ist. Wenn dieser Hash einem Nutzer zugeordnet werden kann, ist er personenbezogenes Datum im Sinne der DSGVO.&lt;/p&gt;

&lt;p&gt;Eine Log-Datei, die in einem Git-Repository landet, ist potenziell dauerhaft sichtbar. Auch nach dem Löschen, denn Git-History.&lt;/p&gt;

&lt;p&gt;Ein solcher Vorfall wäre meldepflichtig. 72 Stunden Frist. Benachrichtigung der Betroffenen. Mögliche Bußgelder.&lt;/p&gt;

&lt;p&gt;Das ist keine hypothetische Bedrohung. Das ist die reale Konsequenz eines realen Vorfalls, der am 26. Juni um 14 Uhr und drei Millisekunden nicht stattgefunden hat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. KI-Agenten scheitern durch Gründlichkeit, nicht durch Böswilligkeit.&lt;/strong&gt; Der gefährlichste Moment ist nicht, wenn der Agent etwas Falsches tut. Es ist, wenn er etwas Richtiges falsch tut.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Guardrails müssen automatisch und still funktionieren.&lt;/strong&gt; Ich habe von dem Block erst abends erfahren. Das ist kein Versagen. Das ist der Beweis, dass das System funktioniert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 10 Prozent Blockierungsrate ist kein Problem. Es ist ein Frühwarnsystem.&lt;/strong&gt; Wer keinerlei Blockierungen sieht, hat entweder keine Guardrails oder zu weiche.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Die DSGVO unterscheidet nicht zwischen menschlichem und maschinellem Handeln.&lt;/strong&gt; Ein Datenleck durch einen KI-Agenten ist genauso meldepflichtig wie eines durch einen Menschen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Nachtmodus ist kein Misstrauen, sondern Systemdesign.&lt;/strong&gt; Eingeschränkte Schreibrechte in autonomen Phasen sind kein Zeichen, dass man dem Agenten nicht vertraut. Sie sind Architektur.&lt;/p&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aisafety</category>
      <category>gdpr</category>
      <category>autonomousagents</category>
      <category>security</category>
    </item>
    <item>
      <title>211 kristallisierte Regeln</title>
      <dc:creator>Frederik von der Heyden</dc:creator>
      <pubDate>Fri, 21 Aug 2026 09:19:47 +0000</pubDate>
      <link>https://dev.to/frederikvonderheyden/211-kristallisierte-regeln-2k99</link>
      <guid>https://dev.to/frederikvonderheyden/211-kristallisierte-regeln-2k99</guid>
      <description>&lt;h2&gt;
  
  
  Wie mein Agent aus 211 Fehlern ein besseres System geworden ist als ich es je programmieren könnte
&lt;/h2&gt;

&lt;p&gt;Heute Morgen hat mein Agent etwas getan, das er vor drei Monaten nicht konnte. Er hat einen eingehenden Webhook-Payload selbstständig klassifiziert, die richtige Skill-Route gewählt und dabei einen Edge Case abgefangen, den ich nie explizit beschrieben hatte.&lt;/p&gt;

&lt;p&gt;Ich habe das erst bemerkt, als ich die Logs durchgesehen habe. Der Agent hatte eine Regel angewendet, die ich nie geschrieben habe. Entstanden aus einem Fehler vom 14. März, bei dem er den falschen Dispatcher aufgerufen hat. Damals habe ich ihn korrigiert. Heute hat er die Korrektur automatisch angewendet, ohne dass ich auch nur daran gedacht hätte.&lt;/p&gt;

&lt;p&gt;Das ist der Crystallization-Loop. Und er verändert grundlegend, wie ich über KI-Systeme denke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was der Crystallization-Loop eigentlich ist
&lt;/h2&gt;

&lt;p&gt;Die meisten KI-Workflows funktionieren so: Man gibt dem Modell einen Prompt, bekommt eine Ausgabe, korrigiert manuell, wiederholt. Jede Session beginnt von vorne. Das Modell lernt nichts. Du lernst vielleicht etwas, aber das nächste Mal ist die Chance hoch, dass der gleiche Fehler wieder passiert.&lt;/p&gt;

&lt;p&gt;Der Crystallization-Loop bricht diesen Kreislauf auf. Jede Korrektur, jedes Feedback, jeder Fehler wird automatisch in eine persistente Regel umgewandelt. Diese Regel landet in einer strukturierten Wissensbasis, die der Agent bei jeder neuen Session lädt.&lt;/p&gt;

&lt;p&gt;Das Prinzip ist einfach. Die Konsequenz ist dramatisch.&lt;/p&gt;

&lt;p&gt;Nach drei Monaten habe ich:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;211 kristallisierte Regeln in strukturierten Markdown-Dateien&lt;/li&gt;
&lt;li&gt;73 Learnings aus echten Fehlern und Korrekturen&lt;/li&gt;
&lt;li&gt;61 Skills, die automatisch aus wiederkehrenden Aufgaben entstanden sind&lt;/li&gt;
&lt;li&gt;308 Memory-Dateien, die den Kontext meines Projekts dauerhaft speichern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kein einziges dieser Dokumente habe ich manuell geschrieben. Sie sind alle aus echten Interaktionen entstanden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die technische Implementierung
&lt;/h2&gt;

&lt;p&gt;Das System besteht aus drei Komponenten, die zusammenspielen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Der Feedback-Collector&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jedes Mal, wenn ich den Agenten korrigiere oder er einen Fehler macht, löst ein Hook den Collection-Prozess aus. In meinem Setup ist das ein Bash-Hook, der auf bestimmte Signalwörter in meinen Antworten reagiert:&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# post-edit-dispatcher.sh&lt;/span&gt;
&lt;span class="nv"&gt;CORRECTION_KEYWORDS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"falsch"&lt;/span&gt; &lt;span class="s2"&gt;"nicht so"&lt;/span&gt; &lt;span class="s2"&gt;"stattdessen"&lt;/span&gt; &lt;span class="s2"&gt;"korrigiere"&lt;/span&gt; &lt;span class="s2"&gt;"fix"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;keyword &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CORRECTION_KEYWORDS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER_INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qi&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$keyword&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;trigger_crystallization_pipeline
    &lt;span class="nb"&gt;break
  &lt;/span&gt;&lt;span class="k"&gt;fi
done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Der Crystallizer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Der eigentliche Kern des Systems. Ein separater Agent-Aufruf, der die Korrektur analysiert und daraus eine generalisierbare Regel ableitet. Nicht einfach die Korrektur speichern, sondern das Muster dahinter extrahieren.&lt;/p&gt;

&lt;p&gt;Ein konkretes Beispiel: Ich hatte dem Agenten gesagt "Schreib keine Gedankenstriche in LinkedIn-Posts." Der Crystallizer hat daraus nicht "Keine Gedankenstriche in LinkedIn-Posts" gemacht, sondern: "In allen Content-Formaten für externe Plattformen keine Gedankenstriche verwenden, da sie in manchen Renderern nicht korrekt dargestellt werden und den Practitioner-Ton brechen."&lt;/p&gt;

&lt;p&gt;Die Regel enthält den Kontext, den Grund und den Anwendungsbereich. Das ist der Unterschied zwischen einer Notiz und einer Regel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;crystallize_correction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&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;
    Correction: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;correction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
    Context: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

    Extract a generalized rule that:
    1. Describes the pattern, not the specific instance
    2. Includes why this rule exists
    3. Defines the scope of application
    4. Can be applied autonomously in future sessions
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Rule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Der Memory-Loader&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Am Anfang jeder Session lädt der Agent die relevanten Regeln. Nicht alle 211, das wäre zu viel Context. Sondern die, die zum aktuellen Aufgabentyp passen. Dafür gibt es eine einfache Klassifizierung beim Session-Start:&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;# session-start-context.sh&lt;/span&gt;
&lt;span class="nv"&gt;TASK_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;classify_current_task &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INITIAL_PROMPT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
load_rules_for_context &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TASK_TYPE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--max&lt;/span&gt; 30 &lt;span class="nt"&gt;--priority&lt;/span&gt; high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Ergebnis: Der Agent startet jede Session nicht bei null, sondern mit dem akkumulierten Wissen aus allen vorherigen Interaktionen, die zu diesem Aufgabentyp passen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ich dabei gelernt habe, was mich überrascht hat
&lt;/h2&gt;

&lt;p&gt;Ich hatte erwartet, dass der Loop hauptsächlich Fehler verhindert. Was ich nicht erwartet hatte: Er macht den Agenten auch kreativer im richtigen Sinn.&lt;/p&gt;

&lt;p&gt;Weil er die Grenzen meiner Präferenzen kennt, kann er innerhalb dieser Grenzen freier agieren. Er muss nicht vorsichtig tasten, ob ein bestimmter Ansatz okay ist. Er weiß es. Das führt zu schnelleren, entschlosseneren Ausgaben.&lt;/p&gt;

&lt;p&gt;Drei konkrete Beispiele aus meinem System:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content-Qualität&lt;/strong&gt;: Nach 40 kristallisierten Regeln zu Tonalität, Format und Verboten hat der Agent angefangen, Posts abzulehnen, die er selbst generiert hatte, weil sie seinen eigenen Regeln widersprachen. Selbstkritik als emergentes Verhalten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill-Routing&lt;/strong&gt;: Aus wiederkehrenden Aufgaben hat das System automatisch neue Skills destilliert. Der Skill "linkedin-publish" ist nicht von mir geplant worden. Er ist entstanden, weil ich dreimal hintereinander die gleiche Sequenz von Schritten ausgeführt habe und der Loop das als Muster erkannt hat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fehler-Immunität&lt;/strong&gt;: Es gibt Fehlerklassen, die nach der Crystallization nie wieder aufgetreten sind. Nicht weil ich sie explizit verboten habe, sondern weil die Regel allgemein genug formuliert ist, um verwandte Fehler abzufangen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was nicht funktioniert hat
&lt;/h2&gt;

&lt;p&gt;Ehrlichkeit gehört dazu. Drei Dinge haben anfangs nicht geklappt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zu granulare Regeln.&lt;/strong&gt; Am Anfang hat der Crystallizer sehr spezifische Regeln generiert. "In Post 7 keine Aufzählungszeichen verwenden." Das ist keine Regel, das ist eine Notiz. Ich musste den Prompt des Crystallizers mehrfach anpassen, bis er generalisierbare Muster statt Einzelfälle produzierte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context-Overload.&lt;/strong&gt; Wenn zu viele Regeln geladen werden, leidet die Performance. Der Agent wird langsamer, Antworten werden defensiver. Die Lösung war das Relevanz-Scoring beim Memory-Load. Weniger ist mehr, aber das richtige Wenige.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Widersprüchliche Regeln.&lt;/strong&gt; Nach zwei Monaten hatte ich Regeln, die sich gegenseitig ausschlossen. Regel 47 sagte "Immer mit einer Frage enden." Regel 112 sagte "Keine rhetorischen Fragen in technischen Texten." Ich brauchte einen monatlichen Review-Prozess, der Konflikte auflöst.&lt;/p&gt;

&lt;p&gt;Das beschreibe ich ausführlich in "Läuft ohne mich", dem Buch, das aus diesem System entstanden ist. Der gesamte Aufbau, die Architektur-Entscheidungen, die Fehler und die Lösungen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die eigentliche Verschiebung
&lt;/h2&gt;

&lt;p&gt;Ein KI-Tool ist ein Werkzeug. Du bedienst es. Du wiederholst Anweisungen. Du kompensierst seine Schwächen manuell.&lt;/p&gt;

&lt;p&gt;Ein System mit Crystallization-Loop ist etwas anderes. Es lernt aus deiner Arbeit. Es wird besser durch deine Korrekturen. Es kennt dich nach drei Monaten besser als du es in einem Prompt erklären könntest.&lt;/p&gt;

&lt;p&gt;Die Frage ist nicht "Wie nutze ich KI besser?" Die Frage ist "Wie baue ich ein System, das ohne mich besser wird?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtigste Erkenntnisse
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Regeln müssen generalisierbar sein, nicht spezifisch. Der Crystallizer muss Muster extrahieren, keine Einzelfälle speichern.&lt;/li&gt;
&lt;li&gt;Relevantes Memory schlägt vollständiges Memory. 30 passende Regeln sind besser als 200 vollständige.&lt;/li&gt;
&lt;li&gt;Widersprüche entstehen zwangsläufig. Ein monatlicher Review-Prozess ist kein Nice-to-have.&lt;/li&gt;
&lt;li&gt;Emergente Verhalten sind ein Qualitätssignal. Wenn der Agent anfängt, sich selbst zu korrigieren, funktioniert das System.&lt;/li&gt;
&lt;li&gt;Der Loop braucht Zeit. Die ersten vier Wochen ist der Effekt kaum spürbar. Ab Woche acht wird er unübersehbar.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Das Buch: Taschenbuch (24,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMT162J" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMT162J&lt;/a&gt; | E-Book (9,99 EUR) &lt;a href="https://amazon.de/dp/B0HDMS2YQ9" rel="noopener noreferrer"&gt;https://amazon.de/dp/B0HDMS2YQ9&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Dieser Artikel wurde mit KI erstellt, auf Basis meiner eigenen Systeme und Praxiserfahrung.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>engineering</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
