{"id":17342,"date":"2026-07-29T03:45:01","date_gmt":"2026-07-29T07:45:01","guid":{"rendered":"https:\/\/wp.glbgpt.com\/?p=17342"},"modified":"2026-07-29T03:45:12","modified_gmt":"2026-07-29T07:45:12","slug":"codex-vs-claude-code","status":"publish","type":"post","link":"https:\/\/wp.glbgpt.com\/de\/hub\/codex-vs-claude-code","title":{"rendered":"Codex vs. Claude-Code: Welches Codierungswerkzeug passt zu Ihrem Arbeitsablauf?"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Bei \u201eCodex vs. Claude\u201c geht es weniger darum, einen universellen Sieger zu finden, sondern vielmehr darum, den Arbeitsstil zu w\u00e4hlen, auf den Sie sich jeden Tag verlassen k\u00f6nnen.<\/strong> Beide Produkte k\u00f6nnen ein Repository \u00fcberpr\u00fcfen, mehrere Dateien bearbeiten, Befehle ausf\u00fchren, Tests durchf\u00fchren und einen Patch erl\u00e4utern. Die wesentlichen Unterschiede zeigen sich darin, wie Sie Aufgaben delegieren, wie oft Sie den Agenten steuern, wie viele Daten Sie einsehen k\u00f6nnen und wie gut sich die jeweiligen Tools in Ihre bestehende Entwicklungsumgebung einf\u00fcgen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In unserem kontrollierten Repository-Test mit vier Aufgaben erzielte Codex 98 von 100 Punkten und Claude Code 99 von 100 Punkten. Beide haben die Kernaufgaben bew\u00e4ltigt. Claude Code zeigte eine umfassendere \u00dcberpr\u00fcfung und eine bessere Abdeckung von Randf\u00e4llen, w\u00e4hrend Codex in unserem Setup das erforderliche Ergebnis oft mit einem geringeren Umfang erreichte und \u00fcberzeugendere Nachweise auf Ausf\u00fchrungsebene lieferte. Ein Punkt Unterschied bei einem kleinen Python-Testfall ist kein Grund, einen allgemeinen Sieger zu erkl\u00e4ren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entwickler, die nicht m\u00f6chten, dass der Rest ihres Workflows an einen bestimmten Programmier-Agenten gebunden ist, k\u00f6nnen GlobalGPT als separate multimodale und multimodellf\u00e4hige Ebene hinzuf\u00fcgen. GlobalGPT integriert \u00fcber 100 Top-Modelle wie GPT 5.6, Claude Opus 5 und GPT Image 2 in einem Dashboard. Dar\u00fcber hinaus bietet das <a href=\"https:\/\/www.glbgpt.com\/home\/cli?inviter=hub_content_cli&amp;login=1\">GlobalGPT-Befehlszeilenschnittstelle<\/a>, MCP- und Skill-Routen k\u00f6nnen aus dem Codex oder dem Claude-Code f\u00fcr Zweitmeinungen, Planung, Dokumentation oder andere unterst\u00fctzte Modelle genutzt werden, w\u00e4hrend der native Coding-Host die Kontrolle \u00fcber Repository-Bearbeitungen und Tests beh\u00e4lt.<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"645\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-1024x645.png\" alt=\"globalgpt-Dashboard\" class=\"wp-image-19280\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-1024x645.png 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-300x189.png 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-18x11.png 18w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-767x483.png 767w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-1536x967.png 1536w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-2048x1289.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3e41869c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-black-color has-text-color has-background has-link-color wp-element-button\" href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_popup&amp;login=1\" style=\"background:linear-gradient(135deg,rgba(250,183,0,0.55) 0%,rgba(255,106,0,0.66) 96%)\"><strong>Probieren Sie \u00fcber 100 Top-Modelle auf GlobalGPT aus<\/strong><\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Der Vergleich vereint offizielle Planinformationen, praktische Erfahrungen mit Repositorys, umfassende, erweiterbare Ergebnisse und klar beschriebene Community-Erfahrungen. Ziel ist es, einem unabh\u00e4ngigen Entwickler bei der Auswahl einer prim\u00e4ren Programmierplattform zu helfen, ohne dass er sich durch Abonnementzug\u00e4nge, zus\u00e4tzliche Gutschriften und API-Abrechnungen verwirren l\u00e4sst.<\/p>\n\n\n\n<style>\n.cvc-toc{margin:28px 0;padding:22px;border:1px solid #e2e6ec;border-radius:8px;background:linear-gradient(145deg,#fff 0%,#f7f9fc 100%);color:#18202b;font:14px\/1.4 Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif}.cvc-toc *{box-sizing:border-box}.cvc-toc .head{display:flex;align-items:end;justify-content:space-between;gap:16px;margin-bottom:16px}.cvc-toc h2{margin:0;font-size:20px}.cvc-toc .hint{color:#667085;font-size:12px}.cvc-toc ol{display:grid;grid-template-columns:1fr 1fr;gap:8px 18px;margin:0;padding:0;list-style:none;counter-reset:toc}.cvc-toc li{counter-increment:toc}.cvc-toc a{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:6px;color:#344054;text-decoration:none;transition:background .15s ease,color .15s ease}.cvc-toc a:before{content:counter(toc,decimal-leading-zero);min-width:24px;color:#2563eb;font-size:11px;font-weight:800;letter-spacing:.04em}.cvc-toc a:hover{background:#eef4ff;color:#174ea6}@media(max-width:720px){.cvc-toc ol{grid-template-columns:1fr}.cvc-toc .head{align-items:start;flex-direction:column}.cvc-toc{padding:18px}}\n<\/style>\n<nav class=\"cvc-toc\" aria-label=\"Inhaltsverzeichnis\">\n  <div class=\"head\"><h2>In diesem Vergleich<\/h2><span class=\"hint\">Zu einem Abschnitt springen<\/span><\/div>\n  <ol>\n    <li><a href=\"#quick-comparison\">Schnellvergleich<\/a><\/li><li><a href=\"#what-they-are\">Was das f\u00fcr Werkzeuge sind<\/a><\/li><li><a href=\"#workflow-control\">Arbeitsablauf und Steuerung<\/a><\/li><li><a href=\"#repository-understanding\">Verst\u00e4ndnis des Repositorys<\/a><\/li><li><a href=\"#implementation\">Implementierung und Fehlerbehebung<\/a><\/li><li><a href=\"#code-review\">Qualit\u00e4t der Code-Reviews<\/a><\/li><li><a href=\"#safety\">Berechtigungen und Sicherheit<\/a><\/li><li><a href=\"#customization\">MCP, F\u00e4higkeiten und Anpassung<\/a><\/li><li><a href=\"#pricing\">Preise und Limits<\/a><\/li><li><a href=\"#controlled-test\">Kontrollierter Test<\/a><\/li><li><a href=\"#user-experience\">Nutzerberichte<\/a><\/li><li><a href=\"#globalgpt\">GlobalGPT-Erweiterungsschicht<\/a><\/li><li><a href=\"#which-one\">Welches soll man w\u00e4hlen?<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><\/li>\n  <\/ol>\n<\/nav>\n\n\n\n<h2 id=\"quick-comparison\" class=\"wp-block-heading\">Codex vs. Claude \u2013 Der Code auf einen Blick<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Entscheidungsfaktor<\/th><th>Codex<\/th><th>Claude-Code<\/th><\/tr><\/thead><tbody><tr><td>Arbeiten am Kern-Repository<\/td><td>Liest, bearbeitet, f\u00fchrt Befehle aus und \u00fcberpr\u00fcft \u00c4nderungen auf allen unterst\u00fctzten Codex-Oberfl\u00e4chen<\/td><td>Dialogbasierter Terminal-Agent zum Lesen, Bearbeiten, Ausf\u00fchren von Befehlen und \u00dcberpr\u00fcfen von \u00c4nderungen<\/td><\/tr><tr><td>In unserem Test beobachteter Stil<\/td><td>In Teilen der Implementierung und bei der Fehlerbehebung kompakter gestaltet<\/td><td>Umfassendere Repository-Analyse, Tests und breiter angelegte \u00dcberpr\u00fcfungen<\/td><\/tr><tr><td>Verst\u00e4ndnis des Repositorys<\/td><td colspan=\"2\">Funktionale Verkn\u00fcpfung zur Aufgabe \u201eFrozen\u201c<\/td><\/tr><tr><td>Code-\u00dcberpr\u00fcfung<\/td><td>Zwei g\u00fcltige Fehler mit h\u00f6herem Schweregrad wurden gefunden und behoben<\/td><td>Es wurden weitere reproduzierbare Probleme gemeldet, wodurch die Bewertung von 19\/20 auf 18\/20 gesenkt wurde.<\/td><\/tr><tr><td>Gemessene Geschwindigkeit<\/td><td colspan=\"2\">Gemischt; die Umgebungen waren nicht \u00e4hnlich genug, um einen allgemeinen Sieger zu ermitteln<\/td><\/tr><tr><td>Einstiegssegment f\u00fcr Verbraucher<\/td><td>$20\/Monat im Rahmen des entsprechenden ChatGPT-Plans<\/td><td>Claude Pro: $20\/Monat in den USA<\/td><\/tr><tr><td>Stufen mit h\u00f6herer Nutzung<\/td><td>Stufen $100 und $200<\/td><td>Maximal 5-fach bei $100 und maximal 20-fach bei $200<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die Tabelle beschreibt eine Kaufentscheidung und stellt keine Rangliste der Modelle dar. Eine andere Modelleinstellung, ein anderes Repository, eine andere Berechtigungskonfiguration oder eine andere Aufgabenspezifikation kann das Ergebnis ver\u00e4ndern. Wenn Sie bereits ein Produkt verwenden, ist der beste Vergleich eine abgegrenzte Aufgabe aus Ihrer eigenen Codebasis mit demselben Erfolgsbefehl und ohne Qualit\u00e4tswiederholungen.<\/p>\n\n\n\n<style>\n.cvc-profile{--ink:#18202b;--muted:#667085;--line:#e5e8ee;--codex:#2563eb;--claude:#d97706;margin:28px 0;padding:22px;border:1px solid var(--line);border-radius:8px;background:linear-gradient(145deg,#fff 0%,#f8fafc 100%);color:var(--ink);font:14px\/1.45 Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif}.cvc-profile *{box-sizing:border-box}.cvc-profile h3{margin:0 0 4px;font-size:20px}.cvc-profile .sub{margin:0 0 20px;color:var(--muted)}.cvc-profile .legend{display:flex;gap:18px;margin-bottom:18px;font-weight:700}.cvc-profile .dot{display:inline-block;width:9px;height:9px;margin-right:7px;border-radius:2px}.cvc-profile .task{display:grid;grid-template-columns:190px 1fr 52px;gap:12px;align-items:center;margin:13px 0}.cvc-profile .task strong{font-size:13px}.cvc-profile .tracks{display:grid;gap:5px}.cvc-profile .track{height:9px;overflow:hidden;border-radius:5px;background:#e9edf3}.cvc-profile .fill{height:100%;border-radius:5px}.cvc-profile .codex{background:var(--codex)}.cvc-profile .claude{background:var(--claude)}.cvc-profile .score{text-align:right;font-variant-numeric:tabular-nums;font-weight:800}.cvc-profile .note{margin:18px 0 0;padding-top:14px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}@media(max-width:650px){.cvc-profile .task{grid-template-columns:1fr 46px}.cvc-profile .task>strong{grid-column:1\/-1}.cvc-profile{padding:18px}}\n<\/style>\n<section class=\"cvc-profile\" aria-label=\"Kontrolliertes Profil der Testergebnisse\">\n  <h3>Kontrolliertes Testprofil<\/h3>\n  <p class=\"sub\">Erstes g\u00fcltiges Ergebnis, gleiche festgelegte Bewertungsskala. Die Balken sind auf die maximale Punktzahl der jeweiligen Aufgabe normiert.<\/p>\n  <div class=\"legend\"><span><i class=\"dot\" style=\"background:#2563eb\"><\/i>Codex<\/span><span><i class=\"dot\" style=\"background:#d97706\"><\/i>Claude-Code<\/span><\/div>\n  <div class=\"task\"><strong>T1 \u00b7 Verst\u00e4ndnis des Repositorys<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:100%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:100%\"><\/div><\/div><\/div><span class=\"score\">20 \/ 20<\/span><\/div>\n  <div class=\"task\"><strong>T2 \u00b7 Funktion f\u00fcr mehrere Dateien<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:100%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:100%\"><\/div><\/div><\/div><span class=\"score\">30 \/ 30<\/span><\/div>\n  <div class=\"task\"><strong>T3 \u00b7 Behebung eines DST-Fehlers<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:100%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:100%\"><\/div><\/div><\/div><span class=\"score\">30 \/ 30<\/span><\/div>\n  <div class=\"task\"><strong>T4 \u00b7 \u00dcberpr\u00fcfung und Reparatur<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:90%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:95%\"><\/div><\/div><\/div><span class=\"score\">18 \/ 19<\/span><\/div>\n  <p class=\"note\">Die Grafik verdeutlicht, woher der Ein-Punkt-Unterschied stammt; sie macht aus einem kleinen Spiel jedoch keine allgemeine Rangliste.<\/p>\n<\/section>\n\n\n\n<h2 id=\"what-they-are\" class=\"wp-block-heading\">Was Codex und der Claude-Code eigentlich sind<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u201eCodex\u201c und \u201eClaude Code\u201c sind Produktbezeichnungen und nicht blo\u00df Modellbezeichnungen. Die zugrunde liegenden <a href=\"https:\/\/www.glbgpt.com\/hub\/best-ai-model-for-coding\/\">KI-Modell f\u00fcr die Programmierung<\/a> Das ist zwar wichtig, aber das umgebende Framework entscheidet auch dar\u00fcber, welche Dateien der Agent einsehen kann, welche Befehle er ausf\u00fchren darf, wie Genehmigungen funktionieren, wie der Kontext beibehalten wird und welche Nachweise nach Abschluss der Aufgabe erhalten bleiben. Wenn man nur die Reputation des Modells vergleicht, l\u00e4sst man einen Gro\u00dfteil der Erfahrung au\u00dfer Acht, die ein Entwickler damit erwirbt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Codex deckt Arbeitsabl\u00e4ufe \u00fcber die Befehlszeile, in der IDE, auf dem Desktop sowie in der Cloud ab. Dank dieser Bandbreite eignet es sich sowohl f\u00fcr die direkte lokale Zusammenarbeit als auch f\u00fcr eine st\u00e4rker abgegrenzte Aufgabenverteilung. Claude Code basiert auf einem dialogorientierten Terminal-Workflow mit unterst\u00fctzten Integrationen und umfangreichen Anpassungsm\u00f6glichkeiten; dies <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-claude-ai-for-coding\/\">Anleitung zur Verwendung von Claude f\u00fcr die Programmierung<\/a> bietet eine umfassendere Einf\u00fchrung in diesen Arbeitsablauf. F\u00fcr manche Entwickler ist es beruhigend, einem Agenten bei der Arbeit im Terminal zuzusehen. F\u00fcr andere sind der abschlie\u00dfende Diff, die Tests und der Pr\u00fcfpfad das wichtige Ergebnis \u2013 und nicht der fortlaufende Austausch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Unterscheidung erkl\u00e4rt auch, warum zwei Tests, bei denen nominell leistungsstarke Modelle zum Einsatz kommen, zu unterschiedlichen Ergebnissen f\u00fchren k\u00f6nnen. Der Host entscheidet, wie Anweisungen dargestellt werden, wie Tools aufgerufen werden und wann ein Mensch eine Aktion genehmigen muss. Vergleiche innerhalb der Community, die den Testrahmen au\u00dfer Acht lassen, k\u00f6nnen das Verhalten auf Produktebene f\u00e4lschlicherweise f\u00fcr die Wahrheit auf Modellebene halten.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Das Modell<\/strong> bietet Denkverm\u00f6gen und die F\u00e4higkeit zur Ideenfindung.<\/li>\n\n\n\n<li><strong>Der Agenten-Kabelbaum<\/strong> steuert Dateien, Befehle, den Kontext, Genehmigungen und die Wiederherstellung.<\/li>\n\n\n\n<li><strong>Der Aufgabenvertrag des Benutzers<\/strong> legt den Umfang, die Erfolgspr\u00fcfungen und den Zeitpunkt fest, zu dem der Agent aufh\u00f6ren soll.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated.webp\" alt=\"Ein kommentierter X-Beitrag, in dem darauf hingewiesen wird, dass ein Agent-Harness Vergleiche zwischen Codierung und Agent beeinflussen kann\" class=\"wp-image-17390\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Ein einzelner Kommentar von X weist auf einen wichtigen Vorbehalt beim Vergleich hin: Der Einsatz des Agenten-Harness kann die Ergebnisse beeinflussen. Dies ist ein n\u00fctzlicher Kontext, jedoch kein kontrollierter Beweis daf\u00fcr, dass eines der beiden Produkte besser ist.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"workflow-control\" class=\"wp-block-heading\">Arbeitsablauf und Steuerung: Delegation oder kontinuierliche Steuerung?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die sinnvollste Frage zum Thema \u201cCodex vs. Claude-Code\u201d lautet oft nicht \u201cWelcher Ansatz f\u00fchrt zu besserem Code?\u201d, sondern \u201eWie m\u00f6chte ich damit arbeiten?\u201c Eine klar definierte, abgegrenzte Aufgabe l\u00e4sst sich mit einem genauen Ziel, einem festgelegten Umfang und einer \u00dcberpr\u00fcfungsanweisung delegieren. Bei einer mehrdeutigen Refaktorisierung sind Diskussionen, Zwischenpr\u00fcfungen und die M\u00f6glichkeit, den Ausf\u00fchrenden umzulenken, bevor er zu viele \u00c4nderungen vornimmt, von Vorteil.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine kontinuierliche Steuerung ist sinnvoll, wenn sich die Anforderungen weiterentwickeln oder noch \u00fcber architektonische Entscheidungen verhandelt wird. Sie wird jedoch zu einem Kostenfaktor, wenn der Agent wiederholt Entscheidungen einfordert, die anhand der Anweisungen aus dem Repository h\u00e4tten gekl\u00e4rt werden k\u00f6nnen. Eine autonome Ausf\u00fchrung ist sinnvoll, wenn der Aufgabenvertrag stabil ist. Sie wird jedoch riskant, wenn der Agent un\u00fcberpr\u00fcfte Annahmen trifft oder den Umfang erweitert, ohne dass ein klarer Rollback-Pfad vorhanden ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein ausf\u00fchrlicher Reddit-Bericht vom 13. April 2026 beschrieb etwa 100 Stunden mit Claude Code und 20 Stunden mit Codex bei einem Python- und TypeScript-Projekt mit rund 80.000 Zeilen und etwa 2.800 Tests. Der Autor charakterisierte Claude als schneller und interaktiver, aber mit h\u00f6herem Betreuungsaufwand verbunden, und Codex als langsamer und bed\u00e4chtiger. Dieser Bericht ist ungew\u00f6hnlich n\u00fctzlich, da er den Projekt- und Erfahrungshintergrund einbezieht, spiegelt jedoch nach wie vor den Arbeitsablauf eines einzelnen Entwicklers wider.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated.webp\" alt=\"Kommentierte Reddit-Erfahrung zum Vergleich von Claude Code und Codex bei einem Projekt mit 80.000 Zeilen\" class=\"wp-image-17391\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Die projektspezifischen Erfahrungen eines Entwicklers mit Claude Code und Codex. Die hervorgehobenen Beobachtungen sollten als zu pr\u00fcfende Hypothesen betrachtet werden und nicht als produktweite Leistungsdaten.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Unsere eigenen Zeitmessungen ergaben keinen eindeutigen Sieger. Claude bew\u00e4ltigte die ersten beiden Aufgaben schneller, w\u00e4hrend Codex die beiden letzteren schneller bew\u00e4ltigte. Claude griff zudem auf einen Subagenten als Ausweichl\u00f6sung zur\u00fcck, nachdem sein CLI-Authentifizierungspfad nicht verf\u00fcgbar war, sodass die Ausf\u00fchrungswege nicht labor\u00e4quivalent waren. Die zutreffende Schlussfolgerung lautet, dass die Geschwindigkeit von der Aufgabe, dem gew\u00e4hlten Modell, der Aufwandsstufe, dem Kontext und dem Host abh\u00e4ngt \u2013 und nicht davon, dass eines der beiden Produkte immer schneller ist.<\/p>\n\n\n\n<h2 id=\"repository-understanding\" class=\"wp-block-heading\">Verst\u00e4ndnis von Repositorien und Kontextmanagement<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Verst\u00e4ndnis eines Repositorys geht \u00fcber die blo\u00dfe Benennung von Ordnern hinaus. Ein n\u00fctzlicher Agent muss nachverfolgen, wie Daten zwischen Dateien flie\u00dfen, Vertr\u00e4ge identifizieren, die eine \u00c4nderung einschr\u00e4nken, Tests ausfindig machen, ein Symptom von seiner wahrscheinlichen Ursache unterscheiden und das Risiko einer Bearbeitung der falschen Ebene erl\u00e4utern. Eine umfassende \u00dcbersicht kann verborgene Inkonsistenzen aufdecken; eine pr\u00e4gnante \u00dcbersicht kann einen Entwickler schneller zu einer sicheren Implementierungsentscheidung f\u00fchren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In unserer schreibgesch\u00fctzten T1-Aufgabe erzielten beide Agenten 20 von 20 Punkten und st\u00fctzten ihre Antworten auf das Repository. Claude Code war umfassender und deckte zus\u00e4tzliche Vertragsinkonsistenzen auf. Codex war kompakter, identifizierte aber dennoch die relevanten Dateien, Risiken und den Implementierungsplan. Keiner der beiden Stile ist automatisch \u00fcberlegen. Vollst\u00e4ndigkeit ist bei ungewohnten Migrationen und Audits hilfreich; Pr\u00e4gnanz ist von Vorteil, wenn der Entwickler die Architektur bereits kennt und einen fokussierten \u00c4nderungsplan w\u00fcnscht.<\/p>\n\n\n\n<style>\n.evidence-t1-repository-understanding{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t1-repository-understanding *{box-sizing:border-box}.evidence-t1-repository-understanding .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t1-repository-understanding .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t1-repository-understanding .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t1-repository-understanding .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t1-repository-understanding .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t1-repository-understanding .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t1-repository-understanding .d-side{min-width:0;padding:24px 26px}.evidence-t1-repository-understanding .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t1-repository-understanding .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t1-repository-understanding .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t1-repository-understanding .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t1-repository-understanding .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t1-repository-understanding .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t1-repository-understanding .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t1-repository-understanding .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t1-repository-understanding .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t1-repository-understanding .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t1-repository-understanding .d-preview pre,.evidence-t1-repository-understanding .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t1-repository-understanding .d-preview pre{padding:13px}.evidence-t1-repository-understanding .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t1-repository-understanding .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t1-repository-understanding .d-fulls{padding:0 26px 22px}.evidence-t1-repository-understanding .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t1-repository-understanding .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t1-repository-understanding .d-full summary::-webkit-details-marker{display:none}.evidence-t1-repository-understanding .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t1-repository-understanding .d-full[open] summary:after{content:\"\u2212\"}.evidence-t1-repository-understanding .d-full-pane{padding:0 14px 14px}.evidence-t1-repository-understanding .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t1-repository-understanding .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t1-repository-understanding .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t1-repository-understanding .d-head{display:block}.evidence-t1-repository-understanding .d-pill{display:inline-block;margin-top:12px}.evidence-t1-repository-understanding .d-grid{grid-template-columns:1fr}.evidence-t1-repository-understanding .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t1-repository-understanding .d-head,.evidence-t1-repository-understanding .d-side{padding:20px}.evidence-t1-repository-understanding .d-fulls{padding:0 20px 20px}.evidence-t1-repository-understanding .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t1-repository-understanding\"><header class=\"d-head\"><div><p class=\"d-kicker\">T1 \u00b7 Test im kontrollierten Repository<\/p><h3 class=\"d-title\">Machen Sie sich mit einem unbekannten Repository vertraut, bevor Sie \u00c4nderungen daran vornehmen<\/h3><p class=\"d-sub\">Architektur abbilden, Datenfluss nachverfolgen, Risiken bei vorrangigen Funktionen identifizieren und keine \u00c4nderungen an Dateien vornehmen.<\/p><\/div><span class=\"d-pill\">Krawatte<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex-Ergebnis\"><div class=\"d-product\"><span>Codex<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>108 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>2 Ausgangswert<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>Schreibgesch\u00fctzt<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>Architektur: Modell, Repository, Dienst und ein \u201eUnwired Time\u201c-Dienstprogramm.\n\nWesentliche Risiken: undefinierte Priorit\u00e4tssemantik, Kompatibilit\u00e4t, Reihenfolge, Validierung und Bereichsinkongruenz.<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> Kompakt, fundiert und ausreichend f\u00fcr die noch ausstehende Entscheidung.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude Code-Ergebnis\"><div class=\"d-product\"><span>Claude-Code<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>61 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>2 Ausgangswert<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>Schreibgesch\u00fctzt<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>Drei Schichten plus ein isoliertes Modul. Keine Zyklen; minimale Abh\u00e4ngigkeitsinjektion.\n\nAu\u00dferdem traten Probleme bei der Identifikatorzuweisung, asymmetrische Fehlervertr\u00e4ge und eine geringe Testabdeckung zutage.<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> Umfassender, erf\u00fcllt aber dennoch dieselbe Lesezugriffsvereinbarung.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Gesamte Codex-Ausgabe anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndige, bereinigte und erstmals g\u00fcltige Ausgabe<\/p><pre>##-Architektur\n\nDies ist ein kleines Python-Paket, das ausschlie\u00dflich auf der Standardbibliothek basiert und vier funktionale Schichten umfasst:\n\n- **Datenmodell:** [`Job`]() ist eine unver\u00e4nderliche Dataklasse, die `identifier`, `name` und `owner` enth\u00e4lt. `Job.to_dict()` serialisiert sie \u00fcber `dataclasses.asdict()`.\n- **Repository:** [`JobRepository`]() speichert Jobs in einem In-Memory-Dictionary, dessen Schl\u00fcssel die Identifikatoren sind. Es gibt keine Datenbank und keine dauerhafte Persistenz.\n- **Dienst:** [`SchedulerService`]() ist zust\u00e4ndig f\u00fcr die Zuweisung von Identifikatoren, die Normalisierung von Eingaben sowie das Anlegen, Auflisten und L\u00f6schen von Jobs.\n- **Zeit-Hilfsfunktion:** [`next_daily_run()`]() berechnet einen Zeitpunkt f\u00fcr den n\u00e4chsten Lauf, wird jedoch weder von `Job`, `SchedulerService` noch von `JobRepository` importiert oder mit diesen verbunden.\n- **\u00d6ffentliche API:** [`scheduler.__init__`]() exportiert ausschlie\u00dflich `SchedulerService`.\n\nTrotz des Repository-Namens enthalten Jobs derzeit keine Planungsinformationen, und es gibt keine Ausf\u00fchrungswarteschlange. Die Priorit\u00e4t kann daher zwar die gespeicherten Metadaten und die Reihenfolge in der Auflistung beeinflussen, hat jedoch keinen Einfluss auf die tats\u00e4chliche Jobausf\u00fchrung, ohne das System erheblich zu erweitern.\n\n## Datenfluss bei der Erstellung und Auflistung\n\nErstellung \u00fcber `SchedulerService.create_job(name, owner)`:\n\n1. [`create_job()`]() lehnt einen Namen ab, der ausschlie\u00dflich aus Leerzeichen besteht.\n2. Es k\u00fcrzt `name` und `owner` und erstellt dann mithilfe des `_next_identifier` des Dienstes ein unver\u00e4nderliches `Job`-Objekt.\n3. [`JobRepository.save()`]() schreibt das Objekt in `_jobs[job.identifier]`.\n4. Der Dienst erh\u00f6ht den Wert von `_next_identifier` und gibt denselben `Job` zur\u00fcck.\n\nAuflistung \u00fcber `SchedulerService.list_jobs()`:\n\n1. [`list_jobs()`]() delegiert direkt an `repository.all()`.\n2. [`JobRepository.all()`]() sortiert die Schl\u00fcssel des W\u00f6rterbuchs numerisch.\n3. Jobs werden daher in aufsteigender Reihenfolge nach Identifikator bzw. Erstellungsdatum zur\u00fcckgegeben, nicht nach Zeitplan oder Priorit\u00e4t.\n\n## Wahrscheinlich von Job-Priorit\u00e4ten betroffene Dateien\n\nErforderlich:\n\n- [`scheduler\/models.py`](): F\u00fcgen Sie das Feld \"priority\" und einen eventuellen Standardwert hinzu. `to_dict()` bezieht es automatisch ein, da es `asdict()` verwendet.\n- [`scheduler\/service.py`](): Priorit\u00e4t annehmen, validieren und an `Job` \u00fcbergeben.\n- [`tests\/test_scheduler.py`](): Testf\u00e4lle f\u00fcr Standard-, explizite, ung\u00fcltige, serialisierte und Reihenfolge-Verhalten erstellen.\n\nBedingt:\n\n- [`scheduler\/repository.py`](): \u00c4ndere `all()` nur, wenn Priorit\u00e4ten die Reihenfolge der Auflistung steuern sollen. Ein deterministischer Sekund\u00e4rschl\u00fcssel wie `identifier` sollte Gleichst\u00e4nde behandeln.\n- [`scheduler\/__init__.py`](): Nur aktualisieren, wenn \"priority\" zu einer \u00f6ffentlichen Enumeration oder einem Wert-Objekt wird.\n- [`README.md`](): Dokumentieren Sie die zul\u00e4ssigen Werte, den Standardwert und die Semantik der Reihenfolge.\n\nWahrscheinlich nicht betroffen:\n\n- `scheduler\/time_rules.py`, da dessen einziges Symbol auf ein \u00fcbergegebenes Datums- und Zeitformat angewendet wird und keinen Bezug zu Jobs oder der Auflistung hat.\n\n## Wesentliche Risiken\n\n- **Undefinierte Semantik:** Der Code liefert keinen Anhaltspunkt daf\u00fcr, ob gr\u00f6\u00dfere oder kleinere Werte eine h\u00f6here Priorit\u00e4t bedeuten, welche Werte g\u00fcltig sind oder ob die Priorit\u00e4t \u00fcberhaupt Auswirkungen auf die Auflistung hat.\n- **Kompatibilit\u00e4t:** Das Hinzuf\u00fcgen eines obligatorischen Arguments zu `Job` oder `create_job()` w\u00fcrde bestehende Aufrufe wie `create_job(\"Daily report\", \"Alex\")` im aktuellen Test unbrauchbar machen. Ein Standardwert bewahrt diesen Aufruf.\n- **Probleme bei der positionsbasierten Konstruktor-Erstellung:** `Job` wird derzeit in `SchedulerService.create_job()` positionsbasiert instanziiert. Die Anordnung der Felder und zuk\u00fcnftige positionsbasierte Aufrufe k\u00f6nnten stillschweigend falsche Werte zuweisen; eine Schl\u00fcsselwort-Konstruktion w\u00e4re sicherer.\n- **Ge\u00e4nderte Reihenfolge:** Das Ersetzen der Identifikatorreihenfolge in `JobRepository.all()` ver\u00e4ndert das etablierte Verhalten. Bei gleichen Priorit\u00e4ten ist ein stabiler Tie-Breaker erforderlich.\n- **Mehrdeutigkeit bei der Validierung:** Ein uneingeschr\u00e4nkter Python-Wert k\u00f6nnte Zeichenketten, Boolesche Werte oder beliebige Ganzzahlen zulassen, die sich nur schwer konsistent vergleichen lassen.\n- **Diskrepanz im Ausf\u00fchrungsbereich:** Es gibt keinen Dispatcher und keine Ausf\u00fchrungswarteschlange. Die Behauptung, dass die Priorit\u00e4t bestimmt, welcher Job zuerst ausgef\u00fchrt wird, w\u00fcrde durch kein derzeitiges Symbol unterst\u00fctzt.\n- **Einschr\u00e4nkungen im Arbeitsspeicher:** Die Priorit\u00e4t verschwindet, wie jedes andere Job-Feld auch, wenn der Prozess endet, da `_jobs` lediglich ein Instanz-Dictionary ist.\n\n## Implementierungs- und Validierungsplan\n\n1. Zun\u00e4chst den Vertrag definieren: Darstellung, zul\u00e4ssige Werte, Standardwert, Richtung der Priorit\u00e4t, Tie-Breaking und ob die Priorit\u00e4t die Reihenfolge in der Liste ver\u00e4ndert.\n2. F\u00fcge `priority` zu `Job` hinzu, vorzugsweise mit einem abw\u00e4rtskompatiblen Standardwert.\n3. Erweitere `SchedulerService.create_job()` um einen Priorit\u00e4tsparameter mit Standardwert, validiere ihn und erstelle `Job` mit Schl\u00fcsselwortargumenten.\n4. Falls die Auflistung priorit\u00e4tsabh\u00e4ngig ist, `JobRepository.all()` so \u00e4ndern, dass zuerst nach Priorit\u00e4t und dann nach Kennung sortiert wird. Andernfalls die Reihenfolge im Repository unver\u00e4ndert lassen.\n5. Tests hinzuf\u00fcgen f\u00fcr:\n   \u2013 Bestehende Erstellung mit zwei Argumenten.\n   \u2013 Explizite Beibehaltung der Priorit\u00e4t.\n   \u2013 Standardpriorit\u00e4t.\n   - Ung\u00fcltige Typen und Werte au\u00dferhalb des zul\u00e4ssigen Bereichs.\n   - Ausgabe von `Job.to_dict()`.\n   - Sortierreihenfolge bei mehreren Priorit\u00e4ten.\n   - Stabile Reihenfolge bei gleichen Priorit\u00e4ten.\n   - Bestehendes Verhalten bei leeren Namen.\n6. Aktualisieren Sie die README-Datei mit dem genauen \u00f6ffentlichen Vertrag.\n7. Die komplette Offline-Testsuite mit `python3 -m unittest discover -s tests -v` ausf\u00fchren.\n\n## \u00dcberpr\u00fcfung durchgef\u00fchrt\n\n- Baseline-Testsuite: **2 Tests bestanden**.\n- Die repositoryweite Symbolsuche hat best\u00e4tigt, dass `next_daily_run()` nicht mehr verkn\u00fcpft ist und keine Symbole mit Priorit\u00e4t vorhanden sind.\n- Ge\u00e4nderte Dateien: **keine**.\n- Implementierung der Funktion: **nicht durchgef\u00fchrt**, wie gefordert.\n\n&gt; **Fazit + Entscheidung**\n&gt;\n&gt; Die \u00c4nderung ist geringf\u00fcgig, wenn die Priorit\u00e4t lediglich Metadaten oder die Reihenfolge in der Auflistung betrifft: haupts\u00e4chlich `models.py`, `service.py`, `repository.py` und Tests. Vor der Implementierung muss entschieden werden, ob die Priorit\u00e4t lediglich einen Job beschreibt oder die Reihenfolge in `list_jobs()` ver\u00e4ndert, sowie die Werteskala, den Standardwert, die Richtung und die Regel bei Gleichstand.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Vollst\u00e4ndige Ausgabe des Claude-Codes anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndiges \u00dcbergabeprotokoll einschlie\u00dflich der wortgetreuen ersten g\u00fcltigen Ausgabe<\/p><pre># T1-Laufprotokoll \u2013 Verst\u00e4ndnis eines unbekannten Repositorys\n\n## Ausf\u00fchrungsparameter\n\n| Feld | Wert |\n| --- | --- |\n| Aufgabe | `T1` |\n| Festgelegte Eingabeaufforderung | `01-prompts\/T1.md` |\n| SHA-256 des eingefrorenen Prompts | `a571ff15c2502ec29b172ae2e77dd9ab0caca2869b91f9468d47571434d16c17` |\n| Ausf\u00fchrungseinheit | isolierter Claude-Subagent, `general-purpose`, neuer Kontext |\n| Isolationsmethode | **Subagent-Fallback** (dokumentiertes Downgrade \u2013 siehe `results\/isolation-decision.md`) |\n| Zugewiesene saubere Kopie | `runtime\/workspaces\/T1` |\n| Claude-Codeversion | `2.1.220` |\n| Modelleinstellung | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:31Z` |\n| end_utc | `2026-07-28T10:28:32Z` |\n| Dauer | 61 s (gleichzeitig mit T2\u2013T4; keine reine Latenzmessung) |\n| Versuchsnummer | 1 |\n| Status | `valid` |\n| Manuelles Eingreifen | keines |\n\n## Zusammenfassung des Safe-Tools\n\n`date`, `find`, `ls`, `wc`, `stat`, `grep`, `Read` auf 7 Dateien im Arbeitsbereich, `python3 -V`,\n`python3 -m unittest discover -s tests -v`. Alle Lesevorg\u00e4nge beschr\u00e4nken sich auf den zugewiesenen Arbeitsbereich.\nKein Netzwerk, keine Installationen, keine Schreibvorg\u00e4nge.\n\n## Ergebnis der Offline-Pr\u00fcfung\n\n`python3 -m unittest discover -s tests -v` \u2192 2 Tests, OK (Beendigungscode 0). Von dem\nKoordinator au\u00dferhalb des Arbeitsbereichs erneut \u00fcberpr\u00fcft: siehe `results\/checks\/T1-public.txt`.\n\n## Patch\n\nKeine. `results\/T1\/patch.diff` ist leer, und `diff -ru 02-fixture runtime\/workspaces\/T1`\nliefert keine Unterschiede. Die Aufgabe erforderte eine \u00dcberpr\u00fcfung ohne \u00c4nderung von Dateien; dies ist\nbest\u00e4tigt und nicht nur behauptet.\n\n## Bereinigte Fehler\n\nEin behebbarer Shell-Fehler: Ein anf\u00e4nglicher `grep`-Befehl verwendete nicht in Anf\u00fchrungszeichen gesetzte `--include=*.py`-Muster, die\ndie Shell zu verallgemeinern versuchte; die erneute Ausf\u00fchrung mit in Anf\u00fchrungszeichen gesetzten Mustern war erfolgreich. Keine Auswirkungen auf die Ergebnisse.\n\n## Sichtbare Ausgabe (w\u00f6rtlich)\n\n### 1. Was dieses Repository ist\n\nEine in sich geschlossene Python-Standardbibliotheks-Fixture namens `local-scheduler-1.0.0` (`fixture-manifest.json`), unter MIT-Lizenz, ohne Netzwerk- oder Produktionsabh\u00e4ngigkeiten (`README.md`, `\"network_required\": false`). Sie ist sehr klein: 8 Quell- und Dokumentationsdateien plus das Manifest, insgesamt 103 Zeilen. Als Interpreter wird **Python 3.9.6** verwendet. Es gibt keine `pyproject.toml`, keine `setup.py`, keine CI-Konfiguration, keinen Linter und keine Typ-Checker-Konfiguration \u2013 der einzige deklarierte Workflow ist `python3 -m unittest discover -s tests -v` (`README.md`).\n\n### 2. Architektur\n\nDrei Schichten plus ein eigenst\u00e4ndiges Modul, alle unter `scheduler\/`:\n\n| Schicht | Datei | Symbol | Aufgabe |\n|---|---|---|---|\n| Paket-Fassade | `scheduler\/__init__.py` | `__all__ = [\"SchedulerService\"]` | Exportiert nur `SchedulerService` neu; `Job`, `JobRepository` und `time_rules` sind nicht Teil der \u00f6ffentlichen Schnittstelle |\n| Dom\u00e4nenmodell | `scheduler\/models.py` | `Job` (`@dataclass(frozen=True)`) | Unver\u00e4nderliches Wert-Objekt mit den Feldern `identifier: int`, `name: str`, `owner: str` sowie `to_dict()`, implementiert als `asdict(self)` |\n| Persistenz | `scheduler\/repository.py` | `JobRepository` | In-Memory-`dict` mit dem Identifikator als Schl\u00fcssel; `save`, `get`, `all`, `delete` |\n| Anwendungsdienst | `scheduler\/service.py` | `SchedulerService` | Validierung, Identifikatorzuweisung, Orchestrierung: `create_job`, `list_jobs`, `delete_job` |\n| Orphan | `scheduler\/time_rules.py` | `next_daily_run` | Wiederholungsberechnung \u2014 **wird von nichts importiert** |\n\nDie Abh\u00e4ngigkeitsrichtung ist klar und einseitig: `service.py` importiert aus `.models` und `.repository`; `repository.py` importiert aus `.models`; `models.py` importiert nur `dataclasses`. Keine Zyklen. Abh\u00e4ngigkeitsinjektion ist vorhanden, aber minimal \u2013 `SchedulerService.__init__(self, repository=None)` f\u00fchrt `self.repository = repository or JobRepository()` aus, sodass in Tests ein gef\u00e4lschtes Repository eingesetzt werden kann.\n\nBeachten Sie, dass `scheduler\/time_rules.py` heute toter Code ist. Ich habe den gesamten Baum nach `time_rules` und `next_daily_run` durchsucht; die einzigen Treffer sind die eigene Definition und die Auflistung in `expected_files` von `fixture-manifest.json`. Die Datei ist im Lieferumfang enthalten, wird aber nicht verwendet.\n\n### 3. Datenfluss\n\n**Erstellen eines Jobs** \u2014 `SchedulerService.create_job(name, owner)`:\n1. \u00dcberpr\u00fcfung: `if not name.strip(): raise ValueError('name is required\")`. Dies ist die *einzige* Validierung im System \u2013 `owner` wird nie \u00fcberpr\u00fcft, daher wird ein leerer Eigent\u00fcmer akzeptiert.\n2. Konstruktion: `Job(self._next_identifier, name.strip(), owner.strip())` \u2013 positionelle Konstruktion, wobei beide Zeichenfolgen durch Entfernen der F\u00fchrungen normalisiert werden.\n3. Speichern: `self.repository.save(job)`, was `self._jobs[job.identifier] = job` ausf\u00fchrt und den Job zur\u00fcckgibt.\n4. Z\u00e4hler erh\u00f6hen: `self._next_identifier += 1` \u2013 *nach* dem Speichern, sodass bei einer ausgel\u00f6sten Ausnahme der Z\u00e4hler unber\u00fchrt bleibt.\n5. Die `Job`-Instanz zur\u00fcckgeben (der Dienst gibt seinen eigenen lokalen `job` zur\u00fcck, nicht den R\u00fcckgabewert des Repositorys).\n\nDie Zuweisung der Identifikatoren erfolgt im **Dienst**, nicht im Repository (`self._next_identifier = 1` in `SchedulerService.__init__`). Dies ist eine wichtige Schnittstelle: Das Einbinden eines Repositorys, das bereits Jobs enth\u00e4lt, \u00fcberschreibt diese stillschweigend, da der neue Dienst die Nummerierung bei 1 neu beginnt.\n\n**Auflisten von Jobs** \u2013 `SchedulerService.list_jobs()` ist ein direkter Durchlauf durch `JobRepository.all()`, der `[self._jobs[key] for key in sorted(self._jobs)]` zur\u00fcckgibt. Die Sortierung erfolgt daher **aufsteigend nach ganzzahliger Kennung**, was derzeit mit der Einf\u00fcgungsreihenfolge \u00fcbereinstimmt. Bei jedem Aufruf wird eine neue Liste erstellt, aber die `Job`-Objekte sind gemeinsam genutzte Referenzen \u2013 was nur deshalb sicher ist, weil `Job` eingefroren ist.\n\n**L\u00f6schen** \u2014 `SchedulerService.delete_job(identifier)` delegiert an `JobRepository.delete`, was `self._jobs.pop(identifier)` ohne Standardwert ist, sodass bei fehlender ID ein `KeyError` ausgel\u00f6st wird. Dies steht im Widerspruch zu `JobRepository.get`, das unter derselben Bedingung `None` zur\u00fcckgibt.\n\n**Testabdeckung dieser Pfade** \u2014 `tests\/test_scheduler.py` enth\u00e4lt genau zwei F\u00e4lle: `test_create_and_list_jobs` (\u00fcberpr\u00fcft `job.identifier == 1` und `[job] == service.list_jobs()`) und `test_blank_name_is_rejected`. Beide F\u00e4lle werden im aktuellen Baum bestanden.\n\n### 4. Dateien, die wahrscheinlich vom Hinzuf\u00fcgen von Job-Priorit\u00e4ten betroffen sind\n\nIn absteigender Reihenfolge der Wahrscheinlichkeit:\n\n1. **`scheduler\/models.py`** \u2014 sicher. `Job` ben\u00f6tigt ein `priority`-Feld. Da die Dataklasse `frozen=True` ist und die Felder positionell sind, muss ein neues Feld einen Standardwert enthalten (z. B. `priority: int = 0`) oder es muss hinter den bestehenden drei Feldern platziert werden, da sonst jede bestehende positionelle Konstruktion nicht mehr funktioniert. `to_dict()` erfordert keine \u00c4nderung \u2013 `asdict(self)` erkennt das Feld automatisch, was eher eine stillschweigende \u00c4nderung des Serialisierungsvertrags als eine Code\u00e4nderung darstellt.\n2. **`scheduler\/service.py`** \u2013 auf jeden Fall. `create_job` ben\u00f6tigt einen `priority`-Parameter und muss diesen in Zeile 13 an den positionellen Konstruktor `Job(...)` \u00fcbergeben. Wenn die Priorit\u00e4t validiert wird (Bereich, Zugeh\u00f6rigkeit zu einer Enumeration), geh\u00f6rt die \u00dcberpr\u00fcfung neben die bestehende `name.strip()`-Pr\u00fcfung. Wenn die Auflistung nach Priorit\u00e4t sortiert werden muss, w\u00e4re `list_jobs` der Ort, an dem eine Sortierregel platziert w\u00fcrde, falls das Repository ein \"dummer Speicher' bleiben soll.\n3. **`scheduler\/repository.py`** \u2014 wahrscheinlich. `sorted(self._jobs)` in `JobRepository.all()` sortiert die *Schl\u00fcssel* des Dicts, d.\u202fh. die Identifikatoren. Eine nach Priorit\u00e4t sortierte Auflistung erfordert eine \u00c4nderung, um die Werte nach einem Schl\u00fcssel wie `(-job.priority, job.identifier)` zu sortieren, oder das Hinzuf\u00fcgen eines separaten sortierten Accessors. Lass den Tie-Break nicht implizit: Die Einf\u00fcgungsreihenfolge im Dict ist kein stabiler Vertrag, auf den man sich verlassen kann.\n4. **`tests\/test_scheduler.py`** \u2014 sicher. Neue Testf\u00e4lle f\u00fcr Standardpriorit\u00e4t, explizite Priorit\u00e4t, Reihenfolge und Ablehnung bei ung\u00fcltiger Priorit\u00e4t. Beachten Sie, dass das vorhandene `assertEqual([job], service.list_jobs())` das *gleiche* Objekt vergleicht und somit auch nach dem Hinzuf\u00fcgen eines Feldes weiterhin g\u00fcltig ist; dies w\u00e4re nicht der Fall, wenn es ein neu erstelltes `Job`-Literal vergleichen w\u00fcrde.\n5. **`README.md`** \u2014 wahrscheinlich, falls die Priorit\u00e4tssemantik (welches Ende des Bereichs Vorrang hat, Standardwert) an irgendeiner Stelle angegeben werden muss.\n6. **`scheduler\/__init__.py`** \u2014 nur, wenn eine Priorit\u00e4ts-Enumeration oder Konstanten neben `SchedulerService` exportiert werden m\u00fcssen.\n7. **`fixture-manifest.json`** \u2014 nur, wenn Sie eine neue Moduldatei hinzuf\u00fcgen; das Array `expected_files` ist eine explizite Bestandsliste und w\u00fcrde sich \u00e4ndern.\n8. **`scheduler\/time_rules.py`** \u2014 sollte *nicht* ver\u00e4ndert werden. Die Priorit\u00e4t steht in keinem Zusammenhang mit der Wiederholung, und dieses Modul ist nicht eingebunden.\n\n### 5. Wesentliche Risiken\n\n- **Die Sortiersemantik stellt eine stillschweigende Verhaltens\u00e4nderung dar.** `JobRepository.all()` garantiert derzeit eine aufsteigende Reihenfolge der Identifikatoren, und `list_jobs` \u00fcbernimmt diese Reihenfolge. Jeder Verbraucher, der sich auf diese Garantie verl\u00e4sst, wird durch eine Neusortierung beeintr\u00e4chtigt. Entscheiden Sie explizit: \u00c4ndert `list_jobs()` seine Bedeutung, oder wird daneben eine neue Funktion `list_jobs_by_priority()` eingef\u00fchrt? Ersteres ist die risikoreichere Option, und der bestehende Test `test_create_and_list_jobs` ist zu schwach, um eine Regression (Liste mit einem einzigen Element) zu erkennen.\n- **Die Sortierrichtung ist tats\u00e4chlich mehrdeutig.** \"Priorit\u00e4t 1\" bedeutet in manchen Systemen \u00fcblicherweise *h\u00f6chste* und in anderen *niedrigste*. In diesem Repo gibt es nichts \u2013 weder einen Kommentar, noch einen Docstring, noch eine Zeile in der README-Datei \u2013, was dies eindeutig festlegt. Entscheide dich f\u00fcr eine Konvention, dokumentiere sie in `models.py` und implementiere sie in einem Test mit mindestens drei unterschiedlichen Priorit\u00e4ten, damit die Sortierrichtung eindeutig festgelegt ist.\n- **Instabile Sortierung bei Gleichstand.** Wenn zwei Jobs dieselbe Priorit\u00e4t haben, muss das Ergebnis dennoch deterministisch sein. Pythons `sorted` ist stabil, aber Stabilit\u00e4t ist nur dann sinnvoll, wenn die Eingabereihenfolge selbst definiert ist. F\u00fcge immer `identifier` als expliziten Sekund\u00e4rschl\u00fcssel hinzu.\n- **Reihenfolge der Felder bei 'frozen\"-Dataklassen.** `Job` ist `@dataclass(frozen=True)` mit drei positionsabh\u00e4ngigen Feldern, und `service.py:13` konstruiert es positionsabh\u00e4ngig. Das Einf\u00fcgen von `priority` an einer anderen Stelle als an letzter Stelle oder ohne Standardwert ist eine kompatibilit\u00e4tsbrechende \u00c4nderung, die von den beiden bestehenden Tests m\u00f6glicherweise nicht deutlich erkannt wird.\n- **Erweiterung des `to_dict()`-Kontrakts.** `asdict(self)` spiegelt alle Felder wider. Das Hinzuf\u00fcgen von `priority` ver\u00e4ndert jede serialisierte Nutzlast, ohne dass eine sichtbare \u00c4nderung am Methodenk\u00f6rper in `models.py` vorgenommen wird. Alles, was auf die exakte Dict-Struktur pr\u00fcft, bricht zusammen.\n- **Einschr\u00e4nkungen in Python 3.9.6.** Kein `@dataclass(slots=True)` (3.10+), kein `kw_only=True` (3.10+) und PEP 604-Annotationen wie `int | None` schlagen zur Laufzeit fehl, wenn `from __future__ import annotations` fehlt. Wenn die Priorit\u00e4t als Enum modelliert wird, ist `enum.StrEnum` erst ab Version 3.11 verf\u00fcgbar und daher nicht nutzbar. Jeder dieser F\u00e4lle w\u00fcrde die Fixture auf diesem Interpreter zum Absturz bringen.\n- **Die Identifikatorzuweisung befindet sich in der falschen Ebene.** `SchedulerService._next_identifier` bedeutet, dass der Dienst f\u00fcr die ID-Generierung zust\u00e4ndig ist, w\u00e4hrend das Repository die Speicherung \u00fcbernimmt. Sollte die Arbeit an Priorit\u00e4ten eine zweite Repository-Implementierung oder vorbelegte Fixtures erfordern, f\u00fchrt diese Aufteilung zu ID-Kollisionen und \u00fcberschriebenen Jobs.\n- **Asymmetrische Fehlerkonventionen.** `JobRepository.get` gibt bei einem Fehlgriff `None` zur\u00fcck, w\u00e4hrend `JobRepository.delete` einen `KeyError` ausl\u00f6st. Jede neue priorit\u00e4tsbezogene Abfrage sollte sich bewusst f\u00fcr eine Konvention entscheiden, anstatt die Inkonsistenz versehentlich zu \u00fcbernehmen.\n- **Pr\u00e4zedenzfall bei Validierungsl\u00fccken.** `create_job` validiert `name`, nicht jedoch `owner`. \u00dcbernehmen Sie diese Nachl\u00e4ssigkeit nicht f\u00fcr `priority` \u2013 eine nicht validierte Priorit\u00e4t wird in den Sortierschl\u00fcssel weitergegeben und kann tief im Inneren von `sorted` (z. B. beim Vergleich von `int` mit `None`) einen `TypeError` ausl\u00f6sen, anstatt an der Aufrufstelle.\n- **Dead-Code-Falle.** `scheduler\/time_rules.py` sieht nach Planungslogik aus und wird Bearbeitungen anziehen. Es wird von keiner Datei importiert, und sein eigener Docstring r\u00e4umt den Fehler ein: Es addiert 24 verstrichene Stunden in UTC und \"verschiebt die lokale Wanduhrzeit bei Umstellungen auf Sommerzeit'. Eine \u00c4nderung daran hat keinerlei beobachtbare Auswirkungen auf das getestete System, sodass der dort aufgewendete Aufwand verschwendet ist und jeder daf\u00fcr geschriebene Test nichts validiert, was tats\u00e4chlich ausgeliefert wird.\n- **D\u00fcnnes Sicherheitsnetz.** Zwei Tests, keine CI, kein Linter, keine Typpr\u00fcfung. Es gibt nichts, was eine Regression abfangen k\u00f6nnte, au\u00dfer dem, was man selbst schreibt. Behandeln Sie die bestehende Testsuite als unzureichende Basisabdeckung, nicht als Gate.\n\n### 6. Implementierungsplan (nicht ausgef\u00fchrt)\n\n1. **Legen Sie zun\u00e4chst die Semantik schriftlich fest.** Priorit\u00e4tstyp (`int` vs. Enum), g\u00fcltiger Bereich, Standardwert f\u00fcr bestehende\/nicht spezifizierte Jobs und Sortierrichtung. Halte dies als Docstring bei `Job` in `scheduler\/models.py` fest \u2013 das ist die einzige Stelle, von der alle Ebenen bereits abh\u00e4ngen.\n2. **Das Modell erweitern.** F\u00fcge `priority: int = 0` als *letztes* Feld von `Job` in `scheduler\/models.py` hinzu, wobei die Positionskompatibilit\u00e4t mit `service.py:13` gewahrt bleibt und `to_dict()` unver\u00e4ndert bleibt.\n3. **Integrieren Sie dies in den Service.** F\u00fcgen Sie einen mit einem Standardwert versehenen `priority`-Parameter zu `SchedulerService.create_job` hinzu, validieren Sie ihn neben der bestehenden `name.strip()`-Pr\u00fcfung (l\u00f6sen Sie einen `ValueError` aus, der dem etablierten Fehlertyp entspricht) und \u00fcbergeben Sie ihn an den `Job`-Konstruktor.\n4. **Legen Sie den Auflistungskontext explizit fest.** Bevorzugte Option mit geringem Risiko: Belassen Sie `JobRepository.all()` als nach Identifikatoren sortierte Grundfunktion und f\u00fcgen Sie einen separaten, nach Priorit\u00e4t sortierten Zugriffsoperator hinzu. Falls stattdessen die Bedeutung von `list_jobs()` ge\u00e4ndert werden muss, \u00e4ndern Sie die Comprehension von `JobRepository.all()` so, dass die Werte nach einem expliziten zusammengesetzten Schl\u00fcssel sortiert werden, der `identifier` als Tie-Break enth\u00e4lt, und vermerken Sie die \u00c4nderung in `README.md`.\n5. **Halten Sie `scheduler\/__init__.py` nur dann synchron**, wenn eine \u00f6ffentliche Enumeration oder Konstante eingef\u00fchrt wurde.\n6. **R\u00fchren Sie `scheduler\/time_rules.py` nicht an** und f\u00fcgen Sie keine Dateien hinzu, es sei denn, `expected_files` in `fixture-manifest.json` wird im Rahmen derselben \u00c4nderung aktualisiert.\n\n### 7. Validierungsplan\n\n- **Zuerst die Baseline.** F\u00fchren Sie vor jeder Bearbeitung `python3 -m unittest discover -s tests -v` aus und vergewissern Sie sich, dass beide Tests bestanden werden. Ich habe dies bereits getan \u2013 es l\u00e4uft einwandfrei.\n- **Regressionspr\u00fcfung.** Beide bestehenden Tests m\u00fcssen auch in unver\u00e4nderter Form weiterhin bestehen. Wenn `test_create_and_list_jobs` bearbeitet werden muss, ist das ein Hinweis darauf, dass die \u00c4nderung zu Fehlern f\u00fchrt, und kein Grund, den Test zu \u00e4ndern.\n- **Neue Testf\u00e4lle in `tests\/test_scheduler.py`:**\n  - Standardpriorit\u00e4t, wenn `create_job` mit der alten Signatur mit zwei Argumenten aufgerufen wird (belegt die Abw\u00e4rtskompatibilit\u00e4t).\n  - Explizite Priorit\u00e4ts\u00fcberpr\u00fcfung bei einem Rundlauf \u00fcber `create_job` \u2192 `list_jobs`.\n  - Sortierung mit **drei oder mehr** unterschiedlichen Priorit\u00e4ten unter \u00dcberpr\u00fcfung der vollst\u00e4ndigen Liste \u2013 dadurch wird die Sortierrichtung festgelegt.\n  - Tie-Break: Zwei Jobs mit gleicher Priorit\u00e4t werden in aufsteigender Reihenfolge der Identifikatoren zur\u00fcckgegeben.\n  - Eine ung\u00fcltige Priorit\u00e4t l\u00f6st einen `ValueError` aus, analog zum Fall mit leerem Namen.\n  - `to_dict()` enth\u00e4lt `priority` mit dem erwarteten Wert.\n  - Eingespeister Repository-Pfad: `SchedulerService(repository=fake)` weist die Priorit\u00e4t weiterhin korrekt zu und nutzt dabei die Schnittstelle `repository or JobRepository()`.\n- **Kompatibilit\u00e4tspr\u00fcfung.** Vergewissern Sie sich, dass alles speziell unter Python 3.9.6 l\u00e4uft \u2013 kein `slots=`, kein `kw_only=`, keine reinen PEP-604-Vereinigungen, kein `StrEnum`.\n- **Bestandspr\u00fcfung.** Lesen Sie `fixture-manifest.json` erneut ein und stellen Sie sicher, dass der Dateisatz auf der Festplatte weiterhin mit `expected_files` \u00fcbereinstimmt.\n- **Determinismus.** F\u00fchren Sie die Testsuite zwei- oder dreimal aus; Fehler im Zusammenhang mit der Reihenfolge der Dict-Iteration k\u00f6nnen sporadisch auftreten.\n- **Sauberkeit.** F\u00fchren Sie die Tests mit `PYTHONDONTWRITEBYTECODE=1` aus, damit `__pycache__`-Verzeichnisse nicht als nicht nachverfolgte Abweichung vom Manifest erscheinen.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Einschr\u00e4nkung des Testumfelds: Es handelte sich um ein kleines Offline-Python-Repository. Claude nutzte nach Ablauf des CLI-OAuth-Tokens einen Subagent-Fallback, sodass Isolation und Token-Sichtbarkeit nicht identisch waren.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses Ergebnis sagt nichts \u00fcber die Leistung in einem gro\u00dfen Monorepo oder bei einer einw\u00f6chigen autonomen Sitzung aus. Der Testfall war bewusst klein und kontrolliert gehalten. F\u00fcr eine echte Bewertung sollten Sie mit einer schreibgesch\u00fctzten Eingabeaufforderung beginnen: Bitten Sie jedes Tool, den Aufrufpfad abzubilden, die Dateien zu benennen, die es \u00e4ndern w\u00fcrde, Tests zu identifizieren und unklare Annahmen aufzulisten, bevor Sie \u00c4nderungen zulassen.<\/p>\n\n\n\n<h2 id=\"implementation\" class=\"wp-block-heading\">Implementierungsstil, Umfang des Patches und Fehlerbehebung<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Arbeiten mit mehreren Dateien<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Das gleiche Bestehungsverhalten kann auf unterschiedliche technische Entscheidungen zur\u00fcckzuf\u00fchren sein. In T2 erzielten beide Produkte 30\/30 und bestanden den \u201eFrozen Hidden Validator\u201c. Claude Code f\u00fchrte die Validierung an mehr als einer Grenze durch und f\u00fcgte umfassendere Direktmodell- und Schwellenwerttests hinzu. Codex verwendete eine kleinere, serviceorientierte Implementierung, die den Vertrag ebenfalls erf\u00fcllte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr einen unabh\u00e4ngigen Entwickler ist dies ein echter Kompromiss. Eine umfassendere Validierung kann Invarianten sch\u00fctzen, wenn Objekte \u00fcber mehrere Pfade erstellt werden. Ein kleinerer Patch kann die Regressionsfl\u00e4che und die \u00dcberpr\u00fcfungszeit verringern, wenn ein Dienst als Einstiegspunkt vorgesehen ist. Die richtige Antwort h\u00e4ngt von den Eigentumsregeln des Repositorys ab, nicht davon, ge\u00e4nderte Zeilen oder Tests isoliert zu z\u00e4hlen.<\/p>\n\n\n\n<style>\n.evidence-t2-multifile-feature{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t2-multifile-feature *{box-sizing:border-box}.evidence-t2-multifile-feature .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t2-multifile-feature .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t2-multifile-feature .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t2-multifile-feature .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t2-multifile-feature .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t2-multifile-feature .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t2-multifile-feature .d-side{min-width:0;padding:24px 26px}.evidence-t2-multifile-feature .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t2-multifile-feature .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t2-multifile-feature .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t2-multifile-feature .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t2-multifile-feature .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t2-multifile-feature .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t2-multifile-feature .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t2-multifile-feature .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t2-multifile-feature .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t2-multifile-feature .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t2-multifile-feature .d-preview pre,.evidence-t2-multifile-feature .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t2-multifile-feature .d-preview pre{padding:13px}.evidence-t2-multifile-feature .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t2-multifile-feature .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t2-multifile-feature .d-fulls{padding:0 26px 22px}.evidence-t2-multifile-feature .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t2-multifile-feature .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t2-multifile-feature .d-full summary::-webkit-details-marker{display:none}.evidence-t2-multifile-feature .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t2-multifile-feature .d-full[open] summary:after{content:\"\u2212\"}.evidence-t2-multifile-feature .d-full-pane{padding:0 14px 14px}.evidence-t2-multifile-feature .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t2-multifile-feature .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t2-multifile-feature .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t2-multifile-feature .d-head{display:block}.evidence-t2-multifile-feature .d-pill{display:inline-block;margin-top:12px}.evidence-t2-multifile-feature .d-grid{grid-template-columns:1fr}.evidence-t2-multifile-feature .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t2-multifile-feature .d-head,.evidence-t2-multifile-feature .d-side{padding:20px}.evidence-t2-multifile-feature .d-fulls{padding:0 20px 20px}.evidence-t2-multifile-feature .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t2-multifile-feature\"><header class=\"d-head\"><div><p class=\"d-kicker\">T2 \u00b7 Test im kontrollierten Repository<\/p><h3 class=\"d-title\">Eine Priorit\u00e4tsfunktion \u00fcber mehrere Dateien hinweg implementieren<\/h3><p class=\"d-sub\">Das \u201eFrozen\u201c-Verhalten hinzuf\u00fcgen, die Kompatibilit\u00e4t gew\u00e4hrleisten und die Pr\u00fcfungen f\u00fcr \u00f6ffentliche sowie versteckte Elemente bestehen.<\/p><\/div><span class=\"d-pill\">Funktionskrawatte<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex-Ergebnis\"><div class=\"d-product\"><span>Codex<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>115 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>7 + versteckt<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>Kleinerer Patch<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>Die Priorit\u00e4t wurde dem unver\u00e4nderlichen Modell hinzugef\u00fcgt, an der Service-Grenze validiert und die Reihenfolge im Repository beibehalten.\n\nAlle sieben \u00f6ffentlichen Tests und der \u201efrozen hidden\u201c-Validator wurden erfolgreich bestanden.<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> Eine kleinere, serviceorientierte Implementierung, die alle festgelegten Verhaltensweisen erf\u00fcllte.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude Code-Ergebnis\"><div class=\"d-product\"><span>Claude-Code<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>101 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>14 + versteckt<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>Umfassendere Tests<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>Die Priorit\u00e4t wurde sowohl an der Service-Grenze als auch im unver\u00e4nderlichen Modell validiert, die Repository-Filterung beibehalten und eine Schwellenwertabdeckung hinzugef\u00fcgt.\n\nVierzehn \u00f6ffentliche Tests und der versteckte Validator wurden bestanden.<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> Umfassendere Abdeckung durch Direktmodelle und Schwellenwerte ohne funktionalen Score-Vorteil.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Gesamte Codex-Ausgabe anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndige, bereinigte und erstmals g\u00fcltige Ausgabe<\/p><pre>Die Funktion zur Priorisierung geplanter Jobs wurde implementiert.\n\nGe\u00e4nderte Dateien:\n\n- [scheduler\/models.py](.\/scheduler\/models.py:5) \u2013 serialisiertes `priority` hinzugef\u00fcgt, Standardwert ist `0`.\n- [scheduler\/service.py](.\/scheduler\/service.py:11) \u2013 Validierung, Speicherung und Filterung mit `list_jobs(min_priority=0)` unter Beibehaltung der Reihenfolge der Identifikatoren hinzugef\u00fcgt.\n- [tests\/test_scheduler.py](.\/tests\/test_scheduler.py:16) \u2013 Testabdeckung f\u00fcr Standardwerte, Serialisierung, Speicherung, Grenzwerte, ung\u00fcltige Werte und Filterung hinzugef\u00fcgt.\n\nAusgef\u00fchrte Tests:\n\n```text\npython3 -m unittest discover -s tests -v\n7 Tests ausgef\u00fchrt \u2014 OK\n```\n\n**Fazit:** Die eingefrorene Aufgabe ist abgeschlossen und verifiziert.  \n**Erforderliche Entscheidung:** Keine.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Vollst\u00e4ndige Ausgabe des Claude-Codes anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndiges \u00dcbergabeprotokoll einschlie\u00dflich der wortgetreuen ersten g\u00fcltigen Ausgabe<\/p><pre># T2-Ausf\u00fchrungsprotokoll \u2013 Funktion zur Priorisierung mehrerer Dateien\n\n## Ausf\u00fchrungsparameter\n\n| Feld | Wert |\n| --- | --- |\n| Aufgabe | `T2` |\n| Festgelegte Eingabeaufforderung | `01-prompts\/T2.md` |\n| SHA-256-Hash der eingefrorenen Eingabeaufforderung | `8476a56034c4e719b97ee4081b32b4c73efd45feafe1bda9d477c83cb8fdb698` |\n| Ausf\u00fchrungseinheit | isolierter Claude-Subagent, `general-purpose`, neuer Kontext |\n| Isolationsmethode | **Subagent-Fallback** (dokumentiertes Downgrade \u2013 siehe `results\/isolation-decision.md`) |\n| Zugewiesene saubere Kopie | `runtime\/workspaces\/T2` |\n| Claude-Codeversion | `2.1.220` |\n| Modelleinstellung | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:52Z` |\n| end_utc | `2026-07-28T10:29:33Z` |\n| Dauer | 101 s (gleichzeitig mit T1, T3, T4; keine reine Latenzmessung) |\n| Versuchsnummer | 1 |\n| Status | `valid` |\n| Menschliches Eingreifen | keines |\n\n## Zusammenfassung der sicheren Tools\n\n`date`, `Read`\/`Edit`\/`Write` ausschlie\u00dflich innerhalb des zugewiesenen Arbeitsbereichs, `grep`,\n`python3 -m unittest discover`, `python3 -m compileall`, Inline-Smoke-Checks mit `python3 -c`.\nKein Netzwerk, keine Installationen, nur Standardbibliothek.\n\n## Ge\u00e4nderte Dateien\n\n`scheduler\/models.py`, `scheduler\/repository.py`, `scheduler\/service.py`,\n`tests\/test_scheduler.py`. Es wurden keine Dateien hinzugef\u00fcgt oder entfernt, daher bleibt `fixture-manifest.json`\nkorrekt. Vollst\u00e4ndiger Patch: `results\/T2\/patch.diff`.\n\n## Ergebnisse der Offline-Pr\u00fcfung\n\nVom Task-Runner gemeldet:\n\n| Pr\u00fcfung | Ergebnis |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` (Ausgangszustand, vor der \u00c4nderung) | 2 bestanden, 0 fehlgeschlagen |\n| `python3 -m compileall -q scheduler tests` | fehlerfrei |\n| Inline-Smoke-Checks (veraltete 3-Arg-Konstruktion, Schwellenwert f\u00fcr Schl\u00fcsselwort\/Positionsangabe, `to_dict`) | bestanden |\n| `python3 -m unittest discover -s tests -v` (endg\u00fcltig) | **14 bestanden, 0 fehlgeschlagen** |\n\nUnabh\u00e4ngig vom Koordinator au\u00dferhalb des Arbeitsbereichs erneut \u00fcberpr\u00fcft:\n\n| Pr\u00fcfung | Beenden | Ergebnis |\n| --- | --- | --- |\n| \u00f6ffentliche Suite (`results\/checks\/T2-public.txt`) | 0 | 14 Tests, OK |\n| versteckter Validator `03-checks\/test_t2_hidden.py` (`results\/checks\/T2-hidden.txt`) | 0 | 2 Tests, OK |\n\nDer versteckte Validator schl\u00e4gt bei einer unver\u00e4nderten Fixture-Kopie fehl (Exit 1), was best\u00e4tigt, dass das Bestehen\naussagekr\u00e4ftig ist. Siehe `results\/checks\/validator-controls.md`.\n\n## Abdeckung des Gold-Map-Verhaltens\n\nAlle f\u00fcnf erforderlichen Verhaltensweisen in `03-checks\/gold-map.json` sind erf\u00fcllt:\n\n| Erforderliches Verhalten | Nachweis |\n| --- | --- |\n| Standardpriorit\u00e4t 0 | `Job.priority: int = MIN_PRIORITY`; `create_job(..., priority=MIN_PRIORITY)`; `test_priority_defaults_to_zero` |\n| Ganzzahlbereich von 0 bis 9 | `validate_priority` lehnt Nicht-Ganzzahlen und Werte au\u00dferhalb des Bereichs ab; `test_out_of_range_priority_is_rejected`, `test_non_integer_priority_is_rejected` |\n| serialisierte Priorit\u00e4t | `to_dict()` \u00fcber `asdict`; `test_priority_appears_in_serialized_output` \u00fcberpr\u00fcft das exakte W\u00f6rterbuch |\n| Filterung nach Mindestpriorit\u00e4t | `list_jobs(min_priority=0)` \u2192 `JobRepository.all(min_priority)`; `test_filter_is_inclusive_of_the_threshold` |\n| Reihenfolge der Identifikatoren | Filter wird innerhalb der bestehenden `sorted(self._jobs)`-Komprehension angewendet; `test_filter_preserves_ascending_identifier_order` |\n\n## Bereinigte Fehler\n\nKeine. `__pycache__`-Artefakte aus Testl\u00e4ufen wurden vom Task-Runner entfernt; ein Koordinator-\nSweep best\u00e4tigte, dass der Arbeitsbereich sauber ist.\n\n## Sichtbare Ausgabe (w\u00f6rtlich)\n\nEin ganzzahliges `priority`-Feld wurde zu geplanten Jobs \u00fcber die Modell-, Repository- und Service-Ebenen der lokalen Scheduler-Fixture hinweg hinzugef\u00fcgt, zus\u00e4tzlich zur gefilterten Auflistung.\n\n**`scheduler\/models.py`** \u2014 Es wurden die Modulkonstanten `MIN_PRIORITY = 0` \/ `MAX_PRIORITY = 9` sowie eine wiederverwendbare Funktion `validate_priority(priority)` hinzugef\u00fcgt, die bei Nicht-Ganzzahlen und bei Werten au\u00dferhalb des Bereichs von 0 bis 9 (einschlie\u00dflich) einen `ValueError` ausl\u00f6st. `bool` wird explizit abgelehnt, obwohl es eine Unterklasse von `int` ist, sodass `True` nicht als Priorit\u00e4t 1 durchrutschen kann. Die eingefrorene Dataklasse `Job` erh\u00e4lt `priority: int = MIN_PRIORITY` als abschlie\u00dfendes Feld mit einem Standardwert, wodurch die bestehende Konstruktion mit drei Argumenten weiterhin funktioniert, sowie eine `__post_init__`-Methode, die den Validator aufruft, sodass ung\u00fcltige Priorit\u00e4ten auf keinem Weg konstruiert werden k\u00f6nnen. `to_dict()` wurde als `asdict(self)` belassen, sodass die Priorit\u00e4t automatisch und in Feldreihenfolge in der serialisierten Ausgabe erscheint.\n\n**`scheduler\/repository.py`** \u2014 `JobRepository.all()` akzeptiert ein optionales `min_priority` und filtert innerhalb der bestehenden `sorted(self._jobs)`-Komprehension, sodass die aufsteigende Reihenfolge der Identifikatoren durch denselben einzigen Codepfad gew\u00e4hrleistet wird, der sie bereits zuvor bereitgestellt hat, anstatt nach dem Filtern neu hergestellt zu werden. Das Standardargument beh\u00e4lt das bisherige Verhalten ohne Argumente f\u00fcr bestehende Aufrufer bei. Am Speicher selbst waren keine \u00c4nderungen erforderlich: Das Repository speichert ganze `Job`-Instanzen, sodass die Priorit\u00e4t erhalten bleibt und \u00fcber `save`\/`get`\/`all` weitergegeben wird.\n\n**`scheduler\/service.py`** \u2014 `create_job` akzeptiert ein optionales, am Ende stehendes `priority`-Argument (Standardwert 0) und validiert es vor der Erstellung des `Job`s, sodass der Fehler an der Service-Grenze mit demselben `ValueError`-Vertrag ausgel\u00f6st wird wie bei der bestehenden \u00dcberpr\u00fcfung auf leere Namen. `list_jobs(min_priority=0)` delegiert an das Repository. Sortierung und Filterung erfolgen an einer Stelle, anstatt doppelt vorhanden zu sein.\n\n**Entwurfsanmerkung zur Validierung von `min_priority`:** Der Wert wird als Ganzzahl typgepr\u00fcft, ist jedoch bewusst *nicht* auf den Bereich 0\u20139 beschr\u00e4nkt. Die 0\u20139-Regel schr\u00e4nkt ein, was ein Job speichern darf; ein Schwellenwert ist ein Abfrageparameter, und die Ablehnung von z. B. `min_priority=10` w\u00fcrde eine legitime Abfrage, die \"keine \u00dcbereinstimmung\" liefert, in einen Fehler verwandeln. Dass `list_jobs(min_priority=9)` `[]` zur\u00fcckgibt, wenn kein Job die Priorit\u00e4t 9 hat, wird durch einen Test abgedeckt.\n\n`scheduler\/time_rules.py` wurde gelesen, aber unver\u00e4ndert gelassen \u2013 die dort dokumentierte Umstellung zur Sommerzeit ist ein bereits vorhandenes, voreingestelltes Verhalten, das au\u00dferhalb des Umfangs dieser Aufgabe liegt, und eine \u00c4nderung h\u00e4tte eine nicht relevante Verhaltens\u00e4nderung zur Folge gehabt. Es wurden keine Dateien hinzugef\u00fcgt oder entfernt, sodass `fixture-manifest.json` weiterhin korrekt ist (programmgesteuert \u00fcberpr\u00fcft).\n\n### Testabdeckung erweitert\n\nStandardwert 0; Speicher-Roundtrip \u00fcber `JobRepository`; Priorit\u00e4t in der Ausgabe von `to_dict()`; Grenzwerte 0 und 9 akzeptiert; Werte au\u00dferhalb des Bereichs \u22121\/10\/100 abgelehnt; Nicht-ganzzahlige Werte `\"3\"`\/`3.5`\/`None`\/`True` werden abgelehnt; direkte Validierung auf Modellebene; ungefilterte Auflistungsreihenfolge; gefilterte Auflistung unter Beibehaltung der aufsteigenden Identifikatorreihenfolge; inklusiver Schwellenwert; leeres Ergebnis; nicht-ganzzahliger Wert f\u00fcr `min_priority` wird abgelehnt.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Einschr\u00e4nkung des Testumfelds: Es handelte sich um ein kleines Offline-Python-Repository. Claude nutzte nach Ablauf des CLI-OAuth-Tokens einen Subagent-Fallback, sodass Isolation und Token-Sichtbarkeit nicht identisch waren.<\/p><\/article>\n\n\n\n<h3 class=\"wp-block-heading\">Behebung von Fehlern in Randf\u00e4llen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">T3 testete einen Fehler bei der Sommerzeitplanung. Beide Agenten erzielten 30\/30 Punkte und bestanden die gleichen versteckten Pr\u00fcfungen im Fr\u00fchjahr und Herbst. Der Code Claude f\u00fcgte eine explizite Abdeckung f\u00fcr mehrdeutige und \u00fcbersprungene Ortszeiten, naive Eingaben und mehrt\u00e4gige \u00dcbertragungen hinzu. Codex nahm eine geringf\u00fcgigere \u00c4nderung des Kalendertags vor und bestand den \u201eFrozen Contract\u201c-Test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Umfassendere Tests f\u00fcr Randf\u00e4lle schaffen Vertrauen, wenn die Bibliothek in gro\u00dfem Umfang wiederverwendet wird oder die Kosten eines Planungsfehlers hoch sind. Eine eng gefasste \u00c4nderung ist sinnvoll, wenn der Fehler gut isoliert ist und das Team Verhaltens\u00e4nderungen minimieren m\u00f6chte. Die entscheidende Frage bei der \u00dcberpr\u00fcfung lautet nicht: \u201cWer hat mehr geschrieben?\u201d, sondern: Behebt der Patch die angegebene Grundursache, wahrt er die umgebenden Vertr\u00e4ge und testet er die risikobehafteten Grenzen ab?.<\/p>\n\n\n\n<style>\n.evidence-t3-dst-bug-fix{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t3-dst-bug-fix *{box-sizing:border-box}.evidence-t3-dst-bug-fix .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t3-dst-bug-fix .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t3-dst-bug-fix .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t3-dst-bug-fix .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t3-dst-bug-fix .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t3-dst-bug-fix .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t3-dst-bug-fix .d-side{min-width:0;padding:24px 26px}.evidence-t3-dst-bug-fix .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t3-dst-bug-fix .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t3-dst-bug-fix .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t3-dst-bug-fix .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t3-dst-bug-fix .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t3-dst-bug-fix .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t3-dst-bug-fix .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t3-dst-bug-fix .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t3-dst-bug-fix .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t3-dst-bug-fix .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t3-dst-bug-fix .d-preview pre,.evidence-t3-dst-bug-fix .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t3-dst-bug-fix .d-preview pre{padding:13px}.evidence-t3-dst-bug-fix .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t3-dst-bug-fix .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t3-dst-bug-fix .d-fulls{padding:0 26px 22px}.evidence-t3-dst-bug-fix .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t3-dst-bug-fix .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t3-dst-bug-fix .d-full summary::-webkit-details-marker{display:none}.evidence-t3-dst-bug-fix .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t3-dst-bug-fix .d-full[open] summary:after{content:\"\u2212\"}.evidence-t3-dst-bug-fix .d-full-pane{padding:0 14px 14px}.evidence-t3-dst-bug-fix .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t3-dst-bug-fix .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t3-dst-bug-fix .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t3-dst-bug-fix .d-head{display:block}.evidence-t3-dst-bug-fix .d-pill{display:inline-block;margin-top:12px}.evidence-t3-dst-bug-fix .d-grid{grid-template-columns:1fr}.evidence-t3-dst-bug-fix .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t3-dst-bug-fix .d-head,.evidence-t3-dst-bug-fix .d-side{padding:20px}.evidence-t3-dst-bug-fix .d-fulls{padding:0 20px 20px}.evidence-t3-dst-bug-fix .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t3-dst-bug-fix\"><header class=\"d-head\"><div><p class=\"d-kicker\">T3 \u00b7 Test im kontrollierten Repository<\/p><h3 class=\"d-title\">T\u00e4gliche Terminplanung bei Umstellung auf Sommerzeit anpassen<\/h3><p class=\"d-sub\">Behalten Sie die gew\u00fcnschte New Yorker Wanduhrzeit w\u00e4hrend der \u00dcbergangszeiten im Fr\u00fchling und Herbst bei.<\/p><\/div><span class=\"d-pill\">Krawatte \u00b7 verschiedene St\u00e4rken<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex-Ergebnis\"><div class=\"d-product\"><span>Codex<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>99 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>4 + 2 versteckt<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>Enge L\u00f6sung<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>Grundursache: Durch die Implementierung wurden 24 verstrichene UTC-Stunden hinzugef\u00fcgt.\n\nBehebung: Um einen lokalen Kalendertag vorr\u00fccken. Sowohl die \u201eFrozen Spring\u201c- als auch die \u201eFrozen Fall\u201c-Pr\u00fcfung wurden bestanden.<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> Der engere Ausschreibungsbereich hat den vollst\u00e4ndig eingefrorenen Vertrag verabschiedet.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude Code-Ergebnis\"><div class=\"d-product\"><span>Claude-Code<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>118 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>10 + 2 versteckt<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>Randabdeckung<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>Behandelt wurden: Fr\u00fchling, Herbst, ausgelassene und mehrdeutige Ortszeiten, naive Eingaben sowie mehrt\u00e4gige \u00dcbertragungen.\n\nBeide \u201eFrozen Hidden\u201c-Pr\u00fcfungen wurden nach einer umfassenderen Regressionsabdeckung bestanden.<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> Umfassendere Abdeckung von Randf\u00e4llen; gleicher Funktionswert unter der Rubrik \u201eFrozen\u201c.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Gesamte Codex-Ausgabe anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndige, bereinigte und erstmals g\u00fcltige Ausgabe<\/p><pre>Die Sommerzeit-Korrektur wurde implementiert.\n\nGe\u00e4nderte Dateien:\n\n- [scheduler\/time_rules.py](.\/scheduler\/time_rules.py)\n- [tests\/test_time_rules.py](.\/tests\/test_time_rules.py)\n\n\u00c4nderungen:\n\n- Der lokale Kalender wird um einen Tag statt um 24 UTC-Stunden vorverlegt.\n- Regressionstests f\u00fcr die Zeitumstellung in New York (Fr\u00fchjahrs- und Herbstzeitumstellung) hinzugef\u00fcgt.\n- Es wurde \u00fcberpr\u00fcft, dass die verstrichenen UTC-Intervalle 23 bzw. 25 Stunden betragen.\n\nPr\u00fcfungen:\n\n- Unit-Tests: 4 bestanden.\n- Syntaxpr\u00fcfung im Arbeitsspeicher: 7 Python-Dateien bestanden.\n- Die Bytecode-Kompilierung wurde blockiert, da Python seinen Cache au\u00dferhalb des zugewiesenen Arbeitsbereichs umleitet; es wurden keine externen Dateien geschrieben.\n\n**Fazit:** `next_daily_run` beh\u00e4lt nun die angeforderte Uhrzeit \u00fcber Sommer- und Winterzeitumstellungen hinweg bei. Es ist keine Entscheidung erforderlich.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Vollst\u00e4ndige Ausgabe des Claude-Codes anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndiges \u00dcbergabeprotokoll einschlie\u00dflich der wortgetreuen ersten g\u00fcltigen Ausgabe<\/p><pre># T3-Laufprotokoll \u2013 DST-Fehlerbehebung\n\n## Ausf\u00fchrungsparameter\n\n| Feld | Wert |\n| --- | --- |\n| Aufgabe | `T3` |\n| Gespeicherte Eingabeaufforderung | `01-prompts\/T3.md` |\n| SHA-256-Hash der eingefrorenen Eingabeaufforderung | `3fee50d0230f27f8d6dd7f12e050fa3f0b7f5fb77d9559361fee96e5f1a47307` |\n| Ausf\u00fchrungseinheit | isolierter Claude-Subagent, `general-purpose`, neuer Kontext |\n| Isolationsmethode | **Subagent-Fallback** (dokumentiertes Downgrade \u2013 siehe `results\/isolation-decision.md`) |\n| Zugewiesene saubere Kopie | `runtime\/workspaces\/T3` |\n| Claude-Codeversion | `2.1.220` |\n| Modelleinstellung | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:05Z` |\n| end_utc | `2026-07-28T10:30:03Z` |\n| Dauer | 118 s (gleichzeitig mit T1, T2, T4; keine reine Latenzmessung) |\n| Versuchsnummer | 1 |\n| Status | `g\u00fcltig` |\n| Menschliches Eingreifen | keines |\n\n## Zusammenfassung des \"Safe\"-Tools\n\n`date`, `Read`\/`Edit` ausschlie\u00dflich innerhalb des zugewiesenen Arbeitsbereichs, `python3 -m unittest discover`,\n`python3 -m compileall`, ein Negativkontrolllauf im Arbeitsspeicher, eine \u00dcberpr\u00fcfung der Manifestintegrit\u00e4t.\nNur Standardbibliothek (`datetime`, `zoneinfo`, `unittest`). Kein Netzwerk, keine Installationen.\n\n## Ge\u00e4nderte Dateien\n\n`scheduler\/time_rules.py` (die Korrektur \u2013 nur der Hauptteil und der Docstring von `next_daily_run`),\n`tests\/test_scheduler.py` (`NextDailyRunTests` hinzugef\u00fcgt, 8 Tests sowie ein `_elapsed`-Hilfsfunktion;\nbestehende Tests unver\u00e4ndert). Keine anderen Module ber\u00fchrt, keine Dateien hinzugef\u00fcgt. Vollst\u00e4ndiger Patch:\n`results\/T3\/patch.diff`.\n\n## Ergebnisse der Offline-Pr\u00fcfung\n\nVom Task-Runner gemeldet:\n\n| Pr\u00fcfung | Ergebnis |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **10 bestanden, 0 fehlgeschlagen** (2 bereits vorhandene + 8 neue) |\n| `python3 -m compileall -q scheduler tests` | sauber |\n| Manifestintegrit\u00e4t gegen\u00fcber `fixture-manifest.json` | 0 fehlend, 0 unerwartet |\n| Negativkontrolle: Vorab bereitgestellte Implementierung im Speicher gepatcht, nur `NextDailyRunTests` | 8 ausgef\u00fchrt, **5 wie beabsichtigt fehlgeschlagen**, einschlie\u00dflich beider DST-Tests |\n\nUnabh\u00e4ngig vom Koordinator au\u00dferhalb des Arbeitsbereichs erneut \u00fcberpr\u00fcft:\n\n| Pr\u00fcfung | Beenden | Ergebnis |\n| --- | --- | --- |\n| \u00f6ffentliche Suite (`results\/checks\/T3-public.txt`) | 0 | 10 Tests, OK |\n| Versteckter Validator `03-checks\/test_t3_hidden.py` (`results\/checks\/T3-hidden.txt`) | 0 | 2 Tests, OK |\n\nDer versteckte Validator schl\u00e4gt bei einer unver\u00e4nderten Fixture-Kopie fehl (Beenden 1). Siehe\n`results\/checks\/validator-controls.md`.\n\n## Abdeckung des Gold-Map-Verhaltens\n\nAlle vier erforderlichen Verhaltensweisen in `03-checks\/gold-map.json` sind erf\u00fcllt:\n\n| Erforderliches Verhalten | Nachweis |\n| --- | --- |\n| Beibehaltung der Wanduhrzeit | Inkrement auf die naive lokale Wanduhr angewendet, Zeitzone wieder zugeordnet; in jedem Sommerzeit-Test \u00fcberpr\u00fcft |\n| Fr\u00fchjahrszeitumstellung abgedeckt | `test_spring_forward_keeps_requested_hour` \u2013 Uhrzeit 09:30 beibehalten, Offset `-04:00`, verstrichene Zeit 23 h |\n| Herbstumstellung abgedeckt | `test_fall_back_keeps_requested_hour` \u2013 Uhrzeit 09:30 beibehalten, Offset `-05:00`, verstrichene Zeit 25 h |\n| IANA-Zeitzone verwendet | `ZoneInfo(\"America\/New_York\")` aus der Standardbibliothek |\n\n\u00dcber den erforderlichen Satz hinaus deckte der Runner auch die beiden PEP-495-Randf\u00e4lle ab \u2013 eine durch die Zeitumstellung im Fr\u00fchjahr\n\u00fcbersprungene Wandzeit und eine mehrdeutige Wandzeit w\u00e4hrend der Zeitumstellung im Herbst \u2013 sowie Sieben-Tage-\u00dcberg\u00e4nge,\ndie sich \u00fcber beide \u00dcberg\u00e4nge erstrecken, und das Verhalten bei naiven Eingaben.\n\n## Bereinigte Fehler\n\nZwei selbst verursachte Fehler bei Test-Assertions: `following - previous` bei zwei Datums- und Zeitangaben, die sich ein\n`tzinfo` teilen, subtrahiert naive Wanduhren, sodass die Assertions zur verstrichenen Zeit 1 Tag anzeigten und fehlschlugen.\nDie Implementierung war korrekt und die Assertions waren falsch; korrigiert mit einem `_elapsed`-\nHelper, der beide Operanden zun\u00e4chst in UTC konvertiert. Keine Tooling-, Import- oder Umgebungsfehler.\n`__pycache__`-Artefakte wurden nach dem Lauf entfernt.\n\n## Sichtbare Ausgabe (w\u00f6rtlich)\n\n**Reproduktion**\n\n`scheduler\/time_rules.py::next_daily_run` wurde mit einem `America\/New_York`-Datums- und Zeitwert auf jeder Seite eines Sommerzeitwechsels im Jahr 2024 aufgerufen:\n\n```\n2024-03-09T09:30:00-05:00 -&gt; 2024-03-10T10:30:00-04:00   #-Stunde driftete um +1\n2024-11-02T09:30:00-04:00 -&gt; 2024-11-03T08:30:00-05:00   #: Die Stunde verschob sich um -1\n```\n\nEin f\u00fcr 09:30 Uhr Ortszeit angeforderter Job wurde nach der Zeitumstellung auf Sommerzeit um 10:30 Uhr und nach der Zeitumstellung auf Winterzeit um 08:30 Uhr gestartet.\n\n**Grundursache**\n\nDie vorgefertigte Implementierung behandelte \u201edaily\u201c als feste absolute Dauer:\n\n```python\nelapsed = previous_run.astimezone(timezone.utc) + timedelta(hours=24)\nreturn elapsed.astimezone(previous_run.tzinfo)\n```\n\nDurch die Umwandlung in UTC ergibt `timedelta(hours=24)` zun\u00e4chst genau 24 verstrichene Stunden. Ein lokaler Kalendertag in einer IANA-Zeitzone dauert jedoch am Tag der Zeitumstellung auf Sommerzeit 23 Stunden und am Tag der Zeitumstellung auf Winterzeit 25 Stunden, sodass ein konstanter Versatz von 24 Stunden zwangsl\u00e4ufig zu einer Abweichung von einer Stunde gegen\u00fcber der angeforderten Wanduhrzeit f\u00fchrt.\n\n**Die L\u00f6sung** (`scheduler\/time_rules.py`)\n\nDa es sich bei der t\u00e4glichen Wiederholung um eine Kalenderregel handelt, wird das Inkrement nun auf die naive lokale Wanduhr angewendet, wobei die Zeitzone anschlie\u00dfend wieder hinzugef\u00fcgt wird:\n\n```python\ntzinfo = previous_run.tzinfo\nnaive_next = previous_run.replace(tzinfo=None) + timedelta(days=1)\nif tzinfo is None:\n    return naive_next\ncandidate = naive_next.replace(tzinfo=tzinfo, fold=0)\nreturn candidate.astimezone(timezone.utc).astimezone(tzinfo)\n```\n\nWarum dies korrekt ist:\n- Die Wanduhr-Arithmetik auf den naiven Wert ist offsetunabh\u00e4ngig, sodass die angeforderte Stunde:Minute konstruktionsbedingt erhalten bleibt; `zoneinfo` liefert dann den jeweils am neuen Datum geltenden UTC-Offset (\u00fcberpr\u00fcft: `-04:00` nach der Zeitumstellung im Fr\u00fchjahr, `-05:00` nach der Zeitumstellung im Herbst, verstrichene Echtzeit jeweils 23 h und 25 h).\n- `fold=0` in Verbindung mit dem UTC-Roundtrip behandelt die beiden Randf\u00e4lle, die bei reiner Wanduhr-Arithmetik undefiniert bleiben. Gem\u00e4\u00df PEP 495 hat eine *\u00fcbersprungene* Wanduhrzeit (02:30 am 10.03.2024) den Offset vor der Zeitumstellung bei `fold=0`; daher normalisiert der Round-Trip-Vorgang sie auf den tats\u00e4chlichen Zeitpunkt 03:30 EDT, anstatt ein Datetime-Objekt zur\u00fcckzugeben, das keinen Zeitpunkt angibt. Eine *mehrdeutige* Wanduhrzeit (01:30 am 03.11.2024) wird deterministisch auf ihr erstes Auftreten (EDT) aufgel\u00f6st, anstatt willk\u00fcrlich zu sein.\n- Naive Eingaben behalten ihre bisherige Bedeutung (einfach +1 Kalendertag) \u2013 es werden den Aufrufern keine neuen `tzinfo`-Anforderungen auferlegt.\n\nDer Umfang wurde eng gehalten: Nur der Hauptteil\/Docstring von `next_daily_run` wurde ge\u00e4ndert. `service.py`, `models.py`, `repository.py` und `__init__.py` bleiben unver\u00e4ndert, es wurden keine neuen Dateien hinzugef\u00fcgt, und das Fixture-Manifest stimmt weiterhin exakt \u00fcberein (keine fehlenden oder unerwarteten Dateien). Ausschlie\u00dflich Standardbibliothek (`datetime`, `zoneinfo`, `unittest`).\n\n**Regressionstests** (`tests\/test_scheduler.py`, neues `NextDailyRunTests`, 8 Tests) decken Folgendes ab: Stabilit\u00e4t an normalen Tagen, Zeitumstellung im Fr\u00fchjahr (Stunde + Offset + 23 verstrichene Stunden), Zeitumstellung im Herbst (Stunde + Offset + 25 verstrichene Stunden), Sieben-Tage-Zyklen, die jeweils \u00fcber einen \u00dcbergang hinwegreichen, \u00fcbersprungene Realzeit, mehrdeutige Realzeit und naive Eingaben.\n\nZwei Anmerkungen sind erw\u00e4hnenswert. Erstens verwendeten meine urspr\u00fcnglichen Assertions zur verstrichenen Zeit `following - previous`; Python ignoriert ein gemeinsames `tzinfo` und subtrahiert naive Wanduhren, sodass beide 1 Tag zur\u00fcckgaben und fehlschlugen. Die Implementierung war korrekt und die Assertions falsch \u2013 behoben mit einem `_elapsed`-Helper, der beide Operanden in UTC umwandelt. Zweitens habe ich \u00fcberpr\u00fcft, ob die Tests den urspr\u00fcnglichen Fehler tats\u00e4chlich abfangen, indem ich `NextDailyRunTests` erneut gegen eine In-Memory-Kopie der mit Startwerten versehenen Implementierung ausgef\u00fchrt habe: 5 von 8 Tests schlugen fehl, darunter beide Sommerzeit-Tests. Die drei F\u00e4lle, die unter der fehlerhaften Version bestanden wurden (normaler Tag, \u00fcbersprungen, mehrdeutig), dokumentieren eher das Verhalten als dass sie Regressionen aufdecken \u2013 die \u00fcbersprungenen\/mehrdeutigen F\u00e4lle stimmen zuf\u00e4llig \u00fcberein, da eine absolute Verschiebung um +24 Stunden zuf\u00e4llig auf denselben normalisierten Zeitpunkt f\u00e4llt.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Einschr\u00e4nkung des Testumfelds: Es handelte sich um ein kleines Offline-Python-Repository. Claude nutzte nach Ablauf des CLI-OAuth-Tokens einen Subagent-Fallback, sodass Isolation und Token-Sichtbarkeit nicht identisch waren.<\/p><\/article>\n\n\n\n<h2 id=\"code-review\" class=\"wp-block-heading\">Qualit\u00e4t der Code\u00fcberpr\u00fcfung und manuelle \u00dcberpr\u00fcfung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Code-Review-Aufgaben erfordern andere F\u00e4higkeiten als die Implementierung von Funktionen. Ein guter Reviewer muss reproduzierbare Fehler finden, deren Auswirkungen bewerten, den genauen Codepfad angeben und einen echten Fehler von einer spekulativen Warnung unterscheiden k\u00f6nnen. Die Behebung eines Fehlers bringt eine weitere Herausforderung mit sich: Der Patch darf keine neue Regression verursachen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Code \u201eClaude\u201c hatte in T4 den deutlichsten Vorteil. Es meldete f\u00fcnf unabh\u00e4ngig reproduzierbare Befunde, darunter beide vorab festgelegten Pr\u00fcfziele, und erzielte 19 von 20 Punkten. Codex meldete und behob zwei g\u00fcltige Fehler h\u00f6herer Schwere, erw\u00e4hnte jedoch das vorab festgelegte Paar nicht und erzielte 18 von 20 Punkten. Bei den Befunden von Codex handelte es sich nicht um Fehlalarme; der beobachtete Unterschied lag eher in der Breite als in der grundlegenden Korrektheit.<\/p>\n\n\n\n<style>\n.evidence-t4-review-and-repair{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t4-review-and-repair *{box-sizing:border-box}.evidence-t4-review-and-repair .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t4-review-and-repair .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t4-review-and-repair .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t4-review-and-repair .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t4-review-and-repair .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t4-review-and-repair .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t4-review-and-repair .d-side{min-width:0;padding:24px 26px}.evidence-t4-review-and-repair .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t4-review-and-repair .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t4-review-and-repair .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t4-review-and-repair .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t4-review-and-repair .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t4-review-and-repair .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t4-review-and-repair .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t4-review-and-repair .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t4-review-and-repair .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t4-review-and-repair .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t4-review-and-repair .d-preview pre,.evidence-t4-review-and-repair .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t4-review-and-repair .d-preview pre{padding:13px}.evidence-t4-review-and-repair .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t4-review-and-repair .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t4-review-and-repair .d-fulls{padding:0 26px 22px}.evidence-t4-review-and-repair .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t4-review-and-repair .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t4-review-and-repair .d-full summary::-webkit-details-marker{display:none}.evidence-t4-review-and-repair .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t4-review-and-repair .d-full[open] summary:after{content:\"\u2212\"}.evidence-t4-review-and-repair .d-full-pane{padding:0 14px 14px}.evidence-t4-review-and-repair .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t4-review-and-repair .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t4-review-and-repair .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t4-review-and-repair .d-head{display:block}.evidence-t4-review-and-repair .d-pill{display:inline-block;margin-top:12px}.evidence-t4-review-and-repair .d-grid{grid-template-columns:1fr}.evidence-t4-review-and-repair .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t4-review-and-repair .d-head,.evidence-t4-review-and-repair .d-side{padding:20px}.evidence-t4-review-and-repair .d-fulls{padding:0 20px 20px}.evidence-t4-review-and-repair .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t4-review-and-repair\"><header class=\"d-head\"><div><p class=\"d-kicker\">T4 \u00b7 Test im kontrollierten Repository<\/p><h3 class=\"d-title\">Finden Sie reproduzierbare Fehler und beheben Sie die Probleme mit der h\u00f6chsten Zuverl\u00e4ssigkeit<\/h3><p class=\"d-sub\">\u00dcberpr\u00fcfen Sie den Testfall, simulieren Sie reale Fehler, wenden Sie zul\u00e4ssige Korrekturen an und weisen Sie nach, dass Regressionstests das Verhalten abdecken.<\/p><\/div><span class=\"d-pill\">Claude-Abdeckungsrand<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex-Ergebnis\"><div class=\"d-product\"><span>Codex<\/span><span class=\"d-score\">18<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>223 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>4 bestanden<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>2 behoben<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>1. Hoch \u2013 Vorhandene Jobs k\u00f6nnten unbemerkt \u00fcberschrieben werden.\n\n2. Mittel \u2013 T\u00e4gliche Ausf\u00fchrungen wurden \u00fcber den Wechsel zur Sommerzeit hinweg verschoben.\n\n\u00dcberpr\u00fcfung: vier Tests bestanden, keine Fehler.<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> N\u00fctzliche Befunde mit h\u00f6herem Schweregrad und gezielte Korrekturen, allerdings wurden die beiden festgelegten \u00dcberpr\u00fcfungsziele verfehlt.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude Code-Ergebnis\"><div class=\"d-product\"><span>Claude-Code<\/span><span class=\"d-score\">19<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>Dauer<\/span><strong>235 s<\/strong><\/div><div class=\"d-metric\"><span>Schecks<\/span><strong>9 bestanden<\/strong><\/div><div class=\"d-metric\"><span>Umfang<\/span><strong>5 gemeldet<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">Erster g\u00fcltiger Auszugsabschnitt<\/div><pre>D1 DST-Abweichung \u00b7 Hoch\nD2 Naive Erfassung der Zeitzone \u00b7 Mittel\nD3 Kollision von Identifikatoren \u00b7 Hoch\nD4 Fehlendes \u201edelete\u201c l\u00f6st einen KeyError aus \u00b7 Mittel\nD5 Eigent\u00fcmer nicht validiert \u00b7 Niedrig<\/pre><\/div><p class=\"d-take\"><strong>Meinung des Rezensenten:<\/strong> Umfassendere \u00dcberpr\u00fcfung ohne erneut auftretende Fehlalarme; zwei vertragsabh\u00e4ngige Befunde wurden nicht behoben.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Gesamte Codex-Ausgabe anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndige, bereinigte und erstmals g\u00fcltige Ausgabe<\/p><pre>## Ma\u00dfnahmenerforderliche Befunde\n\n1. **Hoch \u2013 Vorhandene Jobs k\u00f6nnten unbemerkt \u00fcberschrieben werden**\n\n   - Nachweis: Initialisierung der Kennung in [service.py](.\/scheduler\/service.py:8) in Kombination mit dem Ersetzen eines W\u00f6rterbuchs in [repository.py](.\/scheduler\/repository.py:9).\n   - Auswirkung: Beim Erstellen eines Dienstes mit einem bereits vorhandenen Repository k\u00f6nnte die Kennung `1` wiederverwendet werden, wodurch der gespeicherte Job ersetzt und Datenverlust verursacht w\u00fcrde.\n   - Minimale Reproduktion: Speichern Sie `Job(1, ...)`, erstellen Sie `SchedulerService(repository)` und erstellen Sie anschlie\u00dfend einen weiteren Job. Vor der Behebung blieb nur der neue Job erhalten.\n   - Behebung: Initialisierung der n\u00e4chsten Kennung ausgehend von der h\u00f6chsten vorhandenen Kennung im Repository.\n   - Regressionstest: [test_scheduler.py](.\/tests\/test_scheduler.py:22).\n\n2. **Mittel \u2014 T\u00e4gliche Ausf\u00fchrungen verschoben sich bei der Umstellung auf Sommerzeit**\n\n   - Nachweis: korrigierte Berechnung in [time_rules.py](.\/scheduler\/time_rules.py:4).\n   - Auswirkung: Ein f\u00fcr 09:00 Uhr geplanter t\u00e4glicher Job wurde nach der Umstellung auf Sommerzeit im Fr\u00fchjahr um 10:00 Uhr ausgef\u00fchrt.\n   - Minimale Reproduktion: Berechne den n\u00e4chsten Lauf nach `2026-03-07 09:00 America\/New_York`. Vor der Korrektur lautete das Ergebnis `2026-03-08 10:00`.\n   - Korrektur: F\u00fcge einen lokalen Kalendertag statt 24 verstrichener UTC-Stunden hinzu.\n   - Regressionstest: [test_scheduler.py](.\/tests\/test_scheduler.py:33).\n\n## Ge\u00e4nderte Dateien\n\n- [scheduler\/service.py](.\/scheduler\/service.py)\n- [scheduler\/time_rules.py](.\/scheduler\/time_rules.py)\n- [tests\/test_scheduler.py](.\/tests\/test_scheduler.py)\n\n## \u00dcberpr\u00fcfung\n\n- Bei beiden Regressionstests wurde vor der Behebung ein Fehlschlag festgestellt.\n- Nach der jeweiligen Behebung wurden beide Tests erfolgreich bestanden.\n- `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v`\n- Ergebnis: **4 Tests bestanden, 0 Fehlschl\u00e4ge**.\n- Es sind keine generierten Python-Cache-Artefakte mehr vorhanden.\n\n## Fazit und Entscheidung\n\n- **Fazit:** Beide best\u00e4tigten Fehler sind behoben und werden durch gezielte Regressionstests abgedeckt.\n- **Erforderliche Entscheidung:** Keine.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Vollst\u00e4ndige Ausgabe des Claude-Codes anzeigen<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">Vollst\u00e4ndiges \u00dcbergabeprotokoll einschlie\u00dflich der wortgetreuen ersten g\u00fcltigen Ausgabe<\/p><pre># T4-Ausf\u00fchrungsprotokoll \u2013 Test und Code-Review\n\n## Ausf\u00fchrungsparameter\n\n| Feld | Wert |\n| --- | --- |\n| Aufgabe | `T4` |\n| Festgelegte Eingabeaufforderung | `01-prompts\/T4.md` |\n| SHA-256-Hash der eingefrorenen Eingabeaufforderung | `5e69546007ea776f40b3d334ddb75671ff684c151c77551bad27de3b0fdce640` |\n| Ausf\u00fchrungseinheit | isolierter Claude-Subagent, `general-purpose`, neuer Kontext |\n| Isolationsmethode | **Subagent-Fallback** (dokumentiertes Downgrade \u2013 siehe `results\/isolation-decision.md`) |\n| Zugewiesene saubere Kopie | `runtime\/workspaces\/T4` |\n| Claude-Codeversion | `2.1.220` |\n| Modelleinstellung | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:22Z` |\n| end_utc | `2026-07-28T10:32:17Z` |\n| Dauer | 235 s (gleichzeitig mit T1\u2013T3; keine reine Latenzmessung) |\n| Versuchsnummer | 1 |\n| Status | `g\u00fcltig` |\n| Menschliches Eingreifen | keines |\n\nDie Bedingung in der eingefrorenen Eingabeaufforderung \u2013 \"Korrekturen vornehmen, sofern die eingefrorene Ausf\u00fchrungskonfiguration\nKorrekturen zul\u00e4sst\" \u2013 wurde vom Koordinator anhand von `00-control\/run-config.json` und\n`00-control\/safety-policy.json` aufgel\u00f6st, die das Schreiben isolierter Fixture-Kopien erlauben. Dem Runner wurde\nmitgeteilt, dass Korrekturen zul\u00e4ssig sind. Ihm wurde keine Steuerdatei angezeigt.\n\n## Zusammenfassung der sicheren Tools\n\n`date`, `Read`\/`Edit`\/`Write` ausschlie\u00dflich innerhalb des zugewiesenen Arbeitsbereichs, `grep`,\n`python3 -m unittest discover`, `python3 -m compileall`, ein Lauf mit einer leeren Scratch-Kopie, eine\nPr\u00fcfung auf Vorhandensein des Manifests. Kein Netzwerk, keine Installationen, nur Standardbibliothek.\n\n## Ge\u00e4nderte Dateien\n\n`scheduler\/time_rules.py` (ge\u00e4ndert), `scheduler\/service.py` (ge\u00e4ndert),\n`tests\/test_scheduler.py` (ge\u00e4ndert, +2 Tests), `tests\/test_time_rules.py` (hinzugef\u00fcgt, 5 Tests).\nVollst\u00e4ndiger Patch: `results\/T4\/patch.diff`.\n\n## Ergebnisse der Offline-Pr\u00fcfung\n\nVom Task-Runner gemeldet:\n\n| Pr\u00fcfung | Ergebnis |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **9 bestanden, 0 fehlgeschlagen, 0 \u00fcbersprungen** (Baseline 2) |\n| `python3 -m compileall -q scheduler tests` | bestanden |\n| \u00dcberpr\u00fcfung des Vorhandenseins der Manifestdateien gegen\u00fcber `expected_files` | alle 8 vorhanden |\n| Vacuity-Lauf gegen wiederhergestellte Originalimplementierungen | 5 Fehler, 4 bestanden, wie beabsichtigt |\n\nUnabh\u00e4ngig vom Koordinator au\u00dferhalb des Arbeitsbereichs erneut \u00fcberpr\u00fcft:\n\n| Pr\u00fcfung | Beendigungsstatus | Ergebnis |\n| --- | --- | --- |\n| \u00f6ffentliche Testsuite (`results\/checks\/T4-public.txt`) | 0 | 9 Tests, OK |\n\nInformative Gegenpr\u00fcfung, ohne Bewertung: Der versteckte T3-Validator besteht diesen Test ebenfalls\nf\u00fcr diesen Arbeitsbereich (Beendigungscode 0), da T4 denselben `next_daily_run`-Fehler unabh\u00e4ngig behoben hat. Siehe\n`results\/checks\/validator-controls.md`.\n\n## Fehlerabdeckung in der Gold-Map\n\n`03-checks\/gold-map.json` legt zwei Fehler f\u00fcr die T4-Bewertung fest. Beide wurden gefunden:\n\n| Festgelegter Fehler | Gefunden | Gemeldet als |\n| --- | --- | --- |\n| leerer Eigent\u00fcmer akzeptiert | ja | **D5**, `scheduler\/service.py:11,13`, Schweregrad \"Low\", gemeldet und absichtlich nicht behoben |\n| Das L\u00f6schen eines fehlenden Bezeichners l\u00f6st einen `KeyError` aus | ja | **D4**, `scheduler\/repository.py:19` \u2192 `service.py:22`, Schweregrad \"Mittel\", gemeldet und bewusst nicht behoben |\n\n\u00dcber die vorgefertigte Menge hinaus wurden drei weitere Befunde gemeldet. Keiner davon ist ein Fehlalarm:\n\n- **D1** \u2014 DST-Abweichung in `next_daily_run`. Dies ist der dritte in\n  `03-checks\/seeded-defects.md` aufgef\u00fchrte Fehler (er wird unter T3 und nicht unter T4 bewertet, ist jedoch ein echter vorgefertigter Fehler).\n- **D2** \u2014 Eine naive Eingabe in `next_daily_run` \u00fcbernimmt stillschweigend die Zeitzone des Hosts und gibt ein\n  entsprechend angepasstes Datums- und Zeitformat zur\u00fcck. Echt und hostabh\u00e4ngig; vom Koordinator anhand des Fixture-Quellcodes verifiziert.\n- **D3** \u2014 Identifikationskollision zwischen einem Dienst und einem injizierten oder gemeinsam genutzten Repository, was zu einer\n  stillschweigenden \u00dcberschreibung f\u00fchrt. Echt: `SchedulerService._next_identifier` beginnt immer bei 1, w\u00e4hrend\n  `JobRepository.save` eine ungesch\u00fctzte Dict-Zuweisung ist. T1 identifizierte unabh\u00e4ngig davon dieselbe\n  Schwachstelle anhand des urspr\u00fcnglichen Fixtures.\n\nAnzahl der Fehlalarme: **0**. Der Runner meldete zudem korrekt, dass keine Sicherheitsbefunde vorliegen, und wies darauf hin, dass\ndas Fixture keine Angriffsfl\u00e4chen in den Bereichen Netzwerk, E\/A, Deserialisierung, Unterprozesse oder Anmeldedaten aufweist.\n\n## Bemerkenswerte Abweichung\n\nDie festgelegte Eingabeaufforderung forderte Tests und Korrekturen f\u00fcr \"die beiden Fehler mit dem h\u00f6chsten Konfidenzgrad\" an. Der\nRunner w\u00e4hlte D1\/D2 (eine Korrektur, gleiche Funktion) und D3 aus, anstatt der beiden in der Gold-Map vorgefertigten\nFehler D4 und D5. Die angegebene Begr\u00fcndung ist vertretbar: D4 und D5 h\u00e4ngen beide von einem nicht spezifizierten API-Vertrag\nab, sodass ihre Behebung reine Spekulation w\u00e4re. Die Erkennungsleistung bleibt davon unber\u00fchrt \u2013 beide vorprogrammierten Fehler\nwurden gefunden, einschlie\u00dflich Datei, Zeile, Schweregrad, Auswirkung und Reproduktion. Die angewendeten Korrekturen bezogen sich auf echte\nFehler und wurden durch eine Vacuity-Pr\u00fcfung best\u00e4tigt.\n\n## Bereinigte Fehler\n\nZwei selbst verursachte Testfehler aufgrund der Subtraktion von Wanduhrzeit und absoluter Zeit bei Datums- und Zeitangaben,\ndie dieselbe `tzinfo` nutzen; korrigiert und erneut \u00fcberpr\u00fcft. Keine Tool- oder Umgebungsfehler. `__pycache__`-\nArtefakte wurden nach dem Lauf entfernt.\n\n## Sichtbare Ausgabe (w\u00f6rtlich)\n\n### Fehlerbericht\n\n**D1 \u2014 `scheduler\/time_rules.py:10-11` \u2014 Der Tagesplan weicht w\u00e4hrend der Sommerzeit um eine Stunde ab \u2014 Schweregrad: Hoch**\n\n`next_daily_run` addiert 24 *verstrichene* Stunden \u00fcber einen UTC-Roundtrip, anstatt den Kalendertag vorzur\u00fccken. Ein t\u00e4glicher Job wird durch die Wanduhrzeit definiert, sodass jeder Job in einer Zone, in der die Sommerzeit gilt, ab dem Umstellungstag stillschweigend eine Stunde zu fr\u00fch oder zu sp\u00e4t ausgef\u00fchrt wird und der Fehler fortbesteht (jeder Lauf wird ausgehend von der verschobenen Zeit neu initialisiert). Das Docstring selbst r\u00e4umte dieses Verhalten ein.\n\n```\nprev = datetime(2024, 3, 9, 9, 0, tzinfo=ZoneInfo('America\/New_York'))\nnext_daily_run(prev)   # -&gt; 2024-03-10 10:00:00-04:00, erwartet 09:00-04:00\nprev = datetime(2024, 11, 2, 9, 0, tzinfo=ZoneInfo(\"America\/New_York\"))\nnext_daily_run(prev)   # -&gt; 03.11.2024 08:00:00-05:00, erwartet 09:00-05:00\n```\n\n**D2 \u2014 `scheduler\/time_rules.py:10-11` \u2014 Ein naiver Eingabewert \u00fcbernimmt stillschweigend die lokale Zeitzone des Rechners \u2014 Schweregrad: Mittel**\n\nDieselben zwei Zeilen. `.astimezone(timezone.utc)` auf einem naiven Datetime-Objekt geht von der lokalen Systemzeit aus, und `.astimezone(None)` gibt ein \"aware\"-Datetime-Objekt zur\u00fcck. Ein Aufruf mit naivem Eingabewert gibt einen \"aware\"-Wert zur\u00fcck, sodass das Ergebnis nicht mit den anderen naiven Werten des Aufrufers vergleichbar ist (`TypeError` beim Vergleich) und das Ergebnis von der `TZ` des Hosts abh\u00e4ngt.\n\n```\nnext_daily_run(datetime(2024, 1, 1, 9, 0))\n# -&gt; datetime(2024, 1, 2, 9, 0, tzinfo=timezone(timedelta(hours=8), \"CST\"))  # hostabh\u00e4ngig\n```\n\n**D3 \u2014 `scheduler\/service.py:8,13,15` (Pr\u00e4fix) \u2014 Identifikationskollision l\u00f6scht gespeicherte Jobs stillschweigend \u2014 Schweregrad: Hoch**\n\nDer ID-Z\u00e4hler war pro `SchedulerService` definiert und begann immer bei 1, wobei der Inhalt des eingebundenen Repositorys ignoriert wurde. Jeder zweite Dienst, der auf ein gemeinsam genutztes Repository zugreift, oder jeder Dienst, der auf ein vorab gef\u00fclltes Repository zugreift, vergab erneut die ID 1; da `JobRepository.save` eine Dict-Zuweisung ist, wurde der vorhandene Job ohne Fehler \u00fcberschrieben. Datenverlust.\n\n```\nrepo = JobRepository()\nSchedulerService(repo).create_job('N\u00e4chtliches Backup', 'Alex')    # ID 1\nSchedulerService(repo).create_job(\"Payroll export\", \"Blake\")   # erneut ID 1\nrepo.all()   # -&gt; [Job(1, 'Payroll export', 'Blake')]  \u2014 Alex' Job ist verschwunden\n```\n\n**D4 \u2014 `scheduler\/repository.py:19` \u2192 `scheduler\/service.py:22` \u2014 `delete_job` l\u00f6st bei einer unbekannten ID einen `KeyError` aus \u2014 Schweregrad: Mittel**\n\n`delete` verwendet `dict.pop` ohne Standardwert, w\u00e4hrend die Schwesterfunktion `get` (Zeile 13) bei einem Fehltreffer `None` zur\u00fcckgibt. Diese Inkonsistenz f\u00fchrt dazu, dass ein roher `KeyError` \u00fcber `SchedulerService.delete_job` ausgegeben wird, den Aufrufer wahrscheinlich nicht abfangen k\u00f6nnen. Reproduktion: `SchedulerService().delete_job(999)` \u2192 `KeyError: 999`. Eine L\u00f6sung w\u00e4re `pop(identifier, None)` oder eine explizite Dom\u00e4nenausnahme \u2013 bewusst nicht behoben, da die Wahl des korrekten Verhaltens (stille No-Op vs. typisierter Fehler) eine API-Entscheidung des Eigent\u00fcmers ist.\n\n**D5 \u2014 `scheduler\/service.py:11,13` \u2014 Das Feld 'owner\u201c wird nicht validiert \u2014 Schweregrad: Niedrig**\n\n`name` wird auf Leere gepr\u00fcft, `owner` jedoch nicht: `create_job(\"ok\", \"   \")` speichert `owner=''`. Beide Parameter rufen zudem `.strip()` ungesch\u00fctzt auf, sodass `None` als `AttributeError: 'NoneType'-Objekt hat kein Attribut 'strip'` ausgegeben wird, anstatt des `ValueError`, den die API ansonsten bei fehlerhafter Eingabe verwendet. Unbeheoben belassen \u2013 der beabsichtigte \u201eowner\u201c-Vertrag ist an keiner Stelle im Fixture angegeben.\n\n**Sicherheit:** keine Befunde. Die Fixture weist keine Schnittstellen f\u00fcr Netzwerk, E\/A, Deserialisierung, Unterprozesse oder Anmeldedaten auf; die Speicherung erfolgt in einem prozessinternen Dict.\n\n**Abdeckungsl\u00fccke:** `scheduler\/time_rules.py` und `scheduler\/repository.py` wiesen vor diesem Durchlauf eine Testabdeckung von null auf; die beiden vorab festgelegten Tests deckten lediglich den Happy Path des Dienstes ab.\n\n### Durchgef\u00fchrte Tests und Korrekturen\n\nDie beiden Fehler mit der h\u00f6chsten Konfidenz waren **D1\/D2** (gleiche Funktion, eine Korrektur) und **D3**.\n\n**Korrektur 1 \u2013 `scheduler\/time_rules.py`:** Der UTC-Roundtrip wurde durch `previous_run + timedelta(days=1)` ersetzt. Python f\u00fchrt bei \u201eaware\u201c-Datums- und Zeitangaben Wall-Clock-Arithmetik durch, und `zoneinfo` ermittelt den UTC-Offset verz\u00f6gert anhand der neuen Wall-Clock-Zeit neu \u2013 somit bleibt 09:00 Uhr weiterhin 09:00 Uhr, w\u00e4hrend sich der Offset korrekt von `-05:00 \u2192 -04:00` verschiebt. Dadurch werden D1 und D2 gemeinsam behoben: Naive Eingaben bleiben nun naiv, und die lokale Zeitzone wird niemals abgeleitet. Der Fall des \u00dcbergangs zwischen \u201eunreichbar\u201c und \u201emehrdeutig\u201c wird so dokumentiert, dass auf die \u201eFold\u201c-Regeln von `tzinfo` zur\u00fcckgegriffen wird.\n\n**Korrektur 2 \u2013 `scheduler\/service.py`:** Der instanzspezifische Z\u00e4hler `_next_identifier` wurde entfernt; Identifikatoren werden nun bei der Erstellung aus dem Repository-Zustand als `max(vorhandene IDs, default=0) + 1` zugewiesen. Dies ist sowohl f\u00fcr gemeinsam genutzte als auch f\u00fcr vorab gef\u00fcllte Repositorys korrekt. Kompromiss: O(n) pro Erstellung statt O(1), akzeptabel f\u00fcr einen auf einem W\u00f6rterbuch basierenden Speicher im Arbeitsspeicher, und Korrektheit gegen\u00fcber einem Z\u00e4hler, der den Speicher, in den er schreibt, nicht sehen kann.\n\n**Tests \u2014 `tests\/test_time_rules.py` (neu, 5 Tests):** Beibehaltung der Wanduhrzeit bei Zeitumstellung (Spring-Forward und Fall-Back), absolute verstrichene Zeit von 23 h\/25 h \u00fcber diese \u00dcberg\u00e4nge hinweg, erneute Aufl\u00f6sung des UTC-Offsets, \u201eNaive-Stays-Naive\u201c sowie eine einfache UTC-Tagesverschiebung. Wird sauber \u00fcbersprungen, wenn keine IANA-Datenbank vorhanden ist.\n\n**Tests \u2014 `tests\/test_scheduler.py` (erweitert, +2 Tests):** Zwei Dienste, die sich ein Repository teilen, m\u00fcssen unterschiedliche IDs vergeben und beide Jobs beibehalten; ein Dienst, der auf ein Repository zugreift, das bereits mit den IDs 1 und 7 vorbelegt ist, muss die ID 8 vergeben und die bestehenden Jobs unver\u00e4ndert lassen.\n\n**Leerheitspr\u00fcfung:** Ich habe beide urspr\u00fcnglichen Implementierungen in einer tempor\u00e4ren Kopie wiederhergestellt und die Testsuite erneut ausgef\u00fchrt \u2013 alle 5 neuen Tests schlugen fehl (`FAILED (failures=5)`), und alle Tests wurden mit dem korrigierten Code erfolgreich bestanden. Die Tests decken die Fehler tats\u00e4chlich auf.\n\nEine Korrektur w\u00e4hrend des Durchlaufs: In meinem ersten Entwurf wurde die verstrichene DST-Zeit als `result - previous` \u00fcberpr\u00fcft, was Python als Realzeit-Arithmetik auswertet, wenn beide Operanden dieselbe `tzinfo`-Einstellung verwenden; daher wurde `24h` gelesen und die Tests schlugen fehl. Die \u00dcberpr\u00fcfungen konvertieren nun vor der Subtraktion auf UTC. Der Fehler lag in meinem Test, nicht in der Korrektur.\n\n### Hinweise f\u00fcr den Verantwortlichen\n\n\u201efixture-manifest.json\u201c wurde unver\u00e4ndert gelassen, daher ist \u201etests\/test_time_rules.py\u201c eine zul\u00e4ssige neue Datei, die nicht in \u201eexpected_files\u201c aufgef\u00fchrt ist \u2013 aktualisiere das Manifest, falls eine Pr\u00fcfung einen exakten Dateisatz vorschreibt. Und D4\/D5 wurden zwar gemeldet, aber bewusst nicht behoben: Beide h\u00e4ngen von einer Entscheidung bez\u00fcglich des API-Vertrags ab (Semantik bei \u201emiss-on-delete\u201c, Validierungsregeln des Eigent\u00fcmers), die nirgendwo in der Fixture spezifiziert ist; sich f\u00fcr eine der beiden zu entscheiden, w\u00e4re daher eher eine Vermutung als eine Korrektur gewesen.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Einschr\u00e4nkung des Testumfelds: Es handelte sich um ein kleines Offline-Python-Repository. Claude nutzte nach Ablauf des CLI-OAuth-Tokens einen Subagent-Fallback, sodass Isolation und Token-Sichtbarkeit nicht identisch waren.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">Keine der beiden Bewertungen macht eine manuelle \u00dcberpr\u00fcfung \u00fcberfl\u00fcssig. Nachdem einer der beiden Agenten eine Reparatur abgeschlossen hat, \u00fcberpr\u00fcfen Sie die ge\u00e4nderten Schnittstellen, unerwartete Dateibereiche, fehlende Negativtests, Berechtigungen oder den Befehlsverlauf sowie den Rollback-Pfad. Eine \u00fcberzeugende Erkl\u00e4rung ist kein Ersatz f\u00fcr einen reproduzierbaren Test.<\/p>\n\n\n\n<h2 id=\"safety\" class=\"wp-block-heading\">Berechtigungen, Sandboxing und Betriebssicherheit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Programmieragent kann vertraulichen Code lesen, Shell-Befehle ausf\u00fchren, zahlreiche Dateien \u00e4ndern und externe Tools aufrufen. Daher ist die Gestaltung der Berechtigungen ein wesentlicher Bestandteil der Produktqualit\u00e4t. Die entscheidenden Fragen lauten: Welche Vorg\u00e4nge erfordern eine Genehmigung? Auf welche Daten hat der Agent standardm\u00e4\u00dfig Zugriff? Wie deutlich werden riskante Aktionen im Voraus angezeigt? Und kann ein Entwickler die daraus resultierenden \u00c4nderungen \u00fcberpr\u00fcfen?.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Man sollte nicht automatisch davon ausgehen, dass weniger Genehmigungsaufforderungen besser sind. Ein reibungsloser Ablauf ist in einer isolierten Testumgebung ohne Anmeldedaten oder Produktionsverbindungen sinnvoll. Das gleiche Verhalten kann jedoch in einem Repository gef\u00e4hrlich sein, das mit Bereitstellungsskripten, echten Kundendaten oder weitreichenden Cloud-Berechtigungen verbunden ist. Umgekehrt k\u00f6nnen \u00fcberm\u00e4\u00dfige Genehmigungsaufforderungen eine sichere Automatisierung unpraktikabel machen und Benutzer dazu verleiten, Anfragen zu genehmigen, ohne sie zu lesen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei unserem Test kamen frische lokale Kopien zum Einsatz \u2013 keine Produktionssysteme, keine Bereitstellung und kein menschliches Eingreifen w\u00e4hrend der Ausf\u00fchrung. Daher wird die Erledigung der Aufgaben unter sicheren Bedingungen bewertet und nicht die relative Sicherheit der beiden Produkte. Bevor Sie eines der beiden Tools f\u00fcr wichtige Aufgaben einsetzen, beginnen Sie mit einem schreibgesch\u00fctzten Zugriff, legen Sie zul\u00e4ssige Verzeichnisse und Befehle fest, \u00fcberpr\u00fcfen Sie die Unterschiede und f\u00fchren Sie objektive \u00dcberpr\u00fcfungen in einer wiederherstellbaren Umgebung durch.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beginnen Sie mit einer schreibgesch\u00fctzten Architektur oder einem Risikopass.<\/li>\n\n\n\n<li>Genehmigen Sie nur Befehle, deren Geltungsbereich und Auswirkungen Sie verstehen.<\/li>\n\n\n\n<li>Bewahren Sie Anmeldedaten, Produktionsdaten und Zugriffsrechte f\u00fcr die Bereitstellung au\u00dferhalb der Testumgebung auf.<\/li>\n\n\n\n<li>Verlangen Sie einen Diff, Tests und einen klaren Rollback-Pfad, bevor Sie das Ergebnis akzeptieren.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"customization\" class=\"wp-block-heading\">MCP, F\u00e4higkeiten, Projektanweisungen und Anpassung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Beide \u00d6kosysteme lassen sich erweitern, doch sollten die Begriffe \u201eErweiterung\u201c und \u201eErweiterungsbedingungen\u201c nicht als Synonyme betrachtet werden. Projektanweisungen geben einem Agenten vor, wie er sich in einem Repository verhalten soll. Wiederverwendbare Skills b\u00fcndeln einen wiederholbaren Arbeitsablauf oder Fachwissen. MCP verbindet einen Host mit externen Tools oder Daten. Hooks und Befehle k\u00f6nnen bestimmte Schritte in einem Entwicklungszyklus automatisieren. Ein Produkt kann in einer Ebene stark sein, ohne eine andere Funktion eins zu eins abzudecken.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die entscheidende Frage beim Kauf ist nicht, ob es ein Integrationslogo gibt. Es geht vielmehr darum, ob die Verbindung auf dem von Ihnen tats\u00e4chlich genutzten Host eingerichtet, authentifiziert, genehmigt und genutzt werden kann. Au\u00dferdem muss ein verst\u00e4ndlicher Fehlermodus vorhanden sein. Ein MCP-Server, der interaktiv funktioniert, in einer unbeaufsichtigten Sitzung jedoch auf eine Genehmigung wartet, ist zwar immer noch n\u00fctzlich, sollte aber nicht als reibungslose Automatisierung bezeichnet werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei wiederverwendbaren Anweisungen gilt ein \u00e4hnlicher Vorbehalt. Lange Anweisungsdateien garantieren keine Einhaltung der Vorschriften, und ein \u00fcberm\u00e4\u00dfig kompliziertes Regelwerk kann den Kontext \u00fcberlagern oder Widerspr\u00fcche hervorrufen. Halten Sie die Repository-Richtlinien kurz, \u00fcberpr\u00fcfbar und nah am Code. Geben Sie erforderliche \u00dcberpr\u00fcfungsbefehle, gesch\u00fctzte Bereiche, Stilregeln und die F\u00e4lle an, in denen der Agent anhalten und nachfragen muss.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Projektanleitung:<\/strong> Repository-spezifische Regeln und \u00dcberpr\u00fcfungsbefehle.<\/li>\n\n\n\n<li><strong>F\u00e4higkeiten:<\/strong> wiederverwendbare Prozeduren oder Fachwissen-Pakete.<\/li>\n\n\n\n<li><strong>MCP:<\/strong> Anbindungen an externe Tools und Daten.<\/li>\n\n\n\n<li><strong>Hooks und Befehle:<\/strong> Automatisierung rund um definierte Workflow-Ereignisse.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"pricing\" class=\"wp-block-heading\">Codex vs. Claude \u2013 Preisgestaltung und Nutzungsbeschr\u00e4nkungen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der \u201eClean Consumer\u201c-Vergleich beginnt bei $20 pro Monat. Der Codex-Zugang ist im entsprechenden $20-ChatGPT-Tarif enthalten, w\u00e4hrend Claude Pro in den Vereinigten Staaten $20 pro Monat kostet und Claude Code umfasst. Beide bieten Tarife f\u00fcr h\u00f6here Nutzungsvolumina zu $100 und $200 an. \u00c4hnliche Listenpreise bedeuten nicht, dass die Kapazit\u00e4ten identisch sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude \u201cMax 5x\u201d kostet $100 pro Monat und \u201cMax 20x\u201d kostet $200 pro Monat. Die Bezeichnungen \u201e5x\u201c und \u201e20x\u201c beschreiben die Nutzung pro Sitzung im Vergleich zur Pro-Version und stellen keine garantierte Anzahl von Programmieraufgaben dar. Claude und Claude Code teilen sich Sitzungs- und Wochenlimits. Die L\u00e4nge des Kontexts, angeh\u00e4ngte Dateien, die Modellauswahl und die Nutzung von Funktionen k\u00f6nnen beeinflussen, wie schnell das Kontingent aufgebraucht wird.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan.webp\" alt=\"Seite zum Claude Max-Tarif mit einer Beschreibung der Nutzungskapazit\u00e4ten von Max 5x und Max 20x\" class=\"wp-image-17388\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Auf der offiziellen Seite zum \u201eMax\u201c-Tarif von Claude werden die Optionen mit 5-facher und 20-facher Nutzungskapazit\u00e4t beschrieben. Die monatlichen Preise sind im selben offiziellen Artikel angegeben; die Tarifdetails wurden im Juli 2026 \u00fcberpr\u00fcft.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die optionalen Nutzungskredite von Claude erm\u00f6glichen bei Aktivierung die Fortsetzung berechtigter Vorg\u00e4nge \u00fcber das im Paket enthaltene Kontingent hinaus; diese Kredite werden separat zu den \u00fcblichen API-Tarifen abgerechnet. Die Authentifizierung per API-Schl\u00fcssel stellt einen weiteren, separat abgerechneten Weg dar. W\u00fcrde man einen dieser Wege als \u201cunbegrenzt\u201d bezeichnen, w\u00fcrde dies die tats\u00e4chlichen Grenzkosten verschleiern.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits.webp\" alt=\"Dokumentation zum Tarifplan \u201eClaude\u201c mit Erl\u00e4uterungen zu gemeinsamen Sitzungen und w\u00f6chentlichen Nutzungslimits\" class=\"wp-image-17389\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Der Code \u201eClaude\u201c nutzt das Kontingent des verbundenen Pro- oder Max-Abonnements, einschlie\u00dflich der Begrenzungen f\u00fcr gemeinsam genutzte Sitzungen und der w\u00f6chentlichen Obergrenzen. Die genaue Kapazit\u00e4t h\u00e4ngt von der jeweiligen Arbeitslast ab.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Codex unterscheidet ebenfalls zwischen der Nutzung im Rahmen des enthaltenen Verbraucher-Tarifs, berechtigten gekauften Guthaben und der API-Abrechnung. F\u00fcr lokale Nachrichten und Cloud-Chats gilt ein Zeitfenster von f\u00fcnf Stunden, und es k\u00f6nnen zudem w\u00f6chentliche Limits gelten. Ein Token-Feld in einem CLI-Protokoll l\u00e4sst sich nicht direkt in einen Prozentsatz f\u00fcr f\u00fcnf Stunden, einen Abonnement-Guthabenbetrag oder eine API-Rechnung umrechnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr gelegentliches Programmieren im Alleingang ist die Stufe $20 auf beiden Seiten der sinnvolle Ausgangspunkt. Die t\u00e4gliche Arbeit mit Repositorien in langen Kontexten kann eine Stufe mit h\u00f6herer Auslastung rechtfertigen, jedoch erst nach Beobachtung der tats\u00e4chlichen R\u00fccksetzungen und des Aufgabenverbrauchs. Intensive parallele Arbeit erfordert noch mehr Sorgfalt: Die Bezahlung einer gr\u00f6\u00dferen Stufe beseitigt nicht die Notwendigkeit, den Kontext zu kontrollieren, Aufgaben aufzuteilen und aufwendige Schlussfolgerungen f\u00fcr Aufgaben zu reservieren, die ein hohes Ma\u00df an Urteilsverm\u00f6gen erfordern.<\/p>\n\n\n\n<h2 id=\"controlled-test\" class=\"wp-block-heading\">Ergebnisse unseres kontrollierten Vergleichstests zwischen Codex und Claude Code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wir haben vier englische Aufgabenstellungen, eine \u00f6ffentliche Python-Fixture, objektive Pr\u00fcfungen, eine Bewertungsrubrik und die \u201eFirst-Valid-Result\u201c-Regel festgelegten, bevor einer der Agenten gestartet wurde. Die Aufgaben umfassten das Verstehen unbekannter Repositorys, eine Funktion mit mehreren Dateien, die Behebung eines DST-Fehlers und eine Code-Review mit Korrekturen. G\u00fcltige Ergebnisse wurden ohne menschliches Eingreifen akzeptiert, und schwache, aber g\u00fcltige Ausgaben konnten nicht erneut ausgef\u00fchrt werden, um eine bessere Punktzahl zu erzielen.<\/p>\n\n\n\n<style>.comparison-setup-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.comparison-setup-card *{box-sizing:border-box}.comparison-setup-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.comparison-setup-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.comparison-setup-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.comparison-setup-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.comparison-setup-card .s-body{padding:24px 26px}.comparison-setup-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.comparison-setup-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.comparison-setup-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.comparison-setup-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.comparison-setup-card table{width:100%;border-collapse:collapse;font-size:12px}.comparison-setup-card th,.comparison-setup-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.comparison-setup-card th{background:var(--soft)}.comparison-setup-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.comparison-setup-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.comparison-setup-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.comparison-setup-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.comparison-setup-card .s-grid{grid-template-columns:1fr}.comparison-setup-card .s-head,.comparison-setup-card .s-body{padding:20px}}<\/style><aside class=\"comparison-setup-card\"><header class=\"s-head\"><p class=\"s-kicker\">Wie der Test durchgef\u00fchrt wurde<\/p><h3>Gleiche Aufgaben, festgelegte Regeln, erste g\u00fcltige Ergebnisse<\/h3><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>Codex<\/span><strong>gpt-5.6-sol<\/strong><small>Mittel T1\u2013T3 \u00b7 Hoch T4<\/small><\/div><div class=\"s-stat\"><span>Claude-Code<\/span><strong>claude-opus-5<\/strong><small>Fallback f\u00fcr Unteragenten offengelegt<\/small><\/div><\/div><table><tbody><tr><th>Spielplan<\/th><td>Kleines \u00f6ffentliches Python-Repository, das ausschlie\u00dflich Standardbibliotheken enth\u00e4lt<\/td><\/tr><tr><th>Regel anwenden<\/th><td>Das erste g\u00fcltige Ergebnis wird beibehalten; Wiederholungen zur Qualit\u00e4tssicherung sind untersagt<\/td><\/tr><tr><th>Sicherheit<\/th><td>Aktuelle Kopien, Offline-Aufgaben, kein Zugriff auf die Produktionsumgebung, kein Push und keine Bereitstellung<\/td><\/tr><tr><th>Punktestand<\/th><td>Vorgefertigte 100-Punkte-Bewertungsrubrik sowie unabh\u00e4ngige \u00f6ffentliche\/verdeckte \u00dcberpr\u00fcfungen<\/td><\/tr><\/tbody><\/table><\/div><\/aside>\n\n\n\n<p class=\"wp-block-paragraph\">Codex f\u00fchrte isolierte CLI-Prozesse mit Roh-JSONL durch, wobei die von der CLI ausgegebenen Token-Felder beibehalten wurden. Die OAuth-Sitzung des Kollegen f\u00fcr die Claude-CLI war abgelaufen, daher verwendete Claude Code einen Koordinator mit neuen Subagent-Kontexten. Wir haben die Patches von Claude in sauberen Audit-Kopien rekonstruiert und die \u00f6ffentlichen sowie die versteckten Pr\u00fcfungen erneut durchgef\u00fchrt. Dies lieferte glaubw\u00fcrdige praktische Beweise, jedoch keine identischen Isolations- oder Modellsteuerungsfl\u00e4chen.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Aufgabe<\/th><th>Codex<\/th><th>Claude-Code<\/th><th>Begrenzte Interpretation<\/th><\/tr><\/thead><tbody><tr><td>T1: Verst\u00e4ndnis des Repositorys<\/td><td>20\/20<\/td><td>20\/20<\/td><td>Unentschieden: kompakt versus ersch\u00f6pfend<\/td><\/tr><tr><td>T2: Funktion f\u00fcr mehrere Dateien<\/td><td>30\/30<\/td><td>30\/30<\/td><td>Funktionale Anbindung; unterschiedlicher Validierungs- und Testumfang<\/td><\/tr><tr><td>T3: Reparatur des DST<\/td><td>30\/30<\/td><td>30\/30<\/td><td>Beide wurden bestanden; schmalerer Patch im Vergleich zu breiterer Randabdeckung<\/td><\/tr><tr><td>T4: \u00dcberpr\u00fcfung und Reparatur<\/td><td>18\/20<\/td><td>19\/20<\/td><td>Der Code \u201eClaude\u201c wies eine gr\u00f6\u00dfere \u00dcberpr\u00fcfungsbreite auf<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<style>.aggregate-verdict-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.aggregate-verdict-card *{box-sizing:border-box}.aggregate-verdict-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.aggregate-verdict-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.aggregate-verdict-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.aggregate-verdict-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.aggregate-verdict-card .s-body{padding:24px 26px}.aggregate-verdict-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.aggregate-verdict-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.aggregate-verdict-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.aggregate-verdict-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.aggregate-verdict-card table{width:100%;border-collapse:collapse;font-size:12px}.aggregate-verdict-card th,.aggregate-verdict-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.aggregate-verdict-card th{background:var(--soft)}.aggregate-verdict-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.aggregate-verdict-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.aggregate-verdict-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.aggregate-verdict-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.aggregate-verdict-card .s-grid{grid-template-columns:1fr}.aggregate-verdict-card .s-head,.aggregate-verdict-card .s-body{padding:20px}}<\/style><article class=\"aggregate-verdict-card\"><header class=\"s-head\"><p class=\"s-kicker\">Kontrollierter Test \u00b7 Rubrik \u201eGefroren\u201c<\/p><h3>Codex 98\/100 vs. Claude Code 99\/100<\/h3><p class=\"s-sub\">Der Abstand von einem Punkt ist kein allgemeing\u00fcltiges Signal f\u00fcr einen Sieg. Die relevanten Unterschiede sind aufgabenspezifisch.<\/p><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>Codex<\/span><strong>98\/100<\/strong><\/div><div class=\"s-stat\"><span>Claude-Code<\/span><strong>99\/100<\/strong><\/div><\/div><table><thead><tr><th>Entscheidungsbereich<\/th><th>Beobachtetes Ergebnis<\/th><th>Praktische Lekt\u00fcre<\/th><\/tr><\/thead><tbody><tr><td>Verst\u00e4ndnis des Repositorys<\/td><td>Unentschieden \u00b7 jeweils 20:20<\/td><td>Claude war ausf\u00fchrlicher; Codex war kompakter.<\/td><\/tr><tr><td>Funktion f\u00fcr mehrere Dateien<\/td><td>Unentschieden \u00b7 jeweils 30:30<\/td><td>Beide haben die verdeckten Pr\u00fcfungen bestanden; Claude hat umfassendere Tests hinzugef\u00fcgt.<\/td><\/tr><tr><td>Behebung eines Fehlers im Zusammenhang mit der Sommerzeit<\/td><td>Unentschieden \u00b7 jeweils 30:30<\/td><td>Claude deckte mehr Kanten ab; Codex verwendete den schmaleren Patch.<\/td><\/tr><tr><td>\u00dcberpr\u00fcfung und Reparatur<\/td><td>Claude 19\/20; Codex 18\/20<\/td><td>Bei Claude wurden mehr reproduzierbare Fehler festgestellt.<\/td><\/tr><tr><td>Gemessene Geschwindigkeit<\/td><td>Gemischt<\/td><td>Claude f\u00fchrte T1\/T2 an; Codex f\u00fchrte T3\/T4 an.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\"><strong>Offenlegung:<\/strong> Gleiche Befehle und gleiche Konfiguration, jedoch unterschiedliche Isolationspfade. Verallgemeinern Sie diesen kleinen Test nicht auf jedes Repository, jede Modellschicht oder jede autonome Sitzung.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">Der Test ist zu klein, um Aussagen \u00fcber die Leistung bei gro\u00dfen Repositorien, allen Sprachen, allen Modellstufen oder langen autonomen Sitzungen zu treffen. Die Gesamtdifferenz von einem Punkt sollte am besten so interpretiert werden, dass \u201cbeide erfolgreich waren, allerdings mit einem Unterschied hinsichtlich der \u00dcberpr\u00fcfungsreichweite\u201d, und nicht als allgemeing\u00fcltige Rangliste.<\/p>\n\n\n\n<h2 id=\"user-experience\" class=\"wp-block-heading\">Was echte Nutzer berichten \u2013 und inwieweit man darauf vertrauen kann<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Feedback aus der Community ist dann wertvoll, wenn es ein Projekt, eine Aufgabe, ein Modell, den Umfang des Aufwands und den Zeithorizont umfasst. Es ist hingegen wenig aussagekr\u00e4ftig, wenn in einem Beitrag lediglich berichtet wird, dass ein Produkt \u201cintelligenter wirkt\u201d oder \u201cviel schneller ist\u201d. Verschiedene Nutzer vergleichen unterschiedliche Repositorys, Abonnementstufen, Prompts, Erweiterungen und den Grad der \u00dcberwachung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das oben angef\u00fchrte Beispiel aus dem Reddit-Kontext deutet auf einen Kompromiss bei der Interaktion hin: Ein schneller, dialogorientierter Ansatz kann mehr Aufmerksamkeit erfordern, w\u00e4hrend eine bed\u00e4chtige Ausf\u00fchrung zwar langsamer wirken mag, daf\u00fcr aber weniger Korrekturen erfordert. Unser kontrollierter Test \u00fcberschneidet sich nur teilweise mit diesem Bericht. Er ergab bei g\u00fcltigen Durchl\u00e4ufen gemischte Geschwindigkeiten und keine menschlichen Eingriffe, sodass die Behauptung bez\u00fcglich der \u201eBetreuung\u201c nicht best\u00e4tigt werden kann. Genau aus diesem Grund sollten Community-Befunde und kontrollierte Befunde gemeinsam dargestellt werden, ohne sie miteinander zu vermischen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Kommentar zum X-Harness bringt einen zweiten wichtigen Punkt auf den Punkt: Ein Ergebnis der Codierung bezieht sich auf das gesamte System und nicht nur auf die Modellbezeichnung. Keiner der beiden Beitr\u00e4ge sollte als Umfragedaten betrachtet werden. Nutzen Sie sie, um Fragen f\u00fcr Ihre eigene Studie zu identifizieren \u2013 Anzahl der Interventionen, Gr\u00f6\u00dfenordnung der Abweichung, Testqualit\u00e4t und Erholung von einer falschen Annahme.<\/p>\n\n\n\n<h2 id=\"globalgpt\" class=\"wp-block-heading\">Erweiterung von Codex und Claude-Code um GlobalGPT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT ist ein <a href=\"https:\/\/www.glbgpt.com\/hub\/best-all-in-one-ai-tools-and-platforms-11-options-compared\/\">multimodeller, multimodaler Arbeitsbereich<\/a>, kein Ersatz f\u00fcr native Repository-Agenten. Seine praktische Aufgabe besteht darin, einen bestehenden Host zu erweitern: ein anderes verf\u00fcgbares Agentenmodell f\u00fcr eine Zweitmeinung, eine Planpr\u00fcfung, einen Dokumentationsdurchlauf oder spezielle Ausgabedaten zu nutzen, w\u00e4hrend Codex oder Claude Code weiterhin f\u00fcr den Repository-Zugriff, Shell-Befehle, Tests und Freigaben zust\u00e4ndig bleibt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT ver\u00f6ffentlicht eigene CLI-Anleitungen f\u00fcr <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-codex\/\">Codex<\/a> und <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-claude-code\/\">Claude-Code<\/a>, sowie Cursor. In unserem sicheren T5-Integrationstest f\u00fchrte die CLI dieselbe \u201efrozen\u201c-Aufgabe in beiden verglichenen Umgebungen aus. In Codex haben wir au\u00dferdem einen schreibgesch\u00fctzten Aufruf der MCP-Modellliste \u00fcberpr\u00fcft und den GlobalGPT-Skill installiert, geladen und verwendet.<\/p>\n\n\n\n<style>.globalgpt-integration-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.globalgpt-integration-card *{box-sizing:border-box}.globalgpt-integration-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.globalgpt-integration-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.globalgpt-integration-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.globalgpt-integration-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.globalgpt-integration-card .s-body{padding:24px 26px}.globalgpt-integration-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.globalgpt-integration-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.globalgpt-integration-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.globalgpt-integration-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.globalgpt-integration-card table{width:100%;border-collapse:collapse;font-size:12px}.globalgpt-integration-card th,.globalgpt-integration-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.globalgpt-integration-card th{background:var(--soft)}.globalgpt-integration-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.globalgpt-integration-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.globalgpt-integration-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.globalgpt-integration-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.globalgpt-integration-card .s-grid{grid-template-columns:1fr}.globalgpt-integration-card .s-head,.globalgpt-integration-card .s-body{padding:20px}}<\/style><article class=\"globalgpt-integration-card\"><header class=\"s-head\"><p class=\"s-kicker\">GlobalGPT-Integration \u00b7 Wird bei der Berechnung der Punktzahl nicht ber\u00fccksichtigt<\/p><h3>CLI wurde in beiden Workflows verifiziert; MCP und Skill wurden in Codex verifiziert<\/h3><p class=\"s-sub\">Damit werden Integrationswege gemessen, nicht aber, ob GlobalGPT einen der beiden nativen Kodierungsagenten ersetzt.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>Pfad<\/th><th>Codex-Umgebung<\/th><th>Claude-Kollegenlauf<\/th><\/tr><\/thead><tbody><tr><td>GlobalGPT-Befehlszeilenschnittstelle<\/td><td>\u00dcberpr\u00fcft mit gpt-5.6-sol und gpt-5.6-luna<\/td><td>Mit denselben eingefrorenen Aufgaben \u00fcberpr\u00fcft<\/td><\/tr><tr><td>MCP<\/td><td>Interaktive, schreibgesch\u00fctzte Modellliste \u00fcberpr\u00fcft<\/td><td>W\u00e4hrend des Betriebs nicht verbunden<\/td><\/tr><tr><td>F\u00e4higkeit<\/td><td>Installiert, geladen und getestet<\/td><td>Installiert, wird jedoch nicht f\u00fcr \u201eFrozen Calls\u201c verwendet<\/td><\/tr><tr><td>Unbeaufsichtigtes MCP<\/td><td>Einhaltung der Zulassungsbeschr\u00e4nkung<\/td><td>Nicht getestet<\/td><\/tr><\/tbody><\/table><details><summary>Vollst\u00e4ndige Nachweise zur Integration anzeigen<\/summary><pre># GlobalGPT Zusammenfassung des Integrationstests\n\n## Umfang\n\nT5 misst die GlobalGPT-Integration und wird bei der Berechnung der nativen Codex-Codierungsbewertung nicht ber\u00fccksichtigt. Yukie wurde nicht verwendet.\n\n## Modellsperre und Bereitschaft\n\n- Modell A: `gpt-5.6-sol`\n- Modell B: `gpt-5.6-luna`\n- Beide Modelle erschienen in der Liste der Live-Modelle.\n- Beide Lightweight-Bereitschaftspr\u00fcfungen lieferten g\u00fcltigen, analysierbaren Text.\n- Die Modelle wurden vor den formalen T5A- und T5B-Ausgaberufen gesperrt.\n\n## Formale CLI-Ergebnisse\n\n| Aufgabe | Modell | Status | Dauer | Prompt-Token | Fertigstellungs-Token | Erforderliche \u00dcberschriften |\n|---|---|---|---:|---:|---:|---:|\n| T5A | gpt-5.6-sol | G\u00fcltig | 27 s | 2.116 | 1.207 | 6\/6 |\n| T5B | gpt-5.6-luna | G\u00fcltig | 14 s | 2.116 | 1.441 | 6\/6 |\n\nBeide formalen Aufrufe verwendeten \u00fcber `glbgpt exec` dieselbe eingefrorene englische Produktplanungsaufgabe, lieferten ausschlie\u00dflich auf Englisch sichtbare Ausgaben und legten keine Anmeldedaten offen. Es erfolgte keine Qualit\u00e4tswiederholung.\n\n## MCP-Ergebnis\n\n- `codex mcp list` zeigte an, dass `globalgpt` aktiviert war.\n- Eine nicht-interaktive Codex-Sitzung erkannte `mcp__globalgpt__glbgpt_list_models` und versuchte, diesen Aufruf auszuf\u00fchren, doch der Aufruf wurde abgebrochen, da keine unbeaufsichtigte MCP-Genehmigung verf\u00fcgbar war. Es wurden keine Sicherheitseinstellungen gelockert.\n- Die aktive interaktive Codex-Sitzung rief erfolgreich dasselbe schreibgesch\u00fctzte GlobalGPT-MCP-Tool auf und erhielt neun Chat-Modelle.\n- Ergebnis: Interaktiver MCP-Zugriff verifiziert; die unbeaufsichtigte, nicht-interaktive MCP-Ausf\u00fchrung unterliegt weiterhin einer Genehmigungsbeschr\u00e4nkung.\n\n##-Skill-Ergebnis\n\n- Die GlobalGPT- und GlobalGPT-Coding-Skills wurden \u00fcber Verkn\u00fcpfungen zum mitgelieferten CLI-Skill-Paket im Codex-Skill-Verzeichnis installiert.\n- Die GlobalGPT-Skill wurde geladen und hinsichtlich der \u00dcberpr\u00fcfung der konfigurierten Sitzung, der Auswahl von Live-Modellen, der Betriebsbereitschaft, der kreditsicheren Optionen und der Fehlerbehandlung getestet.\n- Ergebnis: Im aktiven Codex-Workflow installiert und getestet.\n\n## Eingeschr\u00e4nkte Schlussfolgerung\n\nDieser Durchlauf verifiziert funktionierende GlobalGPT-CLI-Aufrufe, einen interaktiven GlobalGPT-MCP-Aufruf (nur Lesezugriff) aus Codex sowie einen installierten und verwendeten GlobalGPT-Skill-Pfad. Er beweist nicht, dass jedes Modell, jedes Medientool, jeder Host, jedes Konto oder jede unbeaufsichtigte MCP-Konfiguration funktioniert. Er testet weder Yukie noch st\u00fctzt er die Behauptung, dass GlobalGPT Codex oder Claude Code ersetzt.\n<\/pre><\/details><p class=\"s-note\">\u00dcberpr\u00fcfter Umfang: bestimmte CLI-Aufrufe, ein interaktiver MCP-Lesevorgang und ein installierter\/genutzter Skill-Pfad. Dies gilt nicht f\u00fcr alle Modelle, Medien-Tools, Hosts oder unbeaufsichtigten Konfigurationen.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">Die Abgrenzung ist entscheidend. Der Claude-Lauf des Kollegen hat den CLI-Pfad \u00fcberpr\u00fcft, nicht den MCP auf der Claude-Seite. Das Skill war dort installiert, wurde aber f\u00fcr die eingefrorenen Anrufe nicht verwendet. Ein unbeaufsichtigter Codex-MCP-Versuch erforderte weiterhin eine manuelle Genehmigung. Die Verf\u00fcgbarkeit von Modellen und Guthaben h\u00e4ngt zudem vom aktuellen GlobalGPT-Tarif ab, daher sollten Entwickler die Live-Liste \u00fcberpr\u00fcfen, anstatt davon auszugehen, dass jedes Modell enthalten ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT deckt au\u00dferdem Bild-, Video-, Audio- und gef\u00fchrte Agent-Workflows ab. Yukies Eintr\u00e4ge zu Folien, Dokumenten und Bildern bilden eine eigene Kategorie: Sie bieten konkrete Vorlagen und eine Schritt-f\u00fcr-Schritt-Anleitung im Browser f\u00fcr Aufgaben, die keine Programmierung erfordern. Das kann einfacher sein, als eine Programmier-CLI zu \u00f6ffnen, um eine Pr\u00e4sentation oder ein strukturiertes Dokument zu erstellen, ersetzt jedoch nicht das Lesen des Repositorys, die Durchf\u00fchrung von Tests oder die Code\u00fcberpr\u00fcfung.<\/p>\n\n\n\n<style>.yukie-workflow-summary-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.yukie-workflow-summary-card *{box-sizing:border-box}.yukie-workflow-summary-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.yukie-workflow-summary-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.yukie-workflow-summary-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.yukie-workflow-summary-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.yukie-workflow-summary-card .s-body{padding:24px 26px}.yukie-workflow-summary-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.yukie-workflow-summary-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.yukie-workflow-summary-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.yukie-workflow-summary-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.yukie-workflow-summary-card table{width:100%;border-collapse:collapse;font-size:12px}.yukie-workflow-summary-card th,.yukie-workflow-summary-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.yukie-workflow-summary-card th{background:var(--soft)}.yukie-workflow-summary-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.yukie-workflow-summary-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.yukie-workflow-summary-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.yukie-workflow-summary-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.yukie-workflow-summary-card .s-grid{grid-template-columns:1fr}.yukie-workflow-summary-card .s-head,.yukie-workflow-summary-card .s-body{padding:20px}}<\/style><article class=\"yukie-workflow-summary-card\"><header class=\"s-head\"><p class=\"s-kicker\">Andere Workflow-Kategorie<\/p><h3>Yukie leitete die Browser-Agent-Tests<\/h3><p class=\"s-sub\">N\u00fctzlich f\u00fcr aufgabenspezifische Web-Workflows; wurde nicht als Ersatz f\u00fcr einen Repository-Coding-Agent getestet.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>Arbeitsablauf<\/th><th>Kriterien erf\u00fcllt<\/th><th>Erstes g\u00fcltiges Ergebnis<\/th><\/tr><\/thead><tbody><tr><td>Folien<\/td><td>5\/6<\/td><td>Eine Pr\u00e4sentation mit f\u00fcnf Folien wurde erstellt; die Referentenanmerkungen konnten nicht \u00fcberpr\u00fcft werden.<\/td><\/tr><tr><td>Dokument<\/td><td>6\/6<\/td><td>Strukturierter Forschungsbericht mit Exportfunktion und Versionsverlauf.<\/td><\/tr><tr><td>Bild + Bildunterschrift<\/td><td>5\/6<\/td><td>Ausgepr\u00e4gtes quadratisches Bild; die erforderliche Bildunterschrift fehlte.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\">Fundierte Schlussfolgerung: klare Einstiegspunkte und strukturierte multimodale Arbeitsabl\u00e4ufe. Unbegr\u00fcndete Schlussfolgerungen: uneingeschr\u00e4nkte Nutzung, genauer Preis oder vollst\u00e4ndiger Ersatz des Codex\/Claude-Codes.<\/p><\/div><\/article>\n\n\n\n<h2 id=\"which-one\" class=\"wp-block-heading\">Welches Programmierwerkzeug sollte ein unabh\u00e4ngiger Entwickler w\u00e4hlen?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>W\u00e4hlen Sie \u201eCodex\u201c<\/strong> wenn die kompakte, begrenzte Ausf\u00fchrung, die Kombination der verf\u00fcgbaren Oberfl\u00e4chen oder die in Ihrer Konfiguration verf\u00fcgbaren Ausf\u00fchrungsdaten zu Ihrer Arbeitsweise passen.<\/li>\n\n\n\n<li><strong>W\u00e4hlen Sie den Code Claude<\/strong> wenn eine Dialog-Terminal-Schleife, die von Ihnen \u00fcberpr\u00fcften Anpassungsfunktionen oder ein umfassenderes \u00dcberpr\u00fcfungsverhalten, wie es in unserem Testfall zu beobachten ist, eine gr\u00f6\u00dfere Rolle spielen.<\/li>\n\n\n\n<li><strong>Verwenden Sie eine der beiden Optionen f\u00fcr ein unbekanntes Repository<\/strong> erst nach einer \u00dcberpr\u00fcfung der schreibgesch\u00fctzten Architektur und einer Risikobewertung. Beide Tools haben diese Aufgabe gut gemeistert.<\/li>\n\n\n\n<li><strong>Verwende beide gezielt<\/strong> wann sich die \u00dcberpr\u00fcfung durch einen zweiten Bearbeiter trotz der zus\u00e4tzlichen Abonnement- und Koordinationskosten lohnt. Bitten Sie das zweite Tool, einen Diff oder Plan zu hinterfragen, anstatt die Aufgabe blind zu wiederholen.<\/li>\n\n\n\n<li><strong>GlobalGPT hinzuf\u00fcgen<\/strong> wenn die Routing-Funktionalit\u00e4t f\u00fcr mehrere Modelle oder multimodale Aufgaben die fehlende Ebene darstellt. Behalten Sie native Repository-Operationen im Programmierhost bei.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Eine siebent\u00e4gige Testphase ist aussagekr\u00e4ftiger als eine Rangliste. W\u00e4hlen Sie eine reale, aber nicht produktive Funktion oder einen Fehler aus und \u00fcberpr\u00fcfen Sie diese. Sperren Sie die Eingabeaufforderung und den Befehl \u201esuccess\u201c. Zeichnen Sie den ersten g\u00fcltigen Diff, die bestandenen Tests, die verstrichene Zeit, menschliche Eingriffe, unerwarteten Umfang und die Auswirkungen der Arbeit auf Ihre verf\u00fcgbare Nutzung auf. Das bessere Produkt ist dasjenige, dessen Fehler Sie erkennen und dessen Arbeitsablauf Sie aufrechterhalten k\u00f6nnen.<\/p>\n\n\n\n<h2 id=\"faq\" class=\"wp-block-heading\">FAQ zu Codex vs. Claude-Code<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Ist Codex besser als der Claude-Code?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht in allen F\u00e4llen. Beide haben die vier Aufgaben in unserem Testablauf erf\u00fcllt. Claude Code war hinsichtlich des Umfangs der \u00dcberpr\u00fcfung f\u00fchrend, w\u00e4hrend Codex bei Teilen der Implementierung und der Fehlerbehebung kompakter war.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was eignet sich besser f\u00fcr gro\u00dfe Repositorys?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Unser kleines Tool kann diese Frage nicht beantworten. Testen Sie beide Varianten zun\u00e4chst in einer schreibgesch\u00fctzten Architekturumgebung aus Ihrem eigenen Repository, bevor Sie \u00c4nderungen zulassen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Welches Codierungsmittel erfordert weniger \u00dcberwachung?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Das h\u00e4ngt von der Klarheit der Aufgabe, den Modelleinstellungen, den Anweisungen im Repository und dem gew\u00fcnschten Interaktionsstil ab. Ein Reddit-Nutzer berichtete von unterschiedlichen \u00dcberwachungsmustern, doch diese individuelle Erfahrung stellt keine produktweite Regel dar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was ist g\u00fcnstiger?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die wichtigsten Verbrauchstufen liegen bei $20, $100 und $200 pro Monat, unterscheiden sich jedoch hinsichtlich der enthaltenen Kapazit\u00e4t und der Limitmechanismen. Optionale Gutschriften und die API-Abrechnung werden separat behandelt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gibt es bei den Tarifen Claude und Claude Nutzungsbeschr\u00e4nkungen f\u00fcr Code-Sharing?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. Bei den Tarifen \u201eClaude\u201c und \u201eClaude Code\u201c gelten bei den verbundenen Pro- oder Max-Tarifen gemeinsame Sitzungs- und Wochenlimits.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gelten f\u00fcr lokale und Cloud-Aufgaben in Codex dieselben Beschr\u00e4nkungen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr lokale Nachrichten und Cloud-Chats gilt ein Zeitfenster von f\u00fcnf Stunden; au\u00dferdem k\u00f6nnen w\u00f6chentliche Obergrenzen gelten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kann GlobalGPT den Codex oder den Claude-Code ersetzen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nein. Es kann zwar beide Workflows um zus\u00e4tzliche Modelle, CLI, MCP, Skills und multimodale Tools erweitern, doch der Zugriff auf das Repository und das Verhalten der Programmier-Agenten verbleiben auf dem Host.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kann ich GlobalGPT aus beiden Produkten verwenden?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT bietet f\u00fcr beide offizielle CLI-Tutorials an. Wir haben die CLI-Nutzung in beiden Umgebungen sowie die Nutzung von MCP und Skill in Codex \u00fcberpr\u00fcft, wobei f\u00fcr den unbeaufsichtigten MCP-Einsatz eine Genehmigungsbeschr\u00e4nkung gilt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Preise, Tarifbedingungen, Integrationen und Quellenangaben wurden im Juli 2026 \u00fcberpr\u00fcft. Produktdetails k\u00f6nnen sich \u00e4ndern.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">Ge\u00f6ffnet GlobalGPT<\/a> wenn Sie Ihren bestehenden Kodierungs-Workflow um eine modell\u00fcbergreifende und multimodale Ebene erweitern m\u00f6chten.<\/p>\n\n\n<\/article>","protected":false},"excerpt":{"rendered":"<p>Codex vs Claude Code is less about finding one universal winner and more about choosing the working style you can trust every day. Both products can inspect a repository, edit multiple files, run commands, execute tests, and explain a patch. The meaningful differences appear in how you delegate work, how often you steer the agent, [&hellip;]<\/p>","protected":false},"author":7,"featured_media":17361,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":" Codex vs Claude Code: Features, Pricing & Hands-On Tests","_seopress_titles_desc":"A neutral Codex vs Claude Code comparison covering features, pricing, limits, real repository tests, user experience, and GlobalGPT integrations.","_seopress_robots_index":"","footnotes":""},"categories":[7],"tags":[],"class_list":["post-17342","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-chat"],"_links":{"self":[{"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/posts\/17342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/comments?post=17342"}],"version-history":[{"count":2,"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/posts\/17342\/revisions"}],"predecessor-version":[{"id":17393,"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/posts\/17342\/revisions\/17393"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/media\/17361"}],"wp:attachment":[{"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/media?parent=17342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/categories?post=17342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/de\/wp-json\/wp\/v2\/tags?post=17342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}