Files

28 KiB
Raw Permalink Blame History

VianoBugAnalysis – Architektur- und Planungskonzept

Stand der Planung nach der initialen Vcore-/wowBugAnalysis-Konzeption

1. Zweck und Grundidee

VianoBugAnalysis ist ein autonomes System zur strukturierten Fehleranalyse in Softwareprojekten. Sein Entwicklungsursprung liegt im Vcore-/WoW-Projekt, die Architektur soll jedoch so allgemein gehalten werden, dass dieselben Mechanismen später auch für andere Softwareprojekte genutzt werden können.

Die konkrete WoW-Implementierung trägt den Namen wowBugAnalysis. Sie besteht aus VianoBugAnalysis plus Vcore-/WoW-spezifischen Adaptern, Konfigurationen und Investigation-Tools.

Die zentrale Aufgabe von VianoBugAnalysis lautet:

Eingehende Fehlerdaten werden zu einem vollständigen Case zusammengeführt, semantisch interpretiert, durch mehrere Hypothesen untersucht und am Ende entweder in eine belastbare Diagnose mit technischem Änderungsauftrag oder in eine kontrollierte menschliche Review überführt.

VianoBugAnalysis erzeugt selbst keinen Patch. Es schreibt keinen Sourcecode, verändert keine Datenbank, erstellt keine Git-Branches, startet keinen Build und steuert kein Lab. Seine Systemgrenze endet bei Diagnose und Change Request.

2. Einordnung in die geplante Toolchain

Die bisher geplante Toolchain wird in klar getrennte Verantwortungsbereiche zerlegt.

Für Vcore/WoW:

Tester / Bugreport → wowdiag → wowsrc → wowBugAnalysis → Change Request → allgemeiner Coding-Agent → wowValidate → LabController → wowBugLab → Testserver / menschliche Freigabe

Für neue Inhalte ist die Entwicklungsseite getrennt:

Mod-Spezifikation → allgemeiner Coding-Agent → wowValidate → LabController → wowDevLab → Release Candidate → Testserver

Wesentliche Trennung:

  • wowDevLab ist die Werkstatt für noch unfertige Inhalte. Frühe Entwicklungsfehler werden dort behoben und nicht in die reguläre Bugpipeline eingespeist.
  • wowBugLab behandelt konkrete Fehler in bereits grundsätzlich funktionierendem Inhalt.
  • Erst wenn ein Mod im DevLab ausreichend ausgereift ist, gelangt er auf den Testserver. Erst dort gefundene Fehler werden reguläre Bugfälle.

Der allgemeine Coding-Agent soll später sowohl Bugfix-Aufträge als auch Mod-/Feature-Aufträge ausführen können. Der Auftragstyp bestimmt seine Policy, nicht ein separater Agent.

3. Zentrale Designprinzipien

3.1 Diagnose statt Patch-Erzeugung VianoBugAnalysis soll ausdrücklich interpretieren und diagnostizieren. Wo wowdiag nur Daten sammelt und wowsrc Implementierungskontext bereitstellt, darf BugAnalysis Aussagen wie „Das hier ist sehr wahrscheinlich kaputt“ treffen – aber noch keine Änderungen ausführen.

3.2 Deterministische Systeme arbeiten der LLM zu LLM-Einsatz wird nicht vermieden, sondern auf die Aufgaben konzentriert, für die semantisches Verständnis notwendig ist:

  • menschliche Berichte interpretieren
  • Soll-/Ist-Abweichungen verstehen
  • Hypothesen formulieren
  • Evidenz semantisch bewerten
  • finale Diagnose formulieren
  • technische Änderungsanforderungen ableiten

Deterministische Komponenten übernehmen:

  • Paketvalidierung
  • Datenextraktion
  • Source-/DB-/Log-Abfragen
  • Provenienz
  • Zustandsverwaltung
  • Budgetregeln
  • Schema-Validierung
  • Dateisystem-/Jobverwaltung

3.3 Kein freier Shellzugriff für eine KI Die LLM darf nie beliebige Shell- oder SQL-Befehle ausführen. Sie formuliert strukturierte Tool-Requests. Kontrollierte Tools beschaffen die Informationen read-only.

3.4 Menschliche Beobachtungen sind First-Class Data Testerberichte sind häufig die stärksten semantischen Hinweise auf das tatsächliche Fehlerbild. Direkte Beobachtungen werden daher prominent behandelt. Tester-Hypothesen werden getrennt gespeichert und nur als Hinweise gewertet.

3.5 State lives with the case, not with the service Das Bugpaket ist die vollständige transportable Fallakte. Der Dienst selbst muss sich einen Bug nicht über Wochen „merken“. Ein zurückkehrender Fall enthält seine komplette Historie, vorherige Diagnosen, Evidenz, Patch-Rückmeldungen und Analyse-Revisionen.

3.6 Append-only Ein Case-Paket darf durch BugAnalysis nur wachsen. Fachliche Artefakte werden nicht gelöscht oder nach Abschluss überschrieben. Neue Revisionen und neue Evidenz werden hinzugefügt. Index-/Pointerdateien dürfen aktualisiert werden.

4. Job-Lifecycle

BugAnalysis verarbeitet Fälle asynchron. Es wartet nach einer Übergabe nicht auf Coding-Agent, Validator oder Lab, sondern nimmt sofort den nächsten offenen Fall.

Hohe Zustände:

NEW → VALIDATED → BUILDING_CASE → INTERPRETING_CASE → GENERATING_HYPOTHESES → INVESTIGATING_HYPOTHESES → BUILDING_DIAGNOSIS → OUTPUT_READY → HANDED_OFF

Sonderzustände:

  • BLOCKED: Die Analyse könnte weitergehen, sobald eine externe Bedingung wieder erfüllt ist, z. B. LLM-Provider oder Research-Service nicht erreichbar.
  • FAILED_TO_ANALYZE: Die vorgesehenen Untersuchungsmöglichkeiten wurden ausgeschöpft, ohne eine belastbare Diagnose zu erreichen. Der Fall geht in Human Review.
  • REOPENED: Neue Evidenz, Testerfeedback oder ein abgelehnter Patch eröffnet denselben Case erneut als neue Analysis Revision.

Wichtige Regel: CASE WAITING ≠ WORKER WAITING

Ein Case im Zustand HANDED_OFF oder BLOCKED hält den Worker nicht auf.

Rückläufer:

  • Ein Tester lehnt Patch 1 ab.
  • BugLab meldet, dass der Fehler weiter besteht.
  • Neue Beobachtungen werden ergänzt.
  • Der bestehende Case wird wieder geöffnet.
  • Die alte Analyse bleibt vollständig erhalten.
  • Es entsteht analysis_revision + 1.

FAILED_TO_ANALYZE ist kein endgültiges Ende. Nach menschlicher Review und neuer Evidenz kann derselbe Case erneut geöffnet werden.

5. Inbox, Cache, Review und Outbox

Geplante Arbeitsverzeichnisse:

inbox/

  • noch nicht validierte eingehende Case-Pakete

quarantine/

  • ungültige oder beschädigte Pakete
  • zusätzlich validation_error.json

cache/

  • unveränderte Originalpakete und temporäre Arbeitskopien

cases/

  • persistenter Arbeitszustand während einer aktiven Analyse

outbox/

  • erfolgreich analysierte Pakete mit Change Request

review/

  • FAILED_TO_ANALYZE-Fälle für menschliche Review

runtime/

  • aktueller Workerzustand, z. B. current_job.json

BLOCKED-Fälle können zurück in die Inbox gelegt werden, sollten jedoch mit retry_not_before und Retry-Grund versehen werden, damit ein temporärer Ausfall nicht denselben Fall in einer Endlosschleife priorisiert.

6. Case-Paket als langlebige Bugakte

Das zentrale Transportformat ist ein ZIP-basiertes Viano Bug Case Package. Für Vcore/WoW ist ein menschlich gut unterscheidbarer Dateiname vorgesehen, z. B.:

wow-Bug-000011.vbcase.zip

Der Dateiname ist nicht autoritativ. Die Programmlogik darf daraus weder Case-ID, Projekt, Status noch Revision ableiten. Der Einstiegspunkt ist immer manifest.json.

Ein umbenanntes Paket muss weiterhin korrekt funktionieren, solange sein Manifest gültig ist.

Das Paket ist self-contained:

  • ursprünglicher Bugreport
  • Reproduktionen
  • wowdiag
  • wowsrc
  • CaseBuilder-Ergebnisse
  • Recherche
  • Hypothesen
  • Evidenz
  • Investigation-Historie
  • Diagnosen
  • Change Requests
  • spätere Patch-/Lab-Rückmeldungen

Ein Rückläufer nach Tagen oder Wochen besitzt damit dieselbe Qualität wie ein frischer Fall, weil kein externes Gedächtnis vorausgesetzt wird.

7. Vorgeschlagene Paketstruktur

Beispiel:

wow-Bug-000011.vbcase.zip ├── manifest.json ├── original/ │ ├── bug_report.json │ ├── reproductions/ │ ├── wowdiag/ │ └── wowsrc/ ├── case/ │ ├── case.json │ ├── case_summary.md │ └── details/ ├── research/ │ └── R0001/ ├── analysis/ │ ├── revisions/ │ │ ├── 0001/ │ │ └── 0002/ │ └── current.json ├── handoffs/ │ └── coding/ │ └── CR-0001/ ├── feedback/ │ └── PATCH-0001/ └── history/ └── events.jsonl

Regeln:

  • original/ wird niemals verändert.
  • abgeschlossene analysis/revisions/NNNN/ werden niemals verändert.
  • neue Reproduktionen, Feedbacks und Revisionen werden hinzugefügt.
  • manifest.json und current.json dürfen als Index-/Pointerdateien aktualisiert werden.
  • unbekannte Dateien werden niemals gelöscht; sie werden unverändert übernommen.

8. manifest.json

manifest.json ist der autoritative Einstiegspunkt für jedes System.

Es enthält mindestens:

  • Paketformat und Formatversion
  • package_id
  • case_id
  • Projektprofil, z. B. wow/vcore
  • Erstellungs- und Änderungszeit
  • aktuellen Routing-/Lifecycle-Status
  • aktuelle Analysis Revision
  • Zeiger auf aktuelle Case-, Diagnose- und Change-Request-Artefakte
  • Zähler/Historienübersicht
  • Integritätsinformationen für wichtige Artefakte

Beispielhafte Projektdaten:

project: type: wow profile: vcore display_name: Viano-Core

Das Manifest ist die einzige Quelle, aus der ein Programm Identität und Routing des Pakets ableiten darf.

9. Paket-Invarianten

Für v1 werden fünf zentrale Invarianten festgeschrieben:

  1. Append-only Kein abgeschlossenes fachliches Artefakt wird gelöscht oder überschrieben.

  2. Self-contained Ein zurückkehrender Case trägt alles mit, was BugAnalysis für seine bisherige Historie benötigt.

  3. Versioned Paketformat und wichtige JSON-Verträge besitzen Schema-/Formatversionen.

  4. Traceable Jede Diagnose muss auf Evidenz und deren Herkunft zurückführbar sein.

  5. Superset Der Output enthält mindestens alle fachlichen Informationen des Inputs.

Formal: Files(Input) ⊆ Files(Output) mit Ausnahme klar definierter aktualisierbarer Indexdateien.

Weitere technische Regeln:

  • atomare Paketgenerierung
  • ZIP-Slip-Schutz
  • Größenlimits
  • Deduplizierung/Idempotenz
  • Case-Locking
  • Hashes für wichtige unveränderliche Artefakte
  • keine Secrets in Case-Paketen

10. Phase 1 – CaseBuilder

Der CaseBuilder diagnostiziert noch nichts. Er erzeugt aus allen verfügbaren Quellen eine konsistente Fallakte.

Eingaben:

  • Bugreport
  • Testerbericht
  • Testerkommentare
  • Reproduktionsdaten
  • Reproduction Events
  • wowdiag-Paket
  • wowsrc-Paket
  • Sollzustand / erwartetes Verhalten
  • ggf. externe Recherche

Interne Teilaufgaben:

  • ReportCollector
  • ReproductionCollector
  • DiagnosticPackageLoader
  • SourceContextLoader
  • ExpectedBehaviorResolver
  • ExternalResearchProvider
  • CaseAssembler

Menschliche Beobachtungen bleiben prominent und werden nicht zu einem anonymen Textblock degradiert.

Direkte Beobachtung, erwartetes Verhalten und Tester-Hypothese werden getrennt.

Der Sollzustand ist Teil des Cases:

  • vollständig durch Tester angegeben → übernehmen
  • teilweise angegeben → ergänzende Recherche
  • fehlt → Recherche

Für Quest-Bugs darf die Netzrecherche ausdrücklich bereits beim Case Building erfolgen. Ziel ist ein belastbarer Soll-/Ist-Vergleich, bevor die Hypothesenphase beginnt.

Externe Recherche beschreibt den vorgesehenen Ablauf, aber niemals die lokale Vcore-Implementierung.

11. case.json und case_summary.md

case.json ist die kanonische Maschinenakte des CaseBuilders. Große Rohdaten werden referenziert und nicht vollständig eingebettet.

Vorgesehene Hauptblöcke:

  • case
  • bug
  • human_observations
  • expected_behavior
  • reproduction
  • entities
  • runtime_facts
  • database_context
  • source_context
  • research
  • data_quality
  • inputs

Fakten erhalten IDs wie F0001, F0002 usw. Spätere Hypothesen können auf diese IDs verweisen.

Entities werden normalisiert gespeichert, z. B.: type = quest id = 26912 roles = [primary_focus]

Große SmartScript-Mengen, lange Eventlisten und komplette Source-Dateien bleiben außerhalb von case.json und werden referenziert.

case_summary.md wird deterministisch aus case.json erzeugt und dient ausschließlich der Menschenlesbarkeit. Es ist keine zweite Wahrheit und enthält keine zusätzliche Interpretation.

12. Phase 2 – Case Interpretation

Phase 2 ist der erste LLM-Schritt.

Aufgabe: Der vorbereitete Case wird semantisch interpretiert und in eine Richtung strukturiert, ohne eine konkrete Fehlerursache festzulegen.

Die Interpretation darf:

  • relevante Bereiche hervorheben
  • den ersten bekannten Punkt der Abweichung bestimmen
  • Ist und Soll gegenüberstellen
  • wichtige Daten/Indizien priorisieren
  • Widersprüche und Wissenslücken sichtbar machen

Sie darf nicht:

  • eine Root Cause behaupten
  • konkrete Fehlerhypothesen als Ergebnis festlegen
  • Patchvorschläge erzeugen

Der Zweck besteht darin, Phase 3 bereits mit einem gerichteten, aufbereiteten Suchraum zu versorgen. Ohne diese Vorarbeit müsste die LLM in der Hypothesenphase alle Daten erneut selbst durchsuchen.

13. LLMGateway und Prompting

Die LLM ist eine austauschbare Reasoning-Komponente, nicht das Programm selbst.

Architektur:

CaseInterpreter → PromptBuilder → LLMGateway → Provider-Adapter → lokaler LLM-Server / eigener Remote-Server / Cloud-Service → strukturierte Antwort → Schema-Validierung → case_interpretation.json

LLMGateway-Aufgaben:

  • Providerwahl
  • Failover
  • Timeout/Retry
  • Promptversion
  • Output-Schema
  • Logging von Modell/Provider
  • Token-/Kostenmetrik
  • Datenschutzprofile
  • lokale Systeme bevorzugen, Cloud optional

Provider sollen über eine einheitliche interne Schnittstelle angesprochen werden. Ein OpenAI-kompatibler HTTP-Adapter ist ein naheliegender erster Adapter, darf aber nicht die interne Architektur bestimmen.

Prompt und Modell sind getrennt. Promptversionen werden als Dateien gepflegt, z. B.: prompts/case_interpretation_v1.txt

Die LLM erhält keinen freien Shell- oder Datenbankzugriff.

14. Output von Phase 2

case_interpretation.json soll unter anderem enthalten:

  • observed_behavior
  • expected_behavior
  • tester_assumptions
  • confirmed_technical_facts
  • behavior_gap
  • first_known_divergence
  • failure_stage
  • contradictions
  • unknowns
  • relevant_entities
  • investigation_direction
  • interpretation_summary

investigation_direction darf beispielsweise auf „post-interaction quest progression“ oder „event activation / spawn phase“ zeigen, aber noch nicht auf eine konkrete Ursache wie „fehlender SmartAI-Eintrag“.

Zusätzlich wird case_interpretation.md deterministisch aus der JSON-Ausgabe erzeugt.

15. Phase 3 – Hypothesengenerierung

Phase 3 darf erstmals konkrete Ursachen vermuten.

Aus case.json und case_interpretation.json werden typischerweise 3 bis maximal 5 wirklich unterschiedliche Hypothesen erzeugt.

Gewichtung:

  • H1 orientiert sich stark an Testerbeobachtung und erkanntem Fehlerpunkt.
  • H2/H3/... sollen bewusst alternative Erklärungen prüfen und dürfen Testerinput schwächer gewichten.
  • Redundante Varianten derselben Idee sollen vermieden werden.

Beispiel für sinnvolle Diversität:

  • Quest-State-Transition fehlerhaft
  • NPC-AI/Script nach Spawn greift nicht
  • Phasing/Visibility erzeugt nur scheinbar dasselbe Fehlerbild

Maximale Hypothesenzahl wird über Config begrenzt, z. B.: max_hypotheses = 5

Die Grenze gilt pro Analysis Revision für insgesamt erzeugte Hypothesen, nicht nur gleichzeitig aktive.

16. Phase 3 – Investigation Loop

Jede Hypothese erhält dasselbe Startbudget.

Eine Iteration:

  1. Controller baut Investigation Context.
  2. LLM erhält:
    • feste Instruktionen
    • Hypothesenstand
    • Budget
    • offene Fragen
    • Ergebnis der vorigen Query
    • beim ersten Durchlauf: kein vorheriges Ergebnis
  3. LLM interpretiert das vorige Ergebnis.
  4. LLM erzeugt:
    • Controller-Updates
    • genau definierte Investigation-Tool-Requests
  5. Antwort wird vollständig validiert.
  6. Nur bei gültiger Antwort werden Aktionen ausgeführt.
  7. Query-Ergebnis wird gespeichert.
  8. deterministische Novelty-/Evidence-Bewertung erfolgt.
  9. in der nächsten Iteration erfolgt die semantische LLM-Bewertung.
  10. Budget und Status werden aktualisiert.
  11. Checkpoint wird geschrieben.

Die LLM darf nie direkt Budget verändern.

17. Investigation Tools und Analysis Controller

Zwei klar getrennte Toolgruppen:

Investigation Tools:

  • lesen die Außenwelt
  • verändern den Case nicht direkt

Beispiele:

  • source.find_text
  • source.find_symbol
  • source.read_context
  • source.find_registration
  • database.describe
  • database.lookup
  • database.find_references
  • timeline.query
  • logs.window
  • research.lookup

Analysis Controller:

  • verändert ausschließlich den internen Analysezustand

Beispiele:

  • evidence.store
  • hypothesis.update
  • question.resolve
  • question.add
  • hypothesis.reject
  • hypothesis.create
  • investigation.note

Die LLM formuliert strukturierte Befehle. Der Controller validiert sie gegen erlaubte Operationen und Werte.

Eine Antwort wird atomar behandelt: Ist ein Teil technisch ungültig, wird die gesamte Antwort verworfen und nicht teilweise ausgeführt.

18. Diagnosebudget

Die Budgetwährung ist eine interne abstrakte Größe und hat nichts mit LLM-Tokens zu tun.

Grundregeln:

  • jede Investigation-Aktion kostet Budget
  • Mindestkosten einer Anfrage > 0
  • gute Evidenz kann einen Teil der Kosten zurückerstatten
  • keine einzelne erfolgreiche Anfrage darf zu Netto-Budgetgewinn führen

Invariante: reward < cost

Praktisch: budget_remaining -= action_cost budget_remaining += evidence_reward

Der Reward setzt sich aus deterministischen und semantischen Anteilen zusammen:

  • deterministische Novelty-Bewertung
  • semantische LLM-Bewertung
  • ggf. Hypothesenwirkung

Ein voller Reward darf nur zustande kommen, wenn beide Seiten die Evidenz als wertvoll einstufen.

Die LLM liefert nur eine gedeckelte semantische Bewertung. Der BudgetManager berechnet den tatsächlichen Reward.

Zusätzlich:

  • duplicate evidence gibt keinen Reward
  • wiederholt geringe Informationsgewinne führen zu frühem Abbruch
  • terminale Hypothesen werden nicht weiter untersucht

Ende von Phase 3: Wenn keine untersuchbare Hypothese mehr genügend Budget für die billigste zulässige Aktion besitzt bzw. alle Hypothesen terminal sind, erfolgt die Gesamtauswertung.

19. Status von Hypothesen

Vorgesehene Zustände bzw. Bewertungen:

  • new
  • investigating
  • weak
  • plausible
  • supported
  • strongly_supported
  • weakened
  • rejected
  • budget_exhausted
  • abandoned_low_information_gain

Confidence soll nicht als scheinpräzise Prozentzahl dargestellt werden. Stattdessen werden qualitative Stufen und konkrete Evidenzreferenzen verwendet.

Eine stark unterstützte Hypothese beendet die Analyse nicht zwangsläufig sofort. Mindestens eine plausible Alternative sollte kurz gegengeprüft werden, um Confirmation Bias zu reduzieren.

20. Neue Analysis Revision nach Review oder Patch-Ablehnung

Wenn eine Analyse scheitert oder ein Patch später abgelehnt wird, wird der Fall nicht neu erfunden.

Beispiel: Revision 1 → H1 rejected → H2 plausible, budget_exhausted → H3 weak → FAILED_TO_ANALYZE

Human Review ergänzt neue Evidenz.

Revision 2: Der CaseBuilder verarbeitet alte Historie plus neue Evidenz. Die LLM kann selbst erkennen, dass die frühere H2 weiterhin sinnvoll ist und sie erneut als Hypothese mit vollem Startbudget aufnehmen.

Dafür ist kein spezieller „review mode“ notwendig.

Dasselbe gilt nach Patch-Ablehnung:

  • alte Diagnose
  • darauf basierender Patch
  • Tester-/Lab-Ergebnis werden zu neuer Evidenz für die nächste Analysis Revision.

21. Phase 4 – Finale Diagnose

Phase 4 ist die letzte eigentliche Phase von VianoBugAnalysis.

Teilaufgaben: 4A Final Hypothesis Evaluation 4B Diagnosis Builder 4C Change Request Builder 4D Output Validation

Die Phase entscheidet:

  • Welche Hypothese ist ausreichend gestützt?
  • Welche Alternativen wurden verworfen oder geschwächt?
  • Welche Restunsicherheit besteht?
  • Was ist die technische Root Cause?
  • Welche Änderung ist erforderlich?
  • Was muss nach dem Fix funktionieren?

Wenn keine Hypothese ausreichend belegt ist: status = inconclusive → FAILED_TO_ANALYZE → Human Review → kein Coding-Auftrag

22. diagnosis_result.json

diagnosis_result.json beschreibt, was als Fehlerursache festgestellt wurde und auf welcher Evidenz diese Aussage basiert.

Vorgesehene Inhalte:

  • format/version
  • case_id
  • analysis_revision
  • status
  • selected_hypothesis
  • root_cause.summary
  • root_cause.technical_description
  • evidence_refs
  • confidence
  • alternatives
  • remaining_uncertainty

Die Diagnose muss vollständig auf bereits gespeicherte Fakten/Evidenz zurückführbar sein.

23. change_request.json – Vertrag zum Coding-Agenten

Der Change Request ist die wichtigste Übergabeschnittstelle zum späteren allgemeinen Coding-Agenten.

Er beschreibt nicht die Untersuchung, sondern den technischen Arbeitsauftrag.

Vorgesehene Inhalte:

  • task.type = bugfix
  • case_id / analysis_revision
  • problem summary
  • current_behavior
  • expected_behavior
  • root_cause
  • affected_scope
  • required_change
  • implementation_intent
  • implementation_guidance
  • constraints
  • preserve
  • forbidden_changes / do_not_fix_by
  • validation_requirements
  • project_context_refs
  • diagnosis_ref

Für Bugfixes gilt ein fester, deterministischer Policy-Block:

  • kleinste praktisch ausreichende Änderung bevorzugen
  • keine neuen Features
  • kein unnötiges Refactoring
  • bestehendes Verhalten außerhalb des diagnostizierten Defekts erhalten
  • keine unnötigen Änderungen an fremden Dateien/DB-Zeilen
  • keine unbekannten APIs/Schemata/Symbole erfinden
  • nur lokal verifizierten Projektkontext verwenden
  • bei fehlendem Implementierungskontext fehlende Informationen melden statt raten
  • kein Deployment, Neustart oder Produktionszugriff

Die Diagnose-LLM liefert die fallspezifische Änderungsabsicht; die Bugfix-Policy wird nicht jedes Mal kreativ neu erzeugt.

24. Allgemeiner Coding-Agent

Der geplante Coding-Agent soll nicht dauerhaft wow-spezifisch sein.

Er bekommt:

  • Change Request
  • freigegebenen Projektcode-/DB-Kontext
  • Task Policy

Tasktypen können später beispielsweise sein:

  • bugfix
  • feature/mod

Bugfix:

  • minimaler Eingriff
  • keine neuen Features
  • enger Scope
  • bestehendes Verhalten erhalten

Feature/Mod:

  • neue Funktionalität erlaubt
  • größere strukturelle Änderungen möglich
  • neue Dateien/Klassen zulässig, wenn gerechtfertigt

Der Coding-Agent muss nicht wissen, wie die Diagnose entstanden ist.

25. Technische Robustheit und Wiederaufnahme

runtime/current_job.json enthält nur den groben Workerzustand, z. B.:

  • case_id
  • analysis_revision
  • stage
  • started_at
  • last_checkpoint_at

Der detaillierte Zustand liegt im Case.

Checkpoints:

  • Case gebaut
  • Interpretation abgeschlossen
  • Hypothesen erzeugt
  • einzelne Hypothese abgeschlossen
  • Diagnose erstellt
  • Output erzeugt

Kritische JSON-Dateien werden atomar geschrieben: tmp-Datei → flush → rename

Ein Programmabsturz darf höchstens den letzten noch nicht bestätigten Schritt wiederholen, nicht die komplette Analyse.

26. BLOCKED und FAILED_TO_ANALYZE

BLOCKED:

  • temporäre äußere Bedingung verhindert Weiterarbeit
  • Beispiel: LLM-Server nicht erreichbar
  • automatischer Retry möglich
  • Paket kann nachgeordnet wieder in die Inbox

FAILED_TO_ANALYZE:

  • diagnostische Möglichkeiten für diese Revision ausgeschöpft
  • kein Coding-Auftrag
  • Paket geht in review/
  • failure_report.json enthält:
    • Grund
    • Hypothesenendstände
    • Restfragen
    • empfohlene menschliche Aktionen

Neue menschliche Evidenz kann denselben Fall später als neue Analysis Revision wieder öffnen.

27. Research und Sollzustand

Expected Behavior Research ist ein eigenständiger Baustein des CaseBuilders.

Bei Vcore/WoW, besonders bei Quest-Bugs:

  • menschlicher Sollzustand wird bevorzugt
  • unvollständige Angaben werden ergänzt
  • fehlende Angaben werden recherchiert

Die Recherche ist technisch ebenfalls nur ein Tool-/API-Aufruf und kann später durch verschiedene Provider implementiert werden.

Alle Research-Ergebnisse behalten Provenienz:

  • tester
  • external_research
  • combined

Externe Quellen dürfen niemals als Beweis für lokale Vcore-Implementierung behandelt werden. Sie dienen nur zur Rekonstruktion des vorgesehenen Verhaltens.

28. Vorgeschlagene Modulstruktur

Erste Zielstruktur:

viano-bug-analysis/ ├── main.py ├── config/ ├── package/ │ ├── validator.py │ ├── reader.py │ ├── writer.py │ └── manifest.py ├── lifecycle/ │ ├── job.py │ ├── queue.py │ ├── state.py │ └── checkpoints.py ├── case/ │ ├── builder.py │ ├── report_collector.py │ ├── reproduction_collector.py │ ├── expected_behavior.py │ └── summary.py ├── llm/ │ ├── gateway.py │ ├── provider_base.py │ ├── openai_compatible.py │ └── prompts/ ├── analysis/ │ ├── interpreter.py │ ├── hypothesis_builder.py │ ├── investigator.py │ ├── evaluator.py │ ├── diagnosis_builder.py │ └── change_request_builder.py ├── tools/ │ ├── router.py │ ├── source_query.py │ ├── database_query.py │ ├── timeline_query.py │ ├── log_query.py │ └── research.py ├── evidence/ │ ├── store.py │ └── scoring.py ├── budget/ │ └── manager.py ├── schemas/ └── profiles/ └── vcore/ ├── wowdiag_adapter.py ├── wowsrc_adapter.py ├── db_tools.py └── config.yaml

Nicht alle Module müssen anfangs eigene Prozesse sein. Die Trennung ist logisch und kann zunächst innerhalb einer Python-Anwendung umgesetzt werden.

29. Empfohlene erste Implementierungsreihenfolge

Da die Architektur nun weitgehend feststeht, sollte nicht zuerst die LLM angebunden werden.

Empfohlene Reihenfolge:

  1. PackageValidator
  2. PackageReader
  3. PackageWriter
  4. Manifest-/Schema-Unterstützung
  5. Job-/Case-State und Checkpoints
  6. CaseBuilder-Grundgerüst
  7. Vcore-Adapter für wowdiag/wowsrc
  8. ExpectedBehaviorResolver / Research-Schnittstelle
  9. LLMGateway
  10. Case Interpretation
  11. Hypothesis Builder
  12. Investigation Tool Router
  13. SourceQueryTool / DatabaseQueryTool
  14. EvidenceStore und BudgetManager
  15. Investigation Loop
  16. Diagnosis Builder
  17. Change Request Builder
  18. End-to-End-Tests mit bekannten Vcore-Fällen

Diese Reihenfolge schafft zuerst das stabile Paket- und Lifecycle-Fundament, bevor autonome LLM-Schleifen darauf aufbauen.

30. Teststrategie für die Entwicklung

Bekannte reale Vcore-Fälle sollen als Regressionstests dienen.

Geeignete Referenzfälle:

  • BUG-10 Brewfest: komplexer Eventkontext, menschliche Beobachtung, Gebietskontext
  • BUG-11 Quest 26912: expliziter Questfokus, fehlendes lokales Arathi-Gebietsskript, ID-Kollisionsproblematik
  • später der bekannte Server-Crash-Fall als anspruchsvoller Laufzeit-/Crash-Test

Ziel ist nicht, diese Bugs im Rahmen der Tooltests erneut zu fixen, sondern zu prüfen:

  • Wird der Case vollständig gebaut?
  • Werden menschliche Hinweise korrekt eingeordnet?
  • Bleibt externe Recherche als externe Evidenz markiert?
  • Werden Hypothesen sinnvoll diversifiziert?
  • Funktioniert Budget/Reward?
  • Wird bei Unsicherheit korrekt FAILED_TO_ANALYZE gemeldet?
  • Ist ein zurückkehrender Case vollständig wiederaufnehmbar?

31. Offene Detailfragen für die Implementierung

Die Architektur ist ausreichend festgelegt. Einige Detailwerte sollen bewusst erst bei der Implementierung bzw. anhand realer Feldtests bestimmt werden:

  • exakte Kosten einzelner Investigation-Aktionen
  • initial_budget_per_hypothesis
  • max_low_information_steps
  • konkrete Confidence-Übergangsregeln
  • exakte JSON-Schemas und Pflichtfelder
  • Retry-/Backoff-Werte
  • konkrete Provideradapter
  • Umfang der ersten Source-/DB-Tooloperationen
  • Kriterien, wann Expected Behavior als ausreichend gilt
  • genaue Hash-/Integrity-Strategie
  • Größenlimits für Case-Pakete

Diese Punkte verändern nicht die Grundarchitektur.

32. Kurzfassung der Systemgrenze

VianoBugAnalysis ist erfolgreich, wenn es aus einem validen Bug-Case-Paket ein angereichertes Case-Paket erzeugt, das entweder:

A) eine nachvollziehbare, evidenzgestützte Diagnose plus Change Request enthält,

B) als BLOCKED kontrolliert zurückgestellt wird,

oder

C) als FAILED_TO_ANALYZE mit vollständigem Untersuchungsbericht an Human Review übergeben wird.

VianoBugAnalysis verändert niemals Projektcode oder Produktionsdaten.

Die wichtigste langfristige Eigenschaft ist: Jeder Bugfall trägt seine gesamte Historie in seinem Paket selbst mit.