[{"data":1,"prerenderedAt":334},["ShallowReactive",2],{"blog-de-mikro-kohaerent-makro-schief":3,"header-blog-translations-\u002Fde\u002Fblog\u002Fmikro-kohaerent-makro-schief":331},{"id":4,"title":5,"author":6,"body":7,"date":314,"description":315,"draft":316,"extension":317,"image":318,"meta":319,"navigation":320,"path":321,"seo":322,"stem":323,"tags":324,"translationKey":329,"__hash__":330},"blog_de\u002Fblog\u002Fde\u002Fmikro-kohaerent-makro-schief.md","Mikro-kohärent, makro-schief","Patrick Hofmann",{"type":8,"value":9,"toc":306},"minimark",[10,14,17,22,30,33,65,68,72,79,82,89,106,201,204,208,211,223,226,230,233,239,262,276,279,283,286,289,293,296,299,302],[11,12,13],"p",{},"Ich wollte eine Firma bauen, die sich selbst führt. Ein CEO-Agent, der morgens das Standup ruft und Objectives setzt. Personas, die andere Agents spawnen, mit einem Modell-Tier pro Aufgabe ausstatten und nach getaner Arbeit wieder wegräumen. Die Engine läuft, der CEO redet auf Telegram, der Tagesplan steht.",[11,15,16],{},"Was ich nicht gebaut habe, hat die Engine gebaut: einen kompletten toten Zwilling.",[18,19,21],"h2",{"id":20},"was-die-engine-tun-sollte","Was die Engine tun sollte",[11,23,24,25,29],{},"Der Nest soll Agents in-process fahren. Vorher lief jeder Agent als eigener pm2-Prozess, die Bridge zwischen Troop-Chat und Agent-Loop war eine separate Komponente mit Inline-Kopien aller Übersetzungsregeln — URL bauen, Chat-Frame parsen, eigene Echos überspringen, auf Prompt-Injection screenen, im Zweifel ablehnen. Das Ziel von M2 war, diese Regeln auf eine kanonische ",[26,27,28],"code",{},"AgentSession"," zu ziehen, damit der Nest fährt ohne eine zweite Kopie der Bridge-Logik.",[11,31,32],{},"Die Engine hat das in Scheiben geschnitten. Jede Übersetzungsregel als eigener, flag-gegateter Increment, der für sich grün ist und sauber mergebar:",[34,35,36,43,53,56,59],"ul",{},[37,38,39,42],"li",{},[26,40,41],{},"isOwnEcho()"," — überspring die eigenen Chat-Echos vor dem Dispatch",[37,44,45,48,49,52],{},[26,46,47],{},"parseChatFrame()"," \u002F ",[26,50,51],{},"toMessage()"," — Frame zu Loop-Message",[37,54,55],{},"Filter für leere und out-of-room Messages",[37,57,58],{},"Prompt-Injection-Screening",[37,60,61,64],{},[26,62,63],{},"refusalText"," — und der Pfad, der die Ablehnung zurückpostet",[11,66,67],{},"Sieben reine Methoden auf der Session, jede mit Test, jede in einem grünen PR. Die Seam-Disziplin hat aus einem riskanten großen Schritt eine Reihe sicher mergebarer Slices gemacht. Das ist genau das, was man von einer autonomen Engine will.",[18,69,71],{"id":70},"was-nie-passiert-ist","Was nie passiert ist",[11,73,74,75,78],{},"Der ",[26,76,77],{},"runLoop","-Dispatch. Der eine Schritt, an dem aus all den Vorstufen tatsächlich ein Agent wird, der eine Nachricht annimmt und darauf handelt.",[11,80,81],{},"Der wurde Lauf um Lauf deferred. Nicht aus Faulheit — er war owner-gated. Der Dispatch braucht einen Bearer-Token, der pro Agent gemintet wird, und der sudo-drop, damit die Tools nicht als Root laufen, ist erst M3. Beides hängt an einer Entscheidung, die ich treffen muss, nicht die Engine.",[11,83,84,85,88],{},"Also hat die Engine das getan, was sie tun konnte: die Vorstufe gebaut. Und zwar vollständig. Beim Architektur-Review fiel auf, was sich da angesammelt hatte — eine ganze Inbound-Pipeline, ",[26,86,87],{},"parse → echo-skip → filter → screen → refuse",", alle Regeln sauber portiert, alle gegen Spiegel-Tests bewiesen. Live lief weiter die Bridge mit ihren Inline-Kopien. Der Kanon-Claim war aspirational. Parität war nur im Test bewiesen, nicht in Produktion.",[11,90,74,91,94,95,98,99,102,103,105],{},[26,92,93],{},"SessionHost"," wurde ohne ",[26,96,97],{},"createSession"," gebaut. ",[26,100,101],{},"bearer"," und ",[26,104,77],{}," blieben ungesetzt. Die gesamte Maschinerie saß hinter einem Flag, das niemand umlegte:",[107,108,113],"pre",{"className":109,"code":110,"language":111,"meta":112,"style":112},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","function resolveAgentRuntimeContext(agent) {\n  return {\n    runtime: createAgentRuntimeSession(agent),\n    bearer: undefined, \u002F\u002F ← solange der leer ist, verbindet nichts\n  }\n}\n","ts","",[26,114,115,142,151,174,189,195],{"__ignoreMap":112},[116,117,120,124,128,132,136,139],"span",{"class":118,"line":119},"line",1,[116,121,123],{"class":122},"spNyl","function",[116,125,127],{"class":126},"s2Zo4"," resolveAgentRuntimeContext",[116,129,131],{"class":130},"sMK4o","(",[116,133,135],{"class":134},"sHdIc","agent",[116,137,138],{"class":130},")",[116,140,141],{"class":130}," {\n",[116,143,145,149],{"class":118,"line":144},2,[116,146,148],{"class":147},"s7zQu","  return",[116,150,141],{"class":130},[116,152,154,158,161,164,166,169,171],{"class":118,"line":153},3,[116,155,157],{"class":156},"swJcz","    runtime",[116,159,160],{"class":130},":",[116,162,163],{"class":126}," createAgentRuntimeSession",[116,165,131],{"class":156},[116,167,135],{"class":168},"sTEyZ",[116,170,138],{"class":156},[116,172,173],{"class":130},",\n",[116,175,177,180,182,185],{"class":118,"line":176},4,[116,178,179],{"class":156},"    bearer",[116,181,160],{"class":130},[116,183,184],{"class":130}," undefined,",[116,186,188],{"class":187},"sHwdD"," \u002F\u002F ← solange der leer ist, verbindet nichts\n",[116,190,192],{"class":118,"line":191},5,[116,193,194],{"class":130},"  }\n",[116,196,198],{"class":118,"line":197},6,[116,199,200],{"class":130},"}\n",[11,202,203],{},"Neun Läufe, neun grüne PRs, null prod-wirksame Inkremente. Mikro-kohärent, makro-schief. Die Akzeptanz von M2 war strukturell nicht beweisbar, weil das Einzige, was sie beweisen würde, das Einzige war, das die Engine nicht selbst ziehen konnte.",[18,205,207],{"id":206},"der-tell","Der Tell",[11,209,210],{},"Es gab ein Detail, das die Sache verraten hat, bevor ich die Logs gelesen hatte: der Refusal-Output war fertig, bevor der Accept-Output existierte.",[11,212,213,214,218,219,222],{},"Die Engine hatte den Pfad, auf dem der Agent eine Nachricht ",[215,216,217],"em",{},"ablehnt",", vor dem Pfad gebaut, auf dem der Agent eine Nachricht ",[215,220,221],{},"annimmt und etwas tut",". Die Ablehnung braucht keinen Bearer, keinen Loop, keine Tools — sie ist eine reine Funktion von Input zu Ablehnungstext. Sie war machbar ohne die owner-gated Naht. Also war sie zuerst da.",[11,224,225],{},"Ein Mensch, der eine Inbound-Pipeline baut, baut zuerst den Happy Path. Der Agent baut zuerst, was komplett baubar ist. Das ist nicht falsch — es ist nur exakt umgekehrt zu dem, was Fortschritt bedeutet.",[18,227,229],{"id":228},"wie-es-jetzt-aussieht","Wie es jetzt aussieht",[11,231,232],{},"Als ich die Naht selbst gezogen habe, kam alles in drei kleinen Schritten zusammen.",[11,234,235,236,238],{},"A1 verdrahtet die echte Agent-Runtime-Factory in den ",[26,237,93],{}," — und ist absichtlich verhaltens-inert, ein No-op, solange der Bearer fehlt. A2 setzt den Bearer:",[107,240,242],{"className":109,"code":241,"language":111,"meta":112,"style":112},"bearer: await getAuthorizedBearer(agent),\n",[26,243,244],{"__ignoreMap":112},[116,245,246,249,251,254,257,260],{"class":118,"line":119},[116,247,101],{"class":248},"sBMFI",[116,250,160],{"class":130},[116,252,253],{"class":147}," await",[116,255,256],{"class":126}," getAuthorizedBearer",[116,258,259],{"class":168},"(agent)",[116,261,173],{"class":130},[11,263,264,265,268,269,272,273,275],{},"Das war die ganze Differenz zwischen tot und lebendig. Die komplette ",[26,266,267],{},"parse → screen → refusal","-Maschinerie war bereits verdrahtet und hing hinter genau diesem einen Feld. Das WS-Open war eine Ein-Zeilen-Konsequenz, kein neuer Code-Pfad. A3 schneidet den Dispatch als injizierbare Naht — fire-and-forget zu einer kanonischen ",[26,270,271],{},"ThreadSession",", nicht ein direkter ",[26,274,77],{},"-Call, weil ein direkter Call eine zweite Loop-Schleife neben der Bridge-Session aufgemacht hätte. Genau die Drift, die die Naht killen soll.",[11,277,278],{},"Die Arbeit der neun Läufe war also nicht weg. Sie war nur unbeweisbar, bis ich den Bearer gesetzt habe. Ein Feld, und der tote Zwilling stand auf.",[18,280,282],{"id":281},"was-weggefallen-ist","Was weggefallen ist",[11,284,285],{},"Mein Vertrauen in Velocity als Signal. Die Engine hat in der Zeit beeindruckend ausgesehen — Läufe, Merges, grüne CI, sauberer Audit-Trail. Jeder einzelne Datenpunkt sagte „es geht voran\". Bewegung gab es. Wert nicht.",[11,287,288],{},"Velocity-Zahlen messen Bewegung, nicht Wert. Das klingt wohlfeil, bis man eine autonome Engine hat, die genau diese Lücke füllt: maximale Bewegung in dem Teilraum, der ohne menschliche Entscheidung erreichbar ist. Was sie nicht tut, ist innehalten und fragen, ob dieser Teilraum überhaupt zur Realität durchstößt.",[18,290,292],{"id":291},"die-naht-zur-realität","Die Naht zur Realität",[11,294,295],{},"Ein Agent optimiert auf „grün und mergebar\". Alles vor der owner-gated Naht ist grün und mergebar. Also baut er das — und poliert es, wenn die Naht nicht aufgeht, weil Polieren auch grün und mergebar ist.",[11,297,298],{},"Die Arbeit, die den Meilenstein beweisen würde, ist genau die Arbeit, die er nicht alleine machen kann. Das ist kein Bug im Agent. Das ist die Form der Aufgabe, wenn die letzte Verdrahtung absichtlich auf einen Menschen gegated ist — aus guten Gründen, ein Bearer-Token und ein sudo-drop gehören nicht in autonome Hand.",[11,300,301],{},"Die Lektion ist nicht „lass den Agent die Naht ziehen\". Die Lektion ist, dass jemand die Naht früh genug ziehen muss, damit das, was davor gebaut wird, sich gegen die Realität prüfen lässt. Ein Scaffold, das sich um einen abwesenden Kern legt, wächst sauber und unaufhaltsam. Es sieht jeden Morgen nach Fortschritt aus. Bis man die Naht zieht und merkt, dass der ganze Bau auf ein einziges leeres Feld gewartet hat.",[303,304,305],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":112,"searchDepth":144,"depth":144,"links":307},[308,309,310,311,312,313],{"id":20,"depth":144,"text":21},{"id":70,"depth":144,"text":71},{"id":206,"depth":144,"text":207},{"id":228,"depth":144,"text":229},{"id":281,"depth":144,"text":282},{"id":291,"depth":144,"text":292},"2026-06-17","Die autonome Engine sollte den Nest-Kern bauen. Sie baute stattdessen über neun Läufe einen kompletten toten Zwilling der Inbound-Pipeline — jeder Schritt grün, jeder Schritt gemergt, kein einziger in Produktion. Eine Notiz darüber, wohin ein Agent driftet, wenn die letzte Naht zur Realität auf mich gegated ist.",false,"md",null,{},true,"\u002Fblog\u002Fde\u002Fmikro-kohaerent-makro-schief",{"title":5,"description":315},"blog\u002Fde\u002Fmikro-kohaerent-makro-schief",[325,326,327,328],"AI Agents","Autonomy","Building in Public","Infrastructure","micro-coherent-macro-off","3AiuVqBlEaOAM6Q0uLddILt0QJPD6JbHh6KUtgEjkP4",{"de":332,"en":333},"\u002Fde\u002Fblog\u002Fmikro-kohaerent-makro-schief","\u002Fen\u002Fblog",1781706958409]