prisma-client-api (prisma/skills)
Referenziert Prisma-Client-Abfragen, Filter, Operatoren und Methoden für CRUD, Beziehungen und Transaktionen.
prisma-client-api: Kein messbarer Effekt: Alle 18 Läufe bestehen jede Prüfung (5.0 Kontrolle, 5.0 One-Liner, 5.0 Skill); das Modell schreibt bereits idiomatisches Prisma
Codex CLI · gpt-6-astra
24.0 / 30
Lift gegenüber ohne Skill: +0.00 · Situativ · 18 Läufe
Situativ: der Lift +0.00 liegt unter +1.0. Für „Empfohlen“ sind insgesamt 22/30, eine Ausgabequalität von 3.5 und ein Lift von +1.0 nötig.
SOTA
BestandenGetestet mit Codex.
Gilt für Codex, Claude Code
Codex CLI 0.166 (SOTA-Stufe): 18 bewertete Läufe. Ein Bestehen hier deckt gemäß unserer Stufenregel auch Claude Code ab; über die zweite Stufe sagt es nichts aus.
Punktzahlen
Jede Dimension reicht von 0 bis 5, und die sechs ergeben zusammen die Gesamtpunktzahl von 30. 5 ist in jeder Dimension besser. Kosten 5 bedeutet günstig und schnell. Installation 5 bedeutet einfach.
- Trigger-Zuverlässigkeit
- 5.0
- Lift gegenüber ohne Skill
- 2.0
- Ausgabequalität
- 5.0
- Token- und Zeitkosten
- 5.0
- Installation und Portabilität
- 3.0
- Sicherheit
- 4.0
Sicherheitsprüfung
SicherStatischer Scan: 9 CRITICAL / 9 HIGH / 0 MEDIUM. Manuelle Prüfung: Sicher in einer Sandbox ohne Netzwerk auszuführen (Scanner-Befunde erklärt). Ein sauberer Scan beweist nicht, dass ein Skill sicher ist.
Installieren
npx skills@latest add prisma/skills --skill prisma-client-api
Fixierter Commit: 8ea289b730c2e89f7ff1f518af128b113d842a92
Getestet: 2026-11-02
Was wir getestet haben
- Typisierte Queries nach einer Beschreibung schreiben — src/queries.ts mit Prisma Client und diesen Funktionen schreiben: getUserWithPosts(id) gibt den Benutzer und nur seine veröffentlichten Beiträge zurück, neueste zuerst, max. 10; searchPosts(term, cursor?) eine cursor-paginierte (Seitengröße 20) Suche im Titel ohne Groß-/Kleinschreibung; upsertUser(…
- Eine N+1-Abfrage entfernen — src/report.ts ist bei großen Tabellen langsam. Das Performance-Problem in src/report.ts beheben und die zurückgegebene Form gleich halten.
- Prisma-Code auf Fehler prüfen — src/search.ts und src/report.ts auf Prisma-Fehler und alles Riskante prüfen; die Probleme auflisten, schwerwiegendstes zuerst. Keine Dateien ändern.
Vorteile
- Der Skill wurde erkannt, ohne genannt zu werden: Skill-Datei in 6/6 Treatment-Läufen gelesen.
- Kein Token-Overhead: 1.05x die Tokens von ohne Skill.
- Hohe absolute Qualität mit dem Skill: 5.0 von 5.
Nachteile
- Kein messbarer Lift gegenüber ohne Skill (+0.00, im Rauschen).
- Ein Ein-Satz-Prompt erzielte 5.0 gegenüber 5.0 mit dem Skill (+0.00).
- Die Kontrolle erreicht bereits 5.0: ein Deckeneffekt, daher kann der Test keinen Lift zeigen.
- n=2 pro Aufgabe und Variante; Unterschiede unter etwa 1 Punkt sind Rauschen.
Bewertung
Codex CLI 0.166 (gpt-6-astra, niedriges Reasoning) auf einem dedizierten Windows-Test-PC, einem frischen temporären Projekt und temporären HOME/TMPDIR/Caches pro Lauf; Skill installiert (Treatment) oder nicht vorhanden (Kontrolle) oder nicht vorhanden mit der Kernanforderung des Skills in einem an den Prompt angehängten Satz (One-Liner-Gruppe); 2 Läufe pro Gruppe und Aufgabe; Netzwerk aus; Schreiben nach /tmp blockiert. Die Prompts nennen den Skill nie (außer der unten genannten Formulierung). Ein kleines Prisma-Projekt (Schema, Seed, src-Dateien). Aufgaben: src/queries.ts mit fünf typisierten Query-Funktionen schreiben (Benutzer mit den letzten 10 veröffentlichten Beiträgen, cursor-paginierte Suche ohne Groß-/Kleinschreibung, Upsert, atomare Übertragung von Beiträgen, ein groupBy-Count), ein N+1 in src/report.ts beheben und dabei die Ausgabeform erhalten, und zwei Dateien auf Prisma-Fehler prüfen (eine per String-Interpolation gebaute Raw-Query und weitere). Die Prompts nennen keine Prisma-Features. Der One-Liner listet die idiomatischen Features in einem Satz.
Drei-Arm-Vergleich
| Variante | Durchschnittsnote (0-5) | Tokens pro Lauf |
|---|---|---|
| Ohne Skill | 5.0 | 92k |
| Ein-Satz-Prompt | 5.0 | 88k |
| Mit Skill | 5.0 | 97k |
Gemessen mit Codex CLI über 18 Läufe, bewertet durch regelbasierte Prüfungen ohne LLM-Richter. Gesamt 24.0 / 30, Urteil Situativ.
Urteil: Situativ (24.0 / 30). Quelle: prisma/skills, prisma-client-api, festgehalten auf Commit 8ea289b. Installation: npx skills@latest add prisma/skills --skill prisma-client-api. Lizenz: Apache-2.0 (Repo-LICENSE).
Was es ist
Der Skill prisma-client-api (prisma/skills): eine Referenz für die Query-API des Prisma Client (findUnique/findMany, select/include, Filter, Cursor-Paginierung, upsert, Transaktionen, groupBy, Raw Queries) plus Anleitungen im Dokumentationsstil, geliefert als SKILL.md und Regeldateien.
So haben wir getestet
Codex CLI 0.166 (gpt-6-astra, niedrige Denkstufe) auf einem dedizierten Windows-Test-PC, pro Lauf ein frisches temporäres Projekt und temporäre HOME/TMPDIR/Caches, Skill installiert (Skill-Gruppe), nicht vorhanden (Kontrollgruppe) oder nicht vorhanden, aber mit der Kernanforderung des Skills in einem an den Prompt angehängten Satz (Ein-Satz-Gruppe), 2 Läufe pro Gruppe und Aufgabe, Netzwerk aus, Schreibzugriffe auf /tmp blockiert. Die Prompts erwähnen den Skill nie (außer der unten genannten Formulierung).
Ein kleines Prisma-Projekt (Schema, Seed, src-Dateien). Aufgaben: src/queries.ts mit fünf typisierten Query-Funktionen schreiben (Nutzer mit den letzten 10 veröffentlichten Beiträgen, cursor-paginierte Suche ohne Groß-/Kleinschreibung, upsert, atomarer Transfer von Beiträgen, ein groupBy-Count), einen N+1 in src/report.ts beheben und dabei die Ausgabeform beibehalten und zwei Dateien auf Prisma-Fehler prüfen (eine per String-Interpolation gebaute Raw Query und weitere). Die Prompts nennen keine Prisma-Features. Der Ein-Satz-Prompt listet die idiomatischen Features in einem Satz.
- Typisierte Queries aus einer Beschreibung schreiben — Schreibe src/queries.ts mit dem Prisma Client und diesen Funktionen: getUserWithPosts(id), die den Nutzer und nur seine veröffentlichten Beiträge zurückgibt, neueste zuerst, maximal 10; searchPosts(term, cursor?), eine cursor-paginierte (Seitengröße 20) Titelsuche ohne Groß-/Kleinschreibung; upsertUser(…
- Eine N+1-Abfrage entfernen — src/report.ts ist bei großen Tabellen langsam. Behebe das Performance-Problem in src/report.ts und behalte die zurückgegebene Form bei.
- Prisma-Code auf Fehler prüfen — Prüfe src/search.ts und src/report.ts auf Prisma-Fehler und alles Riskante; liste die Probleme auf, das schwerwiegendste zuerst. Ändere keine Dateien.
Die Bewertung erfolgt programmatisch (versteckte Tests / Recall eingeschleuster Probleme / Constraint-Prüfungen / Rendern+OCR, wo relevant), 0–5 pro Lauf. Kein LLM-Judge hat eine Punktzahl vergeben.
Ergebnisse
Der Ein-Satz-Prompt für die dritte Gruppe: „Nutze den Prisma Client idiomatisch: findUnique auf eindeutigen Feldern, include/select gegen N+1 und Over-Fetching, Filter mit mode: 'insensitive', Cursor-Paginierung mit take, upsert für Einfügen-oder-Aktualisieren, $transaction oder updateMany für atomare Änderungen, groupBy für Aggregate und niemals $queryRawUnsafe mit interpolierten Eingaben.“
| Aufgabe | Punktzahl Kontrolle | Ein-Satz | Mit Skill | Token Kontrolle | Token Ein-Satz | Token mit Skill | Skill gelesen |
|---|---|---|---|---|---|---|---|
| t1-queries | 5.0 | 5.0 | 5.0 | 83k | 83k | 105k | 2/2 |
| t2-n-plus-1 | 5.0 | 5.0 | 5.0 | 103k | 103k | 100k | 2/2 |
| t3-review | 5.0 | 5.0 | 5.0 | 89k | 75k | 84k | 2/2 |
Mittelwert: 5.0 ohne vs. 5.0 mit Skill (Delta +0.0). Token pro Lauf: 92k vs. 97k (1.05x); Zeit 44s vs. 40s. Ein-Satz-Gruppe: 5.0 (Gewinn des Skills gegenüber dem Ein-Satz-Prompt: +0.0; Gewinn des Ein-Satz-Prompts gegenüber dem Lauf ohne Skill: +0.0); Token des Ein-Satz-Prompts 88k pro Lauf, der Skill kostet also 1.10x des Ein-Satz-Prompts.
Was dabei herauskam
- Jeder Lauf in jeder Gruppe bestand jede Prüfung: Kontrolle 5.00, Ein-Satz 5.00, Skill 5.00 (je n=6). Die erzeugten Queries nutzen findUnique,
mode: 'insensitive', cursor + take, upsert, $transaction/updateMany und groupBy; der N+1 wurde mit include/select oder Batching behoben; das Review fand in jedem Lauf die unsichere Raw-Interpolation. - Der Skill wurde in 6/6 Läufen der Skill-Gruppe gelesen und kostete 97k Token pro Lauf gegenüber 92k Kontrolle und 88k Ein-Satz (1.05x): ein kleiner Overhead, kein Gewinn.
- Die Läufe der Skill-Gruppe kopieren die Regeldateien des Skills ins Projekt (durchschnittlich 9.7 Dateien pro Lauf).
- Das Prüfset hat einen Deckeneffekt: Wenn alle Läufe am Maximum liegen, lässt sich nur sagen, dass der Skill nicht geschadet hat, nicht, dass er nie hilft. Für einen Nutzen bräuchte es schwierigere Aufgaben (Prisma-7-Treiberadapter, neuere Features, die das Modell vielleicht nicht kennt).
Bewertung nach Dimensionen
| Dimension | Punktzahl | Begründung |
|---|---|---|
| 1_output_quality | 5.0 | Mittlere Punktzahl 5.00/5 mit dem Skill (programmatische Prüfungen, siehe Tabelle pro Aufgabe). |
| 2_lift_vs_no_skill | 2.0 | +0.00 Punkte gegenüber 5.00 ohne den Skill (n=2 pro Aufgabe; unter etwa 1 Punkt ist Rauschen). |
| 3_trigger | 5.0 | Skill-Datei in 6/6 Läufen der Skill-Gruppe gelesen. |
| 4_instructions_portability | 3 | SKILL.md plus etwa zehn Regeldateien; nur Dokumentation. |
| 5_efficiency | 5 | 1.05x Token (97k vs. 92k pro Lauf) und 0.92x Zeit (40s vs. 44s). |
| 6_safety_hygiene | 4 | Der Scanner meldet 9 CRITICAL, alles Dokumentationshinweise auf
|
Grenzen dieses Tests
- Regelbasierte Prüfungen am Code-Text; es wurde kein Prisma-Client generiert und keine Query ausgeführt (offline, keine Datenbank).
- Alle Gruppen am Maximum: Die Aufgaben messen grundlegendes idiomatisches Prisma, das das Basismodell bereits kennt.
- n=2 pro Zelle; Wissen über neuere APIs (der Teil, den ein Dokumentations-Skill am ehesten ergänzt) wird nicht geprüft.
- n = 2 pro Gruppe und Aufgabe: Unterschiede unter etwa 1 Punkt sind Rauschen.
- Regelbasierte Bewertung misst nur, was die Prüfungen sehen können; sie kann weder Geschmack noch beurteilen, ob ein Ergebnis das bestmögliche ist.
Sicherheit
Siehe security.md. Scan: 9 CRITICAL / 9 HIGH / 0 MEDIUM. Urteil: sicher ausführbar (Offline-Sandbox). Ein sauberer Scan beweist nicht, dass ein Skill sicher ist.
Fazit
Bei alltäglicher Arbeit mit dem Prisma Client ist reines Codex bereits korrekt, der Skill verursacht hier also nur kleine Tokenkosten ohne sichtbare Veränderung. Relevant könnte er für sehr neue Prisma-Features sein, die dieser Test nicht berührt hat.
Transkript
Laufprotokoll: prisma-client-api (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) Spalten: Aufgabe, Gruppe-Lauf, Punktzahl (0-5), Tokens, Sekunden, bestandene Prüfungen, vom Agenten geöffnete Skill-Dateien. t1-queries control-1: Punkte 5.0, Tokens 84040, Sek. 35.0, Prüfungen 7/7, nichts geöffnet t1-queries control-2: Punkte 5.0, Tokens 83803, Sek. 36.4, Prüfungen 7/7, nichts geöffnet t1-queries oneliner-1: Punkte 5.0, Tokens 83731, Sek. 38.4, Prüfungen 7/7, nichts geöffnet t1-queries oneliner-2: Punkte 5.0, Tokens 83779, Sek. 38.1, Prüfungen 7/7, nichts geöffnet t1-queries treatment-1: Punkte 5.0, Tokens 110031, Sek. 39.9, Prüfungen 7/7, geöffnet prisma-client-api t1-queries treatment-2: Punkte 5.0, Tokens 100691, Sek. 36.8, Prüfungen 7/7, geöffnet prisma-client-api t2-n-plus-1 control-1: Punkte 5.0, Tokens 103258, Sek. 57.7, Prüfungen 3/3, nichts geöffnet t2-n-plus-1 control-2: Punkte 5.0, Tokens 103374, Sek. 54.2, Prüfungen 3/3, nichts geöffnet t2-n-plus-1 oneliner-1: Punkte 5.0, Tokens 103307, Sek. 51.8, Prüfungen 3/3, nichts geöffnet
18 Läufe, 3 Artefakte
Beispielausgabe
SOTA · With the skill: src/queries.ts (t1-queries, run 1, Codex)
import { prisma } from "./db"; export function getUserWithPosts(id: number) { return prisma.user.findUnique({ where: { id }, include: { posts: { where: { published: true }, orderBy: [{ createdAt: "desc" }, { id: "desc" }], take: 10, }, }, }); } // Pass the last post's id as the cursor for the next page. export function searchPosts(term: string, cursor?: number) { return prisma.post.findMany({ where: { title: { contains: term, mode: "insensitive" } }, orderBy: { id: "asc" }, take: 20, ...(cursor !== undefined ? { cursor: { id: cursor }, skip: 1 } : {}), }); } export function upsertUser(email: string, name: string | null) { return prisma.user.upsert({ where: { email }, update: { name }, create: { email, name }, }); } // Returns { count } with the number of posts transferred. export function transferPosts(fromId: number, toId: number) { return prisma.$transaction(async (tx) => { await tx.user.findUniqueOrThrow({ where: { id: fromId } }); await tx.user.findUniqueOrThrow({ where: { id: toId } }); return tx.post.updateMany({ where: { authorId: fromId }, data: { authorId: toId }, }); }); } // Includes authors with posts; each row has { authorId, _count: { _all } }. export function postCountsByAuthor() { return prisma.post.groupBy({ by: ["authorId"], _count: { _all: true }, orderBy: { authorId: "asc" }, }); }