Claude Opus 5 Testbericht: Lohnt sich das neue Modell von Anthropic?
Olivia Carter
Zuletzt aktualisiert am 29.07.2026
Claude Opus 5 Testbericht: Lohnt sich das neue Modell von Anthropic?
Faktenprüfung: 28. Juli 2026.
Kurzfazit: Dieser Testbericht zum Claude Opus 5 präsentiert ein überzeugendes High-End-Modell für Programmierer, komplexe Geschäftsabläufe und Käufer, die Leistung nahe der Spitzenklasse wünschen, ohne stets den Preis für ein Fable 5-Modell zahlen zu müssen. Anthropic kostet $5 pro Million Eingabetoken und $25 pro Million Ausgabetoken, während das Modell ein Kontextfenster von 1 Million Token und bis zu 128.000 Ausgabetoken in der synchronen Messages-API unterstützt. Es ist nicht automatisch die beste Wahl für einfache Chats, kurze Zusammenfassungen oder Anfragen mit hohem Volumen und geringem Wert.
Das überzeugendste Argument ist eher praktischer als theatralischer Natur: Opus 5 verbindet ernstzunehmenden Spielraum für logische Schlussfolgerungen mit einer überschaubareren Wirtschaftlichkeit als die „Frontier“-Stufe von Anthropic. In unserem einzigen Debugging-Test fand es den Fehler, der genau mit dem Präfix übereinstimmte, schlug den kleinsten Patch vor, fügte einen gezielten Regressionstest hinzu und gab einen Verifizierungsbefehl aus, der lokal erfolgreich war. Das ist ein nützlicher Beleg für diese Aufgabe – kein Beweis dafür, dass das Modell bei jedem Programmierauftrag gewinnen wird.
Am besten geeignet für: Programmierer, Langzeitkontextanalyse, Unternehmensautomatisierung und Teams, deren kostspielige Fehlschläge ein Premium-Modell rechtfertigen. Überspringe diesen Schritt, wenn: Geschwindigkeit und Stückkosten sind wichtiger als die Qualität der abschließenden Argumentation.
Der Claude Opus 5 ist das Premium-Alltagsmodell von Anthropic für komplexe agentische Kodierung und Unternehmensaufgaben. Anthropic gab dies am 24. Juli 2026 bekannt, und beschrieb es als durchdacht, proaktiv und effizienter als andere Modelle. Es ersetzte Claude Opus 4.8, wurde zum Standardmodell auf dem Claude Max und zum leistungsstärksten verfügbaren Modell auf dem Claude Pro.
Anthropic kündigte am 24. Juli 2026 das Modell Claude Opus 5 an und teilte mit, dass es noch am selben Tag erhältlich sei.
Das Produktversprechen ist für eine Opus-Veröffentlichung ungewöhnlich: Das Modell wird nicht ausschließlich als Modell mit maximaler Intelligenz dargestellt. Anthropic soll täglich eingesetzt werden, mit anpassbarem Aufwand und einem moderaten Latenzprofil. Dadurch lässt es sich leichter für lang laufende Agenten und anspruchsvolle Produktionsaufgaben rechtfertigen, während einfachere Workloads weiterhin an ein schnelleres, kostengünstigeres Modell weitergeleitet werden können.
Der Zugriff hängt vom jeweiligen Zugangsweg ab. Privatanwender können Opus 5 über berechtigte Claude-Tarife nutzen; Entwickler können über die Claude-API und unterstützte Cloud-Plattformen darauf zugreifen. Auch für GlobalGPT gibt es eine eigene Produktseite. Leser, die die Abonnementstufen von Anthropic vergleichen möchten, können die Vergleich der Tarife „Free“, „Pro“ und „Max“ von Claude bevor Sie eine Abrechnungsart auswählen.
Claude Opus 5 – Preis, API und wichtigste technische Daten
Die offizielle Claude-API-Preis ist $5 pro Million eingegebener Token und $25 pro Million ausgegebener Token. Dabei handelt es sich um Basis-API-Tarife, nicht um den Preis für ein Claude-Privatkundenabonnement oder einen Plattformtarif eines Drittanbieters. Für das Prompt-Caching und die Stapelverarbeitung gelten separate Tarife; vergleichen Sie daher das gesamte Anfragemuster, anstatt lediglich den angegebenen Eingabepreis zu multiplizieren.
Feld
Claude Opus 5
Was das bedeutet
Claude API-ID
claude-opus-5
Verwenden Sie genau diesen Modellwert in offiziellen Claude-API-Anfragen.
Basis-Einkaufspreis
$5 / MTok
Standard-Eingabe-Token-Satz vor Caching oder Mengenrabatten.
Basis-Verkaufspreis
$25 / MTok
Agenten mit hohem Output können schnell teuer werden.
Kontextfenster
1 Million Token
Geeignet für große Repositorien und Dokumentensammlungen, abhängig von der Qualität der Anfragen und der Suchstrategie.
Maximale Leistung
128K Token
Gilt für die synchrone Messages-API; für Message Batches gibt es einen separaten Beta-Pfad mit einer Obergrenze von 300.000.
Zuverlässige Wissensgrenze
Mai 2026
Nach heutigen Maßstäben zwar neu, aber kein Ersatz für die Live-Abfrage.
Vergleich der Latenzzeiten
Mäßig
Es handelt sich nicht um das schnellste Modell von Anthropic; die Latenz hängt weiterhin von Aufwand, Tools und Arbeitslast ab.
Die Claude-Plattform identifiziert „claude-opus-5“ als die aktuelle Opus-5-API-ID und den Alias.Die Claude-Plattform listet Opus 5 mit $5/$25 pro Million Eingabe-/Ausgabe-Token auf, mit einem Kontextfenster von 1 Million Token, einer maximalen Ausgabe von 128.000 Token und Stichtagen im Mai 2026.Die Claude-Plattform weist ein Kontextfenster von 1 Mio., eine maximale Ausgabe von 128 k sowie Cutoffs im Mai 2026 auf.
Für den Zugang durch Verbraucher, Anthropic listet Claude Pro auf bei $20 monatlich oder $17 pro Monat, wenn $200 jährlich abgerechnet wird; Claude Max beginnt bei $100 pro Monat. Laut Anthropic ist Opus 5 das leistungsstärkste Modell bei Pro und die Standardeinstellung bei Max, doch die im Tarif enthaltenen Kontingente und Produktfunktionen sind unabhängig von der gemessenen API-Nutzung.
Falls Sie eine detailliertere Kostenaufschlüsselung benötigen, finden Sie die Claude KI-Tarife und Preisübersicht für APIs unterscheidet zwischen Verbraucherabonnements, API-Abrechnung und Nutzungsbeschränkungen. Diese Unterscheidung ist wichtig: “Im Tarif enthalten” bedeutet nicht, dass unbegrenzte API-Aufrufe möglich sind, und ein API-Tarif gibt keinen Aufschluss darüber, in welchem Umfang Sie Zugang zum Verbraucher-Chat erhalten.
Claude Opus 5 Benchmark-Ergebnisse
Wichtige Grenze: Die folgenden Zahlen sind von Anthropic veröffentlichte Benchmark-Ergebnisse, es handelt sich hierbei nicht um unabhängige Messungen, die im Rahmen dieses Testberichts durchgeführt wurden. Sie sind hilfreich, um die beabsichtigte Leistungs- und Kostenposition von Anthropic zu verstehen, garantieren jedoch nicht, dass bei Ihren Prompts, Tools, Ihrem Repository oder Ihrem Latenzbudget das gleiche Ergebnis erzielt wird.
Bewertung
Die von Anthropic veröffentlichte Behauptung
Wie man es liest
Frontier-Bench v0.1
Opus 5 übertrifft Opus 4.8 um mehr als das Doppelte bei geringeren Kosten pro Aufgabe.
Ein allgemeines Signal für die Leistungsfähigkeit der Agenten, keine pauschale Verdopplung der Leistung.
CursorBench 3.2
Bei maximaler Leistung liegt Opus 5 nur 0,51 TP40T hinter der Höchstpunktzahl von Fable 5, und das bei halb so hohen Kosten pro Aufgabe.
Starke Wirtschaftlichkeit der Codierungsagenten unter den in Anthropic getesteten Aufwandsbedingungen.
Zapier AutomationBench
Etwa das 1,5-Fache der zweitbesten Erfolgsquote bei gleichen Kosten pro Aufgabe.
Vielversprechend für die durchgängige Geschäftsautomatisierung; die Gestaltung von Arbeitsabläufen spielt nach wie vor eine wichtige Rolle.
OSWorld 2.0
Übertrifft das beste Ergebnis von Fable 5 bei etwas mehr als einem Drittel der Kosten.
Deutet in diesem Benchmark auf eine attraktive Effizienz bei der Computernutzung hin.
Laut Anthropic erreicht Opus 5 bei der Hälfte der Kosten pro Aufgabe einen Wert, der nur 0,5% unter dem Spitzenwert von Fable 5 im CursorBench 3.2-Test liegt.Anthropic berichtet von einem 1,5-fachen Vorteil bei der Erfolgsquote auf Zapier AutomationBench und einem Kostenvorteil bei OSWorld 2.0.
Der Aufwand ist Teil des Ergebnisses. Laut Anthropic wird in der Claude-API und im Claude-Code standardmäßig ein hoher Aufwand für Opus 5 verwendet, während bei den Vergleichen ebenfalls die Einstellungen „high“, „xhigh“ oder „max“ zum Einsatz kommen. Ein höherer Aufwand kann den Erfolg bei schwierigen Aufgaben verbessern, erhöht jedoch gleichzeitig die Token-Kosten, die Latenz oder beides. Die Benchmark-Kosten pro Aufgabe sind daher aussagekräftiger als der Preis pro Token allein – doch keine dieser Kennzahlen ersetzt einen Pilotversuch mit Ihrer eigenen Arbeitslast.
So haben wir das Claude Opus 5 getestet
Wir haben eine kompakte Debugging-Aufgabe zur Ermittlung der Grundursache an einem CommonJS-Fixture mit drei Dateien durchgeführt. Die Aufgabe sah vor, dass das Modell vor der Bearbeitung die Grundursache identifizieren, den kleinstmöglichen Patch vorschlagen, einen gezielten Regressionstest hinzufügen, nicht relevante Änderungen vermeiden und den genauen Verifizierungsbefehl angeben sollte.
Wir haben den Patch dann unabhängig überprüft, anstatt die Antwort als richtig anzusehen, nur weil sie so überzeugend klang. Der Befehl „local“ lautete node --test test/account-summary.test.cjs. Vor der Korrektur ergab die Testsuite einen bestandenen Test und einen Fehlschlag. Nach dem Anwenden des Patches für die exakte Gleichheit ergab sie zwei bestandene Tests und keinen Fehlschlag.
Diese Methode liefert uns nützliche Erkenntnisse über einen bestimmten Debugging-Workflow: Diagnose, Disziplin bei der Fehlerbehebung, Qualität der Regressionstests und Überprüfbarkeit. Sie misst jedoch nicht die allgemeine Führungskompetenz beim Programmieren, die langfristige Zuverlässigkeit der Akteure, die Geschwindigkeit oder die Leistung sprachübergreifend.
Claude Opus 5 – Praxistest
Fehlerbehebung an der Ursache: korrekt, minimal und überprüfbar
In unserem Test hat Claude Opus 5 den Fehler korrekt auf normalizedQuery.startsWith(account.id.toLowerCase()). Mit der Abfrage ACCT-10, die Präfixprüfung ergab eine Übereinstimmung acct-1 erstens, also Array.prototype.find hat das falsche Konto zurückgegeben, bevor die genaue ID ermittelt wurde.
Die vorgeschlagene Korrektur änderte den Präfixabgleich auf exakte Übereinstimmung und fügte einen Regressionsfall für den aufgefüllten, groß- und kleingeschriebenen ACCT-10 Eingabe. Es wurde kein Code umgeschrieben, der in keinem Zusammenhang stand. Diese Zurückhaltung ist in realen Repositories wichtig, da eine zu umfassende “Bereinigung” mehr Überprüfungsaufwand verursachen kann als der ursprüngliche Fehler.
Der stärkste Teil war der gesamte Zyklus: die Grundursache benennen, erklären, warum der bestehende Test sie übersehen hat, die kleinste Änderung vornehmen, den passenden Regressionstest hinzufügen und den Befehl zur Überprüfung angeben. Das Ergebnis steht im Einklang mit der Positionierung von Opus 5 als ’Coding-Agent“, bleibt aber auf eine einzige Testumgebung beschränkt. Eine umfassendere Einführung in den Workflow finden Sie unter wie man Claude AI für die Codierung verwendet.
Vollständige Aufgabenstellungen und Lösungen für T1–T4 sowie kopierbarer Code
T1: Fehlerbehebung an der Ursache
Bestanden – den Fehler bei der Präfixübereinstimmung gefunden, den kleinsten Patch vorgeschlagen und einen gezielten Regressionstest hinzugefügt.
Als Fehler wurde die Präfixübereinstimmung identifiziert; es wurde erläutert, warum der alte Test diesen Fehler übersehen hatte; es wurde ein Regressionstest vorgeschlagen, der auf exakter Übereinstimmung plus eins basiert.
Vollständige T1-Aufgabe und Antwort anzeigen
Vollständige Eingabeaufforderung
Sie debuggen ein bewusst klein gehaltenes CommonJS-Fixture. Arbeiten Sie ausschließlich anhand der drei unten aufgeführten Dateien und der angegebenen Reproduktion.
Anforderungen:
1. Geben Sie die Grundursache an, bevor Sie Änderungen vorschlagen.
2. Schlagen Sie den kleinsten Patch vor, der den Fehler behebt.
3. Fügen Sie einen gezielten Regressionstest hinzu, der vor der Korrektur fehlschlägt und danach erfolgreich ist.
4. Geben Sie den genauen Verifizierungsbefehl an, der vom Stammverzeichnis des Fixtures aus ausgeführt werden muss.
5. Schreiben Sie keinen nicht betroffenen Code um. Benennen Sie keine Dateien um, fügen Sie keine Abhängigkeiten hinzu und ändern Sie nicht die öffentliche API.
6. Geben Sie genau diese Abschnitte in der folgenden Reihenfolge zurück: `ROOT CAUSE`, `PATCH`, `VERIFICATION`, `LIMITATIONS`.
7. Geben Sie in `PATCH` einen einheitlichen Diff in einem umschlossenen `diff`-Block an. Geben Sie in `VERIFICATION` einen Befehl in einem umschlossenen `text`-Block an.
Reproduktion: `summarizeAccount(accounts, ' ACCT-10 ')` sollte `{ id: 'acct-10', name: 'Nimbus', seats: 24 }` zurückgeben, gibt jedoch das Konto `acct-1` zurück.
Datei: `src/find-account.cjs`
```js
function findAccount(accounts, query) {
const normalizedQuery = query.trim().toLowerCase();
return accounts.find((account) =>
normalizedQuery.startsWith(account.id.toLowerCase()),
);
}
module.exports = { findAccount };
```
Datei: `src/account-summary.cjs`
```js
const { findAccount } = require('./find-account.cjs');
function summarizeAccount(accounts, requestedId) {
const account = findAccount(accounts, requestedId);
if (!account) return null;
return { id: account.id, name: account.name, seats: account.seats };
}
module.exports = { summarizeAccount };
```
Datei: `test/account-summary.test.cjs`
```js
const test = require('node:test');
const assert = require('node:assert/strict');
const { summarizeAccount } = require('../src/account-summary.cjs');
const accounts = [
{ id: 'acct-1', name: 'Atlas', seats: 5 },
{ id: 'acct-10', name: 'Nimbus', seats: 24 },
];
test('fasst eine exakte Konto-ID zusammen', () => {
assert.deepEqual(summarizeAccount(accounts, 'acct-1'), {
id: 'acct-1',
name: 'Atlas',
seats: 5,
});
});
```
Claude Opus 5
GRUNDURSACHE
„findAccount“ sucht nach Präfixen, nicht nach exakter Übereinstimmung:
Array.prototype.find gibt das erste Element zurück, das das Prädikat erfüllt. Für ‘ACCT-10‘ lautet die normalisierte Abfrage ‘acct-10’, und die ID des ersten Kontos ‘acct-1’ ist ein Präfix davon, sodass startsWith wahr ist und „acct-1“ die Suche vorzeitig beendet, bevor „acct-10“ überhaupt geprüft wird. Die Normalisierung durch „trim().toLowerCase()“ ist korrekt – Leerzeichen und Groß-/Kleinschreibung sind nicht das Problem. „summarizeAccount“ ist eine Durchleitungsfunktion und nicht schuld. Der bestehende Test kann dies nicht erkennen: ‘acct-1’ ist ein Präfix seiner selbst und gleichzeitig das erste Element, sodass bei dieser Eingabe zwischen Präfixabgleich und exaktem Abgleich nicht unterschieden werden kann.
PATCH
diff
1--- a/src/find-account.cjs2+++ b/src/find-account.cjs3@@ -1,8 +1,8 @@4 function findAccount(accounts, query) {5 const normalizedQuery = query.trim().toLowerCase();6- return accounts.find((account) =>7- normalizedQuery.startsWith(account.id.toLowerCase()),8- );9+ return accounts.find(10+ (account) => account.id.toLowerCase() === normalizedQuery,11+ );12 }1314 module.exports = { findAccount };15--- a/test/account-summary.test.cjs16+++ b/test/account-summary.test.cjs17@@ -14,3 +14,11 @@18 test('summarizes an exact account ID', () => {19 seats: 5,20 });21 });22+23+test('matches the full ID rather than a prefix, with padding and mixed case', () => {24+ assert.deepEqual(summarizeAccount(accounts, ' ACCT-10 '), {25+ id: 'acct-10',26+ name: 'Nimbus',27+ seats: 24,28+ });29+});
Vor der Korrektur schlägt der neue Test beim Objekt „acct-1 / Atlas / 5“ fehl; nach der Korrektur wird er bestanden.
ÜBERPRÜFUNG
Text
1node --test test/account-summary.test.cjs
node --test test/account-summary.test.cjs
EINSCHRÄNKUNGEN
• Umfang: Ein Operator wurde geändert. Es gab keine Umbenennungen, keine neuen Abhängigkeiten, und die Signaturen sowie die Rückgabetypen von `findAccount` und `summarizeAccount` blieben unverändert. • Bereits bestehendes Verhalten, das unverändert bleibt (fällt nicht in den Geltungsbereich dieses Fehlers): • Ein „requestedId“-Wert, der kein String ist (null, eine Zahl), löst bei „.trim()“ weiterhin einen Fehler aus. • Die Konto-IDs selbst werden nicht gekürzt, sodass ein gespeichertes ‘acct-10’ weiterhin nicht übereinstimmt – nur die Abfrage wird normalisiert. • Bei der Groß-/Kleinschreibung wird einfach toLowerCase() verwendet; es erfolgt keine Unicode-Normalisierung und keine lokalisierungsabhängige Umformung. • Doppelte IDs werden weiterhin der ersten Übereinstimmung zugeordnet, und die Suchzeit bleibt bei O(n). • Testabdeckung: Der einzelne Regressionstest zielt genau auf die gemeldete Reproduktion ab. Der nicht gefundene (Null-)Pfad und die fehlerhafte Eingabe bleiben ungeprüft.
ROOT CAUSE
findAccount matches by prefix, not by equality:
```js
normalizedQuery.startsWith(account.id.toLowerCase())
```
Array.prototype.find returns the first element satisfying the predicate. For ' ACCT-10 ' the normalized query is 'acct-10', and the first account's ID 'acct-1' is a prefix of it, so startsWith is true and acct-1 short-circuits the search before acct-10 is ever tested.
The trim().toLowerCase() normalization is correct — whitespace and casing are not the problem. summarizeAccount is a pass-through and is not at fault.
The existing test cannot catch this: 'acct-1' is a prefix of itself and is the first element, so prefix matching and exact matching are indistinguishable for that input.
PATCH
```diff
--- a/src/find-account.cjs
+++ b/src/find-account.cjs
@@ -1,8 +1,8 @@
function findAccount(accounts, query) {
const normalizedQuery = query.trim().toLowerCase();
- return accounts.find((account) =>
- normalizedQuery.startsWith(account.id.toLowerCase()),
- );
+ return accounts.find(
+ (account) => account.id.toLowerCase() === normalizedQuery,
+ );
}
module.exports = { findAccount };
--- a/test/account-summary.test.cjs
+++ b/test/account-summary.test.cjs
@@ -14,3 +14,11 @@
test('summarizes an exact account ID', () => {
seats: 5,
});
});
+
+test('matches the full ID rather than a prefix, with padding and mixed case', () => {
+ assert.deepEqual(summarizeAccount(accounts, ' ACCT-10 '), {
+ id: 'acct-10',
+ name: 'Nimbus',
+ seats: 24,
+ });
+});
```
Before the fix the new test fails with the acct-1 / Atlas / 5 object; after the fix it passes.
VERIFICATION
```text
node --test test/account-summary.test.cjs
```
LIMITATIONS
• Scope: one operator changed. No renames, no new dependencies, and findAccount / summarizeAccount signatures and return shapes are unchanged.
• Pre-existing behavior left alone (out of scope for this bug):
• A non-string requestedId (null, a number) still throws on .trim().
• Account IDs themselves are not trimmed, so a stored ' acct-10' still will not match — only the query is normalized.
• Casing uses plain toLowerCase(); no Unicode normalization or locale-aware folding.
• Duplicate IDs still resolve to the first match, and lookup remains O(n).
• Test coverage: the single regression test targets exactly the reported reproduction. The not-found (null) path and malformed input remain untested.
T2: Analyse des Kontostatus
Teilweise – Die Kernkennzahlen wurden berechnet und Maßnahmen priorisiert, doch die erfasste Antwort endete ohne die angeforderte „Recheck“-Markierung.
Berechneter MRR für $34.800 in der Risikogruppe (94,31%); E-505 eskaliert und Folgeaktionen priorisiert; Antwort endete ohne den angeforderten „Recheck“-Marker.
Vollständige T2-Aufgabe und Antwort anzeigen
Vollständige Eingabeaufforderung
Analysieren Sie die bereitgestellte Datei `account-health.csv` als geschlossenen Datensatz. Verwenden Sie keine externen Fakten und ergänzen Sie keine fehlenden Werte.
Risikoregeln (jeweils unabhängig bewerten):
- `inactivity`: `days_since_login >= 30`
- `payment`: `failed_payments >= 2`
- `low_utilization`: `seats_used / seats_purchased = 80`, während das Konto „at-risk“ ist.
- `weak_health_without_risk`: `health_score = 9` und `open_tickets >= 3`.
Anforderungen:
1. Berechnen Sie die ausgelösten Risiko- und Widerspruchsflags für jedes Konto.
2. Geben Sie die Gesamtwerte des Datensatzes für Konten, MRR, risikobehaftete Konten, risikobehafteten MRR, zu eskalierende Konten, Widerspruchszeilen, gekaufte Lizenzen und genutzte Lizenzen an.
3. Erstellen Sie eine Aktionstabelle mit genau fünf Spalten: `Konto | Risikoauslöser | Widersprüche | Priorität | Empfohlene Maßnahme`.
4. Führen Sie direkt berechnete Werte unter der Überschrift `Gemessene Fakten` und Ermessensentscheidungen unter der Überschrift `Schlussfolgerung` auf.
5. Zeigen Sie unter „Überprüfung“ ausreichend Rechenwege auf, um jede Gesamtsumme und jeden Schwellenwert unabhängig nachprüfen zu können, einschließlich des Falls, in dem der Wert genau 0,50 beträgt.
6. Korrigieren oder interpretieren Sie die Regeln nicht stillschweigend neu. Wenn ein Signal kontraintuitiv erscheint, vermerken Sie es als Widerspruch, anstatt seine Klassifizierung zu ändern.
`account-health.csv`:
```csv
account_id,account_name,plan,mrr_usd,days_since_login,failed_payments,seats_purchased,seats_used,health_score,nps,open_tickets
A-101,Aster,Enterprise,12000,45,0,100,82,92,9,1
B-202,Beacon,Pro,4200,4,2,20,18,70,7,0
C-303, Cinder, Pro, 3600, 12, 0, 20, 8, 65, 10, 4
D-404, Dahlia, Starter, 900, 5, 0, 5, 4, 42, 6, 0
E-505,Ember,Enterprise,15000,65,3,200,70,35,3,6
F-606,Fjord,Starter,1200,29,1,4,2,85,9,3
```
Claude Opus 5
Gemessene Fakten
Quelle: account-health.csv, 6 Zeilen, als geschlossen behandelt. Es wurden keine Werte imputiert.
Auswertung der Regeln pro Konto
Konto Tage ≥ 30 fehlgeschlagen≥2 util < 0,50 Anzahl der Risiken Status A-101 Aster ✅ 45 ❌ 0 ❌ 0,82 1 gefährdet B-202 Leuchtfeuer ❌ 4 ✅ 2 ❌ 0,90 1 gefährdet C-303 Asche ❌ 12 ❌ 0 ✅ 0,40 1 gefährdet D-404 Dahlie ❌ 5 ❌ 0 ❌ 0,80 0 nicht gefährdet E-505 Ember ✅ 65 ✅ 3 ✅ 0,35 3 Risikogruppe + Eskalation F-606 Fjord ❌ 29 ❌ 1 ❌ 0,50 0 nicht gefährdet Warnmeldungen zu Widersprüchen pro Konto Konto starke_Gesundheit_mit_Risiko schlechte_Gesundheit_ohne_Risiko Veranstalter_mit_Ticket_Ladung A-101 Aster ✅ (92 ≥ 80, Risikogruppe) ❌ ❌ (NPS 9 ✓, Tickets 1 ✗) B-202 Leuchtfeuer ❌ (70 < 80) ❌ (70 ≥ 50) ❌ (NPS 7) C-303 Asche ❌ (65 < 80) ❌ (65 ≥ 50) ✅ (NPS 10, Tickets 4) D-404 Dahlie ❌ ✅ (42 < 50, kein Risiko) ❌ (NPS 6) E-505 Ember ❌ (35 < 80) ❌ (35 < 50, gehört jedoch zur Risikogruppe) ❌ (NPS 3) F-606 Fjord ❌ (85 ≥ 80, aber kein Risikopatient) ❌ (85 ≥ 50) ✅ (NPS 9, Tickets 3) Gesamtzahlen des Datensatzes Metrisch Wert Konten 6 Gesamt-MRR $36,900 Risikokonten 4 (A-101, B-202, C-303, E-505) Gefährdeter MRR $34.800 (94,311 TP40T der Gesamtzahl) Konten eskalieren 1 (E-505) Widerspruchsreihen 4 (A-101, C-303, D-404, F-606) Warnungen bei Widersprüchen 4 (1 „starke_Gesundheit_mit_Risiko“, 1 „schwache_Gesundheit_ohne_Risiko“, 2 „Veranstalter_mit_Ticket_Belastung“) Gekaufte Sitzplätze 349 Belegte Sitzplätze 184 Schlussfolgerung Die nachstehende Prioritätenreihenfolge und die empfohlenen Maßnahmen sind Ermessensentscheidungen und keine festgelegten Regeln. Bei meiner Gewichtung stehen Statusänderungen an erster Stelle, gefolgt von gefährdetem MRR und schließlich von Widerspruchsignalen. Konto Risikoauslöser Widersprüche Priorität Empfohlene Maßnahme E-505 Ember Inaktivität, Zahlung, geringe Auslastung - P0 Alle drei Regeln werden für den größten Kunden ausgelöst ($15.000 MRR). Als aktiven Kundenabgang behandeln: Zahlungsmethode wiederherstellen und anschließend eine Überprüfung durch die Geschäftsleitung hinsichtlich der 130 ungenutzten Lizenzen durchführen. A-101 Aster Inaktivität starke_Gesundheit_mit_Risiko P1 $: 12.000 MRR bei 45 Tagen Inaktivität, trotz eines Scores von 92 und einer soliden 82%-Nutzungsrate. Überprüfen Sie, ob die Anmeldepause auf eine tatsächliche Abwanderung oder auf einen Tracking-Fehler (SSO, reine API-Nutzung) zurückzuführen ist, bevor Sie aufgrund des Scores Maßnahmen ergreifen. C-303 Asche geringe Auslastung Veranstalter_mit_Ticket_Ladung P1 Promoter (NPS 10) mit 4 offenen Tickets bei einer Auslastung von 40%. Die Ticketauslastung ist das wahrscheinliche Hindernis für die Einführung; leeren Sie die Warteschlange und treiben Sie anschließend die Sitzplatzaktivierung voran. B-202 Leuchtfeuer Zahlung - P2 Eindeutiger Einzelfall: 2 fehlgeschlagene Zahlungen bei einer letzten Anmeldung vor 4 Tagen und einer 90%-Nutzung. Nur Nachverfolgung der Rechnungsstellung, keine Kundendienstmaßnahme erforderlich. F-606 Fjord - Veranstalter_mit_Ticket_Ladung P3 Liegt knapp innerhalb aller Grenzwerte (29 Tage, 1 fehlgeschlagene Zahlung, Auslastung genau 0,50). Nach den Regeln besteht kein Risiko, aber ein weiterer Tag ohne Aktivität oder eine weitere fehlgeschlagene Zahlung würde die Situation umkehren. Beobachten Sie die Entwicklung und klären Sie die 3 Tickets auf. D-404 Dahlie - schlechte_Gesundheit_ohne_Risiko P3 Ergebnis 42, ohne dass eine Regel ausgelöst wurde, bei einer Auslastung von 80% auf einem $900 MRR. Entweder
Gemessene Fakten
Quelle: account-health.csv, 6 Zeilen, als abgeschlossen behandelt. Keine Werte imputiert.
Regelauswertung pro Konto
Konto
Tage ≥ 30
Fehlschläge ≥ 2
Nutzungsgrad < 0,50
Risikoanzahl
Status
A-101 Aster
✅ 45
❌ 0
❌ 0,82
1
risikobehaftet
B-202 Beacon
❌ 4
✅ 2
❌ 0,90
1
risikobehaftet
C-303 Cinder
❌ 12
❌ 0
✅ 0,40
1
risikobehaftet
D-404 Dahlia
❌ 5
❌ 0
❌ 0,80
0
nicht risikobehaftet
E-505 Ember
✅ 65
✅ 3
✅ 0,35
3
gefährdet + eskalieren
F-606 Fjord
❌ 29
❌ 1
❌ 0,50
0
kein Risiko
Widerspruchsmarkierungen pro Konto
Konto
starker_Zustand_mit_Risiko
schwacher_Zustand_ohne_Risiko
Promoter_mit_Ticket-Auslastung
A-101 Aster
✅ (92 ≥ 80, Risiko)
❌
❌ (NPS 9 ✓, Tickets 1 ✗)
B-202 Beacon
❌ (70 < 80)
❌ (70 ≥ 50)
❌ (NPS 7)
C-303 Cinder
❌ (65 < 80)
❌ (65 ≥ 50)
✅ (NPS 10, Tickets 4)
D-404 Dahlia
❌
✅ (42 < 50, nicht gefährdet)
❌ (NPS 6)
E-505 Ember
❌ (35 < 80)
❌ (35 < 50, aber gefährdet)
❌ (NPS 3)
F-606 Fjord
❌ (85 ≥ 80, aber nicht gefährdet)
❌ (85 ≥ 50)
✅ (NPS 9, Tickets 3)
Gesamtwerte des Datensatzes
Kennzahl
Wert
Konten
6
Gesamt-MRR
$36.900
Risikobehaftete Konten
4 (A-101, B-202, C-303, E-505)
Risikobehaftetes MRR
$34.800 (94,31% des Gesamtwerts)
Zu eskalierende Konten
1 (E-505)
Zeilen mit Widersprüchen
4 (A-101, C-303, D-404, F-606)
Widerspruchsmarkierungen
4 (1 „strong_health_with_risk“, 1 „weak_health_without_risk“, 2 „promoter_with_ticket_load“)
Gekaufte Plätze
349
Genutzte Plätze
184
Schlussfolgerung
Die nachstehende Prioritätenreihenfolge und die empfohlenen Maßnahmen sind Ermessensentscheidungen und keine regelbasierten Ergebnisse. Meine Gewichtung bei der Rangfolge berücksichtigt zuerst den Eskalationsstatus, dann den gefährdeten MRR und schließlich die Widerspruchsindikatoren.
Konto
Risikoauslöser
Widersprüche
Priorität
Empfohlene Maßnahme
E-505 Ember
Inaktivität, Zahlung, geringe_Auslastung
—
P0
Alle drei Regeln werden beim größten Konto ($15.000 MRR) ausgelöst. Als aktiven Kundenabgang behandeln: Zahlungsmethode wiederherstellen, anschließend eine Überprüfung durch die Geschäftsleitung hinsichtlich der 130 ungenutzten Plätze durchführen.
A-101 Aster
Inaktivität
starke_Gesundheit_mit_Risiko
P1
$12.000 MRR mit 45 Tagen Inaktivität trotz eines Scores von 92 und einer gesunden Auslastung von 82%. Überprüfen Sie, ob die Anmeldepause auf tatsächliche Abwanderung oder auf ein Tracking-Artefakt (SSO, reine API-Nutzung) zurückzuführen ist, bevor Sie auf den Score reagieren.
C-303 Cinder
geringe_Auslastung
Promoter_mit_Ticket-Last
P1
Promoter (NPS 10) mit 4 offenen Tickets bei einer Auslastung von 40%. Die Ticket-Last ist das plausible Hindernis für die Akzeptanz; die Warteschlange abarbeiten und anschließend die Aktivierung des Arbeitsplatzes vorantreiben.
B-202 Beacon
Zahlung
—
P2
Eindeutiger Einzelfall: 2 fehlgeschlagene Zahlungen bei einer Anmeldehäufigkeit von 4 Tagen und einer Auslastung von 90%. Nur Nachverfolgung der Abrechnung, keine Kundendienstmaßnahmen erforderlich.
F-606 Fjord
—
promoter_with_ticket_load
P3
Liegt knapp innerhalb aller Grenzwerte (29 Tage, 1 fehlgeschlagene Zahlung, genau 0,50 Auslastung). Nach den Regeln nicht gefährdet, aber ein weiterer Tag Inaktivität oder eine weitere fehlgeschlagene Zahlung würde den Status umkehren. Beobachten und die 3 Tickets klären.
D-404 Dahlia
—
weak_health_without_risk
P3
Score 42, keine Regel ausgelöst und 80%-Auslastung bei $900 MRR. Entweder
T3: Erstellung responsiver Benutzeroberflächen
Teilweise – es wurde eine umfassende, in sich geschlossene Implementierung und Selbstprüfung erstellt, wobei ausdrücklich eingeräumt wurde, dass die Seite geprüft und nicht zur Laufzeit gerendert wurde.
Erstellte eine in sich geschlossene Antwort mit 21.907 Zeichen; behandelte die Themen Desktop, Mobilgeräte, Überlauf und Barrierefreiheit; wies ausdrücklich darauf hin, dass das Layout überprüft und nicht zur Laufzeit gerendert wurde.
Vollständige T3-Aufgabe und Antwort anzeigen
Vollständige Eingabeaufforderung
Erstellen Sie eine ansprechende Produktvergleichsoberfläche als einzelne, ausführbare HTML-Datei, wobei Sie ausschließlich die unten aufgeführten Produktdaten verwenden dürfen.
Anforderungen:
1. Geben Sie genau einen umschlossenen `html`-Codeblock zurück, gefolgt von einem `SELF-CHECK`-Abschnitt. Teilen Sie HTML, CSS oder JavaScript nicht in separate Dateien auf.
2. Verwenden Sie ausschließlich semantisches HTML, eingebettetes CSS und eingebettetes Vanilla-JavaScript: keine externen Frameworks, Pakete, Schriftarten, Bilder, Netzwerkanfragen oder Build-Schritte.
3. Stellen Sie drei per Tastatur bedienbare Registerkarten ("Übersicht", "Preise", "Limits") mit korrekter "tablist"-, "tab"- und "tabpanel"-Semantik bereit. Die Pfeiltasten "Pfeil nach links" und "Pfeil nach rechts" müssen die Registerkarten verschieben und aktivieren; die Tasten "Home" und "End" müssen zur ersten bzw. letzten Registerkarte springen und diese aktivieren. Der Fokus muss sichtbar bleiben.
4. Die ausgewählte Registerkarte muss durch `aria-selected`, `tabindex` und das sichtbare Panel gekennzeichnet sein; inaktive Panels müssen ausgeblendet sein.
5. Ziel für Desktop: 1440px breit. Ziel für Mobilgeräte: 390px breit ohne horizontalen Seitenüberlauf, ohne abgeschnittene Steuerelemente, mit mindestens 44px hohen Tippzielen und in einer Spalte gestapelten Vergleichskarten.
6. Fügen Sie eine prägnante Kopfzeile, eine klare Empfehlung, drei Produktkarten und eine kompakte Vergleichstabelle ein. Achten Sie auf einen gut lesbaren Kontrast und vermeiden Sie dekorative Animationen.
7. Verwenden Sie genau diese Produktangaben und fügen Sie keine eigenen Aussagen hinzu:
- Atlas: `$19/Monat`, `20 Projekte`, `10 GB`, `E-Mail-Support`, am besten für Einzelarbeit geeignet.
- Beacon: `$49/Monat`, `Unbegrenzte Projekte`, `100 GB`, `Prioritäts-Support`, insgesamt am besten für wachsende Teams geeignet.
- Cove: `$99/Monat`, `Unbegrenzte Projekte`, `1 TB`, `Dedizierter Support`, am besten geeignet für regulierte Betriebsabläufe.
8. Versehen Sie "Beacon" mit einer gut sichtbaren Kennzeichnung "Insgesamt am besten", ohne dass die anderen Karten deaktiviert wirken.
9. Geben Sie unter "SELF-CHECK" ausdrücklich an, welche Prüfungen Sie für semantische Registerkarten, Tastaturverhalten, das 1440px-Layout, das 390px-Layout, horizontalen Überlauf und externe Abhängigkeiten durchgeführt haben. Behaupten Sie nicht, dass Sie einen Viewport tatsächlich gerendert haben, es sei denn, dies ist tatsächlich der Fall; unterscheiden Sie zwischen Code-Prüfung und Laufzeitüberprüfung.
Produkt-Fixture (ebenfalls gespeichert als `fixtures/T3-responsive-ui/product-data.json`):
```json
{
"products": [
{"name":"Atlas","price":"$19/mo","projects":"20 projects","storage":"10 GB","support":"E-Mail-Support","bestFor":"Einzelarbeit"},
{"name":"Beacon","price":"$49/Monat","projects":"Unbegrenzte Anzahl von Projekten","storage":"100 GB","support":"Prioritäts-Support","bestFor":"wachsende Teams","badge":"Bester Gesamteindruck"},
{"name":"Cove","price":"$99/Monat","projects":"Unbegrenzte Anzahl an Projekten","speicherplatz":"1 TB","Support":"Dedizierter Support","am besten geeignet für":"regulierte Betriebsabläufe"}
]
}
```
Alle folgenden Aussagen basieren ausschließlich auf der Code-Prüfung. Ich habe weder einen Browser geöffnet, noch einen Viewport gerendert, noch einen Screenreader ausgeführt, noch die Tastaturbefehle getestet; daher ist hier nichts lauffzeitverifiziert. Wenn eine Aussage vom Verhalten der Layout-Engine abhängt, weise ich ausdrücklich darauf hin. Semantische Registerkarten – geprüft, konsistent Ein div[role="tablist"] mit aria-label="Planvergleichsansichten" enthält drei button[type="button"][role="tab"]. Jede Registerkarte verfügt über eine eindeutige ID und ein "aria-controls"-Attribut, das auf ein "section"[role="tabpanel"] verweist; jedes Panel enthält ein „aria-labelledby“-Attribut, das zurück auf die zugehörige Registerkarte verweist. Ich habe alle drei Paare manuell nachverfolgt: „tab-overview“/„panel-overview“, „tab-pricing“/„panel-pricing“, „tab-limits“/„panel-limits“. Keine doppelten IDs, keine losen Verweise. Die Panels verwenden „tabindex=“0““, sodass der Panel-Inhalt nach dem Tab erreichbar ist. Tastaturverhalten – geprüft, nicht ausgeführt Ein einziger "keydown"-Listener für die Tab-Liste verarbeitet die Tasten „Pfeil nach rechts“, „Pfeil nach links“, „Pos1“ und „Ende“, ruft ausschließlich für diese vier Tasten „event.preventDefault()“ auf und kehrt andernfalls vorzeitig zurück. Die Pfeiltasten führen an beiden Enden einen Zeilenumbruch durch. Da `activate()` sowohl `aria-selected`, `tabindex` und `hidden` aktualisiert als auch den Fokus verschiebt, bewirken die Pfeiltasten sowie die Tasten „Home“ und „End“ die Bewegung und die Aktivierung in einem Schritt – was dem in den Anforderungen geforderten Muster der automatischen Aktivierung entspricht. Die Navigation mit Tab/Umschalt+Tab basiert auf einem variablen „tabindex“: Genau ein Tab-Element hat „tabindex=“0“, die übrigen „-1“, was durch „activate()“ verwaltet wird. Die Sichtbarkeit des Fokus erfolgt über eine globale „:focus-visible“-Regel mit einem 3px-Umriss und einem 2px-Versatz; ich habe den Standard-Umriss weder überschrieben noch entfernt. Ich habe die Tastenbehandlung in einem echten Browser noch nicht überprüft. Reflexion bei ausgewähltem Zustand — geprüft activate() setzt alle drei Attribute in derselben Schleife, sodass aria-selected="true", tabindex="0" und das Fehlen des Attributs „hidden“ nicht voneinander abweichen können. Inaktive Bereiche erhalten das Attribut „hidden“, und [hidden] { display: none !important; } schützt vor den Darstellungsregeln, die dies andernfalls zunichte machen würden – dieser Schutz ist wichtig, da die Bereiche untergeordnete Elemente mit „display: grid“ enthalten. activate(currentIndex(), false) wird beim Laden ausgeführt, um den Zustand anhand des Markups zu normalisieren, ohne den Fokus zu stehlen. Falls JavaScript nicht ausgeführt wird, wird das Markup so ausgeliefert, dass „Overview“ ausgewählt und die beiden anderen Panels ausgeblendet sind, sodass die Seite auf ein lesbares Panel zurückfällt. 1440px-Layout – geprüft, nicht gerendert .wrap hat eine maximale Breite von 1120px und einen Rand von 0 auto, sodass der Inhalt bei 1440px zentriert wird und etwa 160px große Zwischenräume entstehen, anstatt sich zu strecken. Karten verwenden „grid-template-columns: repeat(3, minmax(0, 1fr))“ mit einem Abstand von 20px, was drei gleich große Spalten ergibt; „align-items: start“ verhindert, dass sich die Karten auf eine gemeinsame Höhe ausdehnen, während „.card { height: 100% }“ dadurch neutralisiert wird. Die Angabe „minmax(0, 1fr)“ ist bewusst gewählt – „1fr“ allein kann verhindern, dass die Spalten unter die Inhaltsbreite schrumpfen, und das Raster in die Breite ziehen. Ich habe die tatsächliche Pixelausgabe nicht gemessen. 390px-Layout – geprüft, nicht gerendert Der Block mit "max-width: 720px" stellt das Kartenraster auf "minmax(0, 1fr)" um, also eine einzelne Spalte, sodass sich die Karten übereinander stapeln. Der Abstand (Padding) verringert sich auf 16px pro Seite, wodurch eine Inhaltsbreite von etwa 358px verbleibt. Tapp-Ziele: Jedes [role="tab"] hat „min-height: 44px“, und der horizontale Abstand schrumpft auf 12px, anstatt dass die Höhe verringert wird, sodass die Mindesthöhe von 44px auch bei schmalen Breiten erhalten bleibt. Die Tabliste erhält die Eigenschaften „flex-wrap: nowrap“ mit „overflow-x: auto“ und „flex: 1 0 auto“ für die untergeordneten Elemente, sodass drei Registerkarten entweder vollständig in die Tabliste passen oder innerhalb dieser scrollbar sind, anstatt mitten im Steuerelement abgeschnitten oder umgebrochen zu werden. ist vorhanden. Nicht bei einem tatsächlichen Viewport von 390px überprüft. Horizontaler Überlauf – geprüft, eine absichtlich eingeschränkte Schriftrolle body { overflow-x: hidden } dient als Sicherheitsmaßnahme, aber ich habe auch versucht, mich nicht darauf zu verlassen. * { box-sizing: border-box } sorgt dafür, dass das Padding innerhalb der festgelegten Breiten bleibt. Die Vergleichstabellen verwenden "white-space: nowrap" für die Zellen, sodass die sechsspaltige Übersichtstabelle auf Mobilgeräten 358px überschreitet; dies wird durch ".table-scroll { max-width: 100%; overflow-x: auto }" begrenzt, wodurch der Tabellenbereich statt der Seite gescrollt wird. Dieser Wrapper verfügt über „tabindex=“0““ und „role=“region““ mit einer Beschriftung, sodass Nutzer mit der Tastatur darauf zugreifen und darin scrollen können. „Flex“- und „Grid“-Nachkommen, die sich andernfalls nicht verkleinern lassen würden, werden mit „minmax(0, 1fr)“ im Grid und „flex-wrap: wrap“ bei „.card-head“ und „.recommendation“ behandelt. Das einzige verbleibende Risiko, das ich ohne Rendering nicht ausschließen kann, ist eine lange, ununterbrochene Zeichenfolge in einer Tabellenzelle; alle Fixture-Werte sind jedoch kurz. Externe Abhängigkeiten – geprüft, keine Nein <link>, <script src>, <img>, @import, url(), fetch, XMLHttpRequest, web font, or CDN reference. Fonts are a system-ui stack. The badge and featured border are CSS only, no icon assets. Everything is inline in one file, so it runs from file:// with no build step. Kontrast und Bewegung – geprüft Der Haupttext #16191f auf #f6f7f9 und der sekundäre Text #4a515c auf Weiß liegen beide deutlich über 4,5:1; das Logo ist weiß auf #10457e, und die aktive Registerkarte ist #10457e auf weißem Hintergrund. Ich habe diese Werte anhand einer Verhältnis-Schätzung aus den Hex-Werten berechnet, nicht mit einem Kontrast-Tool. Es gibt nirgendwo Übergänge, Animationen oder Transformationen; der „prefers-reduced-motion“-Block ist eher ein wirkungsloses Sicherheitsnetz als eine Korrektur für vorhandene Bewegungen. Genauigkeit der Vorrichtung — geprüft Jeder der drei Tarife ist in allen drei Übersichten sowie in der Tabelle der jeweiligen Übersicht aufgeführt. Ich habe jeden Preis, jede Projektanzahl, jede Speicherkapazität und jede Supportstufe mit dem JSON-Datensatz „Atlas“ abgeglichen. 19 / 20 𝑝 𝑟 𝑜 𝑗 𝑒 𝑐 𝑡 𝑠 / 10 𝐺 𝐵 / 𝐸 𝑚 𝑎 𝑖 𝑙 , 𝐵 𝑒 𝑎 𝑐 𝑜 𝑛 49/Unbegrenzt/100 GB/Priorität, Cove $99/Unbegrenzt/1 TB/Dediziert. Beacon trägt das Abzeichen "Best overall" und einen 2px breiten Akzentrand; Atlas und Cove behalten volltransparenten Text, normale Rahmen und identische Schriftgestaltung bei, sodass sie als verfügbar und nicht als deaktiviert wahrgenommen werden. Die „Best for“-Angaben werden als kurze Beschriftungen dargestellt („Best for solo work“) – der Wortlaut wird um den Produktwert herum hinzugefügt, es werden keine neuen Produktversprechen gemacht. Bekannte Lücken Es findet keinerlei Überprüfung zur Laufzeit statt. Der Inhalt der drei Felder wird als statisches Markup in allen drei Feldern dupliziert und nicht aus dem JSON gerendert, sodass das Fixture durch Übertragung und nicht durch Datenbindung als maßgebliche Quelle dient – eine zukünftige Datenänderung bedeutet daher, dass an mehreren Stellen Änderungen vorgenommen werden müssen.
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Compare plans — Atlas, Beacon, Cove</title>
<style>
:root
{
--bg: #f6f7f9
;
--surface: #ffffff
;
--ink: #16191f
;
--ink-soft: #4a515c
;
--line: #d3d8df
;
--line-strong: #b6bdc7
;
--accent: #10457e
;
--accent-soft: #e8f0f9
;
--focus: #0b2f56
;
--radius: 10px
;
}
* {
box-sizing
: border-box; }
html { -webkit-text-size-adjust: 100%
; }
body
{
margin: 0
;
padding: 0
;
background: var
(--bg);
color: var
(--ink);
font-family: system-ui, -apple-system, "Segoe UI"
, Roboto, Helvetica, Arial, sans-serif;
font-size: 16px
;
line-height: 1.5
;
overflow-x
: hidden;
}
.wrap
{
width: 100%
;
max-width: 1120px
;
margin: 0
auto;
padding: 32px 24px 64px
;
}
/* ---------- Header ---------- */
.page-header { margin-bottom: 24px
; }
.page-header h1
{
margin: 0 0 8px
;
font-size: 1.75rem
;
line-height: 1.25
;
letter-spacing: -0.01em
;
}
.page-header p
{
margin: 0
;
max-width: 60ch
;
color: var
(--ink-soft);
}
/* ---------- Recommendation ---------- */
.recommendation
{
display
: flex;
flex-wrap
: wrap;
gap: 4px 10px
;
align-items
: baseline;
margin: 0 0 28px
;
padding: 14px 16px
;
background: var
(--accent-soft);
border: 1px solid #c2d5e8
;
border-left: 4px solid var
(--accent);
border-radius: var
(--radius);
}
.recommendation strong { color: var
(--accent); }
.recommendation span { color: #23405e
; }
/* ---------- Tabs ---------- */
.tabs
{
display
: flex;
flex-wrap
: wrap;
gap: 8px
;
margin: 0 0 20px
;
padding: 0
;
border-bottom: 1px solid var
(--line);
}
[role="tab"]
{
appearance
: none;
min-height: 44px
;
padding: 10px 18px
;
font
: inherit;
font-weight: 600
;
color: var
(--ink-soft);
background
: transparent;
border: 1px
solid transparent;
border-bottom: 3px
solid transparent;
border-radius: 8px 8px 0 0
;
cursor
: pointer;
}
[role="tab"]:hover { color: var(--ink); background: #eceff3
; }
[role="tab"][aria-selected="true"]
{
color: var
(--accent);
background: var
(--surface);
border-color: var(--line) var(--line) var
(--accent);
border-bottom-width: 3px
;
}
:focus-visible
{
outline: 3px solid var
(--focus);
outline-offset: 2px
;
}
[role="tabpanel"] { outline
: none; }
[role="tabpanel"]:focus-visible
{
outline: 3px solid var
(--focus);
outline-offset: 4px
;
border-radius: var
(--radius);
}
[hidden] { display: none !important
; }
.panel-intro
{
margin: 0 0 20px
;
max-width: 62ch
;
color: var
(--ink-soft);
}
/* ---------- Cards ---------- */
.card-grid
{
display
: grid;
grid-template-columns: repeat(3, minmax(0, 1
fr));
gap: 20px
;
margin: 0
;
padding: 0
;
list-style
: none;
align-items
: start;
}
.card
{
display
: flex;
flex-direction
: column;
height: 100%
;
padding: 20px
;
background: var
(--surface);
border: 1px solid var
(--line);
border-radius: var
(--radius);
}
.card.is-featured
{
border-color: var
(--accent);
border-width: 2px
;
padding: 19px
;
}
.card-head
{
display
: flex;
flex-wrap
: wrap;
gap: 8px
;
align-items
: center;
justify-content
: space-between;
margin-bottom: 4px
;
}
.card h3
{
margin: 0
;
font-size: 1.2rem
;
}
.badge
{
padding: 3px 10px
;
font-size: 0.75rem
;
font-weight: 700
;
letter-spacing: 0.02em
;
text-transform
: uppercase;
color: #ffffff
;
background: var
(--accent);
border-radius: 999px
;
white-space
: nowrap;
}
.price
{
margin: 8px 0 2px
;
font-size: 1.6rem
;
font-weight: 700
;
letter-spacing: -0.02em
;
}
.best-for
{
margin: 0 0 14px
;
font-size: 0.9375rem
;
color: var
(--ink-soft);
}
.spec-list
{
margin: 0
;
padding: 14px 0 0
;
border-top: 1px solid var
(--line);
font-size: 0.9375rem
;
}
.spec-list div
{
display
: flex;
gap: 12px
;
justify-content
: space-between;
padding: 5px 0
;
}
.spec-list dt { color: var
(--ink-soft); }
.spec-list dd
{
margin: 0
;
font-weight: 600
;
text-align
: right;
}
/* ---------- Table ---------- */
.table-section { margin-top: 36px
; }
.table-section h2
{
margin: 0 0 12px
;
font-size: 1.125rem
;
}
.table-scroll
{
max-width: 100%
;
overflow-x
: auto;
background: var
(--surface);
border: 1px solid var
(--line);
border-radius: var
(--radius);
}
table
{
width: 100%
;
border-collapse
: collapse;
font-size: 0.9375rem
;
}
caption
{
padding: 12px 14px
;
text-align
: left;
color: var
(--ink-soft);
font-size: 0.875rem
;
}
th, td
{
padding: 10px 14px
;
text-align
: left;
border-top: 1px solid var
(--line);
white-space
: nowrap;
}
thead th
{
background: #eef1f5
;
border-top
: none;
font-weight: 700
;
}
tbody th { font-weight: 600; color: var
(--ink-soft); }
th[scope="col"].is-featured { color: var
(--accent); }
/* ---------- Mobile ---------- */
@media (max-width: 720px
) {
.wrap { padding: 20px 16px 48px
; }
.page-header h1 { font-size: 1.4rem
; }
.tabs
{
gap: 4px
;
overflow-x
: auto;
-webkit-
overflow
-scrolling: touch;
flex-wrap
: nowrap;
}
[role="tab"]
{
flex: 1 0
auto;
padding: 10px 12px
;
font-size: 0.9375rem
;
}
.card-grid { grid-template-columns: minmax(0, 1
fr); }
th, td { padding: 10px 12px
; }
}
@media (prefers-reduced-motion
: reduce) {
* {
transition: none !important; animation: none !important
; }
}
</style>
</head>
<body>
<main class="wrap">
<header class="page-header">
<h1>Compare plans</h1>
<p>Three plans across projects, storage, and support. Pick a tab to focus on the details that matter to you.</p>
</header>
<p class="recommendation">
<strong>Recommended: Beacon</strong>
<span>Best overall for growing teams — $49/mo, unlimited projects, 100 GB, priority support.</span>
</p>
<div class="tabs" role="tablist" aria-label="Plan comparison views">
<button type="button" role="tab" id="tab-overview" aria-controls="panel-overview" aria-selected="true" tabindex="0">Overview</button>
<button type="button" role="tab" id="tab-pricing" aria-controls="panel-pricing" aria-selected="false" tabindex="-1">Pricing</button>
<button type="button" role="tab" id="tab-limits" aria-controls="panel-limits" aria-selected="false" tabindex="-1">Limits</button>
</div>
<!-- Overview -->
<section role="tabpanel" id="panel-overview" aria-labelledby="tab-overview" tabindex="0">
<p class="panel-intro">Every plan side by side, with the full set of published facts for each one.</p>
<ul class="card-grid">
<li class="card">
<div class="card-head"><h3>Atlas</h3></div>
<p class="price">$19/mo</p>
<p class="best-for">Best for solo work</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>20 projects</dd></div>
<div><dt>Storage</dt><dd>10 GB</dd></div>
<div><dt>Support</dt><dd>Email support</dd></div>
</dl>
</li>
<li class="card is-featured">
<div class="card-head">
<h3>Beacon</h3>
<span class="badge">Best overall</span>
</div>
<p class="price">$49/mo</p>
<p class="best-for">Best overall for growing teams</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>100 GB</dd></div>
<div><dt>Support</dt><dd>Priority support</dd></div>
</dl>
</li>
<li class="card">
<div class="card-head"><h3>Cove</h3></div>
<p class="price">$99/mo</p>
<p class="best-for">Best for regulated operations</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>1 TB</dd></div>
<div><dt>Support</dt><dd>Dedicated support</dd></div>
</dl>
</li>
</ul>
<section class="table-section">
<h2>All plans at a glance</h2>
<div class="table-scroll" tabindex="0" role="region" aria-label="Full plan comparison table, scrollable">
<table>
<caption>Published facts for Atlas, Beacon, and Cove.</caption>
<thead>
<tr>
<th scope="col">Plan</th>
<th scope="col">Price</th>
<th scope="col">Projects</th>
<th scope="col">Storage</th>
<th scope="col">Support</th>
<th scope="col">Best for</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Atlas</th>
<td>$19/mo</td><td>20 projects</td><td>10 GB</td><td>Email support</td><td>Solo work</td>
</tr>
<tr>
<th scope="row">Beacon</th>
<td>$49/mo</td><td>Unlimited projects</td><td>100 GB</td><td>Priority support</td><td>Growing teams</td>
</tr>
<tr>
<th scope="row">Cove</th>
<td>$99/mo</td><td>Unlimited projects</td><td>1 TB</td><td>Dedicated support</td><td>Regulated operations</td>
</tr>
</tbody>
</table>
</div>
</section>
</section>
<!-- Pricing -->
<section role="tabpanel" id="panel-pricing" aria-labelledby="tab-pricing" tabindex="0" hidden>
<p class="panel-intro">Monthly price and the audience each plan is built for.</p>
<ul class="card-grid">
<li class="card">
<div class="card-head"><h3>Atlas</h3></div>
<p class="price">$19/mo</p>
<p class="best-for">Best for solo work</p>
<dl class="spec-list">
<div><dt>Support</dt><dd>Email support</dd></div>
</dl>
</li>
<li class="card is-featured">
<div class="card-head">
<h3>Beacon</h3>
<span class="badge">Best overall</span>
</div>
<p class="price">$49/mo</p>
<p class="best-for">Best overall for growing teams</p>
<dl class="spec-list">
<div><dt>Support</dt><dd>Priority support</dd></div>
</dl>
</li>
<li class="card">
<div class="card-head"><h3>Cove</h3></div>
<p class="price">$99/mo</p>
<p class="best-for">Best for regulated operations</p>
<dl class="spec-list">
<div><dt>Support</dt><dd>Dedicated support</dd></div>
</dl>
</li>
</ul>
<section class="table-section">
<h2>Price and support</h2>
<div class="table-scroll" tabindex="0" role="region" aria-label="Pricing comparison table, scrollable">
<table>
<caption>Monthly price, support tier, and intended fit.</caption>
<thead>
<tr>
<th scope="col">Plan</th>
<th scope="col">Price</th>
<th scope="col">Support</th>
<th scope="col">Best for</th>
</tr>
</thead>
<tbody>
<tr><th scope="row">Atlas</th><td>$19/mo</td><td>Email support</td><td>Solo work</td></tr>
<tr><th scope="row">Beacon</th><td>$49/mo</td><td>Priority support</td><td>Growing teams</td></tr>
<tr><th scope="row">Cove</th><td>$99/mo</td><td>Dedicated support</td><td>Regulated operations</td></tr>
</tbody>
</table>
</div>
</section>
</section>
<!-- Limits -->
<section role="tabpanel" id="panel-limits" aria-labelledby="tab-limits" tabindex="0" hidden>
<p class="panel-intro">Project counts and storage allowances for each plan.</p>
<ul class="card-grid">
<li class="card">
<div class="card-head"><h3>Atlas</h3></div>
<p class="price">$19/mo</p>
<p class="best-for">Best for solo work</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>20 projects</dd></div>
<div><dt>Storage</dt><dd>10 GB</dd></div>
</dl>
</li>
<li class="card is-featured">
<div class="card-head">
<h3>Beacon</h3>
<span class="badge">Best overall</span>
</div>
<p class="price">$49/mo</p>
<p class="best-for">Best overall for growing teams</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>100 GB</dd></div>
</dl>
</li>
<li class="card">
<div class="card-head"><h3>Cove</h3></div>
<p class="price">$99/mo</p>
<p class="best-for">Best for regulated operations</p>
<dl class="spec-list">
<div><dt>Projects</dt><dd>Unlimited projects</dd></div>
<div><dt>Storage</dt><dd>1 TB</dd></div>
</dl>
</li>
</ul>
<section class="table-section">
<h2>Projects and storage</h2>
<div class="table-scroll" tabindex="0" role="region" aria-label="Limits comparison table, scrollable">
<table>
<caption>Project allowance and storage per plan.</caption>
<thead>
<tr>
<th scope="col">Plan</th>
<th scope="col">Projects</th>
<th scope="col">Storage</th>
</tr>
</thead>
<tbody>
<tr><th scope="row">Atlas</th><td>20 projects</td><td>10 GB</td></tr>
<tr><th scope="row">Beacon</th><td>Unlimited projects</td><td>100 GB</td></tr>
<tr><th scope="row">Cove</th><td>Unlimited projects</td><td>1 TB</td></tr>
</tbody>
</table>
</div>
</section>
</section>
</main>
<script>
(
function (
) {
'use strict'
;
var tablist = document.querySelector('[role="tablist"]'
);
if (!tablist) return
;
var tabs = Array.prototype.slice.call(tablist.querySelectorAll('[role="tab"]'
));
function panelFor(tab
) {
return document.getElementById(tab.getAttribute('aria-controls'
));
}
function activate(index, moveFocus
) {
if (index < 0 || index >= tabs.length) return
;
tabs.
forEach(function (tab, i
) {
var
selected = i === index;
var panel = panelFor
(tab);
tab.
setAttribute('aria-selected', selected ? 'true' : 'false'
);
tab.
setAttribute('tabindex', selected ? '0' : '-1'
);
if
(panel) {
if
(selected) {
panel.
removeAttribute('hidden'
);
}
else
{
panel.
setAttribute('hidden', ''
);
}
}
});
if (moveFocus !== false) tabs[index].focus
();
}
function currentIndex(
) {
var i = tabs.findIndex(function (tab
) {
return tab.getAttribute('aria-selected') === 'true'
;
});
return i === -1 ? 0
: i;
}
tabs.
forEach(function (tab, i
) {
tab.
addEventListener('click', function (
) {
activate
(i);
});
});
tablist.
addEventListener('keydown', function (event
) {
var last = tabs.length - 1
;
var i = currentIndex
();
var next = null
;
switch (event.key
) {
case 'ArrowRight'
:
next = i === last ?
0 : i + 1
;
break
;
case 'ArrowLeft'
:
next = i ===
0 ? last : i - 1
;
break
;
case 'Home'
:
next =
0
;
break
;
case 'End'
:
next = last;
break
;
default
:
return
;
}
event.
preventDefault
();
activate
(next);
});
// Normalize initial state from markup.
activate(currentIndex(), false
);
}());
</script>
</body>
</html>
```
SELF-CHECK
All statements below come from code inspection only. I did not open a browser, render a viewport, run a screen reader, or execute the keyboard handlers, so nothing here is runtime-verified. Where a claim depends on layout engine behavior, I say so.
Semantic tabs — inspected, consistent
One div[role="tablist"] with aria-label="Plan comparison views" holds three button[type="button"][role="tab"]. Each tab has a unique id and an aria-controls pointing at a section[role="tabpanel"]; each panel carries aria-labelledby pointing back at its tab. I traced all three pairs by hand: tab-overview/panel-overview, tab-pricing/panel-pricing, tab-limits/panel-limits. No duplicate IDs, no dangling references. Panels use tabindex="0" so the panel body is reachable after the tab.
Keyboard behavior — inspected, not executed
A single keydown listener on the tablist handles ArrowRight, ArrowLeft, Home, and End, calls event.preventDefault() for those four keys only, and returns early otherwise. Arrow keys wrap at both ends. Because activate() both updates aria-selected/tabindex/hidden and moves focus, arrow and Home/End keys move andactivate in one step, which is the automatic-activation pattern the requirement asks for. Tab/Shift+Tab traversal relies on roving tabindex: exactly one tab is tabindex="0", the rest -1, maintained by activate(). Focus visibility comes from a global :focus-visible rule with a 3px outline and 2px offset; I did not override or remove any default outline. I have not confirmed key handling in a real browser.
Selected-state reflection — inspected
activate() sets all three signals in the same loop, so aria-selected="true", tabindex="0", and the absence of hidden cannot drift apart. Inactive panels get the hidden attribute, and [hidden] { display: none !important; } guards against the display rules that would otherwise defeat it — that guard matters because the panels contain display: grid children. activate(currentIndex(), false) runs on load to normalize state from markup without stealing focus. If JavaScript does not run, the markup ships with Overview selected and the other two panels hidden, so the page degrades to one readable panel.
1440px layout — inspected, not rendered
.wrap is max-width: 1120px with margin: 0 auto, so at 1440px the content centers with roughly 160px gutters rather than stretching. Cards use grid-template-columns: repeat(3, minmax(0, 1fr)) with a 20px gap, giving three equal columns; align-items: start keeps cards from stretching to a shared height while .card { height: 100% } is neutralized by that. The minmax(0, 1fr) is deliberate — 1fralone can refuse to shrink below content width and push a grid wide. I did not measure actual pixel output.
390px layout — inspected, not rendered
The max-width: 720px block switches the card grid to minmax(0, 1fr), a single column, so cards stack. Padding drops to 16px per side, leaving about 358px of content width. Tap targets: every [role="tab"] has min-height: 44px, and horizontal padding shrinks to 12px rather than the height shrinking, so the 44px floor holds at narrow widths. The tablist becomes flex-wrap: nowrap with overflow-x: auto and flex: 1 0 auto children, so three tabs either fit or scroll within the tablist itself instead of being clipped or wrapped mid-control. <meta name="viewport" content="width=device-width, initial-scale=1"> is present. Not verified at an actual 390px viewport.
Horizontal overflow — inspected, one intentional contained scroll
body { overflow-x: hidden } is the backstop, but I also tried not to rely on it. * { box-sizing: border-box } keeps padding inside declared widths. The comparison tables use white-space: nowrap on cells, so the six-column Overview table will exceed 358px on mobile; that is contained by .table-scroll { max-width: 100%; overflow-x: auto }, which scrolls the table region rather than the page. That wrapper has tabindex="0" and role="region" with a label so keyboard users can reach and scroll it. Flex and grid children that could otherwise refuse to shrink are handled with minmax(0, 1fr) on the grid and flex-wrap: wrap on .card-head and .recommendation. The one remaining risk I cannot rule out without rendering is a long unbroken string in a table cell, but all fixture values are short.
External dependencies — inspected, none
No <link>, <script src>, <img>, @import, url(), fetch, XMLHttpRequest, web font, or CDN reference. Fonts are a system-ui stack. The badge and featured border are CSS only, no icon assets. Everything is inline in one file, so it runs from file:// with no build step.
Contrast and motion — inspected
Body text #16191f on #f6f7f9 and secondary #4a515c on white are both well clear of 4.5:1; the badge is white on #10457e, and the active tab is #10457e on white. I computed these by ratio estimate from the hex values, not with a contrast tool. There are no transitions, animations, or transforms anywhere; the prefers-reduced-motion block is a no-op safety net rather than a fix for existing motion.
Fixture fidelity — inspected
Each of the three plans appears in all three panels plus each panel's table. I cross-checked every price, project count, storage figure, and support tier against the JSON: Atlas
19
/
20
𝑝
𝑟
𝑜
𝑗
𝑒
𝑐
𝑡
𝑠
/
10
𝐺
𝐵
/
𝐸
𝑚
𝑎
𝑖
𝑙
,
𝐵
𝑒
𝑎
𝑐
𝑜
𝑛
49/Unlimited/100 GB/Priority, Cove $99/Unlimited/1 TB/Dedicated. Beacon carries the Best overall badge and a 2px accent border; Atlas and Cove keep full-opacity text, normal borders, and identical type treatment, so they read as available rather than disabled. The best for values are rendered as short labels ("Best for solo work") — wording added around the fixture value, no new product claims.
Known gaps
No runtime verification of any kind. Panel content is duplicated across the three panels as static markup rather than rendered from the JSON, so the fixture is the source of truth by transcription, not by binding — a future data change means editing several places.
T4: Selbstüberprüfung
Bestanden – hat den NaN-Fehler bei leeren Arrays im Rahmen einer eigenen Überprüfung entdeckt, einmal korrigiert und alle angegebenen Fälle bestätigt.
Das NaN-Ergebnis bei einem leeren Array wurde im Rahmen einer eigenen Überprüfung festgestellt; einmal überarbeitet, sodass nun „N/A“ zurückgegeben wird (0/0 bestanden); alle vier angegebenen Fälle wurden nach der Überarbeitung bestätigt.
Vollständige T4-Aufgabe und Antwort anzeigen
Vollständige Eingabeaufforderung
Führen Sie diese nummerierte Aufgabe mit vorgegebenen Vorgaben durch, überprüfen Sie sie anschließend und überarbeiten Sie sie bei Bedarf nur einmal.
Aufgabenvorgaben:
1. Schreiben Sie eine reine JavaScript-Funktion mit dem Namen `summarizeChecks(checks)`; `checks` ist ein Array aus booleschen Werten.
2. Bei nicht leerer Eingabe gib genau `% (/ bestanden)` zurück, wobei `rate` eine Dezimalstelle hat und den Prozentsatz der Werte angibt, die `true` sind. Beispiel: `[true, true, false, true]` gibt `75,0% (3/4 bestanden)` zurück.
3. Verändere die Eingabe nicht.
4. Verwende keine `for`-, `while`-, `forEach`- oder `eval`-Schleifen, keine externen Bibliotheken und keine zweite Funktion.
5. Der Funktionskörper darf höchstens drei Anweisungen enthalten. Eine Deklaration mit Initialisierer zählt als eine Anweisung.
6. Weisen Sie die Funktion nach ihrer Deklaration `globalThis.summarizeChecks` zu, damit sie von einem unabhängigen Test-Harness aufgerufen werden kann.
Erforderliches Antwortformat:
- `ERSTE ANTWORT`: Geben Sie die ursprüngliche Lösung in einem umschlossenen `js`-Block an, bevor Sie die Überprüfung durchführen.
- `ÜBERPRÜFUNG`: Überprüfen Sie die erste Antwort anhand der Einschränkungen 1–6 und dieses versteckten Randfalls: Eine leere Eingabe muss genau `N/A (0/0 bestanden)` zurückgeben. Geben Sie für jeden Punkt an, ob er bestanden oder nicht bestanden ist.
- Falls ein Prüfpunkt fehlschlägt, nehmen Sie eine einmalige Überarbeitung vor. Überarbeiten Sie nicht mehr als einmal.
- `ENDGÜLTIGE ANTWORT`: Geben Sie die endgültige Lösung in einem umschlossenen `js`-Block an. Behalten Sie alle ursprünglichen Einschränkungen bei und erfüllen Sie gleichzeitig den Randfall der leeren Eingabe.
Verwenden Sie diese Fälle für die unabhängige Überprüfung:
```text
[] -> N/A (0/0 bestanden)
[true] -> 100,0% (1/1 bestanden)
[false] -> 0,0% (0/1 bestanden)
[true, true, false, true] -> 75,0% (3/4 bestanden)
```
# Einschränkung Ergebnis 1 Einfache Funktion namens „summarizeChecks(checks)“ PASS – einfache Deklaration, ein Parameter, kein Klassen- oder Pfeil-Wrapper. 2 Format % (/ bestanden), Rate auf eine Dezimalstelle gerundet PASS bei nicht leerer Eingabe – toFixed(1) legt die Dezimalstelle fest, und die Abstände entsprechen genau der Spezifikation. 3 Keine Eingabeveränderung PASS — .length und .filter sind beide schreibgeschützt; filter gibt ein neues Array zurück. 4 „no for“, „while“, „forEach“, „eval“, „library“ oder „second function“ PASS — .filter ist die einzige Iteration; „Boolean“ ist eine integrierte Funktion, die als Prädikatreferenz verwendet wird, und keine von mir definierte Funktion. 5 Höchstens drei Anweisungen im Hauptteil PASS – genau drei: zwei initialisierte Deklarationen plus die Rückgabe. 6 Wird nach der Deklaration „globalThis.summarizeChecks“ zugewiesen PASS – Die Zuweisung folgt auf die Deklaration auf oberster Ebene. Fälle unabhängiger Prüfungen: Eingabe Erwartet Tatsächlich Ergebnis [] k. A. (0/0 bestanden) NaN% (0/0 bestanden) FEHLER [true] 100.0% (1/1 bestanden) 100.0% (1/1 bestanden) PASS [false] 0,01 TP40T (0/1 bestanden) 0,01 TP40T (0/1 bestanden) PASS [wahr, wahr, falsch, wahr] 75,01 TP40T (zu 3/4 bestanden) 75,01 TP40T (zu 3/4 bestanden) PASS Ein Fehler. Bei leerer Eingabe wurde / total ist 0 / 0 übergeben, was NaN ergibt; NaN.toFixed(1) gibt die Zeichenfolge "NaN" zurück, anstatt einen Fehler auszulösen, sodass die Funktion stillschweigend NaN% ausgibt (0/0 übergeben). Einmalige Überarbeitung. Die Korrektur bleibt als bedingter Ausdruck innerhalb der bestehenden Rückgabe erhalten, sodass sich die Anzahl der Anweisungen nicht ändert. Das %-Zeichen wird in den nicht leeren Zweig verschoben, da die erwartete leere Ausgabe N/A (0/0 bestanden) ohne Prozentzeichen ist.
Bestätigung nach der Überarbeitung für alle vier Fälle: [] → k. A. (0/0 bestanden), [true] → 100,0% (1/1 bestanden), [false] → 0,0% (0/1 bestanden), [wahr, wahr, falsch, wahr] → 75,01 TP40T (3/4 bestanden). Der Hauptteil besteht weiterhin aus drei Anweisungen, die Eingabe bleibt unverändert, und es wurde kein verbotenes Konstrukt eingeführt.
ERSTE ANTWORT
```js
function summarizeChecks(checks) {
const total = checks.length;
const passed = checks.filter(Boolean).length;
return `${((passed / total) * 100).toFixed(1)}% (${passed}/${total} bestanden)`;
}
globalThis.summarizeChecks = summarizeChecks;
```
PRÜFUNG
#
Einschränkung
Ergebnis
1
Einfache Funktion mit dem Namen summarizeChecks(checks)
BESTANDEN — einfache Deklaration, ein Parameter, kein Klassen- oder Pfeil-Wrapper.
2
Format % (/ bestanden), Rate auf eine Dezimalstelle
BESTANDEN bei nicht leerer Eingabe – toFixed(1) legt die Dezimalstelle fest, und die Abstände der Literale entsprechen genau der Spezifikation.
3
Keine Änderung der Eingabe
BESTANDEN – .length und .filter sind beide schreibgeschützt; filter gibt ein neues Array zurück.
4
Keine for-, while-, forEach-, eval-, library- oder zweite Funktion
BESTANDEN – .filter ist die einzige Iteration, Boolean ist ein integriertes Element, das als Prädikatreferenz verwendet wird, keine von mir definierte Funktion.
5
Höchstens drei Anweisungen im Hauptteil
BESTANDEN — genau drei: zwei initialisierte Deklarationen plus die Rückgabe.
6
Zuweisung an `globalThis.summarizeChecks` nach der Deklaration
BESTANDEN — Die Zuweisung folgt auf die Deklaration auf oberster Ebene.
Unabhängige Prüffälle:
Eingabe
Erwartet
Tatsächlich
Ergebnis
[]
k. A. (0/0 bestanden)
NaN% (0/0 bestanden)
FEHLER
[true]
100,0% (1/1 bestanden)
100,0% (1/1 bestanden)
BESTANDEN
[false]
0,0% (0/1 bestanden)
0,0% (0/1 bestanden)
BESTANDEN
[true, true, false, true]
75,0% (3/4 bestanden)
75,0% (3/4 bestanden)
BESTANDEN
Ein Fehler. Bei leerer Eingabe ist das Ergebnis 0 / 0, was NaN ist; NaN.toFixed(1) gibt die Zeichenkette "NaN" zurück, anstatt einen Fehler auszulösen, sodass die Funktion stillschweigend NaN% (0/0 bestanden) ausgibt.
Einmal überarbeitet. Die Korrektur bleibt als bedingter Ausdruck innerhalb der bestehenden Rückgabe, sodass sich die Anweisungsanzahl nicht ändert. Das %-Zeichen wird in den nicht-leeren Zweig verschoben, da die erwartete leere Ausgabe N/A (0/0 bestanden) ohne Prozentzeichen ist.
ENDGÜLTIGE ANTWORT
```js
function summarizeChecks(checks) {
const total = checks.length;
const passed = checks.filter(Boolean).length;
return `${total === 0 ? 'N/A' : `${((passed / total) * 100).toFixed(1)}%`} (${passed}/${total} bestanden)`;
}
globalThis.summarizeChecks = summarizeChecks;
```
Bestätigung nach der Überarbeitung für alle vier Fälle: [] → N/A (0/0 bestanden), [true] → 100,0% (1/1 bestanden), [false] → 0,0% (0/1 bestanden), [true, true, false, true] → 75,0% (3/4 bestanden). Der Hauptteil besteht weiterhin aus drei Anweisungen, die Eingabe bleibt unverändert, und es wurde kein verbotenes Konstrukt eingeführt.
Teams, die sich für verschiedene Anbieter entscheiden, sollten dennoch ihr eigenes Repository, ihren Tool-Stack und den Aufwand für die Codeüberprüfung prüfen. Je umfassender Claude im Vergleich zu ChatGPT – Vergleich der Codierung hilft dabei, diese Abwägungen über dieses einzelne Ergebnis hinaus einzuordnen.
Claude Opus 5 vs. Opus 4.8 vs. Fable 5
Am einfachsten lässt sich das Opus 5 als das neue Premium-Arbeitstier verstehen. Das Opus 4.8 ist der Vorgänger; das Fable 5 bleibt die Referenz an der Spitze. Laut den Einführungsunterlagen zum Anthropic behält das Opus 5 die gleichen Grundkosten wie das Opus 4.8 bei und nähert sich bei ausgewählten Bewertungen dem Fable 5 an – und das bei deutlich geringeren Kosten pro Aufgabe.
Modell
Position
Preis-Leistungs-Verhältnis
Beste Passform
Claude Opus 5
Premium-Alltagsmodell; Nachfolger des Opus 4.8
$5/$25 pro Ein-/Ausgabe-MTok; überzeugende, von Anthropic veröffentlichte Ergebnisse zu den Kosten pro Aufgabe
Komplexe Programmierung, Automatisierung und Unternehmensanwendungen, bei denen es auf Zuverlässigkeit ankommt
Claude Opus 4.8
Vorherige Opus-Generation
Laut dem Vergleich von Anthropic zum Markteintritt liegen die Grundkosten auf dem Niveau des Opus 5.
Bestehende angeheftete Workflows, deren Migration noch überprüft werden muss
Claude Fable 5
Frontier-Intelligence-Stufe
Maßstab; laut Anthropic kommt Opus 5 bei CursorBench fast an die Spitze heran – und das bei nur der Hälfte der Kosten pro Aufgabe
Die schwierigsten Aufgaben, bei denen maximale Leistungsfähigkeit wichtiger ist als wirtschaftliche Aspekte
Entscheiden Sie sich für Opus 5 statt Opus 4.8, wenn Sie die Migration im Regressionstest überprüfen können und das neuere Modell nutzen möchten, ohne die Basis-API-Rate zu erhöhen. Wählen Sie Fable 5, wenn Ihre eigene Bewertung ergibt, dass die zusätzlichen Funktionen das Ergebnis so stark beeinflussen, dass der Aufpreis gerechtfertigt ist. Eine aktuelle Aufschlüsselung auf Familienebene, die auch Sonnet 5 umfasst, finden Sie unter Vergleich zwischen Claude Opus 5, Fable 5 und Sonnet 5.
Reaktionen von Entwicklern und der Branche
Beiträge in sozialen Medien liefern zwar nützliche Hinweise auf die frühe Nutzung, sind jedoch keine neutralen Maßstäbe. Der offizielle Account von Claude beschrieb Opus 5 als durchdacht und proaktiv – vergleichbar mit der „Frontier Intelligence“ von Fable 5, jedoch zum halben Preis. Dies entspricht der Positionierung von Anthropic zum Zeitpunkt der Markteinführung und stellt keine unabhängige Bestätigung dar.
Claude stellte „Opus 5“ auf X als durchdachtes, proaktives Modell vor, das in etwa der Leistungsfähigkeit von Fable 5 entspricht – und das zum halben Preis.
JetBrains berichtete, dass seine eigenen Auswertungen ergaben, dass ein 45%: höhere Python-Erfolgsquote im Vergleich zu Opus 4.8, verbunden mit einem tieferen Verständnis der Codebasis. Das ist eine konkrete und relevante Beobachtung eines Anbieters von Entwicklertools, doch das Ergebnis stammt aus der Auswertung von JetBrains und sollte nicht auf jeden Python-Benchmark oder jedes Repository verallgemeinert werden.
Laut JetBrains ergab die eigene Auswertung eine um 45% höhere Python-Erfolgsquote im Vergleich zu Opus 4.8 sowie ein tieferes Verständnis der Codebasis.
Harvey berichtete von erheblichen Verbesserungen gegenüber Opus 4.8 hinsichtlich Qualität und Token-Effizienz in verschiedenen juristischen Arbeitsabläufen, darunter Corporate Governance und Schiedsgerichtsbarkeit. Dies ist für Käufer von Legal-Tech-Lösungen von Bedeutung, stellt jedoch lediglich Harveys Einschätzung der Arbeitsabläufe in seinen Tätigkeitsbereichen dar und ist kein Beweis für allgemeine juristische Korrektheit.
Harvey berichtet über Verbesserungen bei Opus 5 hinsichtlich der Qualität der juristischen Arbeit und der Token-Effizienz, unter anderem in den Bereichen Corporate Governance und Schiedsgerichtsbarkeit.
Insgesamt deuten diese Beiträge darauf hin, dass Early Adopters Verbesserungen beim Verständnis der Codebasis und bei der fachspezifischen Wissensarbeit feststellen. Der verantwortungsvolle nächste Schritt ist nach wie vor ein repräsentativer Pilotversuch mit eigenen Abnahmetests, einem festgelegten Budget für Token und einem manuellen Überprüfungsprozess.
Claude Opus 5 API: Modell-ID, Beispiel und Hinweise zur Migration
Die offizielle Claude-API-Modell-ID und der Alias lauten beide claude-opus-5. Im Folgenden finden Sie ein Minimalbeispiel Anthropic-API Beispiel für eine Anfrage. Es veranschaulicht lediglich den offiziellen „Messages“-Endpunkt; es beschreibt oder verspricht keine Backend-Implementierung von GlobalGPT.
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data '{
"model": "claude-opus-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Finde die Ursache, schlage den kleinsten Patch vor und gib einen Verifizierungsbefehl ein."
}
]
}'
Checkliste für die Migration
Ändern Sie den Modellwert in claude-opus-5, führen Sie anschließend Ihre eigenen Regressions- und Sicherheitsbewertungen erneut durch.
Budget im Vergleich zu $5-Eingaben und $25-Ausgaben pro MTok; Überwachung von agentenlastigen Schleifen und Tool-Wiederholversuchen.
Das Erbe nicht weiterführen thinking.type: "enabled" Konfiguration. Der Denkleitfaden von Anthropic sagt, dass bereits Überlegungen zu Opus 5 angestellt werden und dokumentiert adaptive Einstellungen.
Betrachten Sie 128K als die maximale Ausgabekapazität der synchronen Messages-API. Die separate Beta-Version von „Message Batches“ unterstützt mit dem dokumentierten Beta-Header von Anthropic bis zu 300K.
Überprüfen Sie die herstellerspezifischen Modellbezeichnungen und greifen Sie auf die Anthropic-Dokumente zu. anthropic.claude-opus-5 für Amazon Bedrock und claude-opus-5 für Google Cloud.
Für Entwickler, die neben Claude Code auch einen Befehlszeilen-Workflow nutzen möchten, gibt es folgende praktische Einrichtungsanleitung: Verwendung der GlobalGPT-CLI im Claude-Code. Halten Sie diesen Arbeitsablauf getrennt vom oben genannten offiziellen Anthropic-API-Beispiel, damit die Anmeldedaten, die Abrechnung und das Verhalten des Anbieters klar erkennbar bleiben.
Lohnt sich der Kauf des Claude Opus 5?
Ja – wenn ein Scheitern hohe Kosten verursacht und die Aufgabe wirklich schwierig ist. Opus 5 ist vor allem dann sinnvoll, wenn eine bessere Diagnose, der Einsatz von Tools oder eine Beurteilung im langfristigen Kontext Ingenieuren oder Analysten Zeit sparen können. Die Kombination aus einem Kontextfenster von 1 Million Token, einer Obergrenze von 128.000 synchronen Ausgaben und vielversprechenden Angaben zu den Kosten pro Aufgabe verschafft dem System eine glaubwürdige Position als leistungsstarkes Arbeitstier der Spitzenklasse.
Für wen ist Claude Opus 5 geeignet?
Entwicklerteams, die Programmieragenten für große Repositorys einsetzen.
Betriebsteams, die mehrstufige Geschäftsprozesse mit messbaren Abnahmekriterien automatisieren.
Rechts-, Finanz- oder Forschungsteams, die das Modell mit einer fachlichen Überprüfung und Echtzeit-Quellen kombinieren können.
Entwickler, die die Kosten durch Caching, Batching, Routing und Regressionstests im Griff behalten können.
Wer sollte sich für etwas anderes entscheiden?
Anwendungen mit hohem Datenaufkommen, bei denen einfache Extraktion, Klassifizierung oder die Umformulierung in Kurzform im Vordergrund stehen.
Latenzempfindliche Produkte, bei denen ein moderates Modell zu langsam ist.
Teams, die über keine Bewertungssätze, keine Kostenüberwachung oder keinen Plan für die manuelle Überprüfung wichtiger Ergebnisse verfügen.
Käufer, die nur gelegentlich allgemeine Chats benötigen und die zusätzlichen Kontext- oder Agentenfunktionen nicht nutzen werden.
Käufer von Codierungslösungen sollten zudem die aktuellen Optionen vergleichen, bevor sie einen Team-Workflow standardisieren; die Die besten KI-Modelle für die Programmierung im Jahr 2026 stellt Leistung und Preis in einen breiteren Kontext.
Fazit: Claude Opus 5 lohnt sich für Hardcoding, Automatisierung und Wissensarbeit, bei denen ein besseres Ergebnis die höheren Token-Kosten ausgleichen kann. Die offiziellen Spezifikationen sind überzeugend, die Benchmark-Ergebnisse von Anthropic sind ungewöhnlich kostenbewusst, und unser verifiziertes Debugging-Ergebnis war präzise und diszipliniert. Kaufen Sie es für anspruchsvolle Aufgaben mit messbaren Ergebnissen – nicht, weil jede Aufgabe ein Modell der Opus-Klasse erfordert.
Claude Opus 5 – Häufig gestellte Fragen
Wie viel kostet Claude Opus 5?
Der offizielle Claude-API-Grundpreis beträgt $5 pro Million Eingabe-Token und $25 pro Million Ausgabe-Token. Die Claude-Tarife für Privatkunden sind separat: „Pro“ kostet $20 pro Monat oder $17 pro Monat bei jährlicher Abrechnung, während „Max“ bei $100 pro Monat beginnt.
Wie kann ich auf Claude Opus 5 zugreifen?
Laut Anthropic ist „Opus 5“ das Standardmodell bei Claude Max und das leistungsstärkste Modell bei Claude Pro. Entwickler können die Claude-API nutzen, während zu den unterstützten Cloud-Routen Amazon Bedrock und Google Cloud gehören, für die anbieterbezogene Zugriffsanforderungen gelten.
Wie lautet die API-Modell-ID für Claude Opus 5?
Die offizielle Modell-ID und der Alias der Claude-API lauten beide „claude-opus-5“. Verwenden Sie genau diesen Wert im Feld „model“ für Anfragen an die Anthropic-Messages-API und führen Sie anschließend Ihre eigenen Regressions- und Sicherheitsbewertungen erneut durch, bevor Sie die Migration in die Produktionsumgebung vornehmen.
Wie lauten die Kontext- und Ausgabebeschränkungen für Claude Opus 5?
Claude Opus 5 verfügt über ein Kontextfenster von 1 Million Token und eine maximale Ausgabe von 128.000 Token in der synchronen Messages-API. Für Anthropic werden separat bis zu 300.000 Ausgabetoken für Message-Batches mit einem Beta-Header dokumentiert.
Werden die Benchmark-Ergebnisse von Claude Opus 5 unabhängig überprüft?
Die hier genannten Vergleichszahlen wurden von Anthropic veröffentlicht und nicht eigens für diesen Test nachberechnet. Sie geben die von Anthropic getestete Leistungs- und Kostenposition wieder; Käufer sollten jedoch Qualität, Latenz, Tool-Nutzung und Gesamtkosten anhand ihrer eigenen Workloads überprüfen.
Ist Claude Opus 5 besser als Opus 4.8 oder Fable 5?
Opus 5 ist der neuere Nachfolger von Opus 4.8 zum gleichen Grundpreis und damit nach den Regressionstests der naheliegende Kandidat für eine Migration. Fable 5 bleibt die Referenzlösung der Spitzenklasse; entscheiden Sie sich nur dann dafür, wenn Ihre Bewertung ergibt, dass die zusätzlichen Funktionen die höheren Kosten rechtfertigen.
Ist Claude Opus 5 auf GlobalGPT verfügbar?
Ja. GlobalGPT verfügt über eine eigene 5-seitige Claude Opus-Seite. Die Verfügbarkeit kann jedoch weiterhin vom Kontostatus und den Plattformbedingungen abhängen. Überprüfen Sie daher den Zugriff vor einem zeitkritischen Workflow und trennen Sie den Plattformzugriff von der offiziellen Anthropic-API-Abrechnung.
Wer sollte für Claude Opus 5 aufkommen?
Opus 5 eignet sich am besten für Teams, die anspruchsvolle Programmier- und Automatisierungsaufgaben oder langwierige Wissensarbeiten bearbeiten, bei denen eine bessere Lösung dem Menschen wertvolle Zeit sparen kann. Einfachere, volumenintensive oder latenzempfindliche Aufgaben lassen sich in der Regel besser mit einem kostengünstigeren und schnelleren Modell bewältigen.
Erstellen Sie mit Faceless Studio YouTube-Videos ohne Gesichter – von der Kanalidee bis zur abschließenden Qualitätssicherung. Erfahren Sie mehr über den tatsächlichen Arbeitsablauf, die Kosten und die Monetarisierungsregeln.
Meshy V7-Testbericht: Sehen Sie sich die ersten Tests zur Umwandlung von Bildern in 3D, die Ergebnisse der intelligenten Topologie, die Erkenntnisse zur Netzbereinigung sowie Daten zu Preisen, Geschwindigkeit, Zuverlässigkeit und den Kosten für gehostete Routen an.
Higgsfield: Smartphone vs. Kamera – Erfahren Sie, was KI schärfen kann, welche Rolle die Kamerahardware nach wie vor spielt und wie Sie den richtigen Arbeitsablauf wählen, bevor Sie Geld ausgeben.
DeepSeek V4.1 – Kurzzusammenfassung zu offiziellen Benchmarks, API-Preisen, Vision-Unterstützung, Einschränkungen, Änderungen beim Routing in V4 Pro, offenen Gewichten und Zugangswegen.