[{"data":1,"prerenderedAt":2733},["ShallowReactive",2],{"search-de":3,"content-de-vision\u002Fagent-pipeline":4,"surround-de-\u002Fvision\u002Fagent-pipeline":2726},[],{"id":5,"title":6,"body":7,"description":2718,"extension":2719,"meta":2720,"navigation":2721,"path":2722,"seo":2723,"stem":2724,"__hash__":2725},"content_de\u002F5.vision\u002F2.agent-pipeline.md","Agenten-Strecke",{"type":8,"value":9,"toc":2685},"minimark",[10,15,19,71,76,99,106,278,284,340,367,390,394,429,434,481,484,531,563,567,581,648,654,710,738,742,762,925,956,960,991,995,1004,1060,1082,1104,1108,1112,1119,1127,1157,1169,1218,1222,1228,1255,1265,1269,1275,1278,1281,1554,1557,1560,1687,1690,1697,1835,1838,1862,1967,1971,1977,1981,1987,2053,2062,2148,2152,2175,2241,2247,2251,2275,2279,2289,2293,2333,2337,2370,2379,2382,2391,2562,2592,2596,2599,2644,2648,2651,2667,2671,2675,2678,2681],[11,12,14],"h1",{"id":13},"architektur-der-agenten-strecke","Architektur der Agenten-Strecke",[16,17,18],"p",{},"Die Agenten-Strecke ist das technische Herzstück von Owlats Entwicklung von einer Plattform für ausgehende E-Mail hin zu einem System für Kommunikationsintelligenz. Jede eingehende E-Mail durchläuft eine mehrstufige Verarbeitungskette, die prüft, Kontext abruft, klassifiziert, entwirft und entweder an den automatischen Versand oder an eine Warteschlange zur menschlichen Prüfung routet.",[20,21,24,49],"callout",{"title":22,"type":23},"Status: Kern ausgeliefert, Ränder werden enger","success",[16,25,26,27,31,32,36,37,40,41,44,45,48],{},"Die Kern-Strecke ist ",[28,29,30],"strong",{},"gebaut und in Betrieb",": die Schrittmodule und der Walker (",[33,34,35],"code",{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002F","), der Empfänger für eingehende Nachrichten (",[33,38,39],{},"apps\u002Fapi\u002Fconvex\u002Finbox\u002Fmessages.ts","), das vollständige Schema (",[33,42,43],{},"apps\u002Fapi\u002Fconvex\u002Fschema\u002Finbox.ts",") und die Postfach-Oberfläche (",[33,46,47],{},"apps\u002Fweb\u002Fapp\u002Fpages\u002Fdashboard\u002Finbox\u002F*",") sind allesamt ausgeliefert.",[16,50,51,52,55,56,59,60,65,66,70],{},"Das meiste, was dieses Dokument einst als Zukunftsmusik markiert hat, ist ",[28,53,54],{},"inzwischen verdrahtet",": der LLM-Klassifikator für Prompt-Injections (Muster + Best-Effort-LLM der Guard-Stufe), das Zusammenfassen von Nachrichten (Coalescing, per Opt-in), das Routing mit abgestufter Autonomie samt lebendiger Feedback-Schleife und drei Circuit Breakern sowie der Wissensgraph und die relevanten Quelldateien, die das Kontext-Briefing des Agenten speisen. Zukunft bleibt die ",[28,57,58],{},"Verzweigung bei mehreren Absichten \u002F parallele Worker"," — der Walker führt weiterhin eine einzelne lineare Kette aus. Jede Stelle ist im Text entsprechend markiert. Für die Wissensseite siehe ",[61,62,64],"a",{"href":63},"\u002Fvision\u002Fknowledge-graph","Wissensgraph",", für den Leitfaden aus Betreibersicht ",[61,67,69],{"href":68},"\u002Fguide\u002Fai-agent","KI-Agent & Autonomie",".",[72,73,75],"h2",{"id":74},"architektur-der-schrittmodule","Architektur der Schrittmodule",[16,77,78,79,83,84,87,88,91,92,95,96,70],{},"Die Strecke ist nicht eine große Funktion. Gemäß ",[61,80,82],{"href":81},"\u002Fdeveloper\u002Fdecisions","ADR-0014"," ist jede Stufe ein ",[28,85,86],{},"Agenten-Schrittmodul"," — ein kleines Objekt mit zwei reinen Funktionen — und ein einzelner ",[28,89,90],{},"Walker"," führt sie der Reihe nach aus. Die Schrittmodule liegen unter ",[33,93,94],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fsteps\u002F\u003Ckind>\u002Findex.ts","; der Walker ist ",[33,97,98],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fwalker.ts",[16,100,101,102,105],{},"Ein Schrittmodul (",[33,103,104],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fsteps\u002Ftypes.ts",") sieht so aus:",[107,108,113],"pre",{"className":109,"code":110,"language":111,"meta":112,"style":112},"language-typescript shiki shiki-themes github-light github-dark-dimmed","interface AgentStepModule\u003CK, In, Out> {\n  readonly kind: K\n  readonly llm?: { tier: 'fast' | 'capable' }   \u002F\u002F present iff the step calls an LLM\n  execute(ctx, input): Promise\u003CAgentStepResult\u003COut>>  \u002F\u002F does the work\n  route(output, input, runCtx): AgentRoute            \u002F\u002F decides what happens next\n}\n","typescript","",[33,114,115,149,165,201,242,272],{"__ignoreMap":112},[116,117,120,124,128,132,135,138,141,143,146],"span",{"class":118,"line":119},"line",1,[116,121,123],{"class":122},"s7YZ4","interface",[116,125,127],{"class":126},"sOLd2"," AgentStepModule",[116,129,131],{"class":130},"sYgZi","\u003C",[116,133,134],{"class":126},"K",[116,136,137],{"class":130},", ",[116,139,140],{"class":126},"In",[116,142,137],{"class":130},[116,144,145],{"class":126},"Out",[116,147,148],{"class":130},"> {\n",[116,150,152,155,159,162],{"class":118,"line":151},2,[116,153,154],{"class":122},"  readonly",[116,156,158],{"class":157},"stnAF"," kind",[116,160,161],{"class":122},":",[116,163,164],{"class":126}," K\n",[116,166,168,170,173,176,179,182,184,188,191,194,197],{"class":118,"line":167},3,[116,169,154],{"class":122},[116,171,172],{"class":157}," llm",[116,174,175],{"class":122},"?:",[116,177,178],{"class":130}," { ",[116,180,181],{"class":157},"tier",[116,183,161],{"class":122},[116,185,187],{"class":186},"s-HuK"," 'fast'",[116,189,190],{"class":122}," |",[116,192,193],{"class":186}," 'capable'",[116,195,196],{"class":130}," }   ",[116,198,200],{"class":199},"sDN9O","\u002F\u002F present iff the step calls an LLM\n",[116,202,204,208,211,214,216,219,222,224,227,229,232,234,236,239],{"class":118,"line":203},4,[116,205,207],{"class":206},"sPO5f","  execute",[116,209,210],{"class":130},"(",[116,212,213],{"class":157},"ctx",[116,215,137],{"class":130},[116,217,218],{"class":157},"input",[116,220,221],{"class":130},")",[116,223,161],{"class":122},[116,225,226],{"class":126}," Promise",[116,228,131],{"class":130},[116,230,231],{"class":126},"AgentStepResult",[116,233,131],{"class":130},[116,235,145],{"class":126},[116,237,238],{"class":130},">>  ",[116,240,241],{"class":199},"\u002F\u002F does the work\n",[116,243,245,248,250,253,255,257,259,262,264,266,269],{"class":118,"line":244},5,[116,246,247],{"class":206},"  route",[116,249,210],{"class":130},[116,251,252],{"class":157},"output",[116,254,137],{"class":130},[116,256,218],{"class":157},[116,258,137],{"class":130},[116,260,261],{"class":157},"runCtx",[116,263,221],{"class":130},[116,265,161],{"class":122},[116,267,268],{"class":126}," AgentRoute",[116,270,271],{"class":199},"            \u002F\u002F decides what happens next\n",[116,273,275],{"class":118,"line":274},6,[116,276,277],{"class":130},"}\n",[16,279,280,283],{},[33,281,282],{},"route()"," gibt eine von drei Formen zurück:",[285,286,287,300],"table",{},[288,289,290],"thead",{},[291,292,293,297],"tr",{},[294,295,296],"th",{},"Route",[294,298,299],{},"Bedeutung",[301,302,303,318,330],"tbody",{},[291,304,305,311],{},[306,307,308],"td",{},[33,309,310],{},"in_state",[306,312,313,314,317],{},"Im aktuellen ",[33,315,316],{},"processingStatus"," bleiben, den nächsten Schritt einplanen.",[291,319,320,325],{},[306,321,322],{},[33,323,324],{},"transition",[306,326,327,329],{},[33,328,316],{}," in einen neuen Zustand überführen (optional einen Folgeschritt einplanen).",[291,331,332,337],{},[306,333,334],{},[33,335,336],{},"done",[306,338,339],{},"Ende — die Strecke ist für diese Nachricht abgeschlossen.",[16,341,342,343,346,347,350,351,354,355,358,359,362,363,366],{},"Der Walker (",[33,344,345],{},"runStep",") legt eine ",[33,348,349],{},"agentActions","-Zeile an, ruft ",[33,352,353],{},"module.execute()"," auf, wendet ",[33,356,357],{},"module.route()"," an und plant den nächsten Schritt selbst über ",[33,360,361],{},"ctx.scheduler.runAfter(0, …)"," ein. Jede Ausnahme innerhalb eines Schritts überführt die Nachricht nach ",[33,364,365],{},"failed",", wobei die fehlgeschlagene Aktion festgehalten wird.",[20,368,371],{"title":369,"type":370},"Eine lineare Kette, keine Verzweigung","info",[16,372,373,374,377,378,381,382,384,385,384,387,389],{},"Der Walker führt ",[28,375,376],{},"eine einzige lineare Schrittkette pro Nachricht"," aus. Die Klassifizierung erzeugt ein einziges ",[33,379,380],{},"Classification","-Objekt, und das Routing ist ",[33,383,310],{}," \u002F ",[33,386,324],{},[33,388,336],{}," — es gibt keine parallele Verzweigung „Worker A \u002F Worker B“. Die Verzweigung bei mehreren Absichten (weiter unten) bleibt ein Zukunftsentwurf.",[72,391,393],{"id":392},"die-fünf-schritte","Die fünf Schritte",[16,395,396,397,137,400,137,403,137,406,137,409,412,413,416,417,420,421,424,425,428],{},"Die Schrittarten sind exakt: ",[33,398,399],{},"security_scan",[33,401,402],{},"context_retrieval",[33,404,405],{},"classify",[33,407,408],{},"draft",[33,410,411],{},"route"," (",[33,414,415],{},"AgentStepKind"," in ",[33,418,419],{},"agent\u002Fsteps\u002Ftypes.ts","). Ein ",[33,422,423],{},"plan","-Schritt war entworfen, wurde aber ",[28,426,427],{},"mit ADR-0014 vor der Produktion verworfen"," — es gibt keine Stufe zur Aktionsplanung.",[430,431,433],"h3",{"id":432},"schritt-1-sicherheitsprüfung","Schritt 1: Sicherheitsprüfung",[16,435,436,439,440,442,443,446,447,450,451,137,454,457,458,461,462,465,466,412,469,472,473,476,477,480],{},[33,437,438],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fsteps\u002Fsecurity_scan\u002Findex.ts"," — der Einstiegsschritt, ausgeführt, während ",[33,441,316],{}," auf ",[33,444,445],{},"received","\u002F",[33,448,449],{},"security_check"," steht. Er prüft die eingehende Nachricht auf Prompt-Injection, eingeschmuggelte Anweisungen und Spam. Die deterministische Schicht nutzt ",[33,452,453],{},"detectInjection",[33,455,456],{},"detectSmuggling"," und ",[33,459,460],{},"calculateSpamScore"," aus ",[33,463,464],{},"patterns.ts","; darüber hinaus fängt ein ",[28,467,468],{},"LLM-Injection-Klassifikator der Guard-Stufe",[33,470,471],{},"getLLMProvider('guard')"," + ",[33,474,475],{},"runLlmObject",") neuartige oder verschleierte Formulierungen ab, welche die regulären Ausdrücke verfehlen. Die beiden Urteile werden ODER-verknüpft — eine Markierung mit hoher Konfidenz auf einer der beiden Seiten gilt als Injection — und der LLM-Aufruf ",[28,478,479],{},"fällt offen aus"," (jeder Modellfehler fällt auf das reine Musterurteil zurück, sodass ein wackliges Modell die Strecke nie blockiert).",[16,482,483],{},"Routing:",[485,486,487,498,511,523],"ul",{},[488,489,490,493,494,497],"li",{},[28,491,492],{},"Injection erkannt (Muster oder Guard-LLM), Konfidenz ≥ 0,7"," → ",[33,495,496],{},"quarantined"," (bis zur menschlichen Freigabe zurückgehalten).",[488,499,500,493,503,506,507,510],{},[28,501,502],{},"Spam-Score ≥ 80",[33,504,505],{},"archived"," (Grund ",[33,508,509],{},"spam",").",[488,512,513,516,517,457,520,522],{},[28,514,515],{},"Sauber, Agent aktiviert"," → Übergang nach ",[33,518,519],{},"classifying",[33,521,402],{}," einplanen.",[488,524,525,528,529,510],{},[28,526,527],{},"Sauber, Agent deaktiviert"," → die Prüfung festhalten und anhalten (",[33,530,336],{},[20,532,534],{"title":533,"type":23},"LLM-Injection-Klassifikator — ausgeliefert (Defense in Depth)",[16,535,536,537,412,540,543,544,547,548,550,551,554,555,558,559,562],{},"Die Modellstufe ",[33,538,539],{},"guard",[33,541,542],{},"apps\u002Fapi\u002Fconvex\u002Flib\u002FllmProvider.ts",") ist inzwischen verdrahtet: Neben der Regex-Prüfung führt ",[33,545,546],{},"security_scan\u002Findex.ts"," einen ",[33,549,475],{},"-Klassifikator aus, der ",[33,552,553],{},"{ isInjection, confidence, reason }"," zurückgibt. Ein LLM-Urteil mit hoher Konfidenz (≥ 0,8) markiert eine Injection auch dann, wenn kein Muster gegriffen hat (",[33,556,557],{},"injectionType: llm_prompt_injection","). Die Erkennung ist damit nicht mehr vollständig deterministisch — sie besteht aus ",[28,560,561],{},"Mustern plus einem Best-Effort-LLM",", das bei jedem Modellfehler offen ausfällt.",[430,564,566],{"id":565},"schritt-2-kontextabruf","Schritt 2: Kontextabruf",[16,568,569,572,573,575,576,442,578,580],{},[33,570,571],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fsteps\u002Fcontext_retrieval\u002Findex.ts"," — läuft ",[33,574,310],{},", während ",[33,577,316],{},[33,579,519],{}," steht. Er stellt eine Briefing-Zeichenkette zusammen, welche die LLM-Schritte konsumieren, und zwar aus:",[485,582,583,592,601,611,627,642],{},[488,584,585,588,589],{},[28,586,587],{},"Kontaktprofil"," — Name, Sprache, Zeitzone aus ",[33,590,591],{},"contacts",[488,593,594,597,598],{},[28,595,596],{},"Jüngste Aktivität"," — die letzten paar ",[33,599,600],{},"contactActivities",[488,602,603,606,607,610],{},[28,604,605],{},"Konversationsverlauf"," — frühere Nachrichten im selben Thread (",[33,608,609],{},"inboundMessages"," nach Thread)",[488,612,613,615,616,619,620,623,624,221],{},[28,614,64],{}," — semantisch relevante typisierte Einträge über ",[33,617,618],{},"internal.knowledge.retrieval.semanticSearch"," (der Abschnitt ",[33,621,622],{},"[KNOWLEDGE]",", begrenzt durch ",[33,625,626],{},"knowledgeEntryLimit",[488,628,629,632,633,619,636,623,639,221],{},[28,630,631],{},"Relevante Quelldateien"," — semantisch relevante hochgeladene Dokumente über ",[33,634,635],{},"internal.semanticFileProcessing.semanticSearch",[33,637,638],{},"[RELEVANT FILES]",[33,640,641],{},"fileLimit",[488,643,644,647],{},[28,645,646],{},"Die aktuelle Nachricht"," — Von \u002F An \u002F Betreff \u002F Text",[16,649,650,651,161],{},"Das Briefing ist tokenbudgetiert (≈ 4 Zeichen\u002FToken, Budget von 4000 Token) und kennt drei Verdichtungsstufen, festgehalten in ",[33,652,653],{},"inboundMessages.contextTier",[285,655,656,669],{},[288,657,658],{},[291,659,660,663,666],{},[294,661,662],{},"Stufe",[294,664,665],{},"Auslöser",[294,667,668],{},"Vorgehen",[301,670,671,684,697],{},[291,672,673,678,681],{},[306,674,675],{},[33,676,677],{},"normal",[306,679,680],{},"Passt ins Budget",[306,682,683],{},"Gesamten Kontext wortgetreu weitergeben.",[291,685,686,691,694],{},[306,687,688],{},[33,689,690],{},"compacted",[306,692,693],{},"Bis zum 3-Fachen des Budgets",[306,695,696],{},"Das Ende des zusammengestellten Kontexts behalten (das jüngste Material).",[291,698,699,704,707],{},[306,700,701],{},[33,702,703],{},"emergency",[306,705,706],{},"Über dem 3-Fachen des Budgets",[306,708,709],{},"Nur die Kontaktzeile und die aktuelle Nachricht behalten.",[20,711,713],{"title":712,"type":23},"Wissensgraph-Kontext — verdrahtet",[16,714,715,716,412,719,721,722,724,725,457,727,729,730,732,733,735,736,70],{},"Der Kontextabruf fragt nun den Wissensgraphen und den Dateiindex ab. Ist der Abfragetext lang genug, führt er eine semantische Vektorsuche über ",[33,717,718],{},"knowledgeEntries",[33,720,618],{},") und über hochgeladene Dateien (",[33,723,635],{},") aus und faltet die Treffer in die Briefing-Abschnitte ",[33,726,622],{},[33,728,638],{}," hinein — hinter demselben Tokenbudget. Sowohl ",[33,731,626],{}," als auch ",[33,734,641],{}," sind jetzt aktiv. Zur Abrufseite siehe ",[61,737,64],{"href":63},[430,739,741],{"id":740},"schritt-3-klassifizierung","Schritt 3: Klassifizierung",[16,743,744,747,748,751,752,457,755,757,758,761],{},[33,745,746],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fsteps\u002Fclassify\u002Findex.ts"," — nutzt die ",[28,749,750],{},"schnelle"," Modellstufe über ",[33,753,754],{},"getLLMProvider('classify')",[33,756,475],{}," für typsichere strukturierte Ausgabe (",[33,759,760],{},"generateObject"," unter der Haube). Er erzeugt genau eine Klassifizierung:",[107,763,765],{"className":109,"code":764,"language":111,"meta":112,"style":112},"{\n  category: 'support' | 'sales' | 'billing' | 'feature_request'\n          | 'complaint' | 'spam' | 'internal' | 'other',\n  priority: 'urgent' | 'normal' | 'low',\n  sentiment: 'positive' | 'neutral' | 'negative',\n  intent: 'question' | 'complaint' | 'request' | 'information'\n        | 'escalation' | 'acknowledgment',\n  confidence: number,  \u002F\u002F 0–1\n}\n",[33,766,767,772,798,824,846,868,892,908,920],{"__ignoreMap":112},[116,768,769],{"class":118,"line":119},[116,770,771],{"class":130},"{\n",[116,773,774,777,780,783,785,788,790,793,795],{"class":118,"line":151},[116,775,776],{"class":126},"  category",[116,778,779],{"class":130},": ",[116,781,782],{"class":186},"'support'",[116,784,190],{"class":122},[116,786,787],{"class":186}," 'sales'",[116,789,190],{"class":122},[116,791,792],{"class":186}," 'billing'",[116,794,190],{"class":122},[116,796,797],{"class":186}," 'feature_request'\n",[116,799,800,803,806,808,811,813,816,818,821],{"class":118,"line":167},[116,801,802],{"class":122},"          |",[116,804,805],{"class":186}," 'complaint'",[116,807,190],{"class":122},[116,809,810],{"class":186}," 'spam'",[116,812,190],{"class":122},[116,814,815],{"class":186}," 'internal'",[116,817,190],{"class":122},[116,819,820],{"class":186}," 'other'",[116,822,823],{"class":130},",\n",[116,825,826,829,831,834,836,839,841,844],{"class":118,"line":203},[116,827,828],{"class":126},"  priority",[116,830,779],{"class":130},[116,832,833],{"class":186},"'urgent'",[116,835,190],{"class":122},[116,837,838],{"class":186}," 'normal'",[116,840,190],{"class":122},[116,842,843],{"class":186}," 'low'",[116,845,823],{"class":130},[116,847,848,851,853,856,858,861,863,866],{"class":118,"line":244},[116,849,850],{"class":126},"  sentiment",[116,852,779],{"class":130},[116,854,855],{"class":186},"'positive'",[116,857,190],{"class":122},[116,859,860],{"class":186}," 'neutral'",[116,862,190],{"class":122},[116,864,865],{"class":186}," 'negative'",[116,867,823],{"class":130},[116,869,870,873,875,878,880,882,884,887,889],{"class":118,"line":274},[116,871,872],{"class":126},"  intent",[116,874,779],{"class":130},[116,876,877],{"class":186},"'question'",[116,879,190],{"class":122},[116,881,805],{"class":186},[116,883,190],{"class":122},[116,885,886],{"class":186}," 'request'",[116,888,190],{"class":122},[116,890,891],{"class":186}," 'information'\n",[116,893,895,898,901,903,906],{"class":118,"line":894},7,[116,896,897],{"class":122},"        |",[116,899,900],{"class":186}," 'escalation'",[116,902,190],{"class":122},[116,904,905],{"class":186}," 'acknowledgment'",[116,907,823],{"class":130},[116,909,911,914,917],{"class":118,"line":910},8,[116,912,913],{"class":126},"  confidence",[116,915,916],{"class":130},": number,  ",[116,918,919],{"class":199},"\u002F\u002F 0–1\n",[116,921,923],{"class":118,"line":922},9,[116,924,277],{"class":130},[16,926,927,928,493,930,932,933,936,937,940,941,944,945,948,949,951,952,955],{},"Routing: ",[33,929,509],{},[33,931,505],{},"; ",[33,934,935],{},"complaint"," oder ",[33,938,939],{},"urgent"," → direkt nach ",[33,942,943],{},"draft_ready"," (den Entwurfsschritt überspringen, menschliche Prüfung erzwingen); alles Übrige → Übergang nach ",[33,946,947],{},"drafting"," und Einplanen des ",[33,950,408],{},"-Schritts. Die Klassifizierung wird in ",[33,953,954],{},"inboundMessages.classification"," abgelegt.",[430,957,959],{"id":958},"schritt-4-entwurfserzeugung","Schritt 4: Entwurfserzeugung",[16,961,962,747,965,751,968,457,971,974,975,137,978,981,982,416,985,384,988,955],{},[33,963,964],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fsteps\u002Fdraft\u002Findex.ts",[28,966,967],{},"leistungsfähige",[33,969,970],{},"getLLMProvider('draft')",[33,972,973],{},"runLlmText",". Der Entwurf ist in ",[33,976,977],{},"agentConfig.toneDescription",[33,979,980],{},"agentConfig.signatureTemplate"," und dem zusammengestellten Kontext verankert. Als Defense in Depth prüft der Entwurfsschritt den zusammengestellten Kontext erneut auf Injection-Muster (Thread-Verlauf, der stromaufwärts nicht einzeln geprüft wurde); ein Treffer mit hoher Konfidenz lässt den Schritt fehlschlagen. Die Ausgabe wird zusammen mit einem ",[33,983,984],{},"confidenceScore",[33,986,987],{},"inboundMessages.draftResponse",[33,989,990],{},"draftSubject",[430,992,994],{"id":993},"schritt-5-routing","Schritt 5: Routing",[16,996,997,1000,1001,161],{},[33,998,999],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fsteps\u002Froute\u002Findex.ts"," — der abschließende Schritt. Er entscheidet über automatische Freigabe versus menschliche Prüfung in ",[28,1002,1003],{},"drei Stufen, die sicherste zuerst",[1005,1006,1007,1021,1043],"ol",{},[488,1008,1009,1012,1013,1016,1017,1020],{},[28,1010,1011],{},"Sicherheitsschranke der Circuit Breaker."," Jeder offene Breaker (",[33,1014,1015],{},"internal.agentHealth.getCircuitBreakersInternal",") erzwingt ",[33,1018,1019],{},"human_review"," — eine beeinträchtigte Strecke versendet nie automatisch, unabhängig von der Konfiguration.",[488,1022,1023,1026,1027,1030,1031,1034,1035,1038,1039,1042],{},[28,1024,1025],{},"Abgestufte Autonomie"," (wenn das Flag ",[33,1028,1029],{},"ai.autonomy"," aktiv ist). ",[33,1032,1033],{},"internal.autonomy.checkPermissionInternal"," wendet die kategoriebezogenen ",[33,1036,1037],{},"autonomyRules"," an (Schwellwert + Tageslimit + Breaker-Prüfung). Eine Kategorie ",[28,1040,1041],{},"ohne Regel wird nie automatisch freigegeben","; eine erlaubte belastet den kategoriebezogenen Tageszähler.",[488,1044,1045,1048,1049,1052,1053,137,1056,1059],{},[28,1046,1047],{},"Klassischer globaler Rückfall"," (Autonomie-Flag aus). Das einzelne ",[33,1050,1051],{},"agentConfig","-Singleton — ",[33,1054,1055],{},"isAutoReplyEnabled",[33,1057,1058],{},"confidenceThreshold"," und die Felder für das Tageslimit.",[16,1061,1062,1063,1066,1067,1070,1071,1074,1075,1078,1079,1081],{},"Bei ",[33,1064,1065],{},"auto_approve"," erfolgt der Übergang nach ",[33,1068,1069],{},"approved","; der Effekt ",[33,1072,1073],{},"schedule_send_approved"," des Lebenszyklus versendet die Antwort dann über ",[33,1076,1077],{},"internal.agent.agentPipeline.sendApprovedReply",". Andernfalls erfolgt der Übergang nach ",[33,1080,943],{}," (wartet auf menschliche Prüfung).",[20,1083,1085],{"title":1084,"type":23},"Routing mit abgestufter Autonomie — verdrahtet",[16,1086,1087,1088,1090,1091,1093,1094,1096,1097,1099,1100,1103],{},"Der Routing-Schritt zieht nicht mehr nur ",[33,1089,1051],{}," heran. Er liest inzwischen die Circuit Breaker und — hinter dem Flag ",[33,1092,1029],{}," — die kategoriebezogenen ",[33,1095,1037],{}," über ",[33,1098,1033],{},"; der klassische globale Schwellwert ist nur noch die Rückfallstufe. Siehe ",[61,1101,1025],{"href":1102},"#graduated-autonomy"," weiter unten.",[72,1105,1107],{"id":1106},"integration-eingehender-e-mail","Integration eingehender E-Mail",[430,1109,1111],{"id":1110},"ablauf-mta-convex","Ablauf MTA → Convex",[16,1113,1114,1115,1118],{},"Eingehende Mail für das gemeinsame Agenten-Postfach kommt über den üblichen MTA-Webhook an, ",[28,1116,1117],{},"nicht"," über eine eigene Eingangsroute:",[107,1120,1125],{"className":1121,"code":1123,"language":1124},[1122],"language-text","Inbound SMTP → owlat-mta\n  → POST \u002Fwebhooks\u002Fmta  (apps\u002Fapi\u002Fconvex\u002Fhttp.ts → providerFeedbackWebhook('mta'),\n                         apps\u002Fapi\u002Fconvex\u002Fwebhooks\u002FproviderFeedbackHttp.ts)\n    → webhook pipeline verifies HMAC, parses the `inbound.received` event\n      (apps\u002Fapi\u002Fconvex\u002Fwebhooks\u002Fadapters\u002Fmta.ts)\n    → dispatcher routes inbound.received → internal.inbox.messages.receiveMessage\n","text",[33,1126,1123],{"__ignoreMap":112},[20,1128,1130],{"title":1129,"type":370},"Verwechseln Sie die beiden MTA-Webhooks nicht",[16,1131,1132,1135,1136,1139,1140,1143,1144,1147,1148,1152,1153,1156],{},[33,1133,1134],{},"POST \u002Fwebhooks\u002Fmta"," transportiert Zustellereignisse ",[28,1137,1138],{},"und"," das Ereignis ",[33,1141,1142],{},"inbound.received"," für das Agenten-Postfach. Die separate Route ",[33,1145,1146],{},"POST \u002Fwebhooks\u002Fmta-mailbox"," gehört zu ",[61,1149,1151],{"href":1150},"\u002Fguide\u002Fpostbox","Postbox"," (persönliche Mail pro Benutzerin und Benutzer) und läuft über ",[33,1154,1155],{},"mail\u002Fwebhook.ts",", nicht über die Agenten-Strecke.",[16,1158,1159,412,1162,1164,1165,1168],{},[33,1160,1161],{},"receiveMessage",[33,1163,39],{},", eine ",[33,1166,1167],{},"internalMutation",") tut anschließend Folgendes:",[1005,1170,1171,1184,1191,1201,1208],{},[488,1172,1173,1174,1176,1177,1180,1181,510],{},"Legt die Absenderin oder den Absender als ",[33,1175,591],{},"-Zeile an bzw. aktualisiert sie (Kanal ",[33,1178,1179],{},"email",", Quelle ",[33,1182,1183],{},"inbound",[488,1185,1186,1187,1190],{},"Ermittelt oder erzeugt über die Threading-Kaskade eine ",[33,1188,1189],{},"conversationThreads","-Zeile.",[488,1192,1193,1194,1196,1197,1200],{},"Fügt die ",[33,1195,609],{},"-Zeile mit ",[33,1198,1199],{},"processingStatus: 'received'"," ein.",[488,1202,1203,1204,1207],{},"Hält eine Kontaktaktivität ",[33,1205,1206],{},"inbound_received"," fest.",[488,1209,1210,1211,1214,1215,1217],{},"Plant ",[33,1212,1213],{},"internal.agent.walker.start"," ein, was die Strecke bei ",[33,1216,399],{}," anstößt.",[430,1219,1221],{"id":1220},"threading","Threading",[16,1223,1224,1225,1227],{},"Das Threading (verantwortet vom Thread-Modul, das aus ",[33,1226,1161],{}," aufgerufen wird) ist eine Kaskade aus drei Strategien:",[1005,1229,1230,1238,1246],{},[488,1231,1232,1237],{},[28,1233,1234],{},[33,1235,1236],{},"In-Reply-To","-Header → den Thread der referenzierten Nachricht finden.",[488,1239,1240,1245],{},[28,1241,1242],{},[33,1243,1244],{},"References","-Header → den Thread irgendeiner referenzierten Nachricht finden.",[488,1247,1248,1251,1252,70],{},[28,1249,1250],{},"Rückfall:"," normalisierter Betreff (Re:\u002FFwd: entfernt, kleingeschrieben) + ",[33,1253,1254],{},"contactIdentifier",[16,1256,1257,1258,384,1261,1264],{},"Ein passender Thread wird wieder geöffnet, falls er geschlossen war; ",[33,1259,1260],{},"messageCount",[33,1262,1263],{},"lastMessageAt"," des Threads werden atomar gepflegt.",[72,1266,1268],{"id":1267},"schema-erweiterungen","Schema-Erweiterungen",[16,1270,1271,1272,1274],{},"Die Postfach-\u002FAgenten-Tabellen sind in ",[33,1273,43],{}," definiert.",[430,1276,609],{"id":1277},"inboundmessages",[16,1279,1280],{},"Speichert jede eingehende E-Mail samt ihrem Verarbeitungszustand.",[285,1282,1283,1296],{},[288,1284,1285],{},[291,1286,1287,1290,1293],{},[294,1288,1289],{},"Feld",[294,1291,1292],{},"Typ",[294,1294,1295],{},"Beschreibung",[301,1297,1298,1311,1329,1345,1360,1375,1388,1401,1436,1449,1461,1475,1487,1505,1517,1529,1542],{},[291,1299,1300,1305,1308],{},[306,1301,1302],{},[33,1303,1304],{},"messageId",[306,1306,1307],{},"string",[306,1309,1310],{},"SMTP-Message-ID",[291,1312,1313,1324,1326],{},[306,1314,1315,137,1318,137,1321],{},[33,1316,1317],{},"from",[33,1319,1320],{},"to",[33,1322,1323],{},"subject",[306,1325,1307],{},[306,1327,1328],{},"Envelope-Daten",[291,1330,1331,1339,1342],{},[306,1332,1333,137,1336],{},[33,1334,1335],{},"textBody",[33,1337,1338],{},"htmlBody",[306,1340,1341],{},"string?",[306,1343,1344],{},"Nachrichteninhalt",[291,1346,1347,1355,1357],{},[306,1348,1349,137,1352],{},[33,1350,1351],{},"inReplyTo",[33,1353,1354],{},"references",[306,1356,1341],{},[306,1358,1359],{},"Threading-Header",[291,1361,1362,1370,1372],{},[306,1363,1364,137,1367],{},[33,1365,1366],{},"headers",[33,1368,1369],{},"attachmentMeta",[306,1371,1341],{},[306,1373,1374],{},"Rohe Header \u002F Anhang-Metadaten (JSON)",[291,1376,1377,1382,1385],{},[306,1378,1379],{},[33,1380,1381],{},"threadId",[306,1383,1384],{},"id → conversationThreads",[306,1386,1387],{},"Konversations-Thread",[291,1389,1390,1395,1398],{},[306,1391,1392],{},[33,1393,1394],{},"contactId",[306,1396,1397],{},"id → contacts",[306,1399,1400],{},"Verknüpfter Kontakt",[291,1402,1403,1407,1410],{},[306,1404,1405],{},[33,1406,316],{},[306,1408,1409],{},"enum",[306,1411,1412,137,1414,137,1416,137,1418,137,1420,137,1422,137,1424,137,1426,137,1429,137,1432,137,1434],{},[33,1413,445],{},[33,1415,449],{},[33,1417,496],{},[33,1419,519],{},[33,1421,947],{},[33,1423,943],{},[33,1425,1069],{},[33,1427,1428],{},"sent",[33,1430,1431],{},"rejected",[33,1433,505],{},[33,1435,365],{},[291,1437,1438,1443,1446],{},[306,1439,1440],{},[33,1441,1442],{},"securityFlags",[306,1444,1445],{},"object?",[306,1447,1448],{},"Ergebnisse der Musterprüfung (Injection, Spam-Score, Konfidenz)",[291,1450,1451,1456,1458],{},[306,1452,1453],{},[33,1454,1455],{},"classification",[306,1457,1445],{},[306,1459,1460],{},"Ergebnis des Klassifikators (Kategorie, Priorität, Stimmung, Absicht, Konfidenz)",[291,1462,1463,1470,1472],{},[306,1464,1465,137,1468],{},[33,1466,1467],{},"draftResponse",[33,1469,990],{},[306,1471,1341],{},[306,1473,1474],{},"Vom Agenten erzeugter Entwurf",[291,1476,1477,1481,1484],{},[306,1478,1479],{},[33,1480,984],{},[306,1482,1483],{},"number?",[306,1485,1486],{},"Gesamtkonfidenz für die Routing-Entscheidung",[291,1488,1489,1494,1497],{},[306,1490,1491],{},[33,1492,1493],{},"contextTier",[306,1495,1496],{},"enum?",[306,1498,1499,384,1501,384,1503],{},[33,1500,677],{},[33,1502,690],{},[33,1504,703],{},[291,1506,1507,1512,1514],{},[306,1508,1509],{},[33,1510,1511],{},"assignedTo",[306,1513,1341],{},[306,1515,1516],{},"Menschliche Prüfinstanz (BetterAuth-Benutzer-ID)",[291,1518,1519,1524,1526],{},[306,1520,1521],{},[33,1522,1523],{},"errorMessage",[306,1525,1341],{},[306,1527,1528],{},"Fehlerdetails der Strecke",[291,1530,1531,1536,1539],{},[306,1532,1533],{},[33,1534,1535],{},"receivedAt",[306,1537,1538],{},"number",[306,1540,1541],{},"Zeitstempel des Nachrichteneingangs",[291,1543,1544,1549,1551],{},[306,1545,1546],{},[33,1547,1548],{},"processedAt",[306,1550,1483],{},[306,1552,1553],{},"Zeitstempel, zu dem die Strecke fertig war (gesetzt, sobald die Verarbeitung abgeschlossen ist)",[430,1555,1189],{"id":1556},"conversationthreads",[16,1558,1559],{},"Fasst zusammengehörige Nachrichten zu Konversationen zusammen.",[285,1561,1562,1572],{},[288,1563,1564],{},[291,1565,1566,1568,1570],{},[294,1567,1289],{},[294,1569,1292],{},[294,1571,1295],{},[301,1573,1574,1588,1598,1613,1636,1647,1668],{},[291,1575,1576,1583,1585],{},[306,1577,1578,137,1580],{},[33,1579,1323],{},[33,1581,1582],{},"normalizedSubject",[306,1584,1307],{},[306,1586,1587],{},"Anzeigebetreff \u002F Abgleichsschlüssel",[291,1589,1590,1594,1596],{},[306,1591,1592],{},[33,1593,1394],{},[306,1595,1397],{},[306,1597,1400],{},[291,1599,1600,1604,1606],{},[306,1601,1602],{},[33,1603,1254],{},[306,1605,1307],{},[306,1607,1608,1609,1612],{},"Kanalneutraler Anzeigebezeichner — E-Mail für E-Mail\u002Fgenerisch, Telefonnummer\u002FHandle für SMS\u002FWhatsApp\u002FChat (in ADR-0032 aus ",[33,1610,1611],{},"contactEmail"," umbenannt)",[291,1614,1615,1620,1622],{},[306,1616,1617],{},[33,1618,1619],{},"status",[306,1621,1409],{},[306,1623,1624,137,1627,137,1630,137,1633],{},[33,1625,1626],{},"open",[33,1628,1629],{},"waiting",[33,1631,1632],{},"resolved",[33,1634,1635],{},"closed",[291,1637,1638,1642,1644],{},[306,1639,1640],{},[33,1641,1511],{},[306,1643,1341],{},[306,1645,1646],{},"Zugewiesenes Teammitglied",[291,1648,1649,1654,1656],{},[306,1650,1651],{},[33,1652,1653],{},"latestDraftStatus",[306,1655,1496],{},[306,1657,1658,384,1661,384,1663,384,1665,1667],{},[33,1659,1660],{},"pending",[33,1662,1069],{},[33,1664,1431],{},[33,1666,1428],{}," — für schnelles Filtern der Warteschlange",[291,1669,1670,1682,1684],{},[306,1671,1672,137,1674,137,1677,137,1679],{},[33,1673,1260],{},[33,1675,1676],{},"firstMessageAt",[33,1678,1263],{},[33,1680,1681],{},"createdAt",[306,1683,1538],{},[306,1685,1686],{},"Thread-Metadaten",[430,1688,349],{"id":1689},"agentactions",[16,1691,1692,1693,1696],{},"Eine Zeile pro ",[28,1694,1695],{},"Schrittausführung"," der Strecke (nicht pro geplanter Aktion).",[285,1698,1699,1709],{},[288,1700,1701],{},[291,1702,1703,1705,1707],{},[294,1704,1289],{},[294,1706,1292],{},[294,1708,1295],{},[301,1710,1711,1724,1746,1769,1782,1797,1815],{},[291,1712,1713,1718,1721],{},[306,1714,1715],{},[33,1716,1717],{},"inboundMessageId",[306,1719,1720],{},"id → inboundMessages",[306,1722,1723],{},"Quellnachricht",[291,1725,1726,1731,1733],{},[306,1727,1728],{},[33,1729,1730],{},"actionType",[306,1732,1409],{},[306,1734,1735,137,1737,137,1739,137,1741,137,1743,1745],{},[33,1736,399],{},[33,1738,402],{},[33,1740,405],{},[33,1742,408],{},[33,1744,411],{}," (die Schrittarten)",[291,1747,1748,1752,1754],{},[306,1749,1750],{},[33,1751,1619],{},[306,1753,1409],{},[306,1755,1756,137,1758,137,1761,137,1764,137,1766],{},[33,1757,1660],{},[33,1759,1760],{},"running",[33,1762,1763],{},"completed",[33,1765,365],{},[33,1767,1768],{},"skipped",[291,1770,1771,1777,1779],{},[306,1772,1773,137,1775],{},[33,1774,218],{},[33,1776,252],{},[306,1778,1341],{},[306,1780,1781],{},"Eingabe \u002F Ausgabe des Schritts (JSON)",[291,1783,1784,1791,1794],{},[306,1785,1786,137,1788],{},[33,1787,1523],{},[33,1789,1790],{},"retryCount",[306,1792,1793],{},"string? \u002F number",[306,1795,1796],{},"Fehlernachverfolgung",[291,1798,1799,1810,1812],{},[306,1800,1801,137,1804,137,1807],{},[33,1802,1803],{},"startedAt",[33,1805,1806],{},"completedAt",[33,1808,1809],{},"durationMs",[306,1811,1483],{},[306,1813,1814],{},"Zeitmessung",[291,1816,1817,1825,1828],{},[306,1818,1819,137,1822],{},[33,1820,1821],{},"modelUsed",[33,1823,1824],{},"tokenUsage",[306,1826,1827],{},"string? \u002F object?",[306,1829,1830,1831,384,1833,221],{},"LLM-Nutzung (für ",[33,1832,405],{},[33,1834,408],{},[430,1836,1051],{"id":1837},"agentconfig",[16,1839,1840,1841,1844,1845,412,1848,416,1851,1854,1855,1858,1859,1861],{},"Das ",[28,1842,1843],{},"Singleton"," für die betriebliche Feinjustierung. Der Hauptschalter ist das Feature-Flag ",[33,1846,1847],{},"ai.agent",[33,1849,1850],{},"isAgentEnabled",[33,1852,1853],{},"agent\u002FagentPipeline.ts"," ruft ",[33,1856,1857],{},"isFeatureEnabled(ctx, 'ai.agent')"," auf), ",[28,1860,1117],{}," eine Spalte dieser Tabelle.",[285,1863,1864,1874],{},[288,1865,1866],{},[291,1867,1868,1870,1872],{},[294,1869,1289],{},[294,1871,1292],{},[294,1873,1295],{},[301,1875,1876,1888,1900,1912,1924,1936,1951],{},[291,1877,1878,1882,1885],{},[306,1879,1880],{},[33,1881,1055],{},[306,1883,1884],{},"boolean",[306,1886,1887],{},"Automatischen Versand ohne menschliche Prüfung erlauben",[291,1889,1890,1894,1897],{},[306,1891,1892],{},[33,1893,1058],{},[306,1895,1896],{},"number (0–1)",[306,1898,1899],{},"Mindestkonfidenz für die automatische Freigabe",[291,1901,1902,1907,1909],{},[306,1903,1904],{},[33,1905,1906],{},"toneDescription",[306,1908,1341],{},[306,1910,1911],{},"Kommunikationsstil der Organisation",[291,1913,1914,1919,1921],{},[306,1915,1916],{},[33,1917,1918],{},"signatureTemplate",[306,1920,1341],{},[306,1922,1923],{},"E-Mail-Signatur für Agentenentwürfe",[291,1925,1926,1931,1933],{},[306,1927,1928],{},[33,1929,1930],{},"maxDailyAutoReplies",[306,1932,1483],{},[306,1934,1935],{},"Tageslimit für automatische Antworten",[291,1937,1938,1946,1948],{},[306,1939,1940,137,1943],{},[33,1941,1942],{},"dailyAutoReplyCount",[33,1944,1945],{},"dailyAutoReplyResetAt",[306,1947,1483],{},[306,1949,1950],{},"Fortlaufende Zähler für das Tageslimit",[291,1952,1953,1958,1960],{},[306,1954,1955],{},[33,1956,1957],{},"coalesceWindowMs",[306,1959,1483],{},[306,1961,1962,1963,1966],{},"Debounce-Fenster für das Zusammenfassen. Opt-in: Ein positiver Wert aktiviert das Zusammenfassen; nicht gesetzt bzw. ",[33,1964,1965],{},"0"," (der Standard) verarbeitet jede Nachricht sofort",[72,1968,1970],{"id":1969},"modell-routing","Modell-Routing",[16,1972,1973,1974,1976],{},"Verschiedene Schritte der Strecke haben verschiedene Anforderungen. Die Klassifizierung braucht Tempo und strukturierte Ausgabe; die Entwurfserzeugung braucht Qualität und Nuance. Der Anbieter-Resolver (",[33,1975,542],{},") routet jede Aufgabe an eine von zwei Modellstufen.",[430,1978,1980],{"id":1979},"modellauswahl-je-aufgabe","Modellauswahl je Aufgabe",[16,1982,1983,1986],{},[33,1984,1985],{},"getLLMProvider(task)"," löst einen OpenAI-kompatiblen Client und die Modell-ID für die Stufe der jeweiligen Aufgabe auf:",[107,1988,1990],{"className":109,"code":1989,"language":111,"meta":112,"style":112},"\u002F\u002F apps\u002Fapi\u002Fconvex\u002Flib\u002FllmProvider.ts\nexport function getLLMProvider(task: LLMTask = 'draft') {\n  return getClient()(modelIdForTier(taskTier(task)))\n}\n",[33,1991,1992,1997,2027,2049],{"__ignoreMap":112},[116,1993,1994],{"class":118,"line":119},[116,1995,1996],{"class":199},"\u002F\u002F apps\u002Fapi\u002Fconvex\u002Flib\u002FllmProvider.ts\n",[116,1998,1999,2002,2005,2008,2010,2013,2015,2018,2021,2024],{"class":118,"line":151},[116,2000,2001],{"class":122},"export",[116,2003,2004],{"class":122}," function",[116,2006,2007],{"class":206}," getLLMProvider",[116,2009,210],{"class":130},[116,2011,2012],{"class":157},"task",[116,2014,161],{"class":122},[116,2016,2017],{"class":126}," LLMTask",[116,2019,2020],{"class":122}," =",[116,2022,2023],{"class":186}," 'draft'",[116,2025,2026],{"class":130},") {\n",[116,2028,2029,2032,2035,2038,2041,2043,2046],{"class":118,"line":167},[116,2030,2031],{"class":122},"  return",[116,2033,2034],{"class":206}," getClient",[116,2036,2037],{"class":130},"()(",[116,2039,2040],{"class":206},"modelIdForTier",[116,2042,210],{"class":130},[116,2044,2045],{"class":206},"taskTier",[116,2047,2048],{"class":130},"(task)))\n",[116,2050,2051],{"class":118,"line":203},[116,2052,277],{"class":130},[16,2054,2055,2056,412,2059,2061],{},"Die Auflösung der Stufe steckt in ",[33,2057,2058],{},"taskTier()",[33,2060,542],{},"):",[285,2063,2064,2076],{},[288,2065,2066],{},[291,2067,2068,2071,2073],{},[294,2069,2070],{},"Aufgabe",[294,2072,662],{},[294,2074,2075],{},"Genutzt von",[301,2077,2078,2090,2102,2113,2125,2137],{},[291,2079,2080,2084,2087],{},[306,2081,2082],{},[33,2083,405],{},[306,2085,2086],{},"fast",[306,2088,2089],{},"Klassifizierungsschritt",[291,2091,2092,2097,2099],{},[306,2093,2094],{},[33,2095,2096],{},"extract",[306,2098,2086],{},[306,2100,2101],{},"Wissensextraktion",[291,2103,2104,2108,2110],{},[306,2105,2106],{},[33,2107,539],{},[306,2109,2086],{},[306,2111,2112],{},"LLM-Injection-Klassifikator der Sicherheitsprüfung",[291,2114,2115,2120,2122],{},[306,2116,2117],{},[33,2118,2119],{},"summarize",[306,2121,2086],{},[306,2123,2124],{},"Zusammenfassung",[291,2126,2127,2131,2134],{},[306,2128,2129],{},[33,2130,408],{},[306,2132,2133],{},"capable",[306,2135,2136],{},"Schritt der Entwurfserzeugung",[291,2138,2139,2143,2145],{},[306,2140,2141],{},[33,2142,423],{},[306,2144,2133],{},[306,2146,2147],{},"(reserviert — der plan-Schritt wurde verworfen)",[430,2149,2151],{"id":2150},"konfiguration","Konfiguration",[16,2153,2154,2155,2159,2160,2164,2165,2168,2169,2172,2173,70],{},"Siehe ",[61,2156,2158],{"href":2157},"\u002Fdeveloper\u002Fdecisions\u002F007-pluggable-llm","ADR-007"," für die Anbieter-Abstraktion und ",[61,2161,2163],{"href":2162},"\u002Fdeveloper\u002Fdecisions\u002F009-model-routing","ADR-009"," für die Routing-Entscheidung. Die Standardwerte sind ",[33,2166,2167],{},"gpt-4o-mini"," (fast) und ",[33,2170,2171],{},"gpt-4o"," (capable), gemäß ",[33,2174,542],{},[285,2176,2177,2189],{},[288,2178,2179],{},[291,2180,2181,2184,2186],{},[294,2182,2183],{},"Variable",[294,2185,1295],{},[294,2187,2188],{},"Standard",[301,2190,2191,2204,2225],{},[291,2192,2193,2198,2201],{},[306,2194,2195],{},[33,2196,2197],{},"LLM_MODEL",[306,2199,2200],{},"Rückfallmodell für alle Aufgaben",[306,2202,2203],{},"—",[291,2205,2206,2211,2217],{},[306,2207,2208],{},[33,2209,2210],{},"LLM_MODEL_CAPABLE",[306,2212,2213,2214,2216],{},"Modell für die Stufe ",[33,2215,408],{}," (capable)",[306,2218,2219,2220,2222,2223],{},"Fällt zurück auf ",[33,2221,2197],{},", dann ",[33,2224,2171],{},[291,2226,2227,2232,2235],{},[306,2228,2229],{},[33,2230,2231],{},"LLM_MODEL_FAST",[306,2233,2234],{},"Modell für Aufgaben der schnellen Stufe (classify, extract, guard, summarize)",[306,2236,2219,2237,2222,2239],{},[33,2238,2197],{},[33,2240,2167],{},[16,2242,2243,2244,2246],{},"Wer selbst hostet und ein einzelnes Ollama-Modell betreibt, kann nur ",[33,2245,2197],{}," setzen — beide Stufen fallen darauf zurück. Organisationen mit GPU-Budget können aufteilen: ein kleines Modell für die Klassifizierung und ein größeres für das Entwerfen.",[72,2248,2250],{"id":2249},"quarantäne","Quarantäne",[16,2252,2253,2254,2257,2258,2260,2261,2264,2265,2267,2268,2271,2272,2274],{},"Von der Sicherheitsprüfung markierte Nachrichten werden nicht stillschweigend verworfen. Sie werden mit ",[33,2255,2256],{},"processingStatus: 'quarantined'"," und einem ",[33,2259,1442],{},"-Objekt gespeichert und erscheinen in einer eigenen Admin-Ansicht (",[33,2262,2263],{},"apps\u002Fweb\u002Fapp\u002Fpages\u002Fdashboard\u002Finbox\u002Fquarantine.vue","), in der ein Mensch sie prüfen und freigeben kann. Die Freigabe einer Nachricht aus der Quarantäne überführt sie zurück nach ",[33,2266,445],{}," (die Quelle ",[33,2269,2270],{},"release_quarantine"," des Lebenszyklus), wodurch die Strecke ab ",[33,2273,399],{}," erneut läuft.",[72,2276,2278],{"id":2277},"prüf-warteschlange","Prüf-Warteschlange",[16,2280,2281,2282,2284,2285,2288],{},"Die Prüf-Warteschlange ist die Schnittstelle für den Menschen in der Schleife — eine Sicht auf ",[33,2283,609],{},", gefiltert nach ",[33,2286,2287],{},"processingStatus = 'draft_ready'",", kein separates System.",[430,2290,2292],{"id":2291},"oberfläche","Oberfläche",[485,2294,2295,2303,2311,2322],{},[488,2296,2297,2302],{},[28,2298,2299],{},[33,2300,2301],{},"\u002Fdashboard\u002Finbox"," — Thread-Liste mit Filtern.",[488,2304,2305,2310],{},[28,2306,2307],{},[33,2308,2309],{},"\u002Fdashboard\u002Finbox\u002F[threadId]"," — vollständige Konversation mit dem Agentenentwurf und den Bedienelementen Freigeben \u002F Bearbeiten \u002F Ablehnen.",[488,2312,2313,412,2318,2321],{},[28,2314,2315],{},[33,2316,2317],{},"\u002Fdashboard\u002Finbox\u002Freview",[33,2319,2320],{},"review.vue",") — fokussierte Prüf-Warteschlange der Vorgänge, die Aufmerksamkeit brauchen.",[488,2323,2324,412,2329,2332],{},[28,2325,2326],{},[33,2327,2328],{},"\u002Fdashboard\u002Finbox\u002Fquarantine",[33,2330,2331],{},"quarantine.vue",") — sicherheitsmarkierte Nachrichten.",[430,2334,2336],{"id":2335},"aktionen","Aktionen",[485,2338,2339,2350,2356,2364],{},[488,2340,2341,2344,2345,2222,2347,2349],{},[28,2342,2343],{},"Freigeben"," — versendet den Entwurf unverändert; Status → ",[33,2346,1069],{},[33,2348,1428],{}," nach bestätigter Übergabe an den Anbieter.",[488,2351,2352,2355],{},[28,2353,2354],{},"Bearbeiten und freigeben"," — den Entwurf ändern, dann senden.",[488,2357,2358,2361,2362,70],{},[28,2359,2360],{},"Ablehnen"," — Status → ",[33,2363,1431],{},[488,2365,2366,2369],{},[28,2367,2368],{},"Neu zuweisen"," — an ein anderes Teammitglied routen.",[16,2371,2372,2373,457,2377,70],{},"Den vollständigen Arbeitsablauf finden Sie in den Leitfäden aus Betreibersicht ",[61,2374,2376],{"href":2375},"\u002Fguide\u002Fteam-inbox","Team-Postfach",[61,2378,69],{"href":68},[72,2380,1025],{"id":2381},"abgestufte-autonomie",[16,2383,2384,2385,2388,2389,70],{},"Die Autonomie- und Betriebsschicht (Tabellen in ",[33,2386,2387],{},"schema\u002Finbox.ts",") ist inzwischen in die aktive Routing-Entscheidung eingebunden, hinter dem Feature-Flag ",[33,2390,1029],{},[285,2392,2393,2406],{},[288,2394,2395],{},[291,2396,2397,2400,2403],{},[294,2398,2399],{},"Tabelle",[294,2401,2402],{},"Zweck",[294,2404,2405],{},"Status",[301,2407,2408,2444,2473,2512,2543],{},[291,2409,2410,2414,2428],{},[306,2411,2412],{},[33,2413,1037],{},[306,2415,2416,2417,2420,2421,2424,2425],{},"Kategoriebezogener ",[33,2418,2419],{},"autoApproveThreshold"," + Tageslimit ",[33,2422,2423],{},"maxDailyAutoActions"," + Schalter ",[33,2426,2427],{},"isEnabled",[306,2429,2430,2433,2434,2436,2437,2439,2440,2443],{},[28,2431,2432],{},"Aktiv"," — der ",[33,2435,411],{},"-Schritt liest sie über ",[33,2438,1033],{}," (Stufe 2); Crons setzen die Zähler zurück und ",[33,2441,2442],{},"adjustThresholds"," justiert sie wöchentlich",[291,2445,2446,2451,2454],{},[306,2447,2448],{},[33,2449,2450],{},"autonomyFeedback",[306,2452,2453],{},"Menschliche Signale aus Freigabe\u002FAblehnung\u002FBearbeitung zur Schwellwertjustierung",[306,2455,2456,2458,2459,2462,2463,2466,2467,2469,2470],{},[28,2457,2432],{}," — Freigeben\u002FAblehnen\u002FBearbeiten in ",[33,2460,2461],{},"inbox\u002Fmutations.ts"," rufen ",[33,2464,2465],{},"internal.autonomy.recordFeedback"," auf und speisen damit sowohl den wöchentlichen ",[33,2468,2442],{},"-Cron als auch den Breaker ",[33,2471,2472],{},"rejection_spike",[291,2474,2475,2480,2483],{},[306,2476,2477],{},[33,2478,2479],{},"agentMetrics",[306,2481,2482],{},"Metriken über ein gleitendes Fenster",[306,2484,2485,137,2488,137,2491,137,2494,137,2497,457,2500,2503,2504,2507,2508,2511],{},[33,2486,2487],{},"queue_depth",[33,2489,2490],{},"processing_latency",[33,2492,2493],{},"error_rate",[33,2495,2496],{},"auto_approve_ratio",[33,2498,2499],{},"rejection_rate",[33,2501,2502],{},"llm_cost"," werden sämtlich von ",[33,2505,2506],{},"agentHealth.ts:rollupMetrics"," befüllt. classification_accuracy wird ebenfalls von ",[33,2509,2510],{},"rollupMetrics"," befüllt, als Näherung über die mittlere selbstberichtete Konfidenz — einen Strom menschlich gelabelter Referenzwerte gibt es weiterhin nicht",[291,2513,2514,2519,2530],{},[306,2515,2516],{},[33,2517,2518],{},"agentCircuitBreakers",[306,2520,2521,2522,384,2525,384,2528],{},"Automatisch auslösende Sicherung bei ",[33,2523,2524],{},"llm_failure",[33,2526,2527],{},"confidence_degradation",[33,2529,2472],{},[306,2531,2532,2535,2536,2539,2540,2542],{},[28,2533,2534],{},"Alle drei"," werden bei jedem Rollup mit Hysterese ausgewertet (",[33,2537,2538],{},"open → half_open → closed","); der ",[33,2541,411],{},"-Schritt verweigert die automatische Freigabe, solange irgendein Breaker offen ist",[291,2544,2545,2550,2553],{},[306,2546,2547],{},[33,2548,2549],{},"knowledgeBackfillJobs",[306,2551,2552],{},"Einmalige Extraktion historischen Wissens",[306,2554,2555,2556,2558,2559,221],{},"Aktiv — wird angestoßen, wenn das Flag ",[33,2557,1847],{}," von false auf true kippt (",[33,2560,2561],{},"agent\u002FknowledgeBackfill.ts",[20,2563,2565],{"title":2564,"type":23},"Die Autonomie ist jetzt eine geschlossene Feedback-Schleife",[16,2566,2567,2568,2570,2571,2573,2574,2576,2577,2579,2580,2582,2583,2585,2586,2588,2589,2591],{},"Der Routing-Schritt entscheidet in drei Stufen — Sicherheitsschranke der Circuit Breaker, kategoriebezogene ",[33,2569,1037],{}," (hinter dem Flag ",[33,2572,1029],{},"), dann der klassische globale Schwellwert aus ",[33,2575,1051],{},". Menschliche Entscheidungen zu Freigabe \u002F Ablehnung \u002F Bearbeitung fließen als ",[33,2578,2450],{}," zurück; der wöchentliche ",[33,2581,2442],{},"-Cron nutzt sie, um kategoriebezogene Schwellwerte zu straffen oder zu lockern, und das Health-Rollup nutzt sie für den Breaker ",[33,2584,2472],{},". Ist ",[33,2587,1029],{}," aus, greift allein die klassische globale Steuerung über ",[33,2590,1051],{}," (Schalter für automatische Antworten, Konfidenzschwelle, Tageslimit).",[72,2593,2595],{"id":2594},"zusammenfassen-von-nachrichten","Zusammenfassen von Nachrichten",[16,2597,2598],{},"E-Mail-Threads treffen oft in Schüben ein — eine CC-Kette mit drei Antworten in 30 Sekunden. Das Zusammenfassen (Coalescing) faltet einen solchen Schub in einen einzigen Streckenlauf auf der jüngsten Nachricht zusammen, statt die Strecke je Nachricht auszuführen.",[20,2600,2602,2633],{"title":2601,"type":23},"Zusammenfassen — ausgeliefert (Opt-in)",[16,2603,2604,2607,2608,2611,2612,2615,2616,2618,2619,2622,2623,2625,2626,2628,2629,2632],{},[33,2605,2606],{},"apps\u002Fapi\u002Fconvex\u002Fagent\u002Fcoalescing.ts"," ist implementiert. ",[33,2609,2610],{},"shouldCoalesce"," ist ein Debounce: Es storniert einen ",[33,2613,2614],{},"processCoalescedBatch","-Job pro Thread und plant ihn ",[33,2617,1957],{}," in die Zukunft neu ein (eine ",[33,2620,2621],{},"coalesceBatches","-Zeile pro Thread), sodass der Stapel erst dann feuert, wenn der Thread ein volles Fenster lang ruhig bleibt. ",[33,2624,2614],{}," wählt anschließend die neueste noch mit ",[33,2627,445],{}," markierte Nachricht als Anführerin, verdrängt die älteren (archiviert mit Grund ",[33,2630,2631],{},"coalesced",", deren Inhalt den Agenten weiterhin über den Thread-Verlauf erreicht) und führt die Strecke einmal für die Anführerin aus.",[16,2634,2635,2636,2639,2640,2643],{},"Es ist ",[28,2637,2638],{},"Opt-in",": Das Zusammenfassen ist nur aktiv, wenn ",[33,2641,2642],{},"agentConfig.coalesceWindowMs"," einen positiven Wert hat. Nicht gesetzt (der Standard) bedeutet, dass jede Nachricht sofort verarbeitet wird, ohne zusätzliche Latenz.",[72,2645,2647],{"id":2646},"verzweigung-bei-mehreren-absichten-zukunft","Verzweigung bei mehreren Absichten (Zukunft)",[16,2649,2650],{},"Ein künftiger Entwurf lässt eine Nachricht mit mehreren Absichten (etwa „prüfen Sie meinen Rechnungsstatus, und wir hätten gern einen Dark Mode“) in parallele Worker-Zweige verzweigen, von denen jeder seinen eigenen Entwurf erzeugt, wobei die Prüf-Warteschlange beide verknüpft mit derselben eingehenden Nachricht anzeigt.",[20,2652,2654],{"title":2653,"type":370},"Nicht im Code",[16,2655,2656,2657,2659,2660,2662,2663,70],{},"Der Walker führt eine einzelne lineare Schrittkette aus, und ",[33,2658,405],{}," erzeugt ein einziges ",[33,2661,380],{},"-Objekt — heute gibt es keinen Mechanismus für Verzweigung \u002F Worker A \u002F Worker B. Zur Richtung der Prozessarchitektur siehe ",[61,2664,2666],{"href":2665},"\u002Fdeveloper\u002Fdecisions\u002F008-process-architecture","ADR-008",[72,2668,2670],{"id":2669},"verwandt","Verwandt",[2672,2673],"link-card",{"description":2674,"title":69,"to":68},"Leitfaden für Betreiber: den Agenten aktivieren, den Tonfall justieren, automatische Antworten und Prüfung.",[2672,2676],{"description":2677,"title":2376,"to":2375},"Eingehende Mail als Team triagieren — mit Konversations-Threads und der Prüf-Warteschlange.",[2672,2679],{"description":2680,"title":64,"to":63},"Typisiertes Organisationswissen — die Kontextschicht, aus der der Agent beim Abruf schöpft.",[2682,2683,2684],"style",{},"html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}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);}",{"title":112,"searchDepth":151,"depth":151,"links":2686},[2687,2688,2695,2699,2705,2709,2710,2714,2715,2716,2717],{"id":74,"depth":151,"text":75},{"id":392,"depth":151,"text":393,"children":2689},[2690,2691,2692,2693,2694],{"id":432,"depth":167,"text":433},{"id":565,"depth":167,"text":566},{"id":740,"depth":167,"text":741},{"id":958,"depth":167,"text":959},{"id":993,"depth":167,"text":994},{"id":1106,"depth":151,"text":1107,"children":2696},[2697,2698],{"id":1110,"depth":167,"text":1111},{"id":1220,"depth":167,"text":1221},{"id":1267,"depth":151,"text":1268,"children":2700},[2701,2702,2703,2704],{"id":1277,"depth":167,"text":609},{"id":1556,"depth":167,"text":1189},{"id":1689,"depth":167,"text":349},{"id":1837,"depth":167,"text":1051},{"id":1969,"depth":151,"text":1970,"children":2706},[2707,2708],{"id":1979,"depth":167,"text":1980},{"id":2150,"depth":167,"text":2151},{"id":2249,"depth":151,"text":2250},{"id":2277,"depth":151,"text":2278,"children":2711},[2712,2713],{"id":2291,"depth":167,"text":2292},{"id":2335,"depth":167,"text":2336},{"id":2381,"depth":151,"text":1025},{"id":2594,"depth":151,"text":2595},{"id":2646,"depth":151,"text":2647},{"id":2669,"depth":151,"text":2670},"Technische Architektur der Agenten-Strecke für eingehende Mail — Schrittmodule, der Walker, Sicherheitsprüfung, Threading und menschliche Prüfung.","md",{},true,"\u002Fvision\u002Fagent-pipeline",{"title":6,"description":2718},"5.vision\u002F2.agent-pipeline","4WAW6m5UMv7lgXzR1GrFWsCGhYyzgmxAEn_XpEKnZ44",[2727,2731],{"title":2728,"path":2729,"stem":2730,"children":-1},"Self-Hosting-Architektur","\u002Fvision\u002Fself-hosting","5.vision\u002F1.self-hosting",{"title":64,"path":63,"stem":2732,"children":-1},"5.vision\u002F3.knowledge-graph",1786915111154]