Skill präzisiert: jeder bearbeitende Subagent schließt seinen Vorgang selbst ab — Rückfrage ordentlich stellen (eine konkrete Frage, einfache Sprache, Kontext → NeedsInfo) ODER nach verifiziertem + eingespieltem Fix mit verständlichem fixNote-Changelog schließen (Resolved). Abschluss-Regel ergänzt: kein Open/Answered-Ticket bleibt offen liegen — Endzustand immer NeedsInfo oder Resolved. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7.1 KiB
name, description
| name | description |
|---|---|
| ticket-triage | Fehlerberichte (Tickets) der Züchterin abarbeiten: neue Tickets per Subagent triagieren, Rückfragen an die Tickets hängen, beantwortete Tickets wieder aufgreifen, Fixes gebündelt umsetzen und beim Schließen dokumentieren, was gefixt wurde. Nutze diesen Skill, wenn der Nutzer „Tickets abarbeiten / triagieren", „Fehlerberichte bearbeiten" o. Ä. verlangt. |
Ticket-Triage & Abarbeitung
Tickets entstehen über das „Fehler melden"-Feature (POST /feedback) und werden
unter Hilfe → Meine Tickets (/hilfe/tickets) verwaltet. Dieser Skill
automatisiert das Triagieren, Rückfragen-Stellen, Umsetzen und Schließen.
Status-Lebenszyklus (Feedback.Status)
| Status | Bedeutung | Wer ist dran |
|---|---|---|
Open |
Neues Ticket, noch nicht triagiert | KI (triagieren) |
NeedsInfo |
KI hat eine Rückfrage angehängt | Züchterin (antworten) |
Answered |
Züchterin hat geantwortet | KI (wieder aufgreifen, umsetzen) |
Resolved |
Erledigt — mit fixNote (Changelog) |
— |
Zu bearbeiten sind Open (neu) und Answered (KI wieder dran). NeedsInfo
wartet auf die Züchterin, Resolved ist fertig — beide überspringen.
Voraussetzungen
- App läuft (Aspire):
dotnet run --project GerbilManager.AppHost; API auf http://localhost:5179. SieheCLAUDE.md(Architektur, Import→DB-Workflow, Domänenwissen: 6-Jahre-Lebensspanne, Geschwisterverpaarung, Genotyp/E-Locus,isResident). - Feedback überlebt den Import-Ingest (FK-freie Spalten) — Tickets bleiben erhalten, auch wenn die DB neu befüllt wird.
Ablauf
1. Tickets holen & einteilen
curl -s http://localhost:5179/feedback (neueste zuerst). Encoding-Falle: über
eine Datei holen (curl -o raw.json) und mit python … .decode('utf-8') lesen,
nicht via Windows-stdin-Pipe (sonst Mojibake). Test-/Dummy-Tickets ausschließen.
Filtere auf status in (Open, Answered). Bei Answered zusätzlich das Feld
answer (Antwort der Züchterin) mitnehmen — darauf basiert die Umsetzung.
2. Triage per Subagent (ein Agent pro Ticket)
Nutze die Workflow-Orchestrierung (pipeline) — einen Triage-Agenten pro
Ticket. args ASCII-sicher halten (nur id/context/gerbilId/litterId übergeben; die
deutschen Nachrichten holt der Agent selbst aus GET /feedback). Defensive im
Script: const tickets = Array.isArray(args) ? args : JSON.parse(args).
Jeder Triage-Agent:
- liest
CLAUDE.md+docs/ticket-triage.md(falls vorhanden), - holt seinen Ticket-Text (+
answerbeiAnswered) ausGET /feedback, - untersucht die echten Daten über die API (
GET /gerbils/{id},/litters/{id}, Eltern verfolgen;provenancezeigt Import-Herkunft inkl. verworfener Werte), - liefert strukturiert (StructuredOutput-Schema):
ticketId, title, category, rootCause, recommendation, fixLayer (import-data|import-logic|backend|frontend| genetics-engine), affectedAreas[], overlapKey (Cluster-Slug), effort (S/M/L), confidence, needsUserInfo, - terminale Aktion am Ticket selbst (jeder Triage-Agent schließt seinen Vorgang ab, lässt nichts offen liegen): braucht es Infos von der Züchterin → Rückfrage ordentlich stellen (siehe 3); ist die Ursache rein eine Daten-/ Code-Korrektur ohne Rückfrage → an den passenden Umsetzungs-Cluster (4) übergeben (NICHT selbst querschnittlich Dateien ändern).
Sammle alle Ergebnisse in eine Datei docs/ticket-triage.md (Cluster-/
Überschneidungs-Matrix + offene Rückfragen) — token-schonend per Python aus dem
Workflow-Ergebnis generieren, nicht 70 KB in den Kontext laden.
3. Rückfragen ordentlich stellen (durch den Triage-Agenten)
Wenn ein Ticket Infos der Züchterin braucht, hängt der Triage-Agent die Rückfrage
direkt selbst ans Ticket:
PUT /feedback/{id} mit {"question": "<Rückfrage>"} → Status wird NeedsInfo.
Anforderungen an eine gute Rückfrage: eine konkrete Frage (kein Sammelsurium),
in einfacher, freundlicher Sprache für die Züchterin (keine Code-/Fachbegriffe),
mit dem nötigen Kontext (welches Tier/welcher Wurf, was unklar ist), und mit einer
klaren Handlungsaufforderung (z. B. „Wie heißt die Mutter von X?"). Die Züchterin
beantwortet es in der App; beim nächsten Lauf erscheint es als Answered und wird
wieder aufgegriffen.
4. Umsetzen — gebündelt nach Cluster (Überschneidungen vermeiden!)
Die Triage-Matrix zeigt, welche Tickets sich Dateien teilen. Bündele nach datei-disjunkten Workstreams, damit parallele Subagenten nicht kollidieren:
- Genetik-Engine →
gerbil-manager-web/src/genetics/**,tools/import/genotype.py. - Stammbaum-Import (Eltern/Dedup/Gender/
isResident) →tools/import/extract.py,merge_and_resolve.py,conflict-decisions.json. - Frontend-Anzeige (z. B. Nicht-Bestandstiere ausblenden) →
GerbilDetailPage.tsx,de.ts. Gemeinsam genutzte Dateien (de.ts,GerbilDetailPage.tsx) gehören genau einem Workstream — sonst sequenziell. Datenkorrekturen, die die Züchterin nennt, als Override inconflict-decisions.jsonkodieren (data-driven, re-ingest-stabil). Subagenten committen NICHT und re-ingesten NICHT — das koordiniert der Haupt-Loop.
5. Import neu einspielen (bei Daten-/Import-Änderungen)
python tools/import/extract.py → extract_contracts.py → merge_and_resolve.py,
dann POST /import/ingest-resolved (wischt + lädt neu). Danach betroffene Tickets
gegen die API verifizieren.
6. Ticket schließen — MIT Changelog (durch den bearbeitenden Subagenten)
Der Subagent/Cluster, der den Fix umgesetzt hat, schließt seine Tickets selbst
ab — aber erst nachdem der Fix verifiziert und (bei Daten-/Import-Fixes) live
eingespielt ist (Schritt 5), damit „erledigt" auch stimmt:
PUT /feedback/{id} mit {"status": "Resolved", "fixNote": "<verständliche Erklärung, was korrigiert wurde>"}.
Die fixNote ist ein Changelog für die Züchterin: einfache, freundliche
Sprache, keine Code-/Fachbegriffe, sagt was korrigiert wurde und ggf. was sie tun
soll. Beispiel: „Die Mutter von Yuki wurde auf Izumi korrigiert (vorher fälschlich
Benjiro). Bitte den Stammbaum neu laden."
Abschluss-Regel (wichtig)
Kein bearbeitetes Ticket bleibt offen liegen. Jedes Open/Answered-Ticket
endet nach einem Lauf in genau einem Endzustand:
NeedsInfo— Rückfrage wurde ordentlich gestellt (Info fehlt), oderResolved— Fix umgesetzt + verifiziert, mitfixNote-Changelog. Kann ein Ticket weder gefixt noch sinnvoll erfragt werden, stelle trotzdem eine klärende Rückfrage (NeedsInfo) statt es offen zu lassen.
Verifikation vor „fertig"
- Code-Fixes:
npx tsc --noEmit,npx vitest run, betroffenenpx playwright test,dotnet build/dotnet test, Python-test_*.py— grün. - Daten-Fixes: in
resolved_import.jsonstichprobenartig prüfen, dann re-ingest + API-Check des konkreten Tiers/Wurfs. - Jedes erledigte Ticket auf
ResolvedmitfixNotegesetzt.
Hinweise
- Pro Ticket genau ein Triage-Agent; Umsetzung gebündelt nach Cluster.
- Encoding: deutsche Texte als UTF-8 (Datei, nicht stdin-Pipe).
- Nichts committen, bis der Haupt-Loop verifiziert hat; auf
mainarbeiten.