diff --git a/backend/agents.py b/backend/agents.py index 86a5004..56e2547 100644 --- a/backend/agents.py +++ b/backend/agents.py @@ -1,8 +1,23 @@ -"""Anbindung an MiniMax über das Anthropic-Messages-Format. Kein Fallback: fehlt die -Konfiguration oder antwortet der Provider nicht, bricht der Aufruf mit sichtbarer -Meldung ab.""" +"""Zwei Wege zum Modell, je nach Aufgabe. + +`frage` geht über MiniMax im Anthropic-Messages-Format: die Prüfungen sind hundert +Anfragen je Lauf und leben von der Temperaturstreuung — das muss billig und +parallelisierbar sein. + +`frage_lokal` geht über die angemeldete Claude-CLI, dasselbe Abo wie die +Agenten-Übergabe. Die Gespräche sind einzelne Aufrufe und leben von Urteilskraft; +dort zählt Qualität, nicht Durchsatz. + +Welche Werkzeuge dabei offenstehen, entscheidet die Betriebsart, nicht das Modell: +Planung liest den Projektcode, Recherche sucht im Web, und keine der beiden kann, +was die andere darf. Die Prüfungen bekommen gar nichts — dort ist der Katalog die +einzige zulässige Quelle. + +Kein Fallback zwischen beiden: fehlt ein Weg, bricht der Aufruf mit sichtbarer +Meldung ab, statt still auf das schwächere Modell auszuweichen.""" import asyncio +import json import httpx @@ -12,6 +27,73 @@ ZEITLIMIT = 180.0 MAX_TOKENS = 8000 API_VERSION = "2023-06-01" +GRUNDLAGE = ( + "claude", "-p", "--model", "opus", "--output-format", "json", + # Spart ein Fünftel der Grundlast; was hier gilt, steht ohnehin im eigenen Prompt. + "--exclude-dynamic-system-prompt-sections", + # Ohne das erbt der Aufruf, was am Rechner sonst eingerichtet ist: MCP-Server, + # Workflows, Hooks, ein fremder Antwortstil. Ein Gespräch über Feature-Karten hat + # in keinem Postfach etwas zu suchen. + "--safe-mode", +) + +# Was in keiner Betriebsart erlaubt ist. Beide Gespräche holen fremden Text in den +# Kontext — das eine Suchtreffer, das andere Quelltext — und fremder Text darf keinen +# Terminplan anlegen, keine Nachricht verschicken und keine Agenten starten. Was +# künftig an Werkzeugen dazukommt, steht hier nicht: beim Nachziehen der CLI gehört +# diese Liste geprüft. +GESPERRT = ( + "Write", "Edit", "NotebookEdit", "Bash", "Task", "TodoWrite", + "Workflow", "Skill", "ReportFindings", "ScheduleWakeup", "DesignSync", + "CronCreate", "CronDelete", "CronList", "RemoteTrigger", "PushNotification", + "SendMessage", "Monitor", "EnterWorktree", "ExitWorktree", + "TaskCreate", "TaskGet", "TaskList", "TaskOutput", "TaskStop", "TaskUpdate", +) + + +def _kommando(erlaubt: tuple, gesperrt: tuple, zuege: int) -> tuple: + """Ein Aufruf mit genau den Werkzeugen einer Betriebsart. + + `--allowed-tools` ist nicht bloß die Umkehrung von `--disallowed-tools`: ohne die + Vorabfreigabe fragt die CLI je Suche und je Datei nach Erlaubnis und bekommt im + Stapelbetrieb keine Antwort. Der Versuch endet dann als Absage, nicht als Fehler. + + `ToolSearch` steht nirgends: Suche, Abruf und Lesen sind nachladbar, ohne das + Werkzeug käme das Modell gar nicht an sie heran. Was es nachlädt, ist trotzdem + gesperrt — die Sperre wirkt beim Aufruf, nicht beim Suchen. + """ + return (*GRUNDLAGE, + "--allowed-tools", *erlaubt, + "--disallowed-tools", *GESPERRT, *gesperrt, + "--max-turns", str(zuege)) + + +# Planen heißt: an den Karten arbeiten, mit dem Code als Beleg. Das Web bleibt zu — +# was das Projekt können soll, entscheidet die Person, nicht eine fremde Seite. +PLANUNG_KOMMANDO = _kommando( + ("Read", "Glob", "Grep"), ("WebSearch", "WebFetch"), 20) +# Ohne eingestelltes Arbeitsverzeichnis gibt es nichts zu lesen. Lesen bliebe hier +# nicht folgenlos: ohne gesetzten Ordner liefe die Suche im Serververzeichnis, und +# das Modell beschriebe planer2 statt des Projekts. +PLANUNG_OHNE_CODE = _kommando( + (), ("Read", "Glob", "Grep", "WebSearch", "WebFetch"), 1) +# Recherche geht nach draußen und nirgendwo sonst: kein Blick in Dateien, damit +# nichts aus dem Projekt in einer Suchanfrage landet. +RECHERCHE_KOMMANDO = _kommando( + ("WebSearch", "WebFetch"), ("Read", "Glob", "Grep"), 24) + +# Opus denkt länger als MiniMax, der Prozessstart kostet extra, und Suchen wie +# Codelesen legen mehrere Abrufe obendrauf. +CHAT_ZEITLIMIT = 600.0 + +# Nur fürs Log: welcher Weg gerade lief. Ohne den Namen sagt eine Zeitangabe nichts, +# denn dieselbe Sekundenzahl ist bei einem Zug teuer und bei zwanzig billig. +WEGE = { + PLANUNG_KOMMANDO: "planung+code", + PLANUNG_OHNE_CODE: "planung", + RECHERCHE_KOMMANDO: "recherche", +} + # Der Provider drosselt bei vielen gleichzeitigen Anfragen WIEDERHOLBAR = (429, 500, 502, 503, 504) WIEDERHOLUNGEN = 6 @@ -39,6 +121,67 @@ def pruefe_konfiguration(): raise NichtKonfiguriert(f"Nicht konfiguriert: {', '.join(fehlend)} in .env fehlt") +async def frage_lokal(system: str, inhalt: str, + kommando: tuple = PLANUNG_OHNE_CODE, + ordner: str | None = None) -> str: + """Eine Runde über die Claude-CLI — der Text der Antwort. + + Der Prompt geht über die Standardeingabe: Katalog und Kartenstand sind zu lang, + um sie als Kommandozeilenargument zu übergeben. Keine Temperatur — die CLI kennt + keine; für einen einzelnen Zug braucht es auch keine Streuung. + + `ordner` ist das Verzeichnis, in dem der Aufruf läuft. Es entscheidet, was ein + erlaubtes Lesen erreicht; ohne Angabe erbt der Prozess das Serververzeichnis, und + das ist nur zulässig, solange gar nicht gelesen werden darf. + """ + try: + prozess = await asyncio.create_subprocess_exec( + *kommando, "--system-prompt", system, + cwd=ordner, + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + except FileNotFoundError: + raise NichtKonfiguriert( + "Claude-CLI nicht gefunden — „claude“ muss im Pfad liegen und angemeldet sein" + ) + try: + aus, err = await asyncio.wait_for( + prozess.communicate(inhalt.encode()), CHAT_ZEITLIMIT) + except asyncio.TimeoutError: + prozess.kill() + raise RuntimeError(f"Claude antwortet nicht innerhalb von {CHAT_ZEITLIMIT:.0f} s") + if prozess.returncode != 0: + raise RuntimeError(f"Claude bricht ab: {err.decode()[-300:].strip() or 'ohne Meldung'}") + try: + daten = json.loads(aus) + except ValueError: + raise RuntimeError("Antwort der Claude-CLI ist kein JSON") + if daten.get("is_error"): + raise RuntimeError(f"Claude meldet einen Fehler: {daten.get('result')}") + _notiere(kommando, daten) + text = str(daten.get("result") or "") + if not text.strip(): + raise RuntimeError("Leere Antwort von Claude") + return text + + +def _notiere(kommando: tuple, daten: dict): + """Wohin die Wartezeit ging — ins Serverlog, eine Zeile je Aufruf. + + Die CLI legt es ohnehin bei; ungelesen bleibt nur die Frage „wieso dauert das so + lange" offen. Ein Zug ist ein Modellaufruf: jede Suche, jeder Abruf, jedes Lesen + zählt einzeln. Sind die Züge hoch, hat das Modell gearbeitet; ist einer teuer, war + der Prompt lang. + """ + zuege = daten.get("num_turns") or 0 + api = (daten.get("duration_api_ms") or 0) / 1000 + print(f"[claude] {WEGE.get(kommando, 'aufruf')}: {api:.0f}s, {zuege} Züge, " + f"{(api / zuege if zuege else api):.0f}s/Zug, " + f"${daten.get('total_cost_usd') or 0:.3f}", flush=True) + + def _pause(res, versuch: int) -> float: """Wie lange bis zum nächsten Versuch — der Provider darf es selbst sagen.""" gesagt = res.headers.get("retry-after") diff --git a/backend/auftrag.py b/backend/auftrag.py new file mode 100644 index 0000000..746b87f --- /dev/null +++ b/backend/auftrag.py @@ -0,0 +1,319 @@ +"""Die Planung an einen Agenten übergeben. + +Claude implementiert die geplanten Änderungen im Arbeitsverzeichnis — lokal über +die Claude-CLI mit dem angemeldeten Konto. Solange er arbeitet, bleibt die +Planung stehen: die Übersicht sagt, was das Projekt kann, und das stimmt erst, +wenn der Code da ist. Erst nach Erfolg wird die Planung übernommen. Ein +Fehlschlag übernimmt nichts; die Planung steht noch und kann erneut los. + +Der Agent meldet jeden erledigten Schritt als eigene Zeile; der Server liest den +Stream mit und hakt die Schritte ab. Zustand nur im Speicher — er überlebt keinen +Serverneustart, der laufende Prozess arbeitet trotzdem zu Ende, übernimmt dann +aber nichts mehr sichtbar. +""" + +import asyncio +import difflib +import json +import re + +import parser +import planung +import projekte +import verzeichnis + +# stream-json liefert je Zeile ein Ereignis: sichtbar wird, woran der Agent +# gerade arbeitet, und die ERLEDIGT-Zeilen kommen an, sobald sie fallen. +KOMMANDO = ("claude", "-p", "--model", "opus", "--permission-mode", "acceptEdits", + "--output-format", "stream-json", "--verbose") +MARKE = "ERLEDIGT:" +# Einzelne Stream-Zeilen tragen ganze Dateien — die Standardgrenze ist zu klein +PUFFER = 10 * 1024 * 1024 + +# projektname -> {"laeuft", "fehler", "text", "schritte", "aktivitaet", "uebernommen"} +_laeufe = {} +_aufgaben = set() + +PRUEFEN = "PRÜFEN" +# Eine neue Funktion ist immer unbewiesen — es gibt noch keinen Code, der sie leistet. +ART = {"weg": "GESTRICHEN", "geaendert": "GEÄNDERT", "neu": PRUEFEN} + +AUFTRAG = """Du bekommst die Feature-Karten eines Projekts und die geplanten Änderungen. +Eine Karte ist ein Auftrag: Regeln sind Zusicherungen, eine Funktion ist etwas, +das man für sich testen kann. Setze den Code in diesem Verzeichnis so um, dass er +den geänderten Karten entspricht. + +- Lies zuerst den bestehenden Code und folge seinen Konventionen. +- Ändere nur, was die Arbeitsschritte verlangen. +- {pruefen} heißt: die Funktion gilt als unbewiesen. Prüfe, ob der Code genau das + leistet, was ihre Testschritte beschreiben. Fehlt sie, baue sie. Weicht sie ab, + bring sie in Ordnung. Sie kann schon einmal gebaut worden sein und trotzdem falsch + arbeiten — glaube dem Code nicht, weil er existiert. +- GEÄNDERT heißt: gebaut, aber die Karte sagt jetzt etwas anderes. +- GESTRICHEN heißt: die Fähigkeit wird entfernt. +- Ein Kommando in Anführungszeichen muss danach genau so aufrufbar sein. +- Führe vorhandene Tests aus, wenn es welche gibt. + +Die Arbeitsschritte: + +{schritte} + +Gib nach jedem abgeschlossenen Schritt sofort eine eigene Textzeile aus, +mit dem Schritt wörtlich wie oben: +{marke} + +Hake nur ab, was du geprüft hast. Konntest du einen Ablauf nicht ausführen — weil +kein Fenster, kein Gerät oder kein Dienst da ist — dann melde ihn NICHT als erledigt. +Schreib am Ende in einer eigenen Zeile, was du nicht prüfen konntest und warum. + +Die betroffenen Karten, wie sie danach gelten: + +{karten}""" + + +def _kartentexte(projekt: str, titel: set) -> str: + """Der volle Text der geplanten Karten — der Sollzustand, nicht der Diff.""" + texte = [] + for datei in sorted(projekte.wurzel(projekt).glob("*.md")): + roh = datei.read_text() + if parser.zerlege(roh)["titel"] in titel: + texte.append(roh.strip()) + return "\n\n=====\n\n".join(texte) or "(keine — nur Streichungen)" + + +def _offene(projekt: str) -> set: + """(Karte, Funktion) für alles, was noch nicht bewiesen ist. + + Auch in Karten, die sich gegenüber dem Stand nicht geändert haben: eine Funktion + zurück auf „offen“ zu setzen ist die Art, eine kaputte Umsetzung zu melden. Sie + muss dann in die Arbeitsliste, sonst hätte der Klick keine Folge. + """ + raus = set() + for datei in projekte.wurzel(projekt).glob("*.md"): + s = parser.zerlege(datei.read_text()) + if s["art"] == parser.VISION: + continue + for f in s["funktionen"]: + if f["stand"] == parser.OFFEN: + raus.add((s["titel"], f["text"])) + return raus + + +def _schritte(projekt: str, aenderungen: dict) -> list[dict]: + """Die Arbeitsliste: ein Eintrag je Streichung, Kopfänderung und Funktion. + + Karte und Funktion stehen daneben, nicht nur im Text. Beim Abhaken wird die + Funktion auf „gebaut“ gesetzt — den Namen aus dem Satz zurückzuparsen wäre + eine zweite Wahrheit über dieselbe Sache. + """ + offen = _offene(projekt) + raus = [] + erledigt = set() + + def funktionsschritt(titel: str, name: str, art: str): + erledigt.add((titel, name)) + # Offen schlägt geändert: „prüfen und herstellen“ deckt beides ab, und der + # Agent soll dem vorhandenen Code nicht glauben. + marke = PRUEFEN if (titel, name) in offen else ART[art] + raus.append({"text": f"{titel} / {name}: {marke}", "karte": titel, + # Eine gestrichene Funktion gibt es hinterher nicht mehr + "funktion": "" if art == "weg" else name}) + + for titel in sorted(aenderungen): + e = aenderungen[titel] + if e["art"] == "weg": + raus.append({"text": f"Karte „{titel}“ streichen", + "karte": titel, "funktion": ""}) + erledigt |= {(titel, n) for n in e.get("funktionen", {})} + continue + if e.get("kopf"): + raus.append({"text": f"Karte „{titel}“: Kartenkopf anpassen", + "karte": titel, "funktion": ""}) + for name, art in sorted(e.get("funktionen", {}).items()): + funktionsschritt(titel, name, art) + + for titel, name in sorted(offen - erledigt): + funktionsschritt(titel, name, "geaendert") + return raus + + +def _visionen(projekt: str) -> set: + """Titel der Vision-Karten, in Stand und Arbeitskopie.""" + titel = set() + for ordner in (projekte.stand(projekt), projekte.wurzel(projekt)): + for datei in ordner.glob("*.md"): + s = parser.zerlege(datei.read_text()) + if s["art"] == parser.VISION: + titel.add(s["titel"]) + return titel + + +def bau_auftrag(projekt: str) -> tuple[str, list[dict]]: + """Prompt und Arbeitsliste, aus dem Stand der laufenden Planung. + + Die Vision bleibt außen vor: sie beschreibt Absicht, keinen Auftrag — + eine geänderte Vision ist nichts, was ein Agent bauen soll. + """ + if not planung.laeuft(projekt): + return "", [] + visionen = _visionen(projekt) + aenderungen = {t: e for t, e in planung.aenderungen(projekt).items() + if t not in visionen} + schritte = _schritte(projekt, aenderungen) + if not schritte: + return "", [] + # Der Sollzustand jeder Karte, die Arbeit trägt — auch der unveränderten mit + # einer offenen Funktion. Ohne ihren Text wüsste der Agent nicht, wogegen er prüft. + bleibend = {s["karte"] for s in schritte if s["karte"] not in { + t for t, e in aenderungen.items() if e["art"] == "weg"}} + text = AUFTRAG.format( + schritte="\n".join(f'- {s["text"]}' for s in schritte), + marke=MARKE, + pruefen=PRUEFEN, + karten=_kartentexte(projekt, bleibend)) + return text, schritte + + +def status(projekt: str) -> dict: + return _laeufe.get(projekt) or { + "laeuft": False, "fehler": "", "text": "", + "schritte": [], "aktivitaet": "", "uebernommen": False, + } + + +# „offen“ steht als eigener Block in der Datei; fehlt er, gilt die Funktion als +# gebaut. Umstellen heißt darum: den Block streichen. Ein Umbau über den Parser +# würde die Datei neu schreiben und dabei unbekannte Blöcke verlieren. +_FUNKTIONSMARKE = re.compile(r"^[ \t]*$", re.M | re.I) +_OFFENBLOCK = re.compile( + r"^[ \t]*\n[ \t]*" + parser.OFFEN + r"[ \t]*\n", re.M | re.I) + + +def _als_gebaut(roh: str, funktion: str) -> str: + """Streicht den offen-Vermerk genau dieser Funktion.""" + marken = [m.start() for m in _FUNKTIONSMARKE.finditer(roh)] + for i, start in enumerate(marken): + ende = marken[i + 1] if i + 1 < len(marken) else len(roh) + block = roh[start:ende] + zeilen = [z.strip() for z in block.splitlines()[1:] if z.strip()] + titel = next((z for z in zeilen + if not z.startswith("\nGalerie\n{T}\n\nBild wählen\n") + features.anlegen("A", f"\nShop\n{T}\n\nKarte kaufen\n") + yield "A" + auftrag._laeufe.clear() + + +def test_ohne_planung_kein_auftrag(projekt): + assert auftrag.bau_auftrag(projekt) == ("", []) + + +def test_leere_planung_kein_auftrag(projekt): + planung.starte(projekt) + assert auftrag.bau_auftrag(projekt) == ("", []) + + +def test_auftrag_nennt_diff_und_sollzustand(projekt): + planung.starte(projekt) + features.anlegen(projekt, f"\nMerkliste\n{T}\n\nProdukt merken\n") + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == "Shop") + features.loeschen(projekt, f["id"]) + + text, schritte = auftrag.bau_auftrag(projekt) + texte = [s["text"] for s in schritte] + assert "Merkliste / Produkt merken: PRÜFEN" in texte + assert "Karte „Shop“ streichen" in texte + assert all(s in text for s in texte) + # Die Zuordnung steht daneben, nicht nur im Satz + assert {"text": "Merkliste / Produkt merken: PRÜFEN", "karte": "Merkliste", + "funktion": "Produkt merken"} in schritte + assert {"text": "Karte „Shop“ streichen", "karte": "Shop", + "funktion": ""} in schritte + # Sollzustand: die neue Karte steht voll drin, die gestrichene nicht + assert "\nProdukt merken" in text + assert "Karte kaufen" not in text.split("Die betroffenen Karten")[1] + + +def test_start_braucht_verzeichnis(projekt): + assert auftrag.starte(projekt, "tu was", ["x"]) is False + + +def test_start_braucht_auftrag(projekt, tmp_path): + verzeichnis.setze(projekt, str(tmp_path)) + assert auftrag.starte(projekt, "", []) is False + + +class Strom: + """Attrappe des Claude-Prozesses: gibt vorbereitete Stream-Zeilen aus.""" + + def __init__(self, zeilen, rc=0, gesehen=None): + import json as _json + self._zeilen = [(_json.dumps(z) + "\n").encode() for z in zeilen] + self.returncode = rc + self._gesehen = gesehen if gesehen is not None else {} + + class Stdin: + def write(s, daten): self._gesehen["eingabe"] = daten.decode() + async def drain(s): pass + def close(s): pass + self.stdin = Stdin() + + class Stdout: + async def readline(s): + return self._zeilen.pop(0) if self._zeilen else b"" + self.stdout = Stdout() + + class Stderr: + async def read(s): return b"" + self.stderr = Stderr() + + async def wait(self): + return self.returncode + + +def text_ereignis(text): + return {"type": "assistant", "message": {"content": [{"type": "text", "text": text}]}} + + +def test_start_fuehrt_claude_im_verzeichnis_aus(projekt, tmp_path, monkeypatch): + verzeichnis.setze(projekt, str(tmp_path)) + planung.starte(projekt) + gesehen = {} + + async def unecht(*kommando, cwd, **k): + gesehen["kommando"] = kommando + gesehen["cwd"] = cwd + return Strom([{"type": "result", "result": "fertig"}], gesehen=gesehen) + + monkeypatch.setattr(asyncio, "create_subprocess_exec", unecht) + + async def lauf(): + assert auftrag.starte(projekt, "Setze um: X", + [{"text": "S1", "karte": "", "funktion": ""}]) is True + assert auftrag.status(projekt)["laeuft"] is True + await asyncio.gather(*auftrag._aufgaben) + + asyncio.run(lauf()) + assert gesehen["kommando"][0] == "claude" + assert "--output-format" in gesehen["kommando"] + assert gesehen["cwd"] == str(tmp_path) + assert gesehen["eingabe"] == "Setze um: X" + stand = auftrag.status(projekt) + assert stand["text"] == "fertig" + assert stand["laeuft"] is False + + +def test_schritte_werden_abgehakt_und_planung_uebernommen(projekt, tmp_path, monkeypatch): + verzeichnis.setze(projekt, str(tmp_path)) + planung.starte(projekt) + features.anlegen(projekt, f"\nMerkliste\n{T}\n\nProdukt merken\n") + anweisung, schritte = auftrag.bau_auftrag(projekt) + + async def unecht(*a, **k): + return Strom([ + {"type": "assistant", "message": {"content": [ + {"type": "tool_use", "name": "Edit", "input": {"file_path": "x.py"}}]}}, + text_ereignis(f'ERLEDIGT: {schritte[0]["text"]}'), + {"type": "result", "result": "alles gebaut"}, + ]) + + monkeypatch.setattr(asyncio, "create_subprocess_exec", unecht) + + async def lauf(): + auftrag.starte(projekt, anweisung, schritte) + await asyncio.gather(*auftrag._aufgaben) + + asyncio.run(lauf()) + stand = auftrag.status(projekt) + assert stand["schritte"] == [{**schritte[0], "fertig": True}] + assert stand["uebernommen"] is True + assert planung.laeuft(projekt) is False + assert "Merkliste" in [f["sektionen"]["titel"] for f in features.liste(projekt)] + + +def test_fehlschlag_laesst_die_planung_stehen(projekt, tmp_path, monkeypatch): + verzeichnis.setze(projekt, str(tmp_path)) + planung.starte(projekt) + features.anlegen(projekt, f"\nMerkliste\n{T}\n\nProdukt merken\n") + anweisung, schritte = auftrag.bau_auftrag(projekt) + + async def unecht(*a, **k): + return Strom([], rc=1) + + monkeypatch.setattr(asyncio, "create_subprocess_exec", unecht) + + async def lauf(): + auftrag.starte(projekt, anweisung, schritte) + await asyncio.gather(*auftrag._aufgaben) + + asyncio.run(lauf()) + stand = auftrag.status(projekt) + assert stand["uebernommen"] is False + assert stand["fehler"] + assert planung.laeuft(projekt) is True + assert "Merkliste" not in [f["sektionen"]["titel"] for f in features.liste(projekt, nur_stand=True)] + + +def test_ungefaehre_meldung_hakt_den_naechsten_schritt_ab(): + lauf = {"schritte": [{"text": "Galerie / Bild wählen: NEU", "fertig": False}, + {"text": "Karte „Shop“ streichen", "fertig": False}]} + auftrag._hake_ab("Test", lauf, "ERLEDIGT: Galerie / Bild wählen (NEU)") + assert lauf["schritte"][0]["fertig"] is True + auftrag._hake_ab("Test", lauf, "ERLEDIGT: völlig anderes Zeug") + assert lauf["schritte"][1]["fertig"] is False + + +def test_fehlender_claude_wird_gemeldet(projekt, tmp_path, monkeypatch): + verzeichnis.setze(projekt, str(tmp_path)) + + async def kaputt(*a, **k): + raise FileNotFoundError("claude") + + monkeypatch.setattr(asyncio, "create_subprocess_exec", kaputt) + + async def lauf(): + auftrag.starte(projekt, "X", [{"text": "S", "karte": "", "funktion": ""}]) + await asyncio.gather(*auftrag._aufgaben) + + asyncio.run(lauf()) + assert "claude-CLI nicht gefunden" in auftrag.status(projekt)["fehler"] + assert auftrag.status(projekt)["laeuft"] is False + + +def test_zweiter_start_wird_abgelehnt(projekt, tmp_path): + verzeichnis.setze(projekt, str(tmp_path)) + auftrag._laeufe[projekt] = {"laeuft": True, "fehler": "", "text": "", + "schritte": [], "aktivitaet": "", "uebernommen": False} + with pytest.raises(ValueError): + auftrag.starte(projekt, "X", [{"text": "S", "karte": "", "funktion": ""}]) + + +# ------------------------------------------------------------- Verzeichnis + +def test_verzeichnis_wird_gemerkt(projekt, tmp_path): + verzeichnis.setze(projekt, str(tmp_path)) + assert verzeichnis.lies(projekt) == str(tmp_path) + verzeichnis.loesche(projekt) + assert verzeichnis.lies(projekt) == "" + + +def test_verzeichnis_lehnt_wurzel_und_relatives_ab(projekt): + with pytest.raises(ValueError): + verzeichnis.pruefe("/") + with pytest.raises(ValueError): + verzeichnis.pruefe("relativ/pfad") + with pytest.raises(FileNotFoundError): + verzeichnis.pruefe("/gibt/es/nicht") + + +def test_verzeichnis_liegt_im_stand_nicht_in_der_kopie(projekt, tmp_path): + planung.starte(projekt) + verzeichnis.setze(projekt, str(tmp_path)) + planung.brich_ab(projekt) + assert verzeichnis.lies(projekt) == str(tmp_path) + + +# ------------------------------------------------------------- Durchblättern + +def test_ordner_listet_nur_sichtbare_verzeichnisse(tmp_path): + (tmp_path / "b").mkdir() + (tmp_path / "A").mkdir() + (tmp_path / ".versteckt").mkdir() + (tmp_path / "datei.txt").write_text("x") + antwort = verzeichnis.ordner(str(tmp_path)) + assert antwort["ordner"] == ["A", "b"] + assert antwort["pfad"] == str(tmp_path) + assert antwort["eltern"] == str(tmp_path.parent) + + +def test_ordner_ohne_pfad_beginnt_daheim(): + from pathlib import Path + assert verzeichnis.ordner("")["pfad"] == str(Path.home()) + + +def test_ordner_lehnt_datei_und_relatives_ab(tmp_path): + (tmp_path / "d.txt").write_text("x") + with pytest.raises(FileNotFoundError): + verzeichnis.ordner(str(tmp_path / "d.txt")) + with pytest.raises(ValueError): + verzeichnis.ordner("relativ") + + +def test_vision_gehoert_nie_zum_auftrag(projekt): + features.anlegen(projekt, "\nVision\n\nvision\n\nAlt\n") + planung.starte(projekt) + v = next(f for f in features.liste(projekt) if f["sektionen"]["art"] == "vision") + features.speichern(projekt, v["id"], v["roh"].replace("Alt", "Neu")) + assert auftrag.bau_auftrag(projekt) == ("", []) + + features.anlegen(projekt, f"\nMerkliste\n{T}\n\nProdukt merken\n") + text, schritte = auftrag.bau_auftrag(projekt) + assert [s["text"] for s in schritte] == ["Merkliste / Produkt merken: PRÜFEN"] + assert "Vision" not in text + + +# ------------------------------------------------- Stand: bestellt wird gebaut + +def _stand(projekt, karte, funktion): + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == karte) + return next(x["stand"] for x in f["sektionen"]["funktionen"] if x["text"] == funktion) + + +def test_abgehakte_funktion_gilt_als_gebaut(projekt, tmp_path, monkeypatch): + """Der Agent hat es gebaut — dann darf die Karte nicht „bestellt“ behaupten.""" + verzeichnis.setze(projekt, str(tmp_path)) + planung.starte(projekt) + features.anlegen(projekt, f"\nMerkliste\n{T}\n\n" + f"Produkt merken\n\noffen\n{T}\n" + f"\nProdukt entfernen\n\noffen\n") + anweisung, schritte = auftrag.bau_auftrag(projekt) + merken = next(s for s in schritte if s["funktion"] == "Produkt merken") + + async def unecht(*a, **k): + return Strom([text_ereignis(f'ERLEDIGT: {merken["text"]}'), + {"type": "result", "result": "eins gebaut"}]) + + monkeypatch.setattr(asyncio, "create_subprocess_exec", unecht) + + async def lauf(): + auftrag.starte(projekt, anweisung, schritte) + await asyncio.gather(*auftrag._aufgaben) + + asyncio.run(lauf()) + # Nur der abgehakte Schritt wandert um; der andere bleibt bestellt + assert _stand(projekt, "Merkliste", "Produkt merken") == "gebaut" + assert _stand(projekt, "Merkliste", "Produkt entfernen") == "offen" + + +def test_gestrichene_funktion_wird_nicht_umgestellt(projekt, tmp_path): + """Was weg ist, ist nicht gebaut — der Schritt trägt darum keinen Namen.""" + planung.starte(projekt) + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == "Galerie") + features.speichern(projekt, f["id"], "\nGalerie\n") + _, schritte = auftrag.bau_auftrag(projekt) + weg = next(s for s in schritte if "Bild wählen" in s["text"]) + assert weg["funktion"] == "" + + +def test_offen_vermerk_bleibt_bei_anderer_funktion(projekt): + roh = ("\nGalerie\n" + "\nBild wählen\n\noffen\n" + "\nBild schließen\n\noffen\n") + neu = auftrag._als_gebaut(roh, "Bild schließen") + assert neu.count("offen") == 1 + assert "Bild wählen\n\noffen" in neu + + +def test_unbekannte_bloecke_bleiben_erhalten(projekt): + """Textoperation statt Neuschreiben: der Rest der Datei bleibt Zeichen für Zeichen.""" + roh = ("\nGalerie\n\nnicht anfassen\n" + "\nBild wählen\n\noffen\n" + "\n- Eine Regel\n") + neu = auftrag._als_gebaut(roh, "Bild wählen") + assert "\nnicht anfassen" in neu + assert "\n- Eine Regel" in neu + assert "offen" not in neu + + +# ---------------------------------------- offen heißt: noch nicht bewiesen + +def _auf_offen(projekt, karte, funktion): + """Wie ein Klick auf den Stand: gebaut zurück auf offen.""" + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == karte) + roh = f["roh"].replace(f"\n{funktion}\n", + f"\n{funktion}\n\noffen\n") + features.speichern(projekt, f["id"], roh) + + +def test_zurueckgesetzte_funktion_kommt_in_die_arbeitsliste(projekt): + """Eine kaputte Umsetzung meldet man, indem man die Funktion auf offen setzt. + + Die Karte ändert sich dadurch, aber sonst nichts — vorher blieb der Klick folgenlos. + """ + planung.starte(projekt) + _auf_offen(projekt, "Galerie", "Bild wählen") + text, schritte = auftrag.bau_auftrag(projekt) + assert [s["text"] for s in schritte] == ["Galerie / Bild wählen: PRÜFEN"] + # Der Sollzustand der Karte gehört dazu, sonst weiß der Agent nicht, wogegen er prüft + assert "\nBild wählen" in text + assert auftrag.PRUEFEN in text + + +def test_offene_funktion_ohne_kartenaenderung(projekt, tmp_path): + """Offen in der Kopie und im Stand: kein Diff, trotzdem Arbeit.""" + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == "Shop") + features.speichern(projekt, f["id"], f["roh"].replace( + "\nKarte kaufen\n", + "\nKarte kaufen\n\noffen\n")) + planung.starte(projekt) + assert planung.aenderungen(projekt) == {} + _, schritte = auftrag.bau_auftrag(projekt) + assert [s["text"] for s in schritte] == ["Shop / Karte kaufen: PRÜFEN"] + + +def test_offen_schlaegt_geaendert(projekt): + """Eine offene Funktion wird geprüft, nicht bloß angepasst.""" + planung.starte(projekt) + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == "Galerie") + features.speichern(projekt, f["id"], f["roh"].replace( + "\nBild wählen\n", + "\nBild wählen\n\noffen\n" + "\n- Eine neue Regel\n")) + _, schritte = auftrag.bau_auftrag(projekt) + assert [s["text"] for s in schritte] == ["Galerie / Bild wählen: PRÜFEN"] + + +def test_gebaut_und_geaendert_bleibt_geaendert(projekt): + planung.starte(projekt) + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == "Galerie") + features.speichern(projekt, f["id"], f["roh"].replace( + "\nBild wählen\n", + "\nBild wählen\n\n- Eine neue Regel\n")) + _, schritte = auftrag.bau_auftrag(projekt) + assert [s["text"] for s in schritte] == ["Galerie / Bild wählen: GEÄNDERT"] + + +def test_gestrichene_karte_zieht_ihre_offenen_nicht_nach(projekt): + """Eine gestrichene Karte darf nicht zusätzlich als „prüfen“ auftauchen.""" + f = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == "Shop") + features.speichern(projekt, f["id"], f["roh"].replace( + "\nKarte kaufen\n", + "\nKarte kaufen\n\noffen\n")) + planung.starte(projekt) + g = next(x for x in features.liste(projekt) if x["sektionen"]["titel"] == "Shop") + features.loeschen(projekt, g["id"]) + _, schritte = auftrag.bau_auftrag(projekt) + assert [s["text"] for s in schritte] == ["Karte „Shop“ streichen"] + + +def test_ohne_planung_kein_lauf(projekt): + """Der Agent arbeitet auf der Planung; ohne sie gibt es keinen Auftrag.""" + _auf_offen(projekt, "Galerie", "Bild wählen") + assert auftrag.bau_auftrag(projekt) == ("", []) + + +def test_auftrag_verlangt_offenlegung_des_ungeprueften(projekt): + planung.starte(projekt) + _auf_offen(projekt, "Galerie", "Bild wählen") + text, _ = auftrag.bau_auftrag(projekt) + assert "nicht prüfen konntest" in text + assert "Hake nur ab, was du geprüft hast" in text diff --git a/backend/tests/test_chat.py b/backend/tests/test_chat.py new file mode 100644 index 0000000..432f51e --- /dev/null +++ b/backend/tests/test_chat.py @@ -0,0 +1,111 @@ +"""Was das Planungsgespräch darf — und was es nicht sieht. + +Geprüft wird nicht die Antwort des Modells, sondern womit es losgeschickt wird: +Werkzeugsatz, Arbeitsverzeichnis und der Absatz im Systemprompt gehören zusammen. +Fällt eines auseinander, behauptet das Modell nachgesehen zu haben, ohne zu können. +""" + +import json + +import pytest + +import agents +import chat +import projekte +import verzeichnis + +KARTE = ("\nUpload\n\nkern\n" + "\nDateien landen im Speicher.\n" + "\nDatei wählen\n\n- Dialog öffnen\n") + + +@pytest.fixture +def projekt(datenordner): + projekte.anlegen("P") + (datenordner / "P" / "upload.md").write_text(KARTE) + return "P" + + +@pytest.fixture +def mitschrift(monkeypatch): + """Fängt den Aufruf ab und gibt eine gültige Antwort zurück.""" + gesehen = {} + + async def antworte(system, inhalt, kommando=None, ordner=None): + gesehen.update(system=system, inhalt=inhalt, kommando=kommando, ordner=ordner) + return json.dumps({"antwort": "Verstanden.", "karten": []}) + + monkeypatch.setattr(agents, "frage_lokal", antworte) + return gesehen + + +async def test_ohne_verzeichnis_kein_lesen(projekt, mitschrift): + await chat.frage(projekt, "Was kann das Projekt?") + assert mitschrift["kommando"] == agents.PLANUNG_OHNE_CODE + assert mitschrift["ordner"] is None + assert chat.CODE_OHNE in mitschrift["system"] + + +async def test_mit_verzeichnis_darf_lesen(projekt, mitschrift, tmp_path): + code = tmp_path / "quelltext" + code.mkdir() + verzeichnis.setze(projekt, str(code)) + await chat.frage(projekt, "Gibt es den Upload schon?") + assert mitschrift["kommando"] == agents.PLANUNG_KOMMANDO + assert mitschrift["ordner"] == str(code.resolve()) + assert chat.CODE_MIT in mitschrift["system"] + + +async def test_toter_pfad_zaehlt_wie_keiner(projekt, mitschrift, tmp_path): + """Sonst startet der Prozess nicht, und die Meldung zeigt auf die CLI.""" + code = tmp_path / "weg" + code.mkdir() + verzeichnis.setze(projekt, str(code)) + code.rmdir() + await chat.frage(projekt, "Und jetzt?") + assert mitschrift["kommando"] == agents.PLANUNG_OHNE_CODE + assert mitschrift["ordner"] is None + + +async def test_planung_sucht_nicht_im_web(projekt, mitschrift, tmp_path): + """Fremdes Wissen kommt aus der Recherche, nicht nebenbei in einen Entwurf.""" + code = tmp_path / "quelltext" + code.mkdir() + verzeichnis.setze(projekt, str(code)) + await chat.frage(projekt, "Wie macht man das üblicherweise?") + for satz in (agents.PLANUNG_KOMMANDO, agents.PLANUNG_OHNE_CODE): + assert "WebSearch" not in _erlaubt(satz) + assert "WebFetch" not in _erlaubt(satz) + + +def test_recherche_sieht_keinen_quelltext(): + """Umgekehrt: aus dem Projekt darf nichts in eine Suchanfrage geraten.""" + erlaubt = _erlaubt(agents.RECHERCHE_KOMMANDO) + assert "WebSearch" in erlaubt and "WebFetch" in erlaubt + for werkzeug in ("Read", "Glob", "Grep"): + assert werkzeug not in erlaubt + + +@pytest.mark.parametrize("kommando", [ + agents.PLANUNG_KOMMANDO, agents.PLANUNG_OHNE_CODE, agents.RECHERCHE_KOMMANDO]) +def test_kein_satz_kann_etwas_anstossen(kommando): + """Fremder Text im Kontext darf nichts auslösen, egal woher er kommt.""" + gesperrt = _gesperrt(kommando) + for werkzeug in ("Write", "Edit", "Bash", "CronCreate", "PushNotification", + "SendMessage", "Workflow", "Task"): + assert werkzeug in gesperrt + assert "--safe-mode" in kommando + + +def _abschnitt(kommando: tuple, flagge: str) -> list: + rest = list(kommando[kommando.index(flagge) + 1:]) + ende = next((i for i, w in enumerate(rest) if w.startswith("--")), len(rest)) + return rest[:ende] + + +def _erlaubt(kommando: tuple) -> list: + return _abschnitt(kommando, "--allowed-tools") + + +def _gesperrt(kommando: tuple) -> list: + return _abschnitt(kommando, "--disallowed-tools") diff --git a/backend/tests/test_ledger.py b/backend/tests/test_ledger.py index a86118c..cd745e0 100644 --- a/backend/tests/test_ledger.py +++ b/backend/tests/test_ledger.py @@ -22,13 +22,16 @@ def projekt(datenordner): def karte(projekt, titel, *funktionen): - """funktionen sind (name, regel) oder (name, regel, [testschritte]).""" + """funktionen sind (name, regel) oder (name, regel, [testschritte]). + + Ohne eigene Schritte bekommt die Funktion einen Platzhalter-Ablauf: Testschritte + sind Pflicht, und ohne sie bricht die Messung vor allem anderen ab. + """ text = f"\n{titel}\n" for eintrag in funktionen: - name, regel, schritte = (*eintrag, [])[:3] + name, regel, schritte = (*eintrag, ["Karte öffnen", "Karte offen"])[:3] text += f"\n{name}\n\n- {regel}\n" - if schritte: - text += "\n" + "".join(f"- {s}\n" for s in schritte) + text += "\n" + "".join(f"- {s}\n" for s in schritte) return features.anlegen(projekt, text) @@ -116,14 +119,14 @@ async def test_stilurteil_wird_gemerkt_und_nicht_neu_gefragt(projekt, monkeypatc liste, arbeite, abschluss = await pruefung._stil_aufgaben(projekt) for a in liste: - assert await arbeite(a, None) == [] + assert await arbeite(a) == [] abschluss() erste = modell.rufe assert erste >= len(pruefung.TEMPERATUREN) liste, arbeite, abschluss = await pruefung._stil_aufgaben(projekt) for a in liste: - assert await arbeite(a, None) == [] + assert await arbeite(a) == [] assert modell.rufe == erste # keine einzige neue Anfrage @@ -136,7 +139,7 @@ async def test_geaenderter_text_wird_neu_gefragt(projekt, monkeypatch): liste, arbeite, abschluss = await pruefung._stil_aufgaben(projekt) for a in liste: - await arbeite(a, None) + await arbeite(a) abschluss() vorher = modell.rufe @@ -144,7 +147,7 @@ async def test_geaenderter_text_wird_neu_gefragt(projekt, monkeypatch): datei.write_text(datei.read_text().replace("- Knopf", "- Ganz anderer Text")) liste, arbeite, _ = await pruefung._stil_aufgaben(projekt) for a in liste: - await arbeite(a, None) + await arbeite(a) assert modell.rufe > vorher @@ -159,7 +162,7 @@ async def test_gemessener_verstoss_kommt_nie_aus_dem_gedaechtnis(projekt, monkey for lauf in range(2): liste, arbeite, abschluss = await pruefung._stil_aufgaben(projekt) - gefunden = [p for a in liste for p in await arbeite(a, None)] + gefunden = [p for a in liste for p in await arbeite(a)] abschluss() assert [p["vorschlag"] for p in gefunden] == ["Passwort prüfen"], lauf assert modell.rufe > len(pruefung.TEMPERATUREN) # zweimal wirklich gefragt diff --git a/backend/tests/test_planung.py b/backend/tests/test_planung.py index b0f5244..296cbb1 100644 --- a/backend/tests/test_planung.py +++ b/backend/tests/test_planung.py @@ -199,3 +199,33 @@ def test_gespraech_und_gedaechtnis_wandern_mit(projekt): def test_die_kopie_kopiert_sich_nicht_selbst(projekt): planung.starte(projekt) assert not (projekte.wurzel(projekt) / projekte.PLANUNG).exists() + + +def test_arbeitsverzeichnis_ueberlebt_das_umsetzen(projekt, tmp_path): + """Erst nach dem Planungsstart festgelegt — dann fehlt es in der Kopie. + + Vorher räumte das Umsetzen es mit dem alten Stand weg, und der nächste Lauf + fand kein Verzeichnis mehr. + """ + import verzeichnis + planung.starte(projekt) + verzeichnis.setze(projekt, str(tmp_path)) + assert not (planung._kopie(projekt) / verzeichnis.DATEI).exists() + + planung.setze_um(projekt) + assert verzeichnis.lies(projekt) == str(tmp_path) + + +def test_geplantes_verzeichnis_gewinnt(projekt, tmp_path): + """Steht es in beiden, gilt die Kopie — sie ist der neuere Stand.""" + import verzeichnis + alt = tmp_path / "alt" + alt.mkdir() + verzeichnis.setze(projekt, str(alt)) + planung.starte(projekt) + neu = tmp_path / "neu" + neu.mkdir() + (planung._kopie(projekt) / verzeichnis.DATEI).write_text(str(neu)) + + planung.setze_um(projekt) + assert verzeichnis.lies(projekt) == str(neu) diff --git a/backend/tests/test_recherche.py b/backend/tests/test_recherche.py new file mode 100644 index 0000000..84f9780 --- /dev/null +++ b/backend/tests/test_recherche.py @@ -0,0 +1,193 @@ +import pytest + +import agents +import projekte +import recherche + + +@pytest.fixture +def projekt(datenordner): + projekte.anlegen("P") + return "P" + + +def test_leeres_projekt_hat_keine_faeden(projekt): + assert recherche.liste(projekt) == [] + + +def test_anlegen_gibt_faden_mit_id(projekt): + faden = recherche.anlegen(projekt) + assert faden["id"] and faden["verlauf"] == [] + assert [f["id"] for f in recherche.liste(projekt)] == [faden["id"]] + + +def test_faeden_haben_eigene_ids(projekt): + a, b = recherche.anlegen(projekt), recherche.anlegen(projekt) + assert a["id"] != b["id"] + assert len(recherche.liste(projekt)) == 2 + + +def test_loeschen_trifft_nur_den_einen(projekt): + a, b = recherche.anlegen(projekt), recherche.anlegen(projekt) + recherche.loeschen(projekt, a["id"]) + assert [f["id"] for f in recherche.liste(projekt)] == [b["id"]] + + +def test_loeschen_ohne_faden_ist_404(projekt): + with pytest.raises(FileNotFoundError): + recherche.loeschen(projekt, "gibtsnicht") + + +def test_faeden_liegen_im_projektstand_nicht_in_der_planung(projekt): + """Nachgeschlagenes überlebt einen Planungsabbruch — es gehört zum Projekt.""" + recherche.anlegen(projekt) + (projekte.stand(projekt) / projekte.PLANUNG).mkdir() + assert len(recherche.liste(projekt)) == 1 + assert (projekte.stand(projekt) / recherche.DATEI).is_file() + + +def _antwort(satz="Laut Quelle X: ja."): + """Eine Modellantwort — Markdown, nicht JSON.""" + async def antworte(system, inhalt, kommando=None, ordner=None): + return satz + return antworte + + +async def test_frage_haengt_beide_zeilen_an(projekt, monkeypatch): + faden = recherche.anlegen(projekt) + monkeypatch.setattr(agents, "frage_lokal", _antwort(" Laut Quelle X: ja. ")) + erg = await recherche.frage(projekt, faden["id"], "Wie geht das?") + assert [(e["rolle"], e["text"]) for e in erg["verlauf"]] == [ + ("person", "Wie geht das?"), ("ki", "Laut Quelle X: ja.")] + + +async def test_erste_frage_benennt_den_faden(projekt, monkeypatch): + faden = recherche.anlegen(projekt) + monkeypatch.setattr(agents, "frage_lokal", _antwort("ok")) + erg = await recherche.frage(projekt, faden["id"], "Wie lädt man\nzu S3 hoch?") + assert erg["titel"] == "Wie lädt man zu S3 hoch?" + # Die zweite Frage lässt den Namen stehen: der Reiter soll nicht wandern + erg = await recherche.frage(projekt, faden["id"], "Und die Grenzen?") + assert erg["titel"] == "Wie lädt man zu S3 hoch?" + + +async def test_langer_titel_wird_gekuerzt(projekt, monkeypatch): + faden = recherche.anlegen(projekt) + monkeypatch.setattr(agents, "frage_lokal", _antwort("ok")) + erg = await recherche.frage(projekt, faden["id"], "w" * 80) + assert len(erg["titel"]) == recherche.TITELLAENGE + 1 + assert erg["titel"].endswith("…") + + +async def test_recherche_bekommt_die_websuche(projekt, monkeypatch): + """Der Werkzeugsatz ist der ganze Unterschied zum Planungsgespräch.""" + faden = recherche.anlegen(projekt) + gesehen = {} + + async def antworte(system, inhalt, kommando=None, ordner=None): + gesehen.update(kommando=kommando, inhalt=inhalt) + return "ok" + + monkeypatch.setattr(agents, "frage_lokal", antworte) + await recherche.frage(projekt, faden["id"], "Was gilt draußen?") + assert gesehen["kommando"] == agents.RECHERCHE_KOMMANDO + + +async def test_die_karten_liegen_im_prompt(projekt, monkeypatch): + """Ohne Bestand ist „was fehlt noch" nicht zu beantworten — dann rät das Modell.""" + (projekte.stand(projekt) / "gold.md").write_text( + "\nGold\n\nkern\n" + "\nSpieler verdient Gold pro Runde.\n" + "\nZinsen erhalten\n\noffen\n" + "\n- Runde spielen\n") + faden = recherche.anlegen(projekt) + gesehen = {} + + async def antworte(system, inhalt, kommando=None, ordner=None): + gesehen["system"] = system + return "ok" + + monkeypatch.setattr(agents, "frage_lokal", antworte) + await recherche.frage(projekt, faden["id"], "Was fehlt noch?") + assert "Zinsen erhalten" in gesehen["system"] + # Der Stand ist der Punkt: er unterscheidet Gebautes von Bestelltem + assert '"stand": "offen"' in gesehen["system"] + # Testabläufe blähen den Prompt und tragen keine Recherche + assert "Runde spielen" not in gesehen["system"] + + +async def test_vision_kommt_mit(projekt, monkeypatch): + (projekte.stand(projekt) / "vision.md").write_text( + "\nVision\n\nvision\n" + "\nTFT im Browser nachbauen.\n") + faden = recherche.anlegen(projekt) + gesehen = {} + + async def antworte(system, inhalt, kommando=None, ordner=None): + gesehen["system"] = system + return "ok" + + monkeypatch.setattr(agents, "frage_lokal", antworte) + await recherche.frage(projekt, faden["id"], "Und nun?") + assert "TFT im Browser nachbauen." in gesehen["system"] + + +async def test_markdown_bleibt_wie_es_kam(projekt, monkeypatch): + """Die Antwort wird als Markdown angezeigt — der Server fasst sie nicht an.""" + roh = "Kurz gesagt.\n\n## Festgelegt\n- **5 Gold** pro Runde\n\n## Quellen\n- [Wiki](http://x)" + faden = recherche.anlegen(projekt) + monkeypatch.setattr(agents, "frage_lokal", _antwort(f"\n{roh}\n")) + erg = await recherche.frage(projekt, faden["id"], "Wie geht Gold?") + assert erg["verlauf"][-1]["text"] == roh + + +async def test_leere_frage_wird_abgelehnt(projekt): + faden = recherche.anlegen(projekt) + with pytest.raises(ValueError): + await recherche.frage(projekt, faden["id"], " ") + + +async def test_geschlossener_faden_verwirft_die_antwort(projekt, monkeypatch): + """Antworten dauern Minuten. Wer inzwischen schließt, will das Ergebnis nicht.""" + faden = recherche.anlegen(projekt) + + async def antworte(system, inhalt, kommando=None, ordner=None): + recherche.loeschen(projekt, faden["id"]) + return "zu spät" + + monkeypatch.setattr(agents, "frage_lokal", antworte) + with pytest.raises(FileNotFoundError): + await recherche.frage(projekt, faden["id"], "Was gilt?") + assert recherche.liste(projekt) == [] + + +async def test_paralleler_faden_bleibt_erhalten(projekt, monkeypatch): + """Der zweite Faden entsteht, während der erste noch wartet.""" + a = recherche.anlegen(projekt) + neu = {} + + async def antworte(system, inhalt, kommando=None, ordner=None): + neu["b"] = recherche.anlegen(projekt) + return "fertig" + + monkeypatch.setattr(agents, "frage_lokal", antworte) + await recherche.frage(projekt, a["id"], "Frage") + faeden = recherche.liste(projekt) + assert [f["id"] for f in faeden] == [a["id"], neu["b"]["id"]] + # Was der eine Faden erfährt, bleibt beim einen + assert len(faeden[0]["verlauf"]) == 2 and faeden[1]["verlauf"] == [] + + +def test_kaputte_datei_gilt_als_leer(projekt): + (projekte.stand(projekt) / recherche.DATEI).write_text("{kein json") + assert recherche.liste(projekt) == [] + + +async def test_tiefe_haelt_den_faden_kurz(projekt, monkeypatch): + faden = recherche.anlegen(projekt) + monkeypatch.setattr(agents, "frage_lokal", _antwort("ok")) + for i in range(recherche.TIEFE): + await recherche.frage(projekt, faden["id"], f"Frage {i}") + verlauf = recherche.liste(projekt)[0]["verlauf"] + assert len(verlauf) == recherche.TIEFE + assert verlauf[-2]["text"] == f"Frage {recherche.TIEFE - 1}" diff --git a/backend/tests/test_routes.py b/backend/tests/test_routes.py index 17e9b28..8167250 100644 --- a/backend/tests/test_routes.py +++ b/backend/tests/test_routes.py @@ -72,3 +72,41 @@ async def test_pruefung_ohne_konfiguration(client, monkeypatch): async def test_unbekanntes_projekt(client): assert (await client.get("/api/projekte/Fremd/features")).status_code == 404 assert (await client.post("/api/projekte/Fremd/features", json={"roh": ROH})).status_code == 404 + assert (await client.get("/api/projekte/Fremd/recherche")).status_code == 404 + + +async def test_recherche_faeden(client, monkeypatch): + import agents + + await client.post("/api/projekte", json={"name": "Alpha"}) + assert (await client.get("/api/projekte/Alpha/recherche")).json()["faeden"] == [] + + a = (await client.post("/api/projekte/Alpha/recherche")).json() + b = (await client.post("/api/projekte/Alpha/recherche")).json() + assert a["id"] != b["id"] + + async def antworte(system, inhalt, kommando=None, ordner=None): + return "## Festgelegt\n- **5 GB** je Sendung" + + monkeypatch.setattr(agents, "frage_lokal", antworte) + res = await client.post(f"/api/projekte/Alpha/recherche/{a['id']}", + json={"text": "Was gilt?"}) + assert res.json()["titel"] == "Was gilt?" + assert len(res.json()["verlauf"]) == 2 + assert res.json()["verlauf"][-1]["text"] == "## Festgelegt\n- **5 GB** je Sendung" + + # Der zweite Faden bleibt leer — Fäden teilen sich nichts + faeden = (await client.get("/api/projekte/Alpha/recherche")).json()["faeden"] + assert [len(f["verlauf"]) for f in faeden] == [2, 0] + + assert (await client.delete(f"/api/projekte/Alpha/recherche/{b['id']}")).status_code == 200 + assert len((await client.get("/api/projekte/Alpha/recherche")).json()["faeden"]) == 1 + assert (await client.delete(f"/api/projekte/Alpha/recherche/{b['id']}")).status_code == 404 + + +async def test_recherche_leere_frage(client): + await client.post("/api/projekte", json={"name": "Alpha"}) + faden = (await client.post("/api/projekte/Alpha/recherche")).json() + res = await client.post(f"/api/projekte/Alpha/recherche/{faden['id']}", + json={"text": " "}) + assert res.status_code == 400 diff --git a/backend/tests/test_struktur.py b/backend/tests/test_struktur.py index f509e82..350eb10 100644 --- a/backend/tests/test_struktur.py +++ b/backend/tests/test_struktur.py @@ -103,7 +103,8 @@ async def test_messung_ist_auftrag_und_tuersteher(datenordner, monkeypatch): f = features.anlegen( "Test", "\nLogin\n\nAnmelden\n" - "\n- Auch Passwort prüfen.\n", + "\n- Auch Passwort prüfen.\n" + "\n- Anmelden\n- Angemeldet\n", ) gesehen = [] # Jede Stimme liefert erst einen halbherzigen Vorschlag: Punkt weg, Füllwort bleibt @@ -141,7 +142,8 @@ async def test_gemessener_verstoss_wird_notfalls_selbst_behoben(datenordner, mon f = features.anlegen( "Test", "\nLogin\n\nAnmelden\n" - "\n- Auch Passwort prüfen.\n", + "\n- Auch Passwort prüfen.\n" + "\n- Anmelden\n- Angemeldet\n", ) async def sturr(system, inhalt, temperatur=0.0): @@ -226,18 +228,24 @@ def test_zeilenfehler_haben_vorrang(): == ["Satzzeichen am Zeilenende, Füllwort „auch“"] -def test_funktion_ohne_jedes_feld_ist_leer(): - """Ein bloßer Titel beschreibt nichts — der Prüfer stülpt ihn über alles.""" +def test_funktion_ohne_testschritte(): + """Ohne Ablauf ist der Titel eine Behauptung — der Prüfer stülpt ihn über alles.""" b = struktur.befunde("funktion", {"titel": "Modal steuern", "ziel": "", "regeln": "", "testen": ""}) - assert _probleme(b) == ["Funktion ohne Ziel, Regeln und Testen"] + assert _probleme(b) == ["Funktion ohne Testschritte"] -def test_ein_einziges_feld_genuegt(): - for feld in ("ziel", "regeln", "testen"): +def test_ziel_und_regeln_ersetzen_die_testschritte_nicht(): + for feld in ("ziel", "regeln"): felder = {"titel": "Modal steuern", "ziel": "", "regeln": "", "testen": ""} felder[feld] = "Etwas tun" if feld == "ziel" else "- Etwas tun" - assert struktur.befunde("funktion", felder) == [], feld + assert _probleme(struktur.befunde("funktion", felder)) \ + == ["Funktion ohne Testschritte"], feld + + +def test_testschritte_genuegen(): + assert struktur.befunde("funktion", {"titel": "Modal steuern", "ziel": "", + "regeln": "", "testen": "- Etwas tun"}) == [] def test_einzelnes_feld_loest_nichts_aus(): @@ -259,3 +267,59 @@ def test_platzhalter_ist_kein_inhalt(): def test_kleiner_als_ist_kein_platzhalter(): assert not struktur._umschreiben("funktion", "regeln", "Wert 3 < 5") + + +def test_kommando_als_testschritt(): + """Ein Setup wird über die Kommandozeile bedient — das muss zulässig sein.""" + assert _pruefe("funktion", "testen", '- Befehl "make install" ausführen') == [] + assert _pruefe("funktion", "titel", "Anwendung installieren") == [] + + +def test_zitat_zaehlt_als_ein_wort(): + """Sonst sprengt jedes Kommando die Wortgrenze.""" + lang = '- Befehl "uv run python -m tft.cli refresh" ausführen' + assert _pruefe("funktion", "testen", lang) == [] + # Ohne Zitat greift die Grenze weiter + assert _probleme(_pruefe("funktion", "testen", + "- Ein sehr langer Schritt mit deutlich zu vielen Wörtern")) \ + == ["Mehr als 8 Wörter"] + + +def test_schraegstrich_im_zitat_ist_erlaubt(): + assert _pruefe("funktion", "testen", '- Befehl "npm run build/dev" ausführen') == [] + assert _probleme(_pruefe("funktion", "regeln", "- Gilt für Bank und/oder Brett")) \ + == ["Klammer oder Schrägstrich"] + + +def test_fuellwort_im_zitat_bleibt_stehen(): + """Der Menüeintrag heißt so — gestrichen zeigte der Schritt auf nichts.""" + assert _pruefe("funktion", "testen", '- Klick auf "Auch Vorlagen zeigen"') == [] + + +def test_kommandoschritt_ist_eine_handlung(): + """Nach dem Ergebnis darf keine Handlung mehr stehen — auch keine mit Kommando.""" + zwei = ('- Befehl "make install" ausführen\n- Anwendung installiert\n' + '- Befehl "make test" ausführen') + assert _probleme(_pruefe("funktion", "testen", zwei)) == \ + ["Zweiter Ablauf in einer Funktion"] + + +def test_ausloeser_ist_kein_funktionstitel(): + """Der Titel nennt die Wirkung; der Griff steht in den Testschritten.""" + for titel in ('Befehl "make install" ausführen', "LMB auf Speichern drücken", + "Klick auf Anlegen ausführen"): + assert "Auslöser statt Wirkung im Titel" in _probleme( + _pruefe("funktion", "titel", titel)), titel + assert _pruefe("funktion", "titel", "Anwendung installieren") == [] + + +def test_vorbedingung_ist_kein_zweiter_ablauf(): + """Der Katalog erlaubt eine Vorbedingung zuerst — sie ist kein Endzustand.""" + text = "- Badge ist sichtbar\n- RMB auf Badge\n- Text ändern\n- Neuer Text sichtbar" + assert _pruefe("funktion", "testen", text) == [] + + +def test_zweiter_ablauf_faellt_weiter_auf(): + text = "- Karte öffnen\n- Karte sichtbar\n- Karte schließen" + assert _probleme(_pruefe("funktion", "testen", text)) \ + == ["Zweiter Ablauf in einer Funktion"] diff --git a/backend/verzeichnis.py b/backend/verzeichnis.py new file mode 100644 index 0000000..c922630 --- /dev/null +++ b/backend/verzeichnis.py @@ -0,0 +1,75 @@ +"""Das Arbeitsverzeichnis eines Projekts — dort implementiert der Agent. + +Der Pfad liegt als eine Zeile im Projektordner und wandert beim Umbenennen mit. +Er ist eine Eigenschaft des Projekts, nicht der Planung: gelesen und geschrieben +wird immer im Projektstand, damit ein Planungsabbruch ihn nicht mitnimmt. +""" + +import os +from pathlib import Path + +import projekte + +DATEI = ".verzeichnis" + + +def _pfad(projekt: str): + return projekte.stand(projekt) / DATEI + + +def lies(projekt: str) -> str: + """Der eingestellte Pfad, oder leer.""" + try: + return _pfad(projekt).read_text().strip() + except OSError: + return "" + + +def pruefe(pfad: str) -> Path: + """Taugt der Pfad als Arbeitsverzeichnis? Gibt ihn aufgelöst zurück oder wirft.""" + pfad = (pfad or "").strip() + if not pfad: + raise ValueError("Kein Pfad angegeben") + ziel = Path(os.path.expanduser(pfad)) + if not ziel.is_absolute(): + raise ValueError("Der Pfad muss absolut sein") + ziel = ziel.resolve() + if not ziel.is_dir(): + raise FileNotFoundError(f"„{ziel}“ ist kein Verzeichnis") + if ziel == Path(ziel.anchor) or ziel == Path.home(): + # Die Wurzel oder das ganze Heimatverzeichnis ist immer ein Fehlgriff + raise ValueError("Bitte ein Projektverzeichnis wählen, nicht die Wurzel") + return ziel + + +def setze(projekt: str, pfad: str) -> str: + ziel = pruefe(pfad) + _pfad(projekt).write_text(f"{ziel}\n") + return str(ziel) + + +def loesche(projekt: str): + _pfad(projekt).unlink(missing_ok=True) + + +def ordner(pfad: str = "") -> dict: + """Ein Verzeichnis zum Durchblättern: Unterordner, ohne Verstecktes. + + Kein Pfad heißt Heimatverzeichnis — dort beginnt die Suche. Die Auswahl + trifft der Mensch; hier wird nur gelistet, nie geschrieben. + """ + ziel = Path(os.path.expanduser(pfad.strip())) if pfad.strip() else Path.home() + if not ziel.is_absolute(): + raise ValueError("Der Pfad muss absolut sein") + ziel = ziel.resolve() + if not ziel.is_dir(): + raise FileNotFoundError(f"„{ziel}“ ist kein Verzeichnis") + try: + unter = sorted( + (e.name for e in ziel.iterdir() + if e.is_dir() and not e.name.startswith(".")), + key=str.lower) + except PermissionError: + raise ValueError(f"„{ziel}“ ist nicht lesbar") + eltern = str(ziel.parent) if ziel.parent != ziel else "" + return {"pfad": str(ziel), "eltern": eltern, "ordner": unter} diff --git a/daten/DesktopNote/.chat.json b/daten/DesktopNote/.chat.json new file mode 100644 index 0000000..c1ed9fe --- /dev/null +++ b/daten/DesktopNote/.chat.json @@ -0,0 +1,122 @@ +[ + { + "rolle": "person", + "text": "Wie wird die Anwendung auf dem PC ausgeführt?" + }, + { + "rolle": "ki", + "text": "Ich weiß nicht, wie die Anwendung gestartet wird. Eine übliche Variante für Ubuntu wäre ein Icon im System Tray, das bei Klick auf das Icon die Topbar öffnet. Soll ich eine Karte dafür anlegen?" + }, + { + "rolle": "person", + "text": "Nein es soll automatisch gestartet werden" + }, + { + "rolle": "ki", + "text": "Entwurf für die Karte. Der Autostart ist kern, weil ohne ihn das Badge nie erscheint, wenn der Benutzer es erwartet." + }, + { + "rolle": "person", + "text": "Braucht autostart nicht sowas wie ein Makefile oder so, dass einmal ausgeführt wird und die anwendung installiert?" + }, + { + "rolle": "ki", + "text": "Guter Punkt. Autostart setzt voraus, dass die Anwendung einmal installiert wird. Das ist ein eigener Schritt, kein Teil des Badges. Hier ein Entwurf für eine Installationskarte. Klärungsbedarf: Muss der Benutzer die Installation selbst durchführen, oder reicht ein Skript?" + }, + { + "rolle": "person", + "text": "ich brauche ein setup mit make commands um die anwendung; welche make commands würde sinn machen?" + }, + { + "rolle": "ki", + "text": "Die Wahl der Make-Befehle ist eine Entscheidung zur Umsetzung, nicht zum Produkt. Ich kann keine passenden Befehle vorschlagen — das ist bei jeder Technologie anders und hängt davon ab, was die Installation umfasst. Wenn du weißt, welche Befehle du brauchst, nenne sie mir. Ich dokumentiere, wie man sie aufruft." + }, + { + "rolle": "person", + "text": "ich brauche ein setup mit make commands um die anwendung; welche make commands würde sinn machen?" + }, + { + "rolle": "ki", + "text": "Ich schlage zwei übliche Make-Befehle vor, die zu fast jedem Projekt passen: \"make install\" für die Erstinstallation und \"make uninstall\" zum Entfernen. \"make\" ohne Ziel zeigt eine Hilfe an. Das sind Konventionen — wenn etwas anderes besser passt, sag Bescheid." + }, + { + "rolle": "person", + "text": "das badge soll eine weitere funktion bekommen; ich will mehrere kurze setze eingaben können; ein satz je zeile; dann kann ich bestimmen welcher satz angezeigt wird; oder ich kann einen idle setzen, dann wechselt der satz alle x Stunden" + }, + { + "rolle": "ki", + "text": "Die Karte Badge wird um zwei Funktionen erweitert: Eintrag auswählen und Idle-Modus aktivieren. Einträge sind Zeilen in der Textarea, aus denen man einen zum Anzeigen wählt. Der Idle-Modus wechselt automatisch alle eingestellten Stunden. Die bestehende Funktion Text anpassen bleibt als RMB-Einstiegspunkt." + }, + { + "rolle": "person", + "text": "die funktionen haben teilweise keine daten" + }, + { + "rolle": "ki", + "text": "Testschritte ergänzt. Eintrag auswählen und Idle-Modus aktivieren haben jetzt Abläufe. Die Texte sind knapp — wenn etwas fehlt, sag Bescheid." + }, + { + "rolle": "person", + "text": "prüfe die karten" + }, + { + "rolle": "ki", + "text": "Vier klare Verstöße korrigiert: die Icon-Regel, die Position „Links in der Topbar\", „Makefile im Projektroot\" als Bauweise und „Bestätigen klicken\" ohne Maustaste. Dazu heißt „Textarea\" jetzt überall „Textfeld\", das Kartenziel ist nicht mehr zirkulär, „Idle-Modus\" wurde zu „Automatischen Wechsel aktivieren\" verdeutscht. Offene Frage: gilt jede Zeile als ein Eintrag, oder trennt wirklich eine Leerzeile die Einträge — beides stand widersprüchlich auf der Karte, ich habe „Jede Zeile ist ein Eintrag\" gesetzt. Zweite Frage: wie heißt der Schalter für den automatischen Wechsel, ich habe „Automatisch wechseln\" angenommen." + }, + { + "rolle": "person", + "text": "einige funktionen haben keinen inhalt" + }, + { + "rolle": "ki", + "text": "Zwei Funktionen hatten keine Testschritte: Einträge bearbeiten und Automatischen Wechsel aktivieren. Beide sind jetzt ausgefüllt. Beim automatischen Wechsel habe ich \"Automatisch wechseln\" als Schalter und ein Feld für Stunden angenommen — stimmt das? Bei Einträge bearbeiten nehme ich an, dass RMB direkt das Textfeld öffnet und \"Bestätigen\" speichert." + }, + { + "rolle": "person", + "text": "prüfe die planung" + }, + { + "rolle": "ki", + "text": "Vier Verstöße korrigiert: \"Abbrechen\" ist jetzt zitiert, die Regel \"Jede Zeile ist ein Eintrag\" stand doppelt in den Testschritten, dem Deinstallieren fehlte die Vorbedingung, und das Setup-Ziel nannte nur die Installation. Der Endzustand bei \"Einträge bearbeiten\" heißt jetzt \"Einträge gespeichert\", weil ein zuvor gewählter Eintrag sonst überschrieben würde. Neu als Entwurf, bitte prüfen: Einträge überleben das Abmelden, und die Auswahl eines Eintrags beendet den automatischen Wechsel — sonst gibt es keinen Weg zurück. Offener Widerspruch: \"Ohne Eintrag bleibt das Badge sichtbar\" widerspricht deiner Ansage \"sichtbar, wenn ein Text definiert ist\"; ich habe sie behalten, weil man nach der Installation sonst kein Ziel für RMB hat." + }, + { + "rolle": "person", + "text": "Bleiben die Einträge persistent über den Neustart hinaus?" + }, + { + "rolle": "ki", + "text": "Ja — die Regel \"Einträge bleiben nach dem Abmelden erhalten\" steht schon auf der Karte, sie deckt Abmelden und Neustart. Ich schärfe sie zu \"Einträge bleiben nach einem Neustart erhalten\", damit kein Zweifel bleibt. Offen: gilt das auch für den gewählten Eintrag und den automatischen Wechsel — laufen die nach dem Neustart weiter? Mein Entwurf nimmt Ja an und setzt je eine Regel dafür." + }, + { + "rolle": "person", + "text": "okay fehlt noch etwas?" + }, + { + "rolle": "ki", + "text": "Zwei Lücken sehe ich. Erstens: welcher Eintrag erscheint ohne eigene Auswahl — mein Entwurf setzt den ersten. Zweitens: überleben gewählter Eintrag und automatischer Wechsel einen Neustart — der Entwurf nimmt Ja an und schärft die Abmelde-Regel zum Neustart. Sonst ist die Planung vollständig, Setup bleibt unverändert." + }, + { + "rolle": "person", + "text": "prüfe die features auf kompaktheit" + }, + { + "rolle": "ki", + "text": "Drei Stellen waren doppelt: die Neustart-Zusage stand dreimal, ich fasse sie als Kartenregel \"Einstellungen bleiben nach einem Neustart erhalten\" zusammen. Beim automatischen Wechsel werden Reihenfolge und Umbruch zu einer Regel \"Wechsel läuft zyklisch durch die Einträge\". Die Regel zum ersten Eintrag ist kürzer formuliert, Setup bleibt unverändert. Sag Bescheid, falls die Sammelregel dir zu grob ist — dann trenne ich Einträge, Auswahl und Wechsel wieder." + }, + { + "rolle": "person", + "text": "prüfe die karten" + }, + { + "rolle": "ki", + "text": "Setup steht auf optional, trägt aber die Installation — ohne sie läuft nichts, also kern. \"Text eingeben\" sagt nicht, wohin — jetzt \"Text in das Textfeld eingeben\". Ebenso präzisiert: \"LMB auf die Zeile im Textfeld\". Offen: erfolgt die Auswahl wirklich im Bearbeitungs-Textfeld oder in einer eigenen Liste?" + }, + { + "rolle": "person", + "text": "ich kann keinen text eintragen" + }, + { + "rolle": "ki", + "text": "Mein Fehler in der Annahme: RMB öffnet kein Textfeld, sondern ein Menü. Entwurf: RMB auf Badge, dann Klick auf \"Einträge bearbeiten\" — erst dann kommt das Textfeld. Die Auswahl habe ich damit auf das Menü gelegt: LMB auf den Eintrag im Menü, ohne Bestätigen. Stimmen die Menüeinträge so, und ist es RMB oder öffnet LMB das Menü?" + } +] diff --git a/daten/DesktopNote/.planung/.chat.json b/daten/DesktopNote/.planung/.chat.json new file mode 100644 index 0000000..c1ed9fe --- /dev/null +++ b/daten/DesktopNote/.planung/.chat.json @@ -0,0 +1,122 @@ +[ + { + "rolle": "person", + "text": "Wie wird die Anwendung auf dem PC ausgeführt?" + }, + { + "rolle": "ki", + "text": "Ich weiß nicht, wie die Anwendung gestartet wird. Eine übliche Variante für Ubuntu wäre ein Icon im System Tray, das bei Klick auf das Icon die Topbar öffnet. Soll ich eine Karte dafür anlegen?" + }, + { + "rolle": "person", + "text": "Nein es soll automatisch gestartet werden" + }, + { + "rolle": "ki", + "text": "Entwurf für die Karte. Der Autostart ist kern, weil ohne ihn das Badge nie erscheint, wenn der Benutzer es erwartet." + }, + { + "rolle": "person", + "text": "Braucht autostart nicht sowas wie ein Makefile oder so, dass einmal ausgeführt wird und die anwendung installiert?" + }, + { + "rolle": "ki", + "text": "Guter Punkt. Autostart setzt voraus, dass die Anwendung einmal installiert wird. Das ist ein eigener Schritt, kein Teil des Badges. Hier ein Entwurf für eine Installationskarte. Klärungsbedarf: Muss der Benutzer die Installation selbst durchführen, oder reicht ein Skript?" + }, + { + "rolle": "person", + "text": "ich brauche ein setup mit make commands um die anwendung; welche make commands würde sinn machen?" + }, + { + "rolle": "ki", + "text": "Die Wahl der Make-Befehle ist eine Entscheidung zur Umsetzung, nicht zum Produkt. Ich kann keine passenden Befehle vorschlagen — das ist bei jeder Technologie anders und hängt davon ab, was die Installation umfasst. Wenn du weißt, welche Befehle du brauchst, nenne sie mir. Ich dokumentiere, wie man sie aufruft." + }, + { + "rolle": "person", + "text": "ich brauche ein setup mit make commands um die anwendung; welche make commands würde sinn machen?" + }, + { + "rolle": "ki", + "text": "Ich schlage zwei übliche Make-Befehle vor, die zu fast jedem Projekt passen: \"make install\" für die Erstinstallation und \"make uninstall\" zum Entfernen. \"make\" ohne Ziel zeigt eine Hilfe an. Das sind Konventionen — wenn etwas anderes besser passt, sag Bescheid." + }, + { + "rolle": "person", + "text": "das badge soll eine weitere funktion bekommen; ich will mehrere kurze setze eingaben können; ein satz je zeile; dann kann ich bestimmen welcher satz angezeigt wird; oder ich kann einen idle setzen, dann wechselt der satz alle x Stunden" + }, + { + "rolle": "ki", + "text": "Die Karte Badge wird um zwei Funktionen erweitert: Eintrag auswählen und Idle-Modus aktivieren. Einträge sind Zeilen in der Textarea, aus denen man einen zum Anzeigen wählt. Der Idle-Modus wechselt automatisch alle eingestellten Stunden. Die bestehende Funktion Text anpassen bleibt als RMB-Einstiegspunkt." + }, + { + "rolle": "person", + "text": "die funktionen haben teilweise keine daten" + }, + { + "rolle": "ki", + "text": "Testschritte ergänzt. Eintrag auswählen und Idle-Modus aktivieren haben jetzt Abläufe. Die Texte sind knapp — wenn etwas fehlt, sag Bescheid." + }, + { + "rolle": "person", + "text": "prüfe die karten" + }, + { + "rolle": "ki", + "text": "Vier klare Verstöße korrigiert: die Icon-Regel, die Position „Links in der Topbar\", „Makefile im Projektroot\" als Bauweise und „Bestätigen klicken\" ohne Maustaste. Dazu heißt „Textarea\" jetzt überall „Textfeld\", das Kartenziel ist nicht mehr zirkulär, „Idle-Modus\" wurde zu „Automatischen Wechsel aktivieren\" verdeutscht. Offene Frage: gilt jede Zeile als ein Eintrag, oder trennt wirklich eine Leerzeile die Einträge — beides stand widersprüchlich auf der Karte, ich habe „Jede Zeile ist ein Eintrag\" gesetzt. Zweite Frage: wie heißt der Schalter für den automatischen Wechsel, ich habe „Automatisch wechseln\" angenommen." + }, + { + "rolle": "person", + "text": "einige funktionen haben keinen inhalt" + }, + { + "rolle": "ki", + "text": "Zwei Funktionen hatten keine Testschritte: Einträge bearbeiten und Automatischen Wechsel aktivieren. Beide sind jetzt ausgefüllt. Beim automatischen Wechsel habe ich \"Automatisch wechseln\" als Schalter und ein Feld für Stunden angenommen — stimmt das? Bei Einträge bearbeiten nehme ich an, dass RMB direkt das Textfeld öffnet und \"Bestätigen\" speichert." + }, + { + "rolle": "person", + "text": "prüfe die planung" + }, + { + "rolle": "ki", + "text": "Vier Verstöße korrigiert: \"Abbrechen\" ist jetzt zitiert, die Regel \"Jede Zeile ist ein Eintrag\" stand doppelt in den Testschritten, dem Deinstallieren fehlte die Vorbedingung, und das Setup-Ziel nannte nur die Installation. Der Endzustand bei \"Einträge bearbeiten\" heißt jetzt \"Einträge gespeichert\", weil ein zuvor gewählter Eintrag sonst überschrieben würde. Neu als Entwurf, bitte prüfen: Einträge überleben das Abmelden, und die Auswahl eines Eintrags beendet den automatischen Wechsel — sonst gibt es keinen Weg zurück. Offener Widerspruch: \"Ohne Eintrag bleibt das Badge sichtbar\" widerspricht deiner Ansage \"sichtbar, wenn ein Text definiert ist\"; ich habe sie behalten, weil man nach der Installation sonst kein Ziel für RMB hat." + }, + { + "rolle": "person", + "text": "Bleiben die Einträge persistent über den Neustart hinaus?" + }, + { + "rolle": "ki", + "text": "Ja — die Regel \"Einträge bleiben nach dem Abmelden erhalten\" steht schon auf der Karte, sie deckt Abmelden und Neustart. Ich schärfe sie zu \"Einträge bleiben nach einem Neustart erhalten\", damit kein Zweifel bleibt. Offen: gilt das auch für den gewählten Eintrag und den automatischen Wechsel — laufen die nach dem Neustart weiter? Mein Entwurf nimmt Ja an und setzt je eine Regel dafür." + }, + { + "rolle": "person", + "text": "okay fehlt noch etwas?" + }, + { + "rolle": "ki", + "text": "Zwei Lücken sehe ich. Erstens: welcher Eintrag erscheint ohne eigene Auswahl — mein Entwurf setzt den ersten. Zweitens: überleben gewählter Eintrag und automatischer Wechsel einen Neustart — der Entwurf nimmt Ja an und schärft die Abmelde-Regel zum Neustart. Sonst ist die Planung vollständig, Setup bleibt unverändert." + }, + { + "rolle": "person", + "text": "prüfe die features auf kompaktheit" + }, + { + "rolle": "ki", + "text": "Drei Stellen waren doppelt: die Neustart-Zusage stand dreimal, ich fasse sie als Kartenregel \"Einstellungen bleiben nach einem Neustart erhalten\" zusammen. Beim automatischen Wechsel werden Reihenfolge und Umbruch zu einer Regel \"Wechsel läuft zyklisch durch die Einträge\". Die Regel zum ersten Eintrag ist kürzer formuliert, Setup bleibt unverändert. Sag Bescheid, falls die Sammelregel dir zu grob ist — dann trenne ich Einträge, Auswahl und Wechsel wieder." + }, + { + "rolle": "person", + "text": "prüfe die karten" + }, + { + "rolle": "ki", + "text": "Setup steht auf optional, trägt aber die Installation — ohne sie läuft nichts, also kern. \"Text eingeben\" sagt nicht, wohin — jetzt \"Text in das Textfeld eingeben\". Ebenso präzisiert: \"LMB auf die Zeile im Textfeld\". Offen: erfolgt die Auswahl wirklich im Bearbeitungs-Textfeld oder in einer eigenen Liste?" + }, + { + "rolle": "person", + "text": "ich kann keinen text eintragen" + }, + { + "rolle": "ki", + "text": "Mein Fehler in der Annahme: RMB öffnet kein Textfeld, sondern ein Menü. Entwurf: RMB auf Badge, dann Klick auf \"Einträge bearbeiten\" — erst dann kommt das Textfeld. Die Auswahl habe ich damit auf das Menü gelegt: LMB auf den Eintrag im Menü, ohne Bestätigen. Stimmen die Menüeinträge so, und ist es RMB oder öffnet LMB das Menü?" + } +] diff --git a/daten/DesktopNote/.planung/badge.md b/daten/DesktopNote/.planung/badge.md new file mode 100644 index 0000000..323332a --- /dev/null +++ b/daten/DesktopNote/.planung/badge.md @@ -0,0 +1,50 @@ + +Badge +---------------------------------------- + +kern +---------------------------------------- + +Zeigt einen von mehreren Einträgen in der Topbar an +---------------------------------------- + +- Ohne Eintrag bleibt das Badge sichtbar +- Beliebige Schriftzeichen erlaubt +- Jede Zeile ist ein Eintrag +- Ohne Auswahl erscheint der erste Eintrag +- Einstellungen bleiben nach einem Neustart erhalten +---------------------------------------- + +Einträge bearbeiten + +- Textfeld zeigt die vorhandenen Einträge +- "Abbrechen" verwirft die Änderung + +- RMB auf Badge +- Klick auf "Einträge bearbeiten" +- Text in das Textfeld eingeben +- LMB auf "Bestätigen" +- Einträge gespeichert + +Eintrag auswählen + +- Menü listet alle Einträge + +- Mehrere Einträge vorhanden +- RMB auf Badge +- LMB auf den Eintrag im Menü +- Gewählter Eintrag im Badge + +Automatischen Wechsel aktivieren + +Zeigt die Einträge ohne Zutun nacheinander + +- Wechsel läuft zyklisch durch die Einträge +- Auswahl eines Eintrags beendet den Wechsel + +- Mehrere Einträge vorhanden +- RMB auf Badge +- Klick auf "Automatisch wechseln" +- Stunden bis zum Wechsel eingeben +- LMB auf "Bestätigen" +- Badge wechselt nach der eingestellten Zeit diff --git a/daten/DesktopNote/.planung/setup.md b/daten/DesktopNote/.planung/setup.md new file mode 100644 index 0000000..c159292 --- /dev/null +++ b/daten/DesktopNote/.planung/setup.md @@ -0,0 +1,25 @@ + +Setup +---------------------------------------- + +kern +---------------------------------------- + +Bringt die Anwendung auf den Rechner und entfernt sie wieder +---------------------------------------- + +- Befehl "make" zeigt die Hilfe +---------------------------------------- + +Anwendung installieren + +- Befehl "make install" ausführen +- Abmelden und wieder anmelden +- Badge in der Topbar sichtbar + +Anwendung deinstallieren + +- Anwendung installiert +- Befehl "make uninstall" ausführen +- Abmelden und wieder anmelden +- Badge fehlt in der Topbar diff --git a/daten/DesktopNote/.planung/vision.md b/daten/DesktopNote/.planung/vision.md new file mode 100644 index 0000000..a75ea68 --- /dev/null +++ b/daten/DesktopNote/.planung/vision.md @@ -0,0 +1,13 @@ + +Vision +---------------------------------------- + +vision +---------------------------------------- + +Text in der Topbar vom Ubuntu Desktop anzeigen. +---------------------------------------- + +- Stop trying to get rich, start trying to follow the rules +- Stop act like a person, become that person +- Discipline is the game diff --git a/daten/DesktopNote/badge.md b/daten/DesktopNote/badge.md new file mode 100644 index 0000000..323332a --- /dev/null +++ b/daten/DesktopNote/badge.md @@ -0,0 +1,50 @@ + +Badge +---------------------------------------- + +kern +---------------------------------------- + +Zeigt einen von mehreren Einträgen in der Topbar an +---------------------------------------- + +- Ohne Eintrag bleibt das Badge sichtbar +- Beliebige Schriftzeichen erlaubt +- Jede Zeile ist ein Eintrag +- Ohne Auswahl erscheint der erste Eintrag +- Einstellungen bleiben nach einem Neustart erhalten +---------------------------------------- + +Einträge bearbeiten + +- Textfeld zeigt die vorhandenen Einträge +- "Abbrechen" verwirft die Änderung + +- RMB auf Badge +- Klick auf "Einträge bearbeiten" +- Text in das Textfeld eingeben +- LMB auf "Bestätigen" +- Einträge gespeichert + +Eintrag auswählen + +- Menü listet alle Einträge + +- Mehrere Einträge vorhanden +- RMB auf Badge +- LMB auf den Eintrag im Menü +- Gewählter Eintrag im Badge + +Automatischen Wechsel aktivieren + +Zeigt die Einträge ohne Zutun nacheinander + +- Wechsel läuft zyklisch durch die Einträge +- Auswahl eines Eintrags beendet den Wechsel + +- Mehrere Einträge vorhanden +- RMB auf Badge +- Klick auf "Automatisch wechseln" +- Stunden bis zum Wechsel eingeben +- LMB auf "Bestätigen" +- Badge wechselt nach der eingestellten Zeit diff --git a/daten/DesktopNote/setup.md b/daten/DesktopNote/setup.md new file mode 100644 index 0000000..c159292 --- /dev/null +++ b/daten/DesktopNote/setup.md @@ -0,0 +1,25 @@ + +Setup +---------------------------------------- + +kern +---------------------------------------- + +Bringt die Anwendung auf den Rechner und entfernt sie wieder +---------------------------------------- + +- Befehl "make" zeigt die Hilfe +---------------------------------------- + +Anwendung installieren + +- Befehl "make install" ausführen +- Abmelden und wieder anmelden +- Badge in der Topbar sichtbar + +Anwendung deinstallieren + +- Anwendung installiert +- Befehl "make uninstall" ausführen +- Abmelden und wieder anmelden +- Badge fehlt in der Topbar diff --git a/daten/DesktopNote/vision.md b/daten/DesktopNote/vision.md new file mode 100644 index 0000000..a75ea68 --- /dev/null +++ b/daten/DesktopNote/vision.md @@ -0,0 +1,13 @@ + +Vision +---------------------------------------- + +vision +---------------------------------------- + +Text in der Topbar vom Ubuntu Desktop anzeigen. +---------------------------------------- + +- Stop trying to get rich, start trying to follow the rules +- Stop act like a person, become that person +- Discipline is the game diff --git a/daten/RAG/.pruefung.json b/daten/MtoRagSystem/.planung/.pruefung.json similarity index 100% rename from daten/RAG/.pruefung.json rename to daten/MtoRagSystem/.planung/.pruefung.json diff --git a/daten/MtoRagSystem/.planung/.verzeichnis b/daten/MtoRagSystem/.planung/.verzeichnis new file mode 100644 index 0000000..22ab7ba --- /dev/null +++ b/daten/MtoRagSystem/.planung/.verzeichnis @@ -0,0 +1 @@ +/home/arbeit/arbeit/MtoRagSystem diff --git a/daten/MtoRagSystem/.planung/anbindung.md b/daten/MtoRagSystem/.planung/anbindung.md new file mode 100644 index 0000000..1f301e8 --- /dev/null +++ b/daten/MtoRagSystem/.planung/anbindung.md @@ -0,0 +1,157 @@ + +Anbindung +---------------------------------------- + +optional +---------------------------------------- + +Bindet einen externen Server kontrolliert an +---------------------------------------- + +- Ein Token wird nie gespeichert, nur sein Name +- Eine Anbindung startet eingeschaltet, ohne Chatfreigabe +- Eine Anbindung wirkt erst nach Freigabe +- Ein Import führt nie ein Werkzeug aus +- Ein Import liest keine Inhalte +- Anweisungen fremder Inhalte werden entfernt +- Ein Transport über Standardeingabe ist gesperrt +- Nur verschlüsselte Verbindungen sind erlaubt +- Interne Netze sind gesperrt +- Weiterleitungen werden nicht verfolgt +- Protokolle enthalten nur Metadaten +- Der Bereich braucht die höchste Rolle +---------------------------------------- + +Anbindung anlegen + +- Speichern folgt einer bestandenen Prüfung +- Ein Speichern ändert keine Antwort +- Ein Formulartoken ist Pflicht + +- Menüeintrag MCP Quellen wählen +- Reiter Anbindung anlegen wählen +- Formular ausfüllen +- Anbindung speichern +- Anbindung in der Übersicht +---------------------------------------- + +Anbindung prüfen + +Testet die Angaben gegen Erlaubnisliste und Regeln + +- Ohne Onlinetest entstehen keine Abrufe +- Das Ergebnis nennt den Grund +- Die Prüfung speichert nicht + +- Formular ausfüllen +- LMB auf Anbindung prüfen +- Prüfergebnis mit Begründung +---------------------------------------- + +Anbindung bearbeiten + +- Änderungen wirken erst nach dem Speichern +- Werkzeugdaten bleiben erhalten +- Zugewiesene Inhalte bleiben am Kurznamen gebunden + +- Übersicht öffnen +- LMB auf Bearbeiten +- Formular vorbefüllt +---------------------------------------- + +Anbindung umschalten + +Legt eine Anbindung vorübergehend still + +- Ausgewählte Inhalte bleiben gespeichert +- Eine stillgelegte Anbindung wirkt nicht +- Wiedereinschalten braucht keine neue Freigabe + +- Übersicht öffnen +- LMB auf Deaktivieren +- Zustandsmarke wechselt +---------------------------------------- + +Anbindung entfernen + +- Der Raum wird zuvor abgeschaltet +- Eine Rückfrage geht voraus + +- Übersicht öffnen +- LMB auf Entfernen +- Bestätigen +- Anbindung verschwindet +---------------------------------------- + +Ressource übernehmen + +Schreibt eine gefundene Ressource in die Anbindung + +- Nur erkannte Ressourcen sind übernehmbar +- Die Übernahme schaltet den Chat nicht ein + +- Serverinhalte aktualisieren +- LMB auf Ressource übernehmen +- Ressource in der Anbindung +---------------------------------------- + +Serverinhalte aktualisieren + +Erkennt Ressourcen, Werkzeuge und Vorlagen als Metadaten + +- Kein Werkzeug wird ausgeführt +- Vorlagen werden erkannt, nie ausgeführt +- Ressourcen werden nicht gelesen +- Gefundene Werkzeuge sind zunächst gesperrt + +- Übersicht öffnen +- LMB auf Inhalte aktualisieren +- Gefundene Inhalte sichtbar +---------------------------------------- + +Anbindung online prüfen + +Prüft eine gespeicherte Anbindung im Terminal + +- Geprüft werden Freigabe und ein Inhalt +- Ohne prüfbaren Inhalt bricht der Lauf ab +- Ein fehlendes Geheimnis blockt vorher +- Anfragen werden bereinigt protokolliert + +- Kommando mit Servernamen aufrufen +- Prüfbericht sichtbar +---------------------------------------- + +Schutzregeln ansehen + +Zeigt Grenzen und Systemprüfung der Anbindungen + +- Die Anzeige ruft nichts extern ab +- Freie Werkzeugnutzung ist gesperrt + +- Menüeintrag Quellen wählen +- Reiter Sicherheit wählen +- Grenzen und Prüfstand sichtbar +---------------------------------------- + +Freigaben prüfen + +Prüft die Serverliste der Grundeinstellung + +- Kein Transport wird geöffnet +- Das Ergebnis nennt Server, Fehler und Warnungen + +- Kommando aufrufen +- Prüfstand je Regel sichtbar +---------------------------------------- + +Brücke trocken testen + +Prüft Bereinigung und Belegbrücke ohne Serverkontakt + +- Nur lokale Nutzlasten werden geprüft +- Kein Transport, keine Chatwirkung +- Fremde Anweisungsmarker fallen weg + +- Kommando aufrufen +- Bereinigte Nutzlast sichtbar diff --git a/daten/MtoRagSystem/.planung/antwort.md b/daten/MtoRagSystem/.planung/antwort.md new file mode 100644 index 0000000..3fb4237 --- /dev/null +++ b/daten/MtoRagSystem/.planung/antwort.md @@ -0,0 +1,115 @@ + +Antwort +---------------------------------------- + +kern +---------------------------------------- + +Beantwortet eine Frage aus geprüften Quellen +---------------------------------------- + +- Nur Aussagen aus den Quellen +- Fehlende Werte werden nicht erfunden +- Keine Schätzung ersetzt einen fehlenden Wert +- Fakten und Ableitungen bleiben getrennt +- Ableitungen sind als solche markiert +- Eignung gilt als belegpflichtige Aussage +- Negativaussagen brauchen einen Quellenbeleg +- Werbesprache ist untersagt +- Sprache der Frage gilt für die Antwort +- Interne Belegkennungen bleiben auf Nachfrage beschränkt +- Interne Denktexte erreichen niemanden +- Die genutzte Datenbasis steht an der Antwort +- Trefferzahl aus Wissen und Shop liegt bei +- Die Antwortdauer wird ausgewiesen +- Ein Vertrauensabzeichen steht an der Antwort +- Wiederholungsschleifen werden sichtbar abgeschnitten +- Transparente Unsicherheit schlägt sichere Falschaussage +---------------------------------------- + +Frage stellen + +Sendet eine Frage und empfängt die Antwort laufend + +- Leere Frage wird abgewiesen +- Höchstens 10000 Zeichen +- Warnung ab 7500 Zeichen +- Erneutes Senden bleibt bis zum Ende gesperrt +- Entwurf überlebt einen Neuladen +- Unterbrochener Empfang wird fortgesetzt +- Ein Lauf verfällt nach 900 Sekunden +- Ein stehender Lauf wird beendet + +- Text eingeben +- Enter drücken +- Frage im Verlauf +- Antwort läuft ein +---------------------------------------- + +Antwort abbrechen + +Beendet eine laufende Antwort vorzeitig + +- Nur während des Empfangs möglich +- Der Serverlauf arbeitet weiter +- Der Vermerk gilt nur in der laufenden Ansicht +- Nach dem Neuladen steht die volle Antwort + +- Frage stellen +- LMB auf Abbrechen +- Abbruchvermerk im Verlauf +---------------------------------------- + +Frage erneut senden + +Wiederholt die Frage mit anderer Einstellung + +- Angeboten sind nur ungenutzte Varianten +- Der Klick setzt die Einstellung passend +- Während des Empfangs gesperrt + +- Frage stellen +- LMB auf eine Variante +- Frage erneut im Verlauf +---------------------------------------- + +Antwortmodus wählen + +Wählt zwischen gründlicher und schneller Antwort + +- Zwei Werte: Standard und schnell +- Ungültiger Wert fällt auf Standard +- Der schnelle Modus nutzt ein anderes Modell +- Der schnelle Modus antwortet ungenauer +- Die Wahl gilt für die ganze Unterhaltung + +- Chat-Einstellungen öffnen +- Antwortmodus wählen +- Modus an der nächsten Antwort +---------------------------------------- + +Datenbasis wählen + +Legt fest, ob Wissen oder Shopdaten zählen + +- Vier Werte: automatisch, Wissen, Shop, beides +- Unbekannter Wert fällt auf automatisch +- Nur Wissen löst keine Shopsuche aus +- Die genutzte Basis steht in der Antwort + +- Chat-Einstellungen öffnen +- Datenbasis wählen +- Basis in der Zusammenfassung +---------------------------------------- + +Folgeaktion auslösen + +Sendet eine vorgeschlagene Folgefrage sofort + +- Der Fragetext kommt vom Server +- Angebot entfällt bei ablehnender Antwort +- Während des Empfangs passiert nichts + +- Frage stellen +- LMB auf eine Folgeaktion +- Folgefrage im Verlauf diff --git a/daten/MtoRagSystem/.planung/auftrag.md b/daten/MtoRagSystem/.planung/auftrag.md new file mode 100644 index 0000000..6d78ced --- /dev/null +++ b/daten/MtoRagSystem/.planung/auftrag.md @@ -0,0 +1,85 @@ + +Auftrag +---------------------------------------- + +kern +---------------------------------------- + +Führt Indexierung und Neuaufbau nachvollziehbar aus +---------------------------------------- + +- Jeder Lauf hinterlässt einen Auftrag +- Der Auftrag nennt Typ, Zustand, Zeiten und Person +- Fünf Zustände bis zum Abbruch +- Nur der Neuaufbau schreibt eine Protokolldatei +- Nur ein Indexlauf läuft gleichzeitig +- Ein Strukturwechsel erzwingt einen sichtbaren Neuaufbau +- Ein unvollständiger Aufbau bricht ab +---------------------------------------- + +Aufträge einsehen + +Zeigt den Verlauf aller Indexläufe + +- Neueste Aufträge stehen oben +- Der Fehlertext endet in der Liste bei 120 Zeichen + +- Menüeintrag Aufträge wählen +- Auftragsliste sichtbar +---------------------------------------- + +Auftrag verfolgen + +Beobachtet einen einzelnen Lauf bis zum Ende + +- Die Kennung muss dem Kennungsformat folgen +- Der Stand wird zweisekündlich nachgeladen +- Geliefert werden Typ, Zustand, Zeiten und Fehler +- Das Nachladen endet mit dem Auftrag + +- Auftragsliste öffnen +- LMB auf eine Kennung +- Zustandsmarke wechselt +---------------------------------------- + +Index neu aufbauen + +Überführt vorgemerkte Änderungen in den Index + +- Nur die höchste Rolle darf starten +- Der Auftrag beginnt wartend +- Die Arbeit läuft im Hintergrund +- Ein Fehlstart markiert den Auftrag als gescheitert +- Nach Erfolg wird der Zwischenspeicher geleert + +- Dokumentliste öffnen +- LMB auf Index neu aufbauen +- Bestätigen +- Auftragsseite sichtbar +---------------------------------------- + +Auftrag ausführen + +Startet einen vorhandenen Auftrag im Terminal + +- Unbekannte Kennung wird abgewiesen +- Abgeschlossene Aufträge laufen nicht erneut +- Ein Trockenlauf vermeidet schwere Schritte + +- Kommando mit Kennung aufrufen +- Zustandszeile sichtbar +---------------------------------------- + +Index hart neu aufbauen + +Baut Chunks, Vektoren und Tags vollständig neu + +- Ohne Erzwingen bricht der Lauf ab +- Vier Schritte laufen in fester Reihenfolge +- Einzelne Schritte lassen sich überspringen +- Ein gescheiterter Schritt beendet den Lauf +- Ein Trockenlauf schreibt keine Indexdatei + +- Kommando mit Erzwingen aufrufen +- Vier Schritte sichtbar +- Gesundheitsstand am Ende diff --git a/daten/MtoRagSystem/.planung/batch.md b/daten/MtoRagSystem/.planung/batch.md new file mode 100644 index 0000000..82f685c --- /dev/null +++ b/daten/MtoRagSystem/.planung/batch.md @@ -0,0 +1,118 @@ + +Batch +---------------------------------------- + +optional +---------------------------------------- + +Importiert viele Dokumente in einem Lauf +---------------------------------------- + +- Höchstens 250 Dateien je Upload +- Erlaubt sind PDF, Text, Markdown und Word +- Geschützte PDF gelten als nicht verarbeitbar +- Doppelte Prüfsummen werden übersprungen +- Höchstens ein Neuaufbau je Lauf +- Ohne Indexwirkung entfällt der Neuaufbau +- Der Eingang wird nach dem Lauf geräumt +- Je gelungener Lauf entsteht ein Bericht +---------------------------------------- + +Batch hochladen + +Lädt viele Dateien gesammelt und verarbeitet sie + +- Ohne Datei bricht der Lauf ab +- Titel entstehen aus Dateinamen oder Manifest +- Schwache Titel werden markiert +- Wissenskarten entstehen nur auf Wunsch +- Aktivierung ohne Wissenskarte wird verworfen + +- Menüeintrag Batch wählen +- Dateien wählen +- Batch starten +- Ergebniszahlen sichtbar +---------------------------------------- + +Batch vorab prüfen + +Prüft einen Eingang ohne jede Schreibwirkung + +- Kein Dokument wird importiert +- Kein Modell wird aufgerufen +- Dateityp, Prüfsumme und Dubletten werden geprüft +- Zusatzschalter erzeugen eine Warnung + +- Kommando im Trockenlauf aufrufen +- Bericht mit Dateiliste sichtbar +---------------------------------------- + +Batch importieren + +Importiert einen Eingang im Terminal + +- Der Import ist über Prüfsummen wiederholbar +- Ohne eindeutigen Benutzer bricht der Lauf ab +- Der Kommandolauf hat keine Dateigrenze +- Erfolgreiche Quellen verlassen den Eingang +- Fehler und Übersprungenes landen getrennt +- Abgeleitete Versionen bleiben ohne Schalter inaktiv + +- Kommando mit Eingang aufrufen +- Bericht als Datei geschrieben +---------------------------------------- + +Berichte auflisten + +- Höchstens 100 Berichte, neueste oben +- Defekte Berichte werden übersprungen + +- Menüeintrag Batch wählen +- Berichtsliste sichtbar +---------------------------------------- + +Bericht ansehen + +Zeigt einen Lauf je Datei und Schritt + +- Die Kennung darf keine Sonderzeichen tragen +- Ein unbekannter Bericht meldet einen Fehler +- Die Ansicht startet keine Verarbeitung + +- Berichtsliste öffnen +- LMB auf Anzeigen +- Schritte und Dateien sichtbar +---------------------------------------- + +Bericht herunterladen + +- Zwei Formate: JSON und Markdown +- Eine fehlende Datei meldet einen Fehler + +- Berichtsliste öffnen +- LMB auf ein Format +- Datei im Download +---------------------------------------- + +Bericht löschen + +- Beide Formate fallen zusammen weg +- Dokumente und Index bleiben unberührt + +- Berichtsliste öffnen +- LMB auf Löschen +- Bestätigen +- Bericht verschwindet +---------------------------------------- + +Eingang bereinigen + +Räumt leere Ordner und falsche Ablagen auf + +- Die Bereinigung wirkt nur im Importverzeichnis +- Namenskollisionen bekommen einen Zähler +- Kein Einfluss auf Suche oder Antwort + +- Menüeintrag Batch wählen +- LMB auf Eingang bereinigen +- Zahl geräumter Ordner sichtbar diff --git a/daten/MtoRagSystem/.planung/beleg.md b/daten/MtoRagSystem/.planung/beleg.md new file mode 100644 index 0000000..a2e1565 --- /dev/null +++ b/daten/MtoRagSystem/.planung/beleg.md @@ -0,0 +1,71 @@ + +Beleg +---------------------------------------- + +kern +---------------------------------------- + +Weist nach, worauf eine Aussage sich stützt +---------------------------------------- + +- Belegquellen sind Wissen, Shop und URL-Inhalte +- Frühere Antworten belegen keine Fachwerte +- Jede Antwort erhält genau einen Belegzustand +- Direkt belegt gilt nur bei einem tragenden Beleg +- Verstreute Anforderungen ergeben schwach belegt +- Fehlende Pflichtangabe ergibt nicht vollständig belegt +- Ohne Quelle gilt nicht geprüft +- Jeder Beleg trägt eine Stärke +- Fehlende Pflichtmerkmale werden einzeln benannt +- Direkte Dokumentquellen stehen unter der Antwort +- Höchstens vier Quellentitel erscheinen +- Eine genutzte Uploaddatei bleibt in der Quellenliste +---------------------------------------- + +Belegdetails aufklappen + +Zeigt Prüfsignale hinter der Vertrauenslage + +- Ohne echte Signale erscheint keine Belegkarte +- Konflikte werden gesondert benannt +- Die Anzeige gilt für alle sichtbaren Antworten + +- Frage stellen +- LMB auf technische Details +- Claims und Belege sichtbar +---------------------------------------- + +Zusatzinfos umschalten + +Blendet Quellen und Folgeaktionen ein + +- Nur genutzte Quellen werden gelistet +- Die Einstellung überlebt einen Neuladen + +- Chat-Einstellungen öffnen +- Zusatzinfos umschalten +- Quellenblock verschwindet +---------------------------------------- + +Statusprotokoll einschalten + +Macht Prüf- und Quellenschritte sichtbar + +- Der Bereich öffnet sich beim Einschalten +- Statusinfos stehen neben dem Verlauf +- Fehlermeldungen bleiben immer sichtbar +- Prompts und Geheimnisse erscheinen nie + +- Chat-Einstellungen öffnen +- Statusprotokoll einschalten +- Seitenbereich mit Zeitleiste sichtbar +---------------------------------------- + +Statusprotokoll schließen + +- Schließen schaltet die Einstellung aus +- Der Zustand überlebt einen Neuladen + +- Statusprotokoll einschalten +- LMB auf Schließen im Bereich +- Bereich verschwindet diff --git a/daten/MtoRagSystem/.planung/benutzer.md b/daten/MtoRagSystem/.planung/benutzer.md new file mode 100644 index 0000000..4b34aa4 --- /dev/null +++ b/daten/MtoRagSystem/.planung/benutzer.md @@ -0,0 +1,82 @@ + +Benutzer +---------------------------------------- + +kern +---------------------------------------- + +Regelt Zugang und Rollen der Menschen +---------------------------------------- + +- Ein Passwort wird nur verschlüsselt gespeichert +- Eine E-Mail ist eindeutig +- Ein deaktiviertes Konto wird abgewiesen +- Niemand deaktiviert sich selbst +- Der letzte oberste Verwalter bleibt geschützt +- Die Verwaltung braucht die höchste Rolle +- Ein Konto lässt sich nicht löschen +- Deaktivierung beendet die laufende Sitzung +---------------------------------------- + +Benutzer filtern + +- Filter nach Text, Zustand und Rolle +- Die Suche trifft Namen, E-Mail und Abteilung +- Ein ungültiger Wert fällt auf alle +- Die Gesamtzahlen bleiben ungefiltert + +- Menüeintrag Benutzer wählen +- Filter setzen +- LMB auf Filtern +- Trefferzahl sichtbar +---------------------------------------- + +Benutzer erstellen + +- Das Passwort braucht acht Zeichen +- Die Wiederholung muss übereinstimmen +- Mindestens eine Rolle ist Pflicht +- Unbekannte Rollen werden abgewiesen +- Die Grundrolle ist nicht vergebbar + +- Benutzerliste öffnen +- Formular ausfüllen +- Rollen ankreuzen +- Erstellen +- Benutzer in der Liste +---------------------------------------- + +Benutzer bearbeiten + +- Leeres Passwortfeld ändert nichts +- Die oberste Rolle entzieht sich niemand selbst +- Namen enden bei 100 Zeichen +- Abteilung endet bei 120 Zeichen + +- Benutzerliste öffnen +- LMB auf Bearbeiten +- Felder ändern +- Speichern +- Änderung in der Liste +---------------------------------------- + +Benutzer umschalten + +Sperrt oder öffnet den Zugang sofort + +- Bestehende Rollen bleiben erhalten + +- Benutzerliste öffnen +- LMB auf Zustand +- Bestätigen +- Zustandsspalte wechselt +---------------------------------------- + +Benutzer im Terminal anlegen + +- Doppelte E-Mail wird abgewiesen +- Die Eingabe erfolgt abgefragt + +- Kommando aufrufen +- Angaben eintragen +- Benutzer angelegt diff --git a/daten/MtoRagSystem/.planung/betriebspruefung.md b/daten/MtoRagSystem/.planung/betriebspruefung.md new file mode 100644 index 0000000..229cd66 --- /dev/null +++ b/daten/MtoRagSystem/.planung/betriebspruefung.md @@ -0,0 +1,117 @@ + +Betriebsprüfung +---------------------------------------- + +optional +---------------------------------------- + +Bewertet Betriebsreife vor der Abnahme +---------------------------------------- + +- Jede Prüfung liest nur lokale Angaben +- Kein Chat, kein Shop, kein Modell läuft +- Ein Fehler setzt den Gesamtstand +- Ein fehlender Nachweis wird zur Warnung +- Ein Nachweis wird nie stillschweigend angenommen +- Geheimnisse bleiben Verweise +- Der Restore-Nachweis bleibt Betreiberaufgabe +- Das System richtet keine Zeitsteuerung ein +- Jedes Ergebnis landet bereinigt im Protokoll +---------------------------------------- + +Betrieb überblicken + +Fasst alle Prüfstände und die letzte Sicherung + +- Die Seite bewertet bei jedem Aufruf neu +- Nur ausgelöste Prüfungen landen im Protokoll +- Der nächste sinnvolle Schritt steht dabei + +- Menüeintrag Betrieb wählen +- Gesamtstand und Teilstände sichtbar +---------------------------------------- + +Sicherheit prüfen + +Prüft Rollen, Geheimnisse und Grenzen + +- Die Prüfung ersetzt kein externes Audit +- Geheimniswerte werden nicht gelesen + +- Betriebsseite öffnen +- LMB auf Sicherheit prüfen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Sicherungsweg prüfen + +Bewertet Pfad, Umfang und Restore-Nachweis + +- Es entsteht keine Sicherung +- Ein Restore-Erfolg wird nicht behauptet + +- Betriebsseite öffnen +- LMB auf Sicherungsweg prüfen +- Prüfpunkte sichtbar +---------------------------------------- + +Zeitsteuerung prüfen + +Bewertet Automatik, Turnus und Betreibernachweise + +- Der Betreiber dokumentiert Automatik selbst +- Nicht beschreibbare Pfade erzeugen Hinweise + +- Betriebsseite öffnen +- LMB auf Zeitsteuerung prüfen +- Nachweistabelle sichtbar +---------------------------------------- + +Protokoll einsehen + +Zeigt die zuletzt ausgelösten Prüfungen + +- Keine Prompts und keine Rohantworten +- Keine Geheimnisse und keine Zugangsdaten +- Der Text endet bei 220 Zeichen +- Höchstens 50 Einträge bleiben erhalten +- Die Anzeige zeigt die letzten acht + +- Betriebsseite öffnen +- Protokollbereich lesen +- Letzte Prüfungen sichtbar +---------------------------------------- + +Abnahmebericht ausgeben + +Lädt den bereinigten Bericht zur Abnahme + +- Zwei Formate: JSON und Markdown +- Die Datengrenze steht im Bericht +- Erledigte Aufgaben fallen weg +- Der Export startet keine Prüfung + +- Betriebsseite öffnen +- Format wählen +- Bericht im Download +---------------------------------------- + +Betriebsreife im Terminal prüfen + +- Nur ein grüner Stand endet ohne Fehler +- Warnungen ändern den Ausgang nicht + +- Kommando aufrufen +- Fallliste sichtbar +---------------------------------------- + +Unterlagen öffnen + +Zeigt Runbook und Checklisten im Adminbereich + +- Nur Markdown aus dem Projektverzeichnis +- Die Anzeige ist rein lesend + +- Menüeintrag Leitfäden wählen +- Dokument wählen +- Inhalt sichtbar diff --git a/daten/MtoRagSystem/.planung/claim.md b/daten/MtoRagSystem/.planung/claim.md new file mode 100644 index 0000000..3b790d7 --- /dev/null +++ b/daten/MtoRagSystem/.planung/claim.md @@ -0,0 +1,51 @@ + +Claim +---------------------------------------- + +kern +---------------------------------------- + +Prüft einzelne Aussagen der Antwort gegen Belege +---------------------------------------- + +- Geprüft werden Werte, Preise und Artikelnummern +- Geprüft werden URLs und Rollencodes +- Geprüft werden Relationen und Kompatibilitätsaussagen +- Ein Claim ohne Quelle gilt als unbelegt +- Ein unbelegter Claim setzt ein Prüfsignal +- Unbelegte Claims werden benannt +- Höchstens fünf Beispiele erscheinen +- Rollencodes gelten nur bei genauer Übereinstimmung +- Relationen brauchen beide Partner in einem Dokument +- Eine leere Antwort gilt als ungeprüft +- Sieben Claim-Arten stehen fest +---------------------------------------- + +Antwort bewerten + +Meldet falsche Zuordnung oder Quellenfehler zurück + +- Zwei Werte: zustimmend und ablehnend +- Ablehnung erlaubt einen Kommentar +- Kommentar wird auf 2000 Zeichen gekürzt +- Bewertung braucht eine fertige Antwort +- Eine fremde Antwort wird abgewiesen +- Die Oberfläche sperrt nach dem Speichern +- Ein erneuter Aufruf überschreibt die Bewertung +- Frage und Antwort werden mitgespeichert + +- Frage stellen +- LMB auf eine Bewertung +- Bestätigung sichtbar +---------------------------------------- + +Prompt kopieren + +Übernimmt die eigene Frage in die Zwischenablage + +- Kopiert wird nur der Fragetext +- Erfolg wird kurz gemeldet + +- Frage stellen +- LMB auf Kopieren +- Rückmeldung an der Schaltfläche diff --git a/daten/MtoRagSystem/.planung/diagnose.md b/daten/MtoRagSystem/.planung/diagnose.md new file mode 100644 index 0000000..59ca8f0 --- /dev/null +++ b/daten/MtoRagSystem/.planung/diagnose.md @@ -0,0 +1,84 @@ + +Diagnose +---------------------------------------- + +optional +---------------------------------------- + +Untersucht einzelne Teile des Antwortwegs +---------------------------------------- + +- Diagnosen ändern Antwortgüte und Wahrheitssicherung nicht +- Prompts und Rohantworten werden nie ausgegeben +- Betriebsfunktionen beeinflussen die Antwort nicht +---------------------------------------- + +Im Terminal fragen + +Stellt Fragen an das System ohne Oberfläche + +- Die Antwort läuft in Stücken ein +- Statusmeldungen stehen dazwischen +- Der Lauf löst echte Modellaufrufe aus + +- Kommando aufrufen +- Frage eintragen +- Antwort läuft ein +---------------------------------------- + +Suchweg testen + +Prüft den hybriden Suchweg zu einer Frage + +- Leere Frage wird abgewiesen +- Die Ausgabe nennt Dauer und Trefferzahl + +- Kommando mit Frage aufrufen +- Trefferliste sichtbar +---------------------------------------- + +Faktenabdeckung prüfen + +Prüft, wie gut Fakten eine Frage abdecken + +- Eine leere Frage wird abgewiesen +- Eine Mindestgüte ist wählbar + +- Kommando mit Frage aufrufen +- Abdeckung mit Zusammenfassung sichtbar +---------------------------------------- + +Ankerauflösung testen + +Prüft die Auflösung einer Folgefrage trocken + +- Kein Eingriff in die Laufzeit +- Mehrdeutige Anker werden verworfen +- Eine genannte Artikelnummer schlägt jeden Anker + +- Kommando mit Folgefrage aufrufen +- Auflösungsbericht sichtbar +---------------------------------------- + +Verlaufsanker auslesen + +Zieht Bezugsanker aus einem Gesprächsverlauf + +- Anker belegen keine Fachwerte +- Eingabe per Argument, Datei oder Strom +- Ein eingebauter Rauchtest ist wählbar + +- Kommando mit Rauchtest aufrufen +- Ankerliste sichtbar +---------------------------------------- + +Fakten inspizieren + +Untersucht gespeicherte Fakten der Chunkdatei + +- Eine fehlende Chunkdatei meldet einen Fehler +- Nur lesender Zugriff auf den Index +- Filter nach Text, Typ und Anzahl + +- Kommando mit Suchtext aufrufen +- Trefferliste sichtbar diff --git a/daten/MtoRagSystem/.planung/dokument.md b/daten/MtoRagSystem/.planung/dokument.md new file mode 100644 index 0000000..a4ae5a2 --- /dev/null +++ b/daten/MtoRagSystem/.planung/dokument.md @@ -0,0 +1,107 @@ + +Dokument +---------------------------------------- + +kern +---------------------------------------- + +Führt eine Wissensquelle über ihre Versionen +---------------------------------------- + +- Ein Dokument hält mehrere Versionen +- Genau eine Version ist aktiv +- Tags hängen am Dokument, nicht an der Version +- Schreiben an Dokument oder Version ändert den Index nicht +---------------------------------------- + +Dokumente filtern + +Grenzt die Liste nach Zustand und Pflege ein + +- Sechs Filter: Suche, Status, Index, Version, Titel, Tags +- Unbekannter Filterwert fällt auf alle +- Die Suche trifft Titel, Kennung und Dateiname +- Kennzahlen zählen immer den Gesamtbestand + +- Dokumentliste öffnen +- Filter setzen +- LMB auf Filtern +- Trefferzahl sichtbar +---------------------------------------- + +Dokument hochladen + +Legt eine Wissensquelle mit erster Version an + +- Die Datei ist Pflicht +- Ohne Titel dient der Dateiname als Titel +- Ein schwacher Titel bekommt einen Prüfhinweis +- Version eins entsteht aktiv +- Je Version wird eine Prüfsumme gespeichert +- Der Index bleibt bis zum Neuaufbau unverändert + +- Dokumentliste öffnen +- LMB auf neues Dokument +- Datei wählen +- Speichern +- Dokumentseite sichtbar +---------------------------------------- + +Titel ändern + +Ersetzt einen schwachen Titel fachlich + +- Leerer Titel wird abgewiesen +- Höchstens 255 Zeichen +- Der Prüfhinweis entfällt danach +- Index und Antwortlogik bleiben unberührt + +- Dokumentseite öffnen +- Titel ändern +- Speichern +- Titel als geprüft markiert +---------------------------------------- + +Titel vorschlagen lassen + +Erzeugt Titelkandidaten aus dem Dokumentanfang + +- Der Ausschnitt endet bei 9000 Zeichen +- Höchstens sechs Vorschläge +- Höchstens 120 Zeichen je Vorschlag +- Zu kurze Kandidaten fallen weg +- Ein Klick füllt nur das Feld +- Dokument, Version und Index bleiben unberührt + +- Dokumentseite öffnen +- LMB auf Titel vorschlagen +- Kandidat wählen +- Titelfeld gefüllt +---------------------------------------- + +Indexbereitschaft ansehen + +Zeigt, was den Index bisher nicht erreicht hat + +- Offene Änderungen werden gezählt +- Gelöschte Dokumente im Index werden benannt + +- Dokumentliste öffnen +- Bereitschaftsblock lesen +- Zahl offener Änderungen sichtbar +---------------------------------------- + +Dokument löschen + +Entfernt Dokument, Versionen und Dateien endgültig + +- Nur die höchste Rolle darf löschen +- Ein laufender Neuaufbau verhindert das Löschen +- Versionsdateien werden mitgelöscht +- Ein Auftrag hält den Vorgang fest +- Der Index ändert sich beim nächsten Neuaufbau + +- Dokumentliste öffnen +- LMB auf Löschen +- Bestätigen +- Dokument verschwindet diff --git a/daten/MtoRagSystem/.planung/evalfall.md b/daten/MtoRagSystem/.planung/evalfall.md new file mode 100644 index 0000000..7438a6b --- /dev/null +++ b/daten/MtoRagSystem/.planung/evalfall.md @@ -0,0 +1,77 @@ + +Evalfall +---------------------------------------- + +optional +---------------------------------------- + +Beschreibt einen prüfbaren Fall für die Antwortgüte +---------------------------------------- + +- Neun Falltypen stehen im Adminbereich +- Ein zehnter Typ läuft nur im Terminal +- Eine Fallkennung ist projektweit eindeutig +- Pflichtfelder sind Kennung, Typ und Frage +- Fälle liegen als Zeilendatei je Typ und Bereich +- Schreiben erfolgt mit ausschließender Sperre +---------------------------------------- + +Bereich wählen + +Schaltet zwischen Systembasis und Fachbereich + +- Der Bereich prägt jede weitere Handlung +- Fachbereiche liegen in eigenen Ordnern + +- Menüeintrag Eval Suite wählen +- LMB auf einen Bereichsreiter +- Fälle des Bereichs sichtbar +---------------------------------------- + +Evalfall anlegen + +- Doppelte Kennung wird abgewiesen +- Erwartung muss ein Objekt sein +- Verlauf muss eine Liste sein +- Ein Fehler verhindert jede Änderung + +- Menüeintrag Eval Suite wählen +- LMB auf neuer Test +- Formular ausfüllen +- Absenden +- Fall in der Datei +---------------------------------------- + +Evalfall geführt anlegen + +Legt einen Fall über einen Assistenten an + +- Eigener Entwurf mit eigener Fehlerprüfung + +- Menüeintrag Eval Suite wählen +- LMB auf Assistent +- Schritte ausfüllen +- Fall in der Datei +---------------------------------------- + +Evalfall ableiten + +Übernimmt einen gescheiterten Lauf als Fall + +- Kennung und Frage werden vorbelegt + +- Lauf mit Fehlschlag öffnen +- LMB auf Fall übernehmen +- Formular vorbefüllt +---------------------------------------- + +Evalfall löschen + +- Eine defekte Zeile verhindert die Änderung +- Unbekannte Kennung meldet einen Fehler +- Eine Rückfrage geht voraus + +- Seite neuer Test öffnen +- LMB auf Löschen +- Bestätigen +- Fall verschwindet diff --git a/daten/MtoRagSystem/.planung/evallauf.md b/daten/MtoRagSystem/.planung/evallauf.md new file mode 100644 index 0000000..aae1024 --- /dev/null +++ b/daten/MtoRagSystem/.planung/evallauf.md @@ -0,0 +1,100 @@ + +Evallauf +---------------------------------------- + +optional +---------------------------------------- + +Prüft die Antwortpipeline gegen gespeicherte Fälle +---------------------------------------- + +- Ein gescheiterter Fall setzt den Gesamtstand +- Eine leere Auswahl gilt nicht als Fehlschlag +- Berichte entstehen unteilbar +- Evals messen Fälle, nicht jede mögliche Frage +- Fünf Falltypen rufen das Modell +- Vier Falltypen laufen ohne Modell +---------------------------------------- + +Evallauf starten + +Führt Fälle aus dem Adminbereich aus + +- Der Lauf braucht die Wissensrolle +- Der Bericht wird zusätzlich archiviert +- Der Lauf blockiert die Anfrage bis zum Ende + +- Menüeintrag Eval Suite wählen +- Auswahl treffen +- Lauf starten +- Ergebnis je Fall sichtbar +---------------------------------------- + +Einzelfall erneut testen + +Wiederholt genau einen gescheiterten Fall + +- Nur der gewählte Fall läuft + +- Lauf mit Fehlschlag öffnen +- LMB auf erneut testen +- Ergebnis des Falls sichtbar +---------------------------------------- + +Läufe vergleichen + +Stellt zwei Berichte als Unterschied gegenüber + +- Der Vergleich nennt behoben, neu und entfernt + +- Menüeintrag Eval Suite wählen +- Vergleichsbasis wählen +- Unterschied sichtbar +---------------------------------------- + +Evallauf im Terminal ausführen + +- Die Auswahl folgt Typ und Bereich +- Ein Abbruch nach dem ersten Fehler ist wählbar +- Ein Lauf ohne Schreiben ist wählbar +- Fälle lassen sich nur auflisten + +- Kommando mit Typ aufrufen +- Ergebnis je Fall sichtbar +---------------------------------------- + +Evallauf parallelisieren + +Verteilt Fälle auf mehrere Kindprozesse + +- Zwischen einem und 32 Prozessen +- Vorgabe sind zwei Prozesse +- Ein Zeitlimit je Prozess ist wählbar +- Das Ergebnis ist ein Sammelbericht + +- Kommando mit Prozesszahl aufrufen +- Sammelbericht sichtbar +---------------------------------------- + +Berichte aufräumen + +- Nur erzeugte Dateinamen fallen weg +- Aufräumen behält 20 Läufe je Bereich +- Die Liste zeigt zehn Läufe + +- Menüeintrag Eval Suite wählen +- LMB auf Aufräumen +- Berichtszahl sinkt +---------------------------------------- + +Berichte löschen + +Entfernt alle Läufe eines Bereichs + +- Der aktuelle Lauf fällt mit weg +- Eine Rückfrage geht voraus + +- Menüeintrag Eval Suite wählen +- LMB auf alle löschen +- Bestätigen +- Berichtsliste leer diff --git a/daten/MtoRagSystem/.planung/fremdinhalt.md b/daten/MtoRagSystem/.planung/fremdinhalt.md new file mode 100644 index 0000000..e100caf --- /dev/null +++ b/daten/MtoRagSystem/.planung/fremdinhalt.md @@ -0,0 +1,138 @@ + +Fremdinhalt +---------------------------------------- + +optional +---------------------------------------- + +Prüft externe Inhalte vor jeder Nutzung +---------------------------------------- + +- Geprüft wird der ausgewählte Inhalt +- Ein Lesen führt kein Werkzeug aus +- Ein Lesen ändert die Antwortpipeline nicht +- Vorschauen sind gekürzt und bereinigt +- Externe Inhalte heben ihren Rang nicht selbst +- Der Bereich braucht die höchste Rolle +- Keine Übernahme ins Standardwissen erfolgt automatisch +---------------------------------------- + +Inhalt live prüfen + +Liest den ausgewählten Inhalt einmalig online + +- Nur der gewählte Inhalt wird gelesen +- Ohne Zutun wird nichts gespeichert + +- Übersicht öffnen +- LMB auf Inhalt prüfen +- Bestätigen +- Vorschau mit Abrufzahl +---------------------------------------- + +Inhalt bereitstellen + +Merkt einen gelesenen Inhalt als Kandidat vor + +- Chat und Antwortnutzung bleiben aus +- Der Kandidat startet ohne Freigabe +- Eine Rückfrage geht voraus + +- Inhalt live prüfen +- LMB auf bereitstellen +- Bestätigen +- Kandidat in der Liste +---------------------------------------- + +Inhalt auswählen + +Ordnet einen Inhalt einem Raum zur Prüfung zu + +- Zwei Arten: eigener Raum und Ergänzung +- Die Auswahl gilt schon als geprüft +- Die Auswahl schaltet den Chat nicht ein +- Standardwissen wird dadurch nicht ergänzt + +- Räume überblicken +- LMB auf Inhalt auswählen +- Bestätigen +- Inhalt im Freigabebereich +---------------------------------------- + +Inhalt entscheiden + +Gibt einen geprüften Inhalt frei oder stellt zurück + +- Fünf Wege bis zum Zurücksetzen +- Eine unbekannte Entscheidung wird abgewiesen +- Eine Freigabe schaltet den Chat nicht ein +- Die Notiz endet bei 1000 Zeichen + +- Freigabebereich öffnen +- LMB auf Inhalt ansehen +- Entscheidung wählen +- Zustandsmarke wechselt +---------------------------------------- + +Inhalt im Chat einschalten + +Fügt einen freigegebenen Inhalt dem Raum zu + +- Nur geprüfte Inhalte eines eigenen Raums +- Nicht vorbereitete Inhalte werden abgewiesen +- Suche und Belege bleiben unberührt +- Es entsteht kein gespeichertes Wissen + +- Freigabebereich öffnen +- LMB auf im Chat einschalten +- Inhalt als aktiv markiert +---------------------------------------- + +Kandidaten filtern + +Grenzt vorbereitete Inhalte nach Zustand ein + +- Filter nach Zustand, Anbindung, Art und Zeit +- Das Filtern ruft nichts extern ab + +- Vorbereitete Inhalte öffnen +- Filter setzen +- Trefferliste eingegrenzt +---------------------------------------- + +Kandidat entfernen + +Löscht einen vorbereiteten Inhalt endgültig + +- Die Vorschau fällt mit weg + +- Vorbereitete Inhalte öffnen +- LMB auf Entfernen +- Kandidat verschwindet +---------------------------------------- + +Kandidaten ausgeben + +Lädt vorbereitete Inhalte als Datei herunter + +- Zwei Formate: Markdown und JSONL +- Der Export gibt die gefilterte Menge aus +- Der Export wirkt nicht als Freigabe + +- Vorbereitete Inhalte öffnen +- Format wählen +- Herunterladen +- Datei im Download +---------------------------------------- + +Ressource lesen + +Liest eine freigegebene Ressource im Terminal + +- Nur erlaubte Server und Adressen +- Der Inhalt wird bereinigt +- Ausgegeben werden nur Metadaten und Prüfsumme +- Eine Kürzung wird gekennzeichnet + +- Kommando mit Adresse aufrufen +- Metadaten und Prüfsumme sichtbar diff --git a/daten/MtoRagSystem/.planung/indexprofil.md b/daten/MtoRagSystem/.planung/indexprofil.md new file mode 100644 index 0000000..51e6894 --- /dev/null +++ b/daten/MtoRagSystem/.planung/indexprofil.md @@ -0,0 +1,64 @@ + +Indexprofil +---------------------------------------- + +optional +---------------------------------------- + +Legt Struktur für Chunking und Einbettung fest +---------------------------------------- + +- Ein Profil ist unveränderlich +- Genau ein Profil ist aktiv +- Einsehen braucht die Wissensrolle +- Ändern braucht die höchste Rolle +- Die Version zählt beim Anlegen hoch +- Ein neues Profil entsteht inaktiv +---------------------------------------- + +Profile prüfen + +Gleicht das aktive Profil gegen den Index ab + +- Der Vergleich läuft gegen die Indexmetadaten +- Eine abweichende Zeile setzt den Gesamtstand +- Fehlende Metadaten gelten als Strukturabweichung +- Die Ansicht startet keinen Neuaufbau + +- Menüeintrag Indexprofile wählen +- Abweichungen je Zeile sichtbar +---------------------------------------- + +Profil anlegen + +- Chunkgröße von 50 bis 1000 in Schritten von 25 +- Überlappung von 25 bis 200 in Schritten von 25 +- Das Einbettungsmodell ist Pflicht +- Fehlende Pflichtwerte nennen das Feld +- Nur die höchste Rolle darf anlegen + +- Indexprofile öffnen +- Werte eintragen +- Profil erstellen +- Inaktives Profil sichtbar +---------------------------------------- + +Profil aktivieren + +- Das bisherige Profil wird deaktiviert +- Die Aktivierung startet keinen Neuaufbau + +- Indexprofile öffnen +- LMB auf Aktivieren +- Bestätigen +- Profil als aktiv markiert +---------------------------------------- + +Profil löschen + +- Der Löschweg erscheint nur bei inaktiven Profilen + +- Indexprofile öffnen +- LMB auf Löschen +- Bestätigen +- Profil verschwindet diff --git a/daten/MtoRagSystem/.planung/konfiguration.md b/daten/MtoRagSystem/.planung/konfiguration.md new file mode 100644 index 0000000..45db7ca --- /dev/null +++ b/daten/MtoRagSystem/.planung/konfiguration.md @@ -0,0 +1,46 @@ + +Konfiguration +---------------------------------------- + +optional +---------------------------------------- + +Prüft die wirksamen Einstellungen vor dem Betrieb +---------------------------------------- + +- Fachsemantik gehört in die Konfiguration +- Harte Sonderpfade im Antwortkern sind verboten +- Geänderter Kataloginhalt wirkt ohne Codeänderung +---------------------------------------- + +Konfiguration validieren + +- Fehler und Warnungen erscheinen getrennt +- Warnungen ändern den Ausgang nicht +- Regressionswächter melden nur Warnungen + +- Kommando aufrufen +- Fehler- und Warnliste sichtbar +---------------------------------------- + +Konfiguration ausgeben + +Zeigt die aufgelöste Einstellung zur Diagnose + +- Die Ausgabe ist nicht bereinigt +- Pfade und Adressen stehen darin +- Nur der Shopschlüssel bleibt verborgen + +- Kommando aufrufen +- Vollständige Ausgabe sichtbar +---------------------------------------- + +Quellen auditieren + +Prüft Herkunft, Muster und Fachneutralität + +- Reine Quelltextanalyse ohne Laufzeitwirkung +- Ein Fehlerstand beendet den Lauf + +- Kommando aufrufen +- Kennzahlen und Funde sichtbar diff --git a/daten/MtoRagSystem/.planung/modellprofil.md b/daten/MtoRagSystem/.planung/modellprofil.md new file mode 100644 index 0000000..8497f9a --- /dev/null +++ b/daten/MtoRagSystem/.planung/modellprofil.md @@ -0,0 +1,68 @@ + +Modellprofil +---------------------------------------- + +optional +---------------------------------------- + +Stellt Modell und Suchparameter der Antwort ein +---------------------------------------- + +- Höchstens ein Profil ist systemweit aktiv +- Ohne aktives Profil greifen die Vorgabewerte +- Die Version zählt je Modellname hoch +- Ein neues Profil entsteht inaktiv +- Ein aktives Profil lässt sich nicht löschen +- Nur fehlende Felder erben die Vorgabewerte +- Wertebereiche greifen erst beim Aktivieren +- Suchwerte werden still auf 1 bis 200 begrenzt +---------------------------------------- + +Profile auflisten + +- Das aktive Profil steht oben +- Die Anzeige startet keine Erzeugung + +- Menüeintrag Modellsetup wählen +- Profilliste sichtbar +---------------------------------------- + +Profil erstellen + +- Der Modellname ist Pflicht +- Nur die höchste Rolle darf anlegen + +- Profilliste öffnen +- Werte eintragen +- Absenden +- Inaktives Profil sichtbar +---------------------------------------- + +Profil aktivieren + +- Profilliste öffnen +- LMB auf Aktivieren +- Bestätigen +- Profil als aktiv markiert +---------------------------------------- + +Profil löschen + +- Profilliste öffnen +- LMB auf Löschen +- Bestätigen +- Profil verschwindet +---------------------------------------- + +Suche testen + +Prüft das Trefferverhalten eines Profils + +- Leere Frage liefert kein Ergebnis +- Der Test ändert das Profil nicht +- Der Test aktiviert das Profil nicht + +- Profilliste öffnen +- LMB auf Testen +- Frage eintragen +- Trefferliste sichtbar diff --git a/daten/MtoRagSystem/.planung/protokoll.md b/daten/MtoRagSystem/.planung/protokoll.md new file mode 100644 index 0000000..24dfe5d --- /dev/null +++ b/daten/MtoRagSystem/.planung/protokoll.md @@ -0,0 +1,43 @@ + +Protokoll +---------------------------------------- + +optional +---------------------------------------- + +Zeigt Betriebsmeldungen der Dienste +---------------------------------------- + +- Nur die höchste Rolle darf lesen +- Die Anzeige ist rein lesend +- Kein Löschen ist vorgesehen +---------------------------------------- + +Protokolle auflisten + +- Nur Dateien nach festem Namensmuster +- Neueste Änderung steht oben + +- Menüeintrag Protokolle wählen +- Dateiliste mit Größe sichtbar +---------------------------------------- + +Protokoll anzeigen + +- Höchstens 1000 Zeilen +- Gelesen wird vom Dateiende +- Eine fehlende Datei meldet einen Fehler + +- Protokollliste öffnen +- LMB auf Anzeigen +- Letzte Zeilen sichtbar +---------------------------------------- + +Vektorprotokoll anzeigen + +- Feste Quelle im Protokollverzeichnis +- Höchstens 500 Zeilen +- Eine fehlende Datei meldet einen Hinweis + +- Menüeintrag Vektorprotokoll wählen +- Letzte Zeilen sichtbar diff --git a/daten/MtoRagSystem/.planung/rueckmeldung.md b/daten/MtoRagSystem/.planung/rueckmeldung.md new file mode 100644 index 0000000..c1d4115 --- /dev/null +++ b/daten/MtoRagSystem/.planung/rueckmeldung.md @@ -0,0 +1,99 @@ + +Rückmeldung +---------------------------------------- + +optional +---------------------------------------- + +Sammelt Nutzerkritik für die Verbesserung +---------------------------------------- + +- Eine Rückmeldung hängt an einer Antwort +- Die Adminsicht braucht die Wissensrolle +- Ein Löschen ist endgültig +- Der Export enthält Frage und Antwort im Klartext +- Der Export folgt den gesetzten Filtern +---------------------------------------- + +Rückmeldungen filtern + +Grenzt Fälle nach zehn Merkmalen ein + +- Filter nach Bewertung und Bearbeitungsstand +- Filter nach Einordnung und Fehlerverdacht +- Filter nach Vorrang und Referenzwert +- Seitengröße wählbar mit 25, 50 oder 100 + +- Menüeintrag Chat-Feedback wählen +- Filter setzen +- Trefferliste sichtbar +---------------------------------------- + +Rückmeldung ansehen + +Zeigt einen Fall mit Frage und Antwort + +- Rückmeldungen filtern +- LMB auf einen Fall +- Frage und Antwort sichtbar +---------------------------------------- + +Rückmeldung erledigen + +- Eine Notiz ist möglich + +- Rückmeldung ansehen +- LMB auf erledigt +- Zustand wechselt +---------------------------------------- + +Rückmeldung wieder öffnen + +- Erledigte Rückmeldung ansehen +- LMB auf wieder öffnen +- Zustand wechselt +---------------------------------------- + +Rückmeldungen gesammelt erledigen + +Setzt den Stand für die ganze Auswahl + +- Auswahl über Kästchen oder Filter +- Höchstens 5000 Fälle je Aktion + +- Rückmeldungen filtern +- Auswahl treffen +- LMB auf Auswahl erledigen +- Zustände wechseln +---------------------------------------- + +Rückmeldung löschen + +- Rückmeldung ansehen +- LMB auf Löschen +- Bestätigen +- Eintrag verschwindet +---------------------------------------- + +Rückmeldungen ausgeben + +- Zwei Formate: Markdown und JSONL +- Der Export ist nicht bereinigt +- Vorgefertigte Auszüge je Vorrang + +- Rückmeldungen filtern +- Format wählen +- Datei im Download +---------------------------------------- + +Rückmeldungen einordnen + +Bestimmt Typ, Risiko und Vorrang im Terminal + +- Ohne Erzwingen nur ungeordnete Einträge +- Höchstens 5000 Einträge je Lauf +- Vorgabe sind 500 Einträge +- Zwischenstände werden gespeichert + +- Kommando aufrufen +- Zähler je Risiko sichtbar diff --git a/daten/MtoRagSystem/.planung/selbsttest.md b/daten/MtoRagSystem/.planung/selbsttest.md new file mode 100644 index 0000000..ac14084 --- /dev/null +++ b/daten/MtoRagSystem/.planung/selbsttest.md @@ -0,0 +1,76 @@ + +Selbsttest +---------------------------------------- + +optional +---------------------------------------- + +Sichert Grenzen des Systems gegen Rückschritte +---------------------------------------- + +- 23 Selbsttests decken die Regressionsfläche +- Jeder Test hat sein eigenes Kommando +- Es gibt kein Sammelkommando +- Jeder Test liefert Fallliste und Ausgang +- Jeder Test kennt eine maschinenlesbare Ausgabe +- 15 Tests prüfen nur den Quelltext +- Sechs Tests prüfen gemischt +- Zwei Tests prüfen nur Verhalten +---------------------------------------- + +Einzeltest ausführen + +Prüft eine benannte Grenze des Systems + +- Kein Modell, kein Netz, keine Antwort +- Keine Datenbank und kein Import +- Ein gescheiterter Fall beendet den Lauf + +- Kommandonamen aus der Übersicht holen +- Kommando aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Ingestgrenzen prüfen + +Sichert Markdown, Chunks und Batchgrenzen ab + +- Zwölf Kommandos decken diesen Bereich +- Ein Test räumt sein Verzeichnis selbst auf + +- Kommando aus der Ingestgruppe aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Anbindungsgrenzen prüfen + +Sichert Fremddaten und Werkzeuggrenzen ab + +- Drei Kommandos decken diesen Bereich +- Verbotene Zeichenketten gelten als Fall + +- Kommando aus der Anbindungsgruppe aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Architekturgrenzen prüfen + +Sichert Flussgrenzen und Produktregeln ab + +- Fünf Kommandos decken diesen Bereich +- Ein Test hängt an einer Freigabeversion + +- Kommando aus der Architekturgruppe aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Antwortgrenzen prüfen + +Sichert Anker, Prüfung und Raumauswahl ab + +- Drei Kommandos decken diesen Bereich +- Keine Chatantwort und kein Shopzugriff +- Unbelegte Begriffe bleiben unrepariert + +- Kommando aus der Antwortgruppe aufrufen +- Fallliste mit Ständen sichtbar diff --git a/daten/MtoRagSystem/.planung/shoptreffer.md b/daten/MtoRagSystem/.planung/shoptreffer.md new file mode 100644 index 0000000..a386971 --- /dev/null +++ b/daten/MtoRagSystem/.planung/shoptreffer.md @@ -0,0 +1,75 @@ + +Shoptreffer +---------------------------------------- + +optional +---------------------------------------- + +Liefert Preis und Verfügbarkeit aus dem Shop +---------------------------------------- + +- Der Preis stammt allein aus dem Shopdatensatz +- Ohne Shoppreis erscheint kein Preis +- Ein fehlender Preis wird nicht zu null +- Kostenlos gilt nur mit Quellenbeleg +- Verfügbarkeit stammt allein aus dem Shopfeld +- Die Produktadresse stammt aus dem Shoppfad +- Reine Wissensantworten tragen keine Shopadressen +- Ein Shoptreffer belegt keine technische Eignung +- Zubehör wird nicht als Hauptgerät ausgegeben +- Bündelangaben bleiben unzerlegt +- Gefilterte Treffer sind keine fehlenden Treffer +- Kein Treffer bedeutet nicht: gibt es nicht +- Ein Shopausfall wird gemeldet +- Bei automatischer Basis startet sie nur bei Kaufbezug +- Die Basis Shop erzwingt die Suche +- Die gesendete Suchanfrage wird offengelegt +- Bilder stammen aus dem Bildfeld desselben Datensatzes +---------------------------------------- + +Shopsuche auslösen + +Sucht aus einer Wissensantwort passende Produkte + +- Angebot entfällt bei gleicher Suche +- Angebot entfällt bei ablehnender Antwort +- Eine erweiterte Suche wird ausgewiesen + +- Frage stellen +- LMB auf Shopsuche +- Trefferliste sichtbar +---------------------------------------- + +Preis nachfragen + +Ruft Handelsdaten zum genannten Produkt ab + +- Angebot entfällt bei genanntem Preis +- Die Folgeantwort bleibt am Produkt + +- Frage nach einem Produkt stellen +- LMB auf Preis anzeigen +- Preis und Artikelnummer sichtbar +---------------------------------------- + +Treffer filtern + +Grenzt die Liste auf Zubehör oder Geräte ein + +- Angebot erscheint nur bei Wirkung +- Mehrdeutige Rollen gelten nicht als Gerät + +- Shopsuche auslösen +- LMB auf eine Rolle +- Liste eingegrenzt +---------------------------------------- + +Shopsuche diagnostizieren + +Prüft eine Suchanfrage samt Reparatur im Terminal + +- Der Zugriff läuft live gegen den Shop +- Die Reparatursuche bevorzugt den angefragten Code + +- Kommando mit Suchtext aufrufen +- Suchanfrage und Treffer sichtbar diff --git a/daten/MtoRagSystem/.planung/sicherung.md b/daten/MtoRagSystem/.planung/sicherung.md new file mode 100644 index 0000000..0595250 --- /dev/null +++ b/daten/MtoRagSystem/.planung/sicherung.md @@ -0,0 +1,90 @@ + +Sicherung +---------------------------------------- + +optional +---------------------------------------- + +Sichert Anwendung und Datenbank nachvollziehbar +---------------------------------------- + +- Geheimnisse werden nie mitkopiert +- Fremdbibliotheken und Zwischenspeicher bleiben draußen +- Ein Datenbankabzug entsteht auf Anforderung oder Vorgabe +- Eine Sperrdatei verhindert parallele Läufe +- Sieben Stände bleiben rollierend erhalten +- Symlinks werden übersprungen +- Ein Verzeichnis nennt Umfang und Kennung +- Eine gelungene Sicherung beweist keinen Restore +---------------------------------------- + +Sicherung testen + +Prüft den geplanten Umfang ohne Schreibvorgang + +- Keine Sicherungsdatei entsteht +- Keine alte Sicherung fällt weg +- Fehlende Pflichtquellen erscheinen als Warnung +- Fehlende Zusatzquellen zählen getrennt + +- Betriebsseite öffnen +- LMB auf Sicherung testen +- Umfang und Warnungen sichtbar +---------------------------------------- + +Sicherung starten + +- Ein Datenbankabzug braucht Schalter oder Vorgabe +- Das Verzeichnis nennt keinen Zugang +- Geräumte Sicherungen werden benannt +- Eine Rückfrage geht voraus + +- Betriebsseite öffnen +- LMB auf Sicherung starten +- Bestätigen +- Sicherung in der Liste +---------------------------------------- + +Sicherung herunterladen + +Holt ein Archiv für den Restore-Test + +- Nur die höchste Rolle darf herunterladen +- Nur gültige lokale Kennungen +- Der Abruf startet keine Sicherung + +- Betriebsseite öffnen +- LMB auf Herunterladen +- Archiv im Download +---------------------------------------- + +Restore prüfen + +Bewertet eine Sicherung als Wiederherstellungsgrundlage + +- Nur die höchste Rolle darf prüfen +- Es läuft keine Wiederherstellung +- Kein Datenbankimport erfolgt +- Gelesen werden Verzeichnis und Bestandteile +- Das Ergebnis liefert einen Plan + +- Betriebsseite öffnen +- LMB auf Restore prüfen +- Prüfpunkte und Plan sichtbar +---------------------------------------- + +Sicherung im Terminal erstellen + +- Ein Trockenlauf schreibt keine Datei +- Die Aufbewahrung ist wählbar + +- Kommando aufrufen +- Kennung und Umfang sichtbar +---------------------------------------- + +Restore im Terminal prüfen + +- Kein Netz, kein Modell, kein Chat + +- Kommando mit Kennung aufrufen +- Prüfpunkte und Plan sichtbar diff --git a/daten/MtoRagSystem/.planung/sitzung.md b/daten/MtoRagSystem/.planung/sitzung.md new file mode 100644 index 0000000..241fbe9 --- /dev/null +++ b/daten/MtoRagSystem/.planung/sitzung.md @@ -0,0 +1,83 @@ + +Sitzung +---------------------------------------- + +kern +---------------------------------------- + +Hält Zugang und Verlauf einer Unterhaltung +---------------------------------------- + +- Chat und Adminbereich teilen eine Anmeldung +- Ein Abmelden beendet beide Bereiche +- Der Verlauf hängt an einem Browserkennzeichen +- Ein Abmelden löscht dieses Kennzeichen nicht +- Deaktivierte Konten werden abgewiesen +- Der Verlauf löst nur Bezüge auf +- Der Verlauf belegt keine Fachwerte +- Ein Hinweis nennt Fehlerrisiko und Datennutzung +---------------------------------------- + +Am Chat anmelden + +- E-Mail und Passwort sind Pflicht +- Ohne Chatrolle erscheint eine Verbotsseite +- Falscher Zugang behält die E-Mail +- Angemeldete landen sofort im Chat + +- Anmeldeseite aufrufen +- E-Mail und Passwort eintragen +- Bestätigen +- Chat mit Verlauf sichtbar +---------------------------------------- + +Vom Chat abmelden + +- Gemerkte Einstellungen bleiben erhalten + +- LMB auf Abmelden +- Anmeldeseite sichtbar +---------------------------------------- + +Am Adminbereich anmelden + +- Ohne Adminrolle erscheint eine Verbotsseite +- Berechtigte landen auf der Systemübersicht +- Der letzte Benutzername ist vorbelegt + +- Adminanmeldung aufrufen +- E-Mail und Passwort eintragen +- Bestätigen +- Systemübersicht sichtbar +---------------------------------------- + +Vom Adminbereich abmelden + +- LMB auf Abmelden +- Anmeldeseite sichtbar +---------------------------------------- + +Verlauf löschen + +Entfernt Gespräch, Produktbezüge und Uploads + +- Während des Empfangs gesperrt +- Löscht alle temporären Uploads mit +- Keine Rückfrage, keine Wiederherstellung +- Danach fehlen alle Bezugsanker + +- LMB auf Verlauf löschen +- Verlauf leer +- Uploadliste leer +---------------------------------------- + +Hilfe öffnen + +Zeigt das Bedienhandbuch im Chat + +- Nur bei vorhandener Handbuchdatei +- Höchstens 512 KB werden gelesen +- Die Hilfe ändert keine Antwortlogik + +- LMB auf Hilfe +- Handbuch im Fenster sichtbar diff --git a/daten/MtoRagSystem/.planung/systemprompt.md b/daten/MtoRagSystem/.planung/systemprompt.md new file mode 100644 index 0000000..3827769 --- /dev/null +++ b/daten/MtoRagSystem/.planung/systemprompt.md @@ -0,0 +1,46 @@ + +Systemprompt +---------------------------------------- + +optional +---------------------------------------- + +Steuert die Grundanweisung an das Modell +---------------------------------------- + +- Genau eine Version ist aktiv +- Die Version zählt fortlaufend hoch +- Eine neue Version überschreibt keine alte +- Nur die höchste Rolle darf ändern +---------------------------------------- + +Version speichern + +- Leerer Inhalt wird abgewiesen +- Die neue Version wird sofort aktiv +- Die bisherige Version wird abgeschaltet + +- Menüeintrag Systemprompt wählen +- Text eintragen +- Speichern +- Neue aktive Version oben +---------------------------------------- + +Version aktivieren + +Schaltet auf eine frühere Version zurück + +- Systemprompt öffnen +- LMB auf Aktivieren +- Bestätigen +- Kennzeichnung wechselt +---------------------------------------- + +Version löschen + +- Eine aktive Version bleibt geschützt + +- Systemprompt öffnen +- LMB auf Löschen +- Bestätigen +- Version verschwindet diff --git a/daten/MtoRagSystem/.planung/tag.md b/daten/MtoRagSystem/.planung/tag.md new file mode 100644 index 0000000..6351030 --- /dev/null +++ b/daten/MtoRagSystem/.planung/tag.md @@ -0,0 +1,92 @@ + +Tag +---------------------------------------- + +optional +---------------------------------------- + +Lenkt die Suche über gepflegte Signale +---------------------------------------- + +- Drei Typen: allgemein, Katalogobjekt, Vertriebssignal +- Unbekannter Typ fällt auf allgemein +- Ein Slug ist eindeutig +- Jede Änderung stößt einen Neuaufbau an +- Ein laufender Neuaufbau verhindert einen zweiten +---------------------------------------- + +Tag anlegen + +- Slug und Bezeichnung sind Pflicht +- Der Slug wird kleingeschrieben +- Leerzeichen werden zu Bindestrichen +- Ein doppelter Slug wird abgewiesen + +- Tagliste öffnen +- Bezeichnung und Slug eintragen +- Anlegen +- Tag in der Liste +---------------------------------------- + +Tag löschen + +- Alle Zuweisungen fallen mit weg + +- Tagliste öffnen +- LMB auf Löschen +- Bestätigen +- Tag verschwindet +---------------------------------------- + +Dokumente zuweisen + +Ordnet einem Tag mehrere Dokumente zu + +- Nur aktive Dokumente stehen zur Wahl +- Doppelte Kennungen werden entfernt +- Nur Unterschiede werden geschrieben + +- Tagliste öffnen +- LMB auf Zuweisen +- Dokumente ankreuzen +- Speichern +- Zähler angepasst +---------------------------------------- + +Dokument-Tags bearbeiten + +Setzt die Tags eines einzelnen Dokuments + +- Tags erscheinen nach Typ sortiert +- Nicht angekreuzte Tags fallen weg + +- Dokumentliste öffnen +- LMB auf Tags +- Tags ankreuzen +- Speichern +- Neuaufbau angestoßen +---------------------------------------- + +Neuaufbau verfolgen + +Zeigt den Fortschritt des Tag-Neuaufbaus laufend + +- Der Stand wird zweisekündlich abgefragt +- Ein Lebenszeichen kommt zehnsekündlich +- Vier Zustände: wartend, laufend, fertig, gescheitert +- Das Zusehen stößt keinen Neuaufbau an + +- Tagliste öffnen +- Statuszeile beobachten +- Zustand wechselt bis fertig +---------------------------------------- + +Tagindex neu aufbauen + +Baut Tagexport und Tagvektoren im Terminal neu + +- Entweder Auftragskennung oder Neuanlage +- Eine Sperrdatei verhindert Parallelläufe + +- Kommando mit Neuanlage aufrufen +- Kennzahlen sichtbar diff --git a/daten/MtoRagSystem/.planung/upload.md b/daten/MtoRagSystem/.planung/upload.md new file mode 100644 index 0000000..963d239 --- /dev/null +++ b/daten/MtoRagSystem/.planung/upload.md @@ -0,0 +1,68 @@ + +Upload +---------------------------------------- + +kern +---------------------------------------- + +Stellt eine Datei als Quelle der Sitzung bereit +---------------------------------------- + +- Erlaubt sind PDF, Markdown und Text +- Höchstens drei Dateien je Sitzung +- Höchstens 10 MB je Datei +- Ein Upload verfällt nach 60 Minuten +- Uploads ändern die Wissensbasis nie +- Ein Upload beginnt nachrangig +- Ein Upload lässt sich auf vorrangig stellen +- Der ausgewertete Text endet bei 60000 Zeichen +- Der Client prüft, der Server prüft erneut +---------------------------------------- + +Datei hochladen + +- Eine leere Datei weist erst der Server ab +- Übergroße Datei wird abgewiesen +- Bei erreichtem Maximum ist der Zugang gesperrt +- Ein Upload beginnt nachrangig + +- LMB auf Hinzufügen +- Datei wählen +- Datei mit Größe sichtbar +---------------------------------------- + +Nutzung wählen + +Legt fest, ob der Upload allein zählt + +- Abfrage erscheint nach dem Hochladen +- Als eigener Raum zählt nur der Upload +- Als Ergänzung bleibt Standardwissen führend +- Ohne Freigabe bleibt Standardwissen wirksam + +- Datei hochladen +- Eine Nutzungsart wählen +- Wissensraum passt sich an +---------------------------------------- + +Upload priorisieren + +Hebt den Upload gegenüber dem Wissen an + +- Zwei Modi: nachrangig und vorrangig +- Als eigener Raum entfällt der Schalter +- Ein Widerspruch bleibt sichtbar ausgewiesen + +- Datei hochladen +- LMB auf den Rangvermerk +- Vermerk zeigt vorrangig +---------------------------------------- + +Upload entfernen + +- Wirkt nur auf eigene Uploads +- Ohne Upload fällt der Raum zurück + +- Datei hochladen +- LMB auf Entfernen +- Datei verschwindet diff --git a/daten/MtoRagSystem/.planung/version.md b/daten/MtoRagSystem/.planung/version.md new file mode 100644 index 0000000..678a70c --- /dev/null +++ b/daten/MtoRagSystem/.planung/version.md @@ -0,0 +1,135 @@ + +Version +---------------------------------------- + +kern +---------------------------------------- + +Hält einen unveränderlichen Stand eines Dokuments +---------------------------------------- + +- Eine Version wird nie überschrieben +- Jede Version trägt eine Prüfsumme +- Eine neue Version entsteht inaktiv +- Nur die aktive Version speist den Index +---------------------------------------- + +Version hochladen + +Legt einen Nachfolgestand als neue Version ab + +- Die Datei ist Pflicht +- Die Nummer zählt vom höchsten Stand hoch +- Die aktive Version bleibt unverändert + +- Dokumentseite öffnen +- LMB auf neue Version +- Datei wählen +- Hochladen +- Inaktive Version sichtbar +---------------------------------------- + +Originaltext ansehen + +Zeigt die Textbasis vor der Chunk-Erzeugung + +- Die Anzeige ändert die Datei nicht +- Jede Seite liefert 40000 Zeichen +- Eine angeforderte Seitengröße endet bei 80000 +- Weitere Seiten laden beim Blättern nach +- Nicht lesbare Formate melden einen Fehler + +- Dokumentseite öffnen +- LMB auf Original ansehen +- Text im Fenster sichtbar +---------------------------------------- + +Version ableiten + +Speichert korrigierten Text als neue Version + +- Die Arbeitskopie endet bei 180000 Zeichen +- Leerer Inhalt wird abgewiesen +- Der Dateiname nennt die Quellversion +- Quelle und aktive Version bleiben unberührt +- Die neue Version ist inaktiv + +- Originaltext ansehen +- Text anpassen +- Als neue Version speichern +- Inaktive Version sichtbar +---------------------------------------- + +Wissenskarte erzeugen + +Erstellt eine strukturierte Markdown-Fassung der Version + +- Die Quelle wird segmentiert verarbeitet +- Ein unvollständiger Plan bricht ab +- Der Zusammenbau erfolgt durch das System +- Der Nachweis nennt Modell und Segmentzahl +- Kein Index wird geschrieben +- Doppelklicks bleiben während des Laufs gesperrt + +- Dokumentseite öffnen +- LMB auf Wissenskarte erzeugen +- Bestätigen +- Neue inaktive Version sichtbar +---------------------------------------- + +Version aktivieren + +Wählt eine Version als künftige Antwortbasis + +- Genau eine Version bleibt aktiv +- Die Version wird zum Neuaufbau vorgemerkt +- Kein Auftrag und kein Neuaufbau startet +- Bis dahin gilt der letzte stabile Index + +- Dokumentseite öffnen +- LMB auf Version aktivieren +- Bestätigen +- Warnung zum Neuaufbau sichtbar +---------------------------------------- + +Version vormerken + +Markiert die aktive Version für den Neuaufbau + +- Nur die aktive Version lässt sich vormerken +- Es startet kein Einzellauf + +- Dokumentseite öffnen +- LMB auf vormerken +- Bestätigen +- Version als vorgemerkt markiert +---------------------------------------- + +Chunks lesen + +Zeigt die Chunks einer Version aus dem Index + +- Die Anzeige ändert keine Antwortlogik +- Höchstens 300 Chunks je Version +- Je Chunk höchstens 1400 Zeichen +- Je Chunk höchstens 30 Fakten +- Ohne Indexeinträge erscheint eine Warnung + +- Dokumentseite öffnen +- LMB auf Chunks lesen +- Chunkliste sichtbar +---------------------------------------- + +Chunkgüte vergleichen + +Stellt Original und Wissenskarte gegenüber + +- Die Prüfung läuft nur im Speicher +- Kein Index wird geschrieben +- Kein Modell wird aufgerufen +- Ein fehlendes Gegenstück meldet einen Hinweis +- Der Vergleich nennt Chunks, Tabellen und Fakten + +- Dokumentseite öffnen +- LMB auf Güte vergleichen +- Vergleich sichtbar diff --git a/daten/MtoRagSystem/.planung/vision.md b/daten/MtoRagSystem/.planung/vision.md new file mode 100644 index 0000000..62a5b93 --- /dev/null +++ b/daten/MtoRagSystem/.planung/vision.md @@ -0,0 +1,72 @@ + +Vision +---------------------------------------- + +vision +---------------------------------------- + +Antworten sollen nicht nur plausibel klingen, sondern nachprüfbar sein. +---------------------------------------- + +Beleggeführt antworten + +Jede Aussage bekommt einen nachvollziehbaren Belegzustand +- Was nicht in den Quellen steht, wird nicht behauptet +- Belegzustand und Abdeckung sind ablesbar +- Einzelne Aussagen werden gegen die Belege geprüft +---------------------------------------- + +Grenzen zeigen + +Fehlendes, Schwaches und Widersprüchliches bleibt sichtbar +- Fehlende Quellen werden benannt, nicht ersetzt +- Quellenkonflikte werden gezeigt statt zusammengeführt +- Transparente Unsicherheit schlägt sichere Falschaussage +---------------------------------------- + +Quellen trennen + +Fachwissen, Handelsdaten und Uploads bleiben unterscheidbar +- Ein Shoppreis belegt keine technische Eignung +- Wissensräume trennen die Bestände sichtbar +- Ein Upload bleibt temporär und nachrangig +---------------------------------------- + +Wissen pflegen + +Dokumente werden antwortfähig, nicht nur abgelegt +- Versionen bleiben einzeln nachvollziehbar +- Struktur, Chunks und Fakten sind einsehbar +- Ein Neuaufbau ist eine bewusste Entscheidung +---------------------------------------- + +Fremddaten kontrollieren + +Externe Quellen wirken nur nach bewusster Freigabe +- Nichts wird automatisch zu Standardwissen +- Nur lesende Werkzeuge, nie Schreibaktionen +- Jede Freigabe ist eine eigene Entscheidung +---------------------------------------- + +Fachfrei bleiben + +Fachsemantik gehört in Konfiguration, nicht in den Kern +- Harte Sonderpfade im Antwortkern sind verboten +- Ein Fachpaket ist pflegbar ohne Codeänderung +- Diagnosen verändern die Antwortgüte nicht +---------------------------------------- + +Betrieb nachweisen + +Der Betreiber kann belegen, dass das System trägt +- Prüfungen, Sicherungen und Berichte sind abrufbar +- Berichte enthalten keine Geheimnisse +- Ein Restore-Nachweis bleibt Aufgabe des Betreibers +---------------------------------------- + +Grenzen des Systems anerkennen + +Das System ersetzt keine Prüfung durch Menschen +- Es gibt keine Rechteverwaltung im Wissen +- Kein Ersatz für Audit, Rechtsrat oder Abkommen +- Evals messen Fälle, nicht universelle Wahrheit diff --git a/daten/MtoRagSystem/.planung/werkzeug.md b/daten/MtoRagSystem/.planung/werkzeug.md new file mode 100644 index 0000000..a14db82 --- /dev/null +++ b/daten/MtoRagSystem/.planung/werkzeug.md @@ -0,0 +1,56 @@ + +Werkzeug +---------------------------------------- + +optional +---------------------------------------- + +Erlaubt ein lesendes Werkzeug im Anbindungsraum +---------------------------------------- + +- Nur eindeutig lesende Werkzeuge sind erlaubt +- Werkzeuge mit Schreibrisiko bleiben gesperrt +- Eine Freigabe gilt nur für ihren Raum +- Das Modell schlägt vor, das System führt aus +- Ein freigegebenes Werkzeug läuft ohne Rückfrage +- Höchstens ein Werkzeug je Antwort +- Jede Nutzung erhält einen Nachweis +- Ein Werkzeugfehler wird sichtbar gemeldet +- Standardwissen und Shop bleiben ausgeschlossen +- Der Bereich braucht die höchste Rolle +---------------------------------------- + +Werkzeug freigeben + +- Nicht eindeutig lesende Werkzeuge bleiben gesperrt +- Der Grund für eine Sperre steht dabei +- Die Freigabe führt kein Werkzeug aus + +- Räume überblicken +- Abschnitt Werkzeuge aufklappen +- LMB auf freigeben +- Werkzeug als freigegeben markiert +---------------------------------------- + +Werkzeugfreigabe zurücknehmen + +- Die Rücknahme wirkt sofort + +- Räume überblicken +- Abschnitt Werkzeuge aufklappen +- LMB auf Freigabe entfernen +- Werkzeug wieder gesperrt +---------------------------------------- + +Werkzeugergebnis auswählen + +Ordnet ein gespeichertes Ergebnis einem Raum zu + +- Kein Werkzeug läuft dabei +- Ergebnisse bleiben gespeicherte Prüfinformationen +- Ergebnisse sind nicht live lesbar + +- Räume überblicken +- Abschnitt Ergebnisse aufklappen +- LMB auf auswählen +- Ergebnis im Freigabebereich diff --git a/daten/MtoRagSystem/.planung/wissensindex.md b/daten/MtoRagSystem/.planung/wissensindex.md new file mode 100644 index 0000000..5b682fc --- /dev/null +++ b/daten/MtoRagSystem/.planung/wissensindex.md @@ -0,0 +1,90 @@ + +Wissensindex +---------------------------------------- + +kern +---------------------------------------- + +Hält die durchsuchbare Fassung des Wissens +---------------------------------------- + +- Treffer unter der Mindestgüte fallen weg +- Jeder Treffer trägt eine Chunkkennung +- Dokument und Abschnitt kommen mit, sofern vorhanden +- Eine nicht erreichbare Suche liefert keine Treffer +- Ein veralteter Index wird gemeldet +- Ein unvollständiger Aufbau bricht ab +---------------------------------------- + +Systemstand ansehen + +Zeigt Chunkzahl und Gesundheit der Dienste + +- Die Anzeige schreibt nichts +- Die harte Chunkgrenze liegt bei 25000 + +- Menüeintrag Systemübersicht wählen +- Chunkzahl und Gesundheit sichtbar +---------------------------------------- + +Chunkindex einsehen + +- Nur die höchste Rolle darf einsehen +- Vorgabe 50, höchstens 200 Einträge je Seite +- Die Anzeige startet keinen Neuaufbau + +- Menüeintrag Wissensbasis wählen +- Metadaten und Einträge sichtbar +---------------------------------------- + +Zwischenspeicher leeren + +Verwirft kurzlebige Zwischenstände nach Wartung + +- Der Dienst kennt keine Antwortlogik +- Ein nicht erreichbarer Vektordienst ergibt eine Warnung +- Eine Rückfrage geht voraus + +- Systemübersicht öffnen +- LMB auf Zwischenspeicher leeren +- Bestätigen +- Ergebnismeldung sichtbar +---------------------------------------- + +Gesundheit prüfen + +Prüft Vektor- und Tagindex im Terminal + +- Gesund ist jeder Zustand mit Vorsilbe OK +- Es entsteht kein Schreibzugriff + +- Kommando aufrufen +- Prüfbericht sichtbar +---------------------------------------- + +Vektordienst steuern + +Startet, stoppt oder lädt den Vektordienst neu + +- Die Steuerung läuft über das Kontrollskript +- Das Zeitlimit beträgt 600 Sekunden + +- Kommando mit Aktion aufrufen +- Ausgabe des Skripts sichtbar +---------------------------------------- + +Wissen zurücksetzen + +Löscht Dokumente, Versionen, Tags und Indexdateien + +- Nur die höchste Rolle darf ausführen +- Die Funktion ist standardmäßig gesperrt +- Der Bestätigungstext muss wörtlich stimmen +- Zuvor entsteht eine Sicherung +- Ein Fehlschlag der Sicherung bricht ab + +- Systemübersicht öffnen +- Bestätigungstext eintippen +- Absenden +- Bestätigen +- Sicherungspfad sichtbar diff --git a/daten/MtoRagSystem/.planung/wissensraum.md b/daten/MtoRagSystem/.planung/wissensraum.md new file mode 100644 index 0000000..58c7074 --- /dev/null +++ b/daten/MtoRagSystem/.planung/wissensraum.md @@ -0,0 +1,97 @@ + +Wissensraum +---------------------------------------- + +kern +---------------------------------------- + +Bestimmt, welcher Bestand eine Antwort trägt +---------------------------------------- + +- Standardwissen ist immer verfügbar +- Standardwissen lässt sich nicht abschalten +- Ein Uploadraum antwortet nur aus dem Upload +- Ein Uploadraum kennt keinen stillen Rückfall +- Ein Anbindungsraum liest nur Freigegebenes +- Ein Anbindungsraum mischt kein Standardwissen +- Ein unbekannter Raum fällt auf Standardwissen +- Freigegebene Inhalte und Werkzeugergebnisse sind nachrangig +- Beide bleiben vom Rangvorteil ausgenommen +---------------------------------------- + +Wissensraum wählen + +Legt die Antwortgrundlage der Unterhaltung fest + +- Der Uploadraum braucht einen gültigen Upload +- Gesperrte Räume sind nicht wählbar +- Während des Empfangs gesperrt + +- Chat-Einstellungen öffnen +- Wissensraum wählen +- Raum in der Zusammenfassung +---------------------------------------- + +Räume überblicken + +Zeigt, welche Räume arbeiten und angeboten werden + +- Der Zugang braucht die höchste Rolle +- Anbindungen sind erst nach Freigabe wirksam + +- Menüeintrag Wissensräume wählen +- Räume mit Zählern sichtbar +---------------------------------------- + +Chatauswahl umschalten + +Gibt einen Raum für die Chatauswahl frei + +- Standardwissen bleibt gesperrt +- Ausschalten löscht keine Freigaben +- Wiedereinschalten braucht keine neue Freigabe +- Nicht vorgesehene Räume werden abgewiesen + +- Räume überblicken +- LMB auf Einschalten +- Raum als aktiv markiert +---------------------------------------- + +Freigegebenen Inhalt vorschauen + +Liest einen freigegebenen Inhalt vor der Entscheidung + +- Der Dialog liest nur auf Klick +- Kein Standardwissen und kein Werkzeug +- Es wird nichts gespeichert + +- Räume überblicken +- Freigabebereich öffnen +- LMB auf live lesen +- Textvorschau sichtbar +---------------------------------------- + +Herkunft ansehen + +Zeigt, welche Inhalte welchem Raum gehören + +- Reine Anzeige ohne Freigabe +- Kein externer Abruf entsteht + +- Räume überblicken +- Abschnitt Herkunft aufklappen +- Zuordnungen je Raum sichtbar +---------------------------------------- + +Raumgrenzen prüfen + +Führt sechs Selbsttests zu den Raumgrenzen aus + +- Es entsteht keine Chatantwort +- Kein Werkzeug wird ausgeführt +- Kein Inhalt wird live gelesen +- Netz und Speicher werden je Test ausgewiesen + +- Räume überblicken +- LMB auf Prüfungen ausführen +- Sammelergebnis sichtbar diff --git a/daten/MtoRagSystem/.pruefung.json b/daten/MtoRagSystem/.pruefung.json new file mode 100644 index 0000000..13292ac --- /dev/null +++ b/daten/MtoRagSystem/.pruefung.json @@ -0,0 +1,2735 @@ +{ + "abdeckung": { + "befehl:mto:agent:architecture:flow-boundary-lock-self-test": { + "abdruck": "c925f9ebbfd2ac93", + "funktion": "Flow-Grenze sperren", + "trug": "ea1cbd831236ff9b" + }, + "befehl:mto:agent:architecture:product-label-formatter-self-test": { + "abdruck": "0d4a6b2e979afd6b", + "funktion": "Produktlabel-Formatierer testen", + "trug": "74392b10f4a0556c" + }, + "befehl:mto:agent:architecture:product-role-code-assignment-guard-self-test": { + "abdruck": "60e19a0ea2d093fe", + "funktion": "Rollencode-Zuweisung prüfen", + "trug": "f2997c6adf648e7d" + }, + "befehl:mto:agent:architecture:retrieval-boundary-plan-self-test": { + "abdruck": "7f8215ff3dff4b5c", + "funktion": "Abrufgrenzen prüfen", + "trug": "f28e16b270157b1c" + }, + "befehl:mto:agent:chat": { + "abdruck": "097710e520fe8631", + "funktion": "Mit Agent chatten", + "trug": "1229550e6c0369a3" + }, + "befehl:mto:agent:config:audit-patterns": { + "abdruck": "0b1c8dad920a1d05", + "funktion": "Konfigurationsmuster prüfen", + "trug": "1b7dd0cb5cba69f8" + }, + "befehl:mto:agent:config:dump-effective": { + "abdruck": "0ba647f167567c2b", + "funktion": "Konfiguration anzeigen", + "trug": "2511a19eea51ca10" + }, + "befehl:mto:agent:config:validate": { + "abdruck": "cb09c2dfeb607be8", + "funktion": "Konfiguration prüfen", + "trug": "108abbfa38def03f" + }, + "befehl:mto:agent:enterprise:backup-restore-readiness": { + "abdruck": "ad2992db1999b947", + "funktion": "Backup-Tauglichkeit prüfen", + "trug": "990d7d1975e35860" + }, + "befehl:mto:agent:enterprise:backup-run": { + "abdruck": "e5e1870cc5f2a2c7", + "funktion": "Daten sichern", + "trug": "6391c6a03fff9ba3" + }, + "befehl:mto:agent:enterprise:deployment-scheduler-readiness": { + "abdruck": "b7f9a71b8bce1733", + "funktion": "Bereitschaftsbericht ausgeben", + "trug": "1961781c00c38587" + }, + "befehl:mto:agent:enterprise:operations-overview": { + "abdruck": "941982a7c7e9d9df", + "funktion": "Übersicht rendern", + "trug": "d6b379dbcf57c5dc" + }, + "befehl:mto:agent:enterprise:operator-report": { + "abdruck": "3305eaab802a8180", + "funktion": "Akzeptanzbericht generieren", + "trug": "1e122f300e60146f" + }, + "befehl:mto:agent:enterprise:readiness-check": { + "abdruck": "c5898cf586f10094", + "funktion": "Betriebsbereitschaft prüfen", + "trug": "dd4dda8395a78a97" + }, + "befehl:mto:agent:enterprise:restore-dry-run": { + "abdruck": "f471bab3a3187f13", + "funktion": "Backup-Trockenlauf prüfen", + "trug": "38cceaaa7e618c63" + }, + "befehl:mto:agent:enterprise:security-data-protection-readiness": { + "abdruck": "0a15e861d54def48", + "funktion": "Sicherheitsstatus prüfen", + "trug": "95276315f7c29265" + }, + "befehl:mto:agent:eval:parallel": { + "abdruck": "440dabce16816af3", + "funktion": "Eval-Fälle parallelisieren", + "trug": "8de24027a3e2c83c" + }, + "befehl:mto:agent:eval:run": { + "abdruck": "85ce4fdd99e94c23", + "funktion": "Eval-Fälle ausführen", + "trug": "73538935d4ddd959" + }, + "befehl:mto:agent:feedback:classify": { + "abdruck": "5428da2879624973", + "funktion": "Feedback klassifizieren", + "trug": "00b9152d4536b7ac" + }, + "befehl:mto:agent:genre:audit-core-neutrality": { + "abdruck": "f97cab11f1213a75", + "funktion": "Genre-Hotspots prüfen", + "trug": "91bc58442eee2f36" + }, + "befehl:mto:agent:history:anchors": { + "abdruck": "69a43649a218b596", + "funktion": "Verankerungen extrahieren", + "trug": "4b9bd02538873b0f" + }, + "befehl:mto:agent:history:followup-dry-run": { + "abdruck": "2af2830fff693f92", + "funktion": "Verankerung testen", + "trug": "9803f7bc34ffb84d" + }, + "befehl:mto:agent:ingest:chunk-quality": { + "abdruck": "179b20588e0c26d7", + "funktion": "Datenqualität prüfen", + "trug": "a162e9d2ed54a9e5" + }, + "befehl:mto:agent:ingest:chunk-quality-self-test": { + "abdruck": "7f431dab24f49f21", + "funktion": "Vergleichsgrenzen validieren", + "trug": "a9bb27f89b92b3a2" + }, + "befehl:mto:agent:ingest:deferred-reindex-state-self-test": { + "abdruck": "4decd99e80b91dd7", + "funktion": "Indizierungszustand prüfen", + "trug": "3ff8ed7e97021ae8" + }, + "befehl:mto:agent:ingest:markdown-derived-chunk-diagnostics-self-test": { + "abdruck": "ab9c4c968bef5c19", + "funktion": "Provenienz prüfen", + "trug": "7c406a0b8ca3453d" + }, + "befehl:mto:agent:ingest:markdown-normalization-foundation-self-test": { + "abdruck": "3f7feb1c5b040048", + "funktion": "Normalisierung prüfen", + "trug": "109ef8545f52ea37" + }, + "befehl:mto:agent:ingest:markdown-normalization-preview-self-test": { + "abdruck": "0f88411e0d7407b2", + "funktion": "Preview prüfen", + "trug": "fc8906b1cdfef658" + }, + "befehl:mto:agent:ingest:run": { + "abdruck": "aef780b3982b6bed", + "funktion": "Ingest-Job starten", + "trug": "f887e188d6183e35" + }, + "befehl:mto:agent:ingest:segmented-markdown-normalization-self-test": { + "abdruck": "21912db371ab9e77", + "funktion": "Segmentierung prüfen", + "trug": "34003cb287e4f9d7" + }, + "befehl:mto:agent:knowledge-space:chat-selection-guard-self-test": { + "abdruck": "601aa7233164d6b5", + "funktion": "Chat-Auswahl-Guard testen", + "trug": "ac7be281304f5f16" + }, + "befehl:mto:agent:knowledge:batch-admin-upload-self-test": { + "abdruck": "21121f956adc3ca0", + "funktion": "Stapel-Upload verifizieren", + "trug": "df545dae80c027af" + }, + "befehl:mto:agent:knowledge:batch-finalize-self-test": { + "abdruck": "4d4c21b129b2a50c", + "funktion": "Wissensbatch finalisieren testen", + "trug": "e9d61c0127ac4796" + }, + "befehl:mto:agent:knowledge:batch-hygiene-self-test": { + "abdruck": "6e777c8e17e244c3", + "funktion": "Hygieneregeln prüfen", + "trug": "761903cb0a2d2033" + }, + "befehl:mto:agent:knowledge:batch-import": { + "abdruck": "47be9b2b1135f1f4", + "funktion": "Batch-Import durchführen", + "trug": "baeac712078f4a8f" + }, + "befehl:mto:agent:knowledge:batch-inbox-disposition-self-test": { + "abdruck": "3e2e59ae7e444730", + "funktion": "Hygieneregeln prüfen", + "trug": "761903cb0a2d2033" + }, + "befehl:mto:agent:mcp:admin-source-check": { + "abdruck": "414f4d925dd1dd7b", + "funktion": "MCP-Quelle prüfen", + "trug": "0917ca989dcd1b58" + }, + "befehl:mto:agent:mcp:admin-source-discover": { + "abdruck": "333c1e221f30b3b8", + "funktion": "Fähigkeiten ermitteln", + "trug": "1e53c164947ea291" + }, + "befehl:mto:agent:mcp:evidence-dry-run": { + "abdruck": "695d5fa49f9a7743", + "funktion": "Simulation ausführen", + "trug": "0f010df62c3d5412" + }, + "befehl:mto:agent:mcp:gateway-dry-run": { + "abdruck": "bf9c879d67aac387", + "funktion": "MCP-Gateway trocken ausführen", + "trug": "59f4089864406319" + }, + "befehl:mto:agent:mcp:hybrid-tool-selection-planner-self-test": { + "abdruck": "d082f417503050bd", + "funktion": "Hybrid-Tool-Auswahl testen", + "trug": "9c05f0bc361a0308" + }, + "befehl:mto:agent:mcp:read-only-tool-execution-self-test": { + "abdruck": "99468d4b3ccde91e", + "funktion": "MCP-Laufzeit-Gate prüfen", + "karten": "69d65c7a24056348", + "trug": "c67fbeaf071e4f1d" + }, + "befehl:mto:agent:mcp:resource-check": { + "abdruck": "e2bec83222815992", + "funktion": "Ressource validieren", + "trug": "3e0c5e7c05c447b1" + }, + "befehl:mto:agent:mcp:resource-read": { + "abdruck": "3bbcf40c19dfb416", + "funktion": "Ressource abrufen", + "trug": "c56c2251c777e9cd" + }, + "befehl:mto:agent:mcp:runtime-boundary-self-test": { + "abdruck": "d736aecb78b903c0", + "funktion": "MCP-Laufzeitgrenze testen", + "trug": "228e1329bb95848b" + }, + "befehl:mto:agent:mcp:runtime-gate-check": { + "abdruck": "157fd59080f4b577", + "funktion": "MCP-Laufzeit-Gate prüfen", + "trug": "c67fbeaf071e4f1d" + }, + "befehl:mto:agent:performance:cache:clear": { + "abdruck": "763defd74a61b330", + "funktion": "Performance-Cache leeren", + "trug": "46d7cac0b9f2f79c" + }, + "befehl:mto:agent:proofing:unsupported-tool-term-guard-self-test": { + "abdruck": "1be9660daebca409", + "funktion": "Guard-Mechanismus prüfen", + "trug": "464037018968440b" + }, + "befehl:mto:agent:release:v1-10-8-lock-self-test": { + "abdruck": "28db5aea7efa396a", + "funktion": "Release-Selbsttest bereitstellen", + "trug": "51c4e03a2afc8beb" + }, + "befehl:mto:agent:retrieval:test": { + "abdruck": "66a9907312e411fc", + "funktion": "Retrieval-Pipeline testen", + "trug": "7dfd51b13de31ffe" + }, + "befehl:mto:agent:shop-followup-anchor-stability-self-test": { + "abdruck": "3fbc5cbbb9918cd2", + "funktion": "Stabilitäts-Selbsttest bereitstellen", + "trug": "307662914163e231" + }, + "befehl:mto:agent:tag:health": { + "abdruck": "34aaf86ed8aa379c", + "funktion": "Tag-Index-Gesundheit prüfen", + "trug": "478f95e9cc14f7d3" + }, + "befehl:mto:agent:tags:job:run": { + "abdruck": "5bb98e3f933da917", + "funktion": "Tag-Rebuild-Auftrag ausführen", + "trug": "1b02b00a7521be25" + }, + "befehl:mto:agent:test:shop-search": { + "abdruck": "5f78005e426d4c4f", + "funktion": "Shop-Suche testen", + "trug": "e4f9db3bd08ba93c" + }, + "befehl:mto:agent:user:create": { + "abdruck": "68921f1ed8e70531", + "funktion": "Benutzer anlegen", + "trug": "d3905c51b162b0ce" + }, + "befehl:mto:agent:vector:control": { + "abdruck": "1c3e9261c8b0c2c5", + "funktion": "Vektordienst steuern", + "trug": "be8c0401addb4adc" + }, + "befehl:mto:agent:vector:health": { + "abdruck": "ab957428c904d078", + "funktion": "Systemzustand prüfen", + "trug": "340f9bb7cc48ab64" + }, + "befehl:mto:ingest:facts:coverage": { + "abdruck": "dcf005cfc8d9b45f", + "funktion": "Abdeckung prüfen", + "trug": "d90435a4cc615013" + }, + "befehl:mto:ingest:facts:inspect": { + "abdruck": "5463537ee443fe78", + "funktion": "Facts prüfen", + "trug": "76dd7c085b763488" + }, + "einbinden:erweitert admin/base.html.twig": { + "abdruck": "dfcfeacbc81295ab", + "funktion": "Chat-Feedback anzeigen", + "trug": "0fb753e62f2eb09b" + }, + "einbinden:erweitert error/access_denied.html.twig": { + "abdruck": "30769f2d88587d3d", + "funktion": "Access-Denied-Fehler bereitstellen", + "trug": "c664c4eb298dd322" + }, + "route:delete /chat-uploads/{uploadId}": { + "abdruck": "a0153beebed60be4", + "funktion": "Upload entfernen", + "trug": "eeec4fdfa3e38511" + }, + "route:get /": { + "abdruck": "de9b287ba64070d2", + "funktion": "Eval-Berichte anzeigen", + "trug": "2f9bb8b3d22f8dbe" + }, + "route:get /admin": { + "abdruck": "8c0cdf9bd2b315ea", + "funktion": "Zum Dashboard weiterleiten", + "trug": "709c61628f0f66ea" + }, + "route:get /admin/": { + "abdruck": "244b9c6384096f5d", + "funktion": "Zum Dashboard weiterleiten", + "trug": "709c61628f0f66ea" + }, + "route:get /admin/chat-feedback": { + "abdruck": "e639b1e43a886a35", + "funktion": "Chat-Feedback anzeigen", + "trug": "0fb753e62f2eb09b" + }, + "route:get /admin/chat-feedback/export": { + "abdruck": "89b2621e72d8b40e", + "funktion": "Feedback exportieren", + "trug": "37a8b8e0632ad60e" + }, + "route:get /admin/chat-feedback/{id}": { + "abdruck": "edae161a247e6bfb", + "funktion": "Feedback-Details anzeigen", + "trug": "a727999800a26db6" + }, + "route:get /admin/dashboard": { + "abdruck": "2acfe2685cf601e1", + "funktion": "Dashboard anzeigen", + "trug": "4d52ebf21e33b65d" + }, + "route:get /admin/documents": { + "abdruck": "254afcc7302b5bb0", + "funktion": "Dokumente auflisten", + "trug": "0f9da42877f59cbe" + }, + "route:get /admin/enterprise": { + "abdruck": "b9d858b5471e2275", + "funktion": "Betrieb einsehen", + "trug": "0b34c0dd4f914b6b" + }, + "route:get /admin/enterprise/backup/download/latest": { + "abdruck": "ed97e58d3ce006f5", + "funktion": "Backup herunterladen", + "trug": "98261892ea9d3263" + }, + "route:get /admin/enterprise/backup/download/{backupId}": { + "abdruck": "284a03d7c9c86a3d", + "funktion": "Backup herunterladen", + "trug": "98261892ea9d3263" + }, + "route:get /admin/evals": { + "abdruck": "894a59095781a388", + "funktion": "Eval-Berichte anzeigen", + "trug": "2f9bb8b3d22f8dbe" + }, + "route:get /admin/guides": { + "abdruck": "a6767af48c103041", + "funktion": "Anleitungsübersicht öffnen", + "trug": "98c240aa62e2af02" + }, + "route:get /admin/ingest-profiles": { + "abdruck": "bd4481affd92aaf9", + "funktion": "Ingest-Profile anzeigen", + "trug": "2a45a43dfa6f7271" + }, + "route:get /admin/knowledge-batches": { + "abdruck": "6d68dc146b79f1b1", + "funktion": "Berichte auflisten", + "trug": "1e1adebd6a533d9b" + }, + "route:get /admin/knowledge-spaces": { + "abdruck": "1f5bfdfaca51004d", + "funktion": "Knowledge-Räume anzeigen", + "trug": "e04105aad7265aec" + }, + "route:get /admin/logout": { + "abdruck": "cebcf3109c609638", + "funktion": "Logout einleiten", + "trug": "9326b36641217583" + }, + "route:get /admin/mcp": { + "abdruck": "3174b0ae81ed2d20", + "funktion": "Diagnose anzeigen", + "trug": "653ae3c6bc6a5ac7" + }, + "route:get /admin/model-config": { + "abdruck": "182f6a72c678582a", + "funktion": "Konfigurationen anzeigen", + "trug": "a4cd0821c5ab3b91" + }, + "route:get /admin/system-logs": { + "abdruck": "6c4c049808bfb725", + "funktion": "Logdateien auflisten", + "trug": "e23662d3a0a4fc26" + }, + "route:get /admin/system/agent": { + "abdruck": "1ff3e3c48256b456", + "funktion": "Agentenaktivität anzeigen", + "trug": "512d3700573a9356" + }, + "route:get /admin/system/prompt": { + "abdruck": "0f2a1947d023e2b0", + "funktion": "Promptversionen verwalten", + "trug": "3ec1e92103f00c9a" + }, + "route:get /admin/tags": { + "abdruck": "dadb6db0fce78a59", + "funktion": "Tags auflisten", + "trug": "a6bcaa4a541749b0" + }, + "route:get /admin/tags/rebuild/stream": { + "abdruck": "da90a04cfab9e7bc", + "funktion": "Tags neu indizieren", + "trug": "aad224c33efd3415" + }, + "route:get /admin/users": { + "abdruck": "451ceac42e573fda", + "funktion": "Benutzer auflisten", + "trug": "200ddcbf1533c973" + }, + "route:get /admin/vector": { + "abdruck": "3762d40b703820f7", + "funktion": "Logdatei anzeigen", + "karten": "69d65c7a24056348", + "trug": "a9d4ceb635037c40" + }, + "route:get /ask-jobs/{jobId}": { + "abdruck": "0477abfc17efcd4b", + "funktion": "Auftragsstatus prüfen", + "trug": "bf711e7620e0bc96" + }, + "route:get /ask-jobs/{jobId}/events": { + "abdruck": "b035aad4da5a9b84", + "funktion": "Auftragsereignisse abrufen", + "trug": "5ec31a2942302b5d" + }, + "route:get /ask-sse/{jobId}": { + "abdruck": "2ae6d3b6ab22ee94", + "funktion": "Chat streamen", + "trug": "3af6f0591b337739" + }, + "route:get /cases/new": { + "abdruck": "d73c3f7105356e98", + "funktion": "Fall anlegen", + "trug": "d302a36967935d71" + }, + "route:get /cases/wizard": { + "abdruck": "55b87c4c5f6edabb", + "funktion": "Assistent anzeigen", + "trug": "804b6b42634c7a25" + }, + "route:get /chat": { + "abdruck": "8af834421de8e8ef", + "funktion": "Chatseite anzeigen", + "trug": "7ef27e2f05c8c346" + }, + "route:get /chat-messages/frontend": { + "abdruck": "ac5ca7be22f54fb2", + "funktion": "Konfiguration bereitstellen", + "trug": "df981d6e3375bcdc" + }, + "route:get /chat-uploads": { + "abdruck": "ccfaa51e5a843676", + "funktion": "Uploads auflisten", + "trug": "09d17a795ce6d016" + }, + "route:get /chat/login": { + "abdruck": "dbc0f1ab46c63065", + "funktion": "", + "karten": "69d65c7a24056348", + "trug": "" + }, + "route:get /chat/logout": { + "abdruck": "8c143d7ed8bb19f1", + "funktion": "Abmelden ermöglichen", + "trug": "b10bdd01f2407daf" + }, + "route:get /create": { + "abdruck": "fb24a0a1b5de52ef", + "funktion": "Ingest-Profil anlegen", + "trug": "ea489ce2cac0eaf7" + }, + "route:get /health": { + "abdruck": "f027e5524a192d02", + "funktion": "Dienststatus melden", + "trug": "161408c208cf7559" + }, + "route:get /history": { + "abdruck": "1a45e95056f2e9ec", + "funktion": "Verlauf abrufen", + "trug": "9867e39b79854b64" + }, + "route:get /log": { + "abdruck": "d174343fa1d615b0", + "funktion": "Logdatei anzeigen", + "karten": "69d65c7a24056348", + "trug": "a9d4ceb635037c40" + }, + "route:get /new": { + "abdruck": "fb14d5f8ec1a4eaa", + "funktion": "Dokument erstellen", + "trug": "22f98a663b531e62" + }, + "route:get /version/{versionId}/chunk-quality": { + "abdruck": "3d9010c730e6ec8d", + "funktion": "Abschnittsqualität laden", + "trug": "3cb1468222207d3a" + }, + "route:get /version/{versionId}/derive": { + "abdruck": "cdf85b729cf231dd", + "funktion": "Version ableiten", + "trug": "0dd44cc05ad88501" + }, + "route:get /version/{versionId}/preview": { + "abdruck": "058dec3bb1d45c3d", + "funktion": "Versionvorschau anzeigen", + "trug": "a0bf7fb5ea225b8c" + }, + "route:get /view/{date}": { + "abdruck": "9e6084cb57091b03", + "funktion": "Logdatei anzeigen", + "trug": "a9d4ceb635037c40" + }, + "route:get /{batchId}/download/{format}": { + "abdruck": "a6452842849c08bf", + "funktion": "Bericht als JSON herunterladen", + "trug": "22375d7e87b48c7a" + }, + "route:get /{id}": { + "abdruck": "ee95293ff6fa8c1e", + "funktion": "Dokument anzeigen", + "trug": "f8dbff8484664fa3" + }, + "route:get /{id}/assign": { + "abdruck": "104594e54aef3de9", + "funktion": "", + "karten": "69d65c7a24056348", + "trug": "" + }, + "route:get /{id}/edit": { + "abdruck": "8884a169ccea6f64", + "funktion": "Benutzer bearbeiten", + "trug": "8915fc3934e98aeb" + }, + "route:get /{id}/status": { + "abdruck": "8ea057327ee0827e", + "funktion": "Auftragsstatus anzeigen", + "trug": "28f625fb14170c58" + }, + "route:get /{id}/test-retrieval": { + "abdruck": "2ba055d91fdcc948", + "funktion": "Retrieval-Qualität testen", + "trug": "ebe624f4ef848daa" + }, + "route:get /{id}/version/new": { + "abdruck": "c690365b95e860d1", + "funktion": "Version erstellen", + "trug": "99e905871d2af5b8" + }, + "route:get /{slug}": { + "abdruck": "44a679fcb574ce62", + "funktion": "Anleitung anzeigen", + "trug": "1abf113dd0ca51b5" + }, + "route:patch /chat-uploads/{uploadId}/authority-mode": { + "abdruck": "9887f2123af2c793", + "funktion": "Berechtigungsmodus ändern", + "trug": "1b7c2db95a58e7b4" + }, + "route:post /activate/{id}": { + "abdruck": "c9636625aae80c95", + "funktion": "post activate {id} bereitstellen", + "trug": "8cea29a4826cdd6a" + }, + "route:post /admin/chat-feedback/batch/review-status": { + "abdruck": "be6a181dc679b11f", + "funktion": "Feedback-Status aktualisieren", + "trug": "4422d06808d2e980" + }, + "route:post /admin/chat-feedback/{id}/delete": { + "abdruck": "6893b0aa4d8eab87", + "funktion": "Feedback löschen", + "trug": "394b01bbb9e78c64" + }, + "route:post /admin/chat-feedback/{id}/review-status": { + "abdruck": "e25459719748b78c", + "funktion": "Feedback-Status aktualisieren", + "trug": "4422d06808d2e980" + }, + "route:post /admin/enterprise/backup/dry-run": { + "abdruck": "cc7a6cb84b283232", + "funktion": "", + "karten": "69d65c7a24056348", + "trug": "" + }, + "route:post /admin/enterprise/backup/start": { + "abdruck": "c26f0e1b8ec48387", + "funktion": "Backup starten", + "trug": "a80ee1ac8d09feef" + }, + "route:post /admin/enterprise/check/backup-restore": { + "abdruck": "60189cb65f15f7c4", + "funktion": "Backup-Wiederherstellung prüfen", + "trug": "2f43d33d76a1b5fd" + }, + "route:post /admin/enterprise/check/deployment-scheduler": { + "abdruck": "5a0199bcefb3aafe", + "funktion": "Deployment prüfen", + "trug": "72e96ff15688afb5" + }, + "route:post /admin/enterprise/check/security": { + "abdruck": "b626d367ee88e80d", + "funktion": "post admin enterprise check security bereitstellen", + "trug": "ae4ec899a0ed87f9" + }, + "route:post /admin/enterprise/restore/dry-run/latest": { + "abdruck": "4233f9927778bb02", + "funktion": "Backup-Trockenlauf prüfen", + "trug": "38cceaaa7e618c63" + }, + "route:post /admin/enterprise/restore/dry-run/{backupId}": { + "abdruck": "9a80fdd8dd1ce713", + "funktion": "Wiederherstellung testen", + "trug": "bffab37148aca377" + }, + "route:post /admin/knowledge-spaces/chat-availability": { + "abdruck": "5846f32d223c395c", + "funktion": "Chat-Verfügbarkeit prüfen", + "trug": "5bfe9a138fa7a344" + }, + "route:post /admin/knowledge-spaces/diagnostics/run": { + "abdruck": "d36a6a72518706c9", + "funktion": "Wissensräume prüfen", + "trug": "00428abe5d12a1a6" + }, + "route:post /admin/knowledge-spaces/provider-candidate-select": { + "abdruck": "70273cbf7942e934", + "funktion": "Kandidaten wählen", + "trug": "1b400e58e9b9ffa1" + }, + "route:post /admin/knowledge-spaces/provider-resource-chat": { + "abdruck": "94af13df841dd297", + "funktion": "Chat-Freigabe umschalten", + "trug": "ba7f9fdd0f377d82" + }, + "route:post /admin/knowledge-spaces/provider-resource-live-preview": { + "abdruck": "59ce57e712f49f67", + "funktion": "Live-Vorschau laden", + "trug": "60f5dcce03a7be18" + }, + "route:post /admin/knowledge-spaces/provider-resource-review": { + "abdruck": "3d9e1c18d8d90b91", + "funktion": "Kandidaten wählen", + "trug": "1b400e58e9b9ffa1" + }, + "route:post /admin/knowledge-spaces/provider-tool-allowlist": { + "abdruck": "bfb807bb4464c1fc", + "funktion": "Tool-Freigaben aktualisieren", + "trug": "71c29c88725cc001" + }, + "route:post /admin/runtime-cache/clear": { + "abdruck": "b70129f6aca03fad", + "funktion": "Cache leeren", + "trug": "5117399da510e8d0" + }, + "route:post /admin/system/prompt/{id}/activate": { + "abdruck": "dd98f9404f17be0a", + "funktion": "Promptversion aktivieren", + "trug": "7f1b7c10cfc78ea1" + }, + "route:post /admin/system/prompt/{id}/delete": { + "abdruck": "47cc4c8359701df5", + "funktion": "Promptversion löschen", + "trug": "69954cb2aa7826c8" + }, + "route:post /ask-jobs": { + "abdruck": "86dc2f6802845aad", + "funktion": "Auftrag starten", + "trug": "82c4f207a44eed63" + }, + "route:post /ask-sse": { + "abdruck": "87998efb193f5a13", + "funktion": "Chat streamen", + "trug": "3af6f0591b337739" + }, + "route:post /cases": { + "abdruck": "891fb74ed011cee0", + "funktion": "Fall erstellen", + "trug": "b2eeeb327760069a" + }, + "route:post /cases/delete": { + "abdruck": "f7d1df8c1239a344", + "funktion": "Fälle löschen bereitstellen", + "trug": "1644004910ad89e4" + }, + "route:post /cases/wizard": { + "abdruck": "f30980daf2c898a1", + "funktion": "Fall erstellen", + "trug": "b2eeeb327760069a" + }, + "route:post /chat-feedback/status": { + "abdruck": "58df216dabd44e95", + "funktion": "Feedback-Status prüfen", + "trug": "f633724f8d81bf1d" + }, + "route:post /chat-uploads": { + "abdruck": "29d717ceaaf86caa", + "funktion": "Datei hochladen", + "trug": "cf32f652744b3bce" + }, + "route:post /chat-uploads/clear": { + "abdruck": "62df3634844e6b6c", + "funktion": "Upload entfernen", + "trug": "eeec4fdfa3e38511" + }, + "route:post /cleanup": { + "abdruck": "e63b808d97ff109c", + "funktion": "Verzeichnis bereinigen", + "trug": "e4bdd1b6abc28e16" + }, + "route:post /clear-cache": { + "abdruck": "ee57c19a44d92c93", + "funktion": "Performance-Cache leeren", + "trug": "46d7cac0b9f2f79c" + }, + "route:post /create": { + "abdruck": "1c4155cf5a5a761e", + "funktion": "Tags bearbeiten", + "trug": "3a6a4c0fb9c8c0e2" + }, + "route:post /global-reindex": { + "abdruck": "0fbbf88bea2405f9", + "funktion": "Neuindizierung starten", + "trug": "ecd57c4d2d8030b3" + }, + "route:post /history/delete": { + "abdruck": "6e0556a3d3ba517a", + "funktion": "Verlauf löschen", + "trug": "9e769103ea5134a6" + }, + "route:post /reload": { + "abdruck": "79600beee79f0e3f", + "funktion": "Daten neu laden", + "trug": "148a6c4d4edb318d" + }, + "route:post /reports/cleanup": { + "abdruck": "8562351bb6f08c43", + "funktion": "Berichte bereinigen", + "trug": "0f19d3d7b9b076c8" + }, + "route:post /reset": { + "abdruck": "fb1f8b79658c653b", + "funktion": "Systemzustand zurücksetzen", + "trug": "bdfc7ede2fdab0cc" + }, + "route:post /run": { + "abdruck": "cf1ec8908428c705", + "funktion": "Evaluation ausführen", + "trug": "ad158b97138fdfd5" + }, + "route:post /search-chunks": { + "abdruck": "76d40589251fcbcd", + "funktion": "Textteile suchen", + "trug": "f12b4b68064135a4" + }, + "route:post /search-tags": { + "abdruck": "3b82c9af379b43c2", + "funktion": "Tags suchen", + "trug": "c28826e98ccf4488" + }, + "route:post /version/{versionId}/ingest": { + "abdruck": "d219584b34c5cf59", + "funktion": "Abschnitte laden", + "trug": "1fdbb25d131c9241" + }, + "route:post /version/{versionId}/markdown-normalize": { + "abdruck": "84b4594ebade4f10", + "funktion": "Markdown bereinigen", + "trug": "3b52c219a579635d" + }, + "route:post /{batchId}/delete": { + "abdruck": "5cc03440260bd2c2", + "funktion": "Bericht löschen", + "trug": "da18d390ddee9f9e" + }, + "route:post /{id}/activate": { + "abdruck": "f57b82e8c822e3a9", + "funktion": "Konfiguration aktivieren", + "trug": "1de4ccbe029cd746" + }, + "route:post /{id}/delete": { + "abdruck": "b39fd9ea4063eef6", + "funktion": "Dokument entfernen", + "trug": "9cfe41d491014a02" + }, + "route:post /{id}/tags/save": { + "abdruck": "daf6d63a0d9dac6f", + "funktion": "post {id} tags save bereitstellen", + "trug": "bfe4c204d790784c" + }, + "route:post /{id}/title": { + "abdruck": "5f4a8a89a24220e5", + "funktion": "Titel aktualisieren", + "trug": "43eca51f9fdc858b" + }, + "route:post /{id}/title-suggestions": { + "abdruck": "fc54786daea4cb86", + "funktion": "Titelvorschläge laden", + "trug": "bdd02c15d128d3e7" + }, + "route:post /{id}/toggle-active": { + "abdruck": "9317d97fb76431ce", + "funktion": "Benutzer aktivieren", + "trug": "ef44f89122814a30" + } + }, + "belege": { + "[\"admin\", \"Dashboard anzeigen\"]": { + "abdruck": "88c7b9f422dc8eb8", + "beleg": "#[Route('/admin/dashboard', name: 'admin_dashboard', methods: ['GET'])]", + "datei": "src/Controller/Admin/DashboardController.php" + }, + "[\"admin\", \"Logout einleiten\"]": { + "abdruck": "22b7a2529dbafa62", + "beleg": "throw new \\LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');", + "datei": "src/Controller/Admin/SecurityController.php" + }, + "[\"admin\", \"Wiederherstellung testen\"]": { + "abdruck": "50b702083d4b3b49", + "beleg": "#[Route('/admin/enterprise/restore/dry-run/{backupId}', name: 'admin_enterprise_restore_dry_run', requirements: ['backupId' => 'retriex-backup-[0-9]{8}-[0-9]{6}(?:-[a-f0-9]{6})?'], methods: ['POST'])]", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"admin\", \"Zum Dashboard weiterleiten\"]": { + "abdruck": "868c59b96819addc", + "beleg": "return $this->redirectToRoute('admin_dashboard');", + "datei": "src/Controller/Admin/DashboardController.php" + }, + "[\"agenten\", \"Agentenaktivität anzeigen\"]": { + "abdruck": "2e27daae10412580", + "beleg": "$limit = max(1, min(200, (int) $request->query->get('limit', 50)));", + "datei": "src/Controller/Admin/SystemAgentController.php" + }, + "[\"agenten\", \"Chat-Auswahl-Guard testen\"]": { + "abdruck": "3f5ad7d5b139a81c", + "beleg": "return ($report['status'] ?? '') === 'OK' ? Command::SUCCESS : Command::FAILURE;", + "datei": "src/Command/KnowledgeSpaceChatSelectionGuardSelfTestCommand.php" + }, + "[\"agenten\", \"Fähigkeiten ermitteln\"]": { + "abdruck": "82e0eb0d75ca0c79", + "beleg": "/** @return array */\n public function discover(string $serverKey, ?int $resourceIndex = null, bool $includeResourceRead = false): array", + "datei": "src/Mcp/McpAdminSourceRegistryBridge.php" + }, + "[\"agenten\", \"Hybrid-Tool-Auswahl testen\"]": { + "abdruck": "05bb4dd7e9a30b1a", + "beleg": "$cases = [\n $this->case('planner_self_test_is_green', [($plannerReport['status'] ?? '') === 'OK'], $plannerReport),\n $this->case('agent_runner_uses_llm_only_as_planner_before_retriex_validation', [\n str_contains($agentRunner, 'buildLlmSelectionPrompt($prompt, $spaceId, $serverKey, $allowlistedTools)'),\n str_contains($agentRunner, 'parseLlmSelectionResponse($rawToolSelection)'),\n str_contains($agentRunner, 'planFromLlmSuggestion($prompt, $spaceId, $serverKey, $allowlistedTools, $toolSuggestion)'),\n str_contains($agentRunner, \"llmCallModel('mcp_tool_selection')\"),\n str_contains($agentRunner, 'deterministic_fallback_allowed'),\n ], ['agent_runner_contains_hybrid_selection' => true]),\n $this->case('loader_exposes_tool_selection_latency', [\n str_contains($agentRunner, 'Passendes Tool wird ausgewählt'),\n str_contains($chatMessages, 'loader_mcp_selecting_tool'),\n str_contains($chatJs, 'loader_mcp_selecting_tool'),\n ], ['loader_status' => 'selecting_tool']),\n $this->case('model_config_has_dedicated_optional_call_model', [\n str_contains($modelConfig, 'mcp_tool_selection:'),\n ], ['model_config' => 'mcp_tool_selection']),\n ];", + "datei": "src/Command/McpHybridToolSelectionPlannerSelfTestCommand.php" + }, + "[\"agenten\", \"MCP-Gateway trocken ausführen\"]": { + "abdruck": "ab8dcf1eaaeba5a5", + "beleg": "return $result['status'] === 'ready' ? Command::SUCCESS : Command::FAILURE;", + "datei": "src/Command/McpGatewayDryRunCommand.php" + }, + "[\"agenten\", \"MCP-Laufzeit-Gate prüfen\"]": { + "abdruck": "a610bdc0e1f1b6e2", + "beleg": "$result = (bool) $input->getOption('fixture')\n ? $this->gate->checkResourceForServers(\n $this->fixtureServers(),\n $request,\n (bool) $input->getOption('assume-enabled'),\n )->toArray()\n : $this->gate->checkResource($request)->toArray();", + "datei": "src/Command/McpRuntimeGateCheckCommand.php" + }, + "[\"agenten\", \"MCP-Laufzeitgrenze testen\"]": { + "abdruck": "a644cd0877293b21", + "beleg": "#[AsCommand(\n name: 'mto:agent:mcp:runtime-boundary-self-test',\n description: 'Validate that MCP stays admin-controlled and bounded for answer runtime'\n)]", + "datei": "src/Command/McpRuntimeBoundarySelfTestCommand.php" + }, + "[\"agenten\", \"MCP-Quelle prüfen\"]": { + "abdruck": "af9e24b774af1592", + "beleg": "#[AsCommand(\n name: 'mto:agent:mcp:admin-source-check',\n description: 'Check one stored Admin MCP source as a registry-compatible read-only test policy'\n)]", + "datei": "src/Command/McpAdminSourceCheckCommand.php" + }, + "[\"agenten\", \"Mit Agent chatten\"]": { + "abdruck": "e74a0245ad75018b", + "beleg": "foreach ($this->agentRunner->run($prompt, $userId) as $token) {\n $output->write($token);\n }", + "datei": "src/Command/AgentCliCommand.php" + }, + "[\"agenten\", \"Performance-Cache leeren\"]": { + "abdruck": "42a53bc0d0dd9e2f", + "beleg": "$result = $this->runtimeCacheClearService->clearAll(!((bool) $input->getOption('skip-vector-service')));", + "datei": "src/Command/RuntimeCacheClearCommand.php" + }, + "[\"agenten\", \"Produktlabel-Formatierer testen\"]": { + "abdruck": "e8e2412ddcf623eb", + "beleg": "private function containsRuntimeSideEffectMarker(string $source): bool\n {\n return false;\n }", + "datei": "src/Command/ProductLabelFormatterExtractionSelfTestCommand.php" + }, + "[\"agenten\", \"Release-Selbsttest bereitstellen\"]": { + "abdruck": "7f9423f2d5b36480", + "beleg": "private const REQUIRED_RELEASE_FILES = [", + "datei": "src/Command/RetriexV1108ReleaseLockSelfTestCommand.php" + }, + "[\"agenten\", \"Ressource abrufen\"]": { + "abdruck": "fe6f6babdb73587a", + "beleg": "$result = (bool) $input->getOption('fixture')\n ? $this->client->readForServers($this->fixtureServers(), $request, (bool) $input->getOption('assume-enabled'))\n : $this->client->read($request, (bool) $input->getOption('assume-enabled'));", + "datei": "src/Command/McpResourceReadCommand.php" + }, + "[\"agenten\", \"Ressource validieren\"]": { + "abdruck": "5fd85436d1302f70", + "beleg": "return $decision->allowed ? Command::SUCCESS : Command::FAILURE;", + "datei": "src/Command/McpResourceCheckCommand.php" + }, + "[\"agenten\", \"Rollencode-Zuweisung prüfen\"]": { + "abdruck": "3ccada3f8950af23", + "beleg": "private function buildReport(): array", + "datei": "src/Command/ProductRoleCodeAssignmentRegressionGuardSelfTestCommand.php" + }, + "[\"agenten\", \"Stabilitäts-Selbsttest bereitstellen\"]": { + "abdruck": "e100bf5436bb7888", + "beleg": "final class ShopFollowupAnchorStabilitySelfTestCommand extends Command", + "datei": "src/Command/ShopFollowupAnchorStabilitySelfTestCommand.php" + }, + "[\"agenten\", \"System rebuild bereitstellen\"]": { + "abdruck": "4a94da2e8f5631d7", + "beleg": "#[AsCommand(\n name: 'mto:agent:system:rebuild',\n description: 'Hard rebuild: global reindex (chunks+vector), rebuild tag index, then reload vector service'\n)]", + "datei": "src/Command/SystemRebuildCommand.php" + }, + "[\"agenten\", \"Vektordienst steuern\"]": { + "abdruck": "81ff7d5a3425664b", + "beleg": "private readonly int $timeoutSeconds = 300,", + "datei": "src/Command/VectorControlCommand.php" + }, + "[\"agenten\", \"Wissensbatch finalisieren testen\"]": { + "abdruck": "fc30904681203405", + "beleg": "protected function execute(InputInterface $input, OutputInterface $output): int", + "datei": "src/Command/KnowledgeBatchFinalizeSelfTestCommand.php" + }, + "[\"anleitungen\", \"Anleitung anzeigen\"]": { + "abdruck": "7638a294a35eaedb", + "beleg": "'html' => $renderer->render($content),", + "datei": "src/Controller/Admin/GuideController.php" + }, + "[\"anleitungen\", \"Anleitungsübersicht öffnen\"]": { + "abdruck": "2335ab051c43a64d", + "beleg": "usort($guides, fn ($a, $b) => strcasecmp($a['title'], $b['title']));", + "datei": "src/Controller/Admin/GuideController.php" + }, + "[\"auftraege\", \"Auftrag starten\"]": { + "abdruck": "b2dc7effa8028795", + "beleg": "#[Route('/ask-jobs', name: 'ask_job_start', methods: ['POST'])]", + "datei": "src/Controller/AskSseController.php" + }, + "[\"auftraege\", \"Auftragsereignisse abrufen\"]": { + "abdruck": "eccbb5871ebf164c", + "beleg": "return new JsonResponse([\n 'status' => (string) ($job['status'] ?? ''),\n 'message' => is_string($job['message'] ?? null) ? (string) $job['message'] : '',\n 'lastEventId' => max(0, (int) ($job['lastEventId'] ?? 0)),\n 'updatedAt' => max(0, (int) ($job['updatedAt'] ?? 0)),\n 'completedAt' => max(0, (int) ($job['completedAt'] ?? 0)),\n 'events' => $this->readJobOutputAfter($jobId, $afterEventId),\n ]);", + "datei": "src/Controller/AskSseController.php" + }, + "[\"auftraege\", \"Auftragsstatus anzeigen\"]": { + "abdruck": "96e47a6fc65c461f", + "beleg": "return $this->json([\n 'id' => (string) $job->getId(),\n 'type' => $job->getType(),\n 'status' => $job->getStatus(),\n 'startedAt' => $job->getStartedAt()->format(DATE_ATOM),\n 'finishedAt' => $job->getFinishedAt()?->format(DATE_ATOM),\n 'errorMessage' => $job->getErrorMessage(),\n 'logPath' => $job->getLogPath(),\n ]);", + "datei": "src/Controller/Admin/IngestJobController.php" + }, + "[\"auftraege\", \"Auftragsstatus prüfen\"]": { + "abdruck": "d8926247da5b90fa", + "beleg": "public function jobStatus(string $jobId): JsonResponse", + "datei": "src/Controller/AskSseController.php" + }, + "[\"auftraege\", \"Ingest-Job starten\"]": { + "abdruck": "e52af5fba6df161f", + "beleg": "protected function execute(InputInterface $input, OutputInterface $output): int", + "datei": "src/Command/IngestRunJobCommand.php" + }, + "[\"backup\", \"Backup herunterladen\"]": { + "abdruck": "8c2bbb210875e413", + "beleg": "#[Route('/admin/enterprise/backup/download/{backupId}', name: 'admin_enterprise_backup_download', requirements: ['backupId' => 'retriex-backup-[0-9]{8}-[0-9]{6}(?:-[a-f0-9]{6})?'], methods: ['GET'])]", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"backup\", \"Backup starten\"]": { + "abdruck": "863cdc2fa384bd3b", + "beleg": "$report = $rollingBackup->createBackup(false, null, false, $includeDatabaseDump);", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"backup\", \"Backup-Tauglichkeit prüfen\"]": { + "abdruck": "7f32db860c7e3cf4", + "beleg": "return ($report['status'] ?? '') === 'OK' ? Command::SUCCESS : Command::FAILURE;", + "datei": "src/Command/EnterpriseBackupRestoreReadinessCheckCommand.php" + }, + "[\"backup\", \"Backup-Trockenlauf prüfen\"]": { + "abdruck": "1a3a2e4963e023bc", + "beleg": "$report = $restoreDryRun->buildDryRunReport();\n $operatorCheckProtocol->recordCheck('restore_dry_run', 'Restore pruefen', $report, ['backup_id' => (string) ($report['backup_id'] ?? ''), 'dry_run' => true]);\n $this->addRestoreDryRunFlash($report);", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"backup\", \"Backup-Wiederherstellung prüfen\"]": { + "abdruck": "b06b798f0cdc03dc", + "beleg": "#[Route('/admin/enterprise/check/backup-restore', name: 'admin_enterprise_check_backup_restore', methods: ['POST'])]", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"benutzer\", \"Benutzer aktivieren\"]": { + "abdruck": "7bc70cb331b3a2ac", + "beleg": "#[Route('/{id}/toggle-active', name: 'admin_users_toggle_active', requirements: ['id' => '[0-9a-fA-F\\-]{36}'], methods: ['POST'])]", + "datei": "src/Controller/Admin/UserController.php" + }, + "[\"benutzer\", \"Benutzer anlegen\"]": { + "abdruck": "93125c82911d2de0", + "beleg": "if (strlen(trim($plainPassword)) < 8) {", + "datei": "src/Command/CreateUserCommand.php" + }, + "[\"benutzer\", \"Benutzer auflisten\"]": { + "abdruck": "d527fa14409a6978", + "beleg": "public function listUsers(string $query = '', string $status = 'all', string $role = 'all'): array", + "datei": "src/Service/Admin/UserAdminService.php" + }, + "[\"benutzer\", \"Benutzer bearbeiten\"]": { + "abdruck": "63f9b60fe54af1c2", + "beleg": "#[Route('/{id}/edit', name: 'admin_users_edit', requirements: ['id' => '[0-9a-fA-F\\-]{36}'], methods: ['GET', 'POST'])]\n public function edit(string $id, Request $request, UserAdminService $users): Response", + "datei": "src/Controller/Admin/UserController.php" + }, + "[\"berichte\", \"Akzeptanzbericht generieren\"]": { + "abdruck": "202ceb031a05333e", + "beleg": "$io->table(['Zeitpunkt', 'Pruefung', 'Status', 'Ergebnis'], array_map(", + "datei": "src/Command/EnterpriseOperatorAcceptanceReportCommand.php" + }, + "[\"berichte\", \"Bericht als JSON herunterladen\"]": { + "abdruck": "cca47a8c490854b4", + "beleg": "public function download(string $batchId, string $format, KnowledgeBatchReportReadService $reports): BinaryFileResponse", + "datei": "src/Controller/Admin/KnowledgeBatchReportController.php" + }, + "[\"berichte\", \"Bericht löschen\"]": { + "abdruck": "94555049b4fa8aa5", + "beleg": "public function deleteReport(string $batchId, Request $request, KnowledgeBatchReportReadService $reports): Response", + "datei": "src/Controller/Admin/KnowledgeBatchReportController.php" + }, + "[\"berichte\", \"Übersicht rendern\"]": { + "abdruck": "17f97a67c55bc85f", + "beleg": "$overview = $this->operationsOverview->buildOverview($backupRestoreReport, $securityReport, $deploymentReport, $acceptanceReport, $backupOverview);", + "datei": "src/Command/EnterpriseOperationsOverviewCommand.php" + }, + "[\"chat\", \"Abmelden ermöglichen\"]": { + "abdruck": "8178f115f5e6d301", + "beleg": "#[Route('/chat/logout', name: 'chat_logout', methods: ['GET'])]", + "datei": "src/Controller/Chat/SecurityController.php" + }, + "[\"chat\", \"Chat streamen\"]": { + "abdruck": "8973369a0ffbb6c6", + "beleg": "return new StreamedResponse(\n function () use ($prompt, $clientId, $cookieResponse, $includeFullContext, $requestContextHint, $dataSourceMode, $finalAnswerModelMode, $temporaryUploadIds, $knowledgeSpaceEffectiveSpaceId): void {\n $this->streamAgentResponse(\n prompt: $prompt,\n clientId: $clientId,\n includeFullContext: $includeFullContext,\n cookieResponse: $cookieResponse,\n jobId: null,\n requestContextHint: $requestContextHint,\n dataSourceMode: $dataSourceMode,\n finalAnswerModelOverride: $this->finalAnswerModelOverride($finalAnswerModelMode),\n temporaryUploadIds: $temporaryUploadIds,\n knowledgeSpaceEffectiveSpaceId: $knowledgeSpaceEffectiveSpaceId\n );\n },\n Response::HTTP_OK,\n $this->streamHeaders()\n );", + "datei": "src/Controller/AskSseController.php" + }, + "[\"chat\", \"Chatseite anzeigen\"]": { + "abdruck": "32f2c858efb14e67", + "beleg": "return $this->render('chat/index.html.twig', [\n 'chat_prompt_user_name' => $this->resolvePromptUserName(),\n 'chat_knowledge_space_selector' => $knowledgeSpaceSelector->build(),\n 'chat_handbook_available' => $chatHandbookMarkdown !== null,\n 'chat_handbook_markdown' => $chatHandbookMarkdown ?? '',\n ]);", + "datei": "src/Controller/Chat/ChatController.php" + }, + "[\"diagnose\", \"Abdeckung prüfen\"]": { + "abdruck": "48d3b0d8a7011a70", + "beleg": "usort($rows, function (array $a, array $b): int {", + "datei": "src/Command/IngestFactsCoverageCommand.php" + }, + "[\"diagnose\", \"Abrufgrenzen prüfen\"]": { + "abdruck": "a37984380c253a68", + "beleg": "final class AgentRetrievalBoundaryPlanSelfTestCommand extends Command", + "datei": "src/Command/AgentRetrievalBoundaryPlanSelfTestCommand.php" + }, + "[\"diagnose\", \"Bereitschaftsbericht ausgeben\"]": { + "abdruck": "a09f986af89eaacd", + "beleg": "return ($report['status'] ?? '') === 'OK' ? Command::SUCCESS : Command::FAILURE;", + "datei": "src/Command/EnterpriseDeploymentSchedulerReadinessCheckCommand.php" + }, + "[\"diagnose\", \"Datenqualität prüfen\"]": { + "abdruck": "ca2c74c205e880ff", + "beleg": "#[AsCommand(\n name: 'mto:agent:ingest:chunk-quality',\n description: 'Compare original and derived Markdown ingest chunk quality in dry-run diagnostics'\n)]", + "datei": "src/Command/IngestChunkQualityCommand.php" + }, + "[\"diagnose\", \"Diagnose anzeigen\"]": { + "abdruck": "a44b68c6167f4548", + "beleg": "#[Route('/admin/mcp', name: 'admin_mcp_diagnostics', methods: ['GET', 'POST'])]", + "datei": "src/Controller/Admin/McpDiagnosticsController.php" + }, + "[\"diagnose\", \"Genre-Hotspots prüfen\"]": { + "abdruck": "83a0e5f5a3d81804", + "beleg": "public function audit(?callable $progress = null): array", + "datei": "src/Genre/CoreNeutralityAuditProvider.php" + }, + "[\"diagnose\", \"Guard-Mechanismus prüfen\"]": { + "abdruck": "428aec0b4471fc87", + "beleg": "private function buildReport(): array", + "datei": "src/Command/UnsupportedToolTermGuardSelfTestCommand.php" + }, + "[\"diagnose\", \"Hygieneregeln prüfen\"]": { + "abdruck": "d0a1488af78eb9a4", + "beleg": "private function buildReport(): array", + "datei": "src/Command/KnowledgeBatchHygieneSelfTestCommand.php" + }, + "[\"diagnose\", \"Indizierungszustand prüfen\"]": { + "abdruck": "5c404523842d6af0", + "beleg": "final class IngestDeferredReindexStateSelfTestCommand extends Command", + "datei": "src/Command/IngestDeferredReindexStateSelfTestCommand.php" + }, + "[\"diagnose\", \"Konfiguration prüfen\"]": { + "abdruck": "0258b188bf0a71d8", + "beleg": "#[AsCommand(\n name: 'mto:agent:config:validate',\n description: 'Validate the effective RetrieX configuration'\n)]", + "datei": "src/Command/ConfigValidateCommand.php" + }, + "[\"diagnose\", \"Provenienz prüfen\"]": { + "abdruck": "3ef13c4717f68df6", + "beleg": "$cases[] = $this->case(\n 'chunk_records_receive_provenance_metadata',\n str_contains($ingestService, 'source_file_extension')\n && str_contains($ingestService, 'source_version_id')\n && str_contains($ingestService, 'derived_from_version_id')\n && str_contains($ingestService, 'derived_format')\n && str_contains($ingestService, 'normalization_prompt_version')\n && str_contains($ingestService, 'normalization_model')\n && str_contains($ingestService, 'normalization_status'),\n 'NDJSON metadata includes source and derived Markdown provenance keys'\n );", + "datei": "src/Command/IngestMarkdownDerivedChunkDiagnosticsSelfTestCommand.php" + }, + "[\"diagnose\", \"Retrieval-Pipeline testen\"]": { + "abdruck": "a2bda82b3cf0c287", + "beleg": "final class TestHybridRetrievalCommand extends Command", + "datei": "src/Command/TestHybridRetrievalCommand.php" + }, + "[\"diagnose\", \"Segmentierung prüfen\"]": { + "abdruck": "2ddb19d3004bb42b", + "beleg": "$service = $this->read($root . '/src/Ingest/MarkdownNormalization/DocumentMarkdownNormalizationService.php');", + "datei": "src/Command/IngestSegmentedMarkdownNormalizationExecutionSelfTestCommand.php" + }, + "[\"diagnose\", \"Shop-Suche testen\"]": { + "abdruck": "ed98c9737930f464", + "beleg": "'zeige mir produkte unter 5000 euro'", + "datei": "src/Command/TestShopSearchCommand.php" + }, + "[\"diagnose\", \"Sicherheitsstatus prüfen\"]": { + "abdruck": "003f893fb9cea617", + "beleg": "return ($report['status'] ?? '') === 'OK' ? Command::SUCCESS : Command::FAILURE;", + "datei": "src/Command/EnterpriseSecurityDataProtectionReadinessCheckCommand.php" + }, + "[\"diagnose\", \"Stapel-Upload verifizieren\"]": { + "abdruck": "fff1582bd8e5bf3f", + "beleg": "final class KnowledgeBatchAdminUploadSelfTestCommand extends Command", + "datei": "src/Command/KnowledgeBatchAdminUploadSelfTestCommand.php" + }, + "[\"diagnose\", \"Systemzustand prüfen\"]": { + "abdruck": "7045932ec8f4d9ce", + "beleg": "return str_starts_with($result['status'], 'OK')\n ? Command::SUCCESS\n : Command::FAILURE;", + "datei": "src/Command/VectorHealthCheckCommand.php" + }, + "[\"diagnose\", \"Tag-Index-Gesundheit prüfen\"]": { + "abdruck": "79248caf983173f9", + "beleg": "private function isHealthy(string $status): bool\n {\n return in_array($status, ['OK', 'OK_EMPTY'], true);\n }", + "datei": "src/Command/TagHealthCheckCommand.php" + }, + "[\"diagnose\", \"Tags neu indizieren\"]": { + "abdruck": "411663e63cc97ed3", + "beleg": "while (!connection_aborted()) {", + "datei": "src/Controller/Admin/TagRebuildStreamController.php" + }, + "[\"diagnose\", \"Verankerung testen\"]": { + "abdruck": "73de227779d46c5f", + "beleg": "if ((bool) $input->getOption('sample')) {\n [$prompt, $history] = $this->samplePromptAndHistory();\n } elseif ($historyFile !== '') {", + "datei": "src/Command/TestFollowUpAnchorResolverDryRunCommand.php" + }, + "[\"diagnose\", \"Vergleichsgrenzen validieren\"]": { + "abdruck": "669f27f21e0c7cbc", + "beleg": "private function buildReport(): array\n {\n $root = rtrim($this->kernel->getProjectDir(), '/\\\\');\n $service = $this->read($root . '/src/Service/Admin/DocumentChunkQualityComparisonService.php');\n $command = $this->read($root . '/src/Command/IngestChunkQualityCommand.php');\n $controller = $this->read($root . '/src/Controller/Admin/DocumentController.php');\n $template = $this->read($root . '/templates/admin/document/show.html.twig');\n $styles = $this->read($root . '/public/assets/styles/base.css');\n $segmentationPlanService = $this->read($root . '/src/Ingest/MarkdownNormalization/DocumentMarkdownSegmentationPlanService.php');\n $agentRunner = $this->read($root . '/src/Agent/AgentRunner.php');\n $ingestService = $this->read($root . '/src/Knowledge/Ingest/KnowledgeIngestService.php');", + "datei": "src/Command/IngestChunkQualityComparisonSelfTestCommand.php" + }, + "[\"dokumente\", \"Abschnitte laden\"]": { + "abdruck": "6be09cd85989675b", + "beleg": "$version->setIngestStatus(DocumentVersion::INGEST_PENDING);", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"dokumente\", \"Abschnittsqualität laden\"]": { + "abdruck": "ff648f1bf4dd8875", + "beleg": "public function versionChunkQuality(", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"dokumente\", \"Dokument entfernen\"]": { + "abdruck": "b30e86c7c0afc914", + "beleg": "public function deleteDocument(", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"dokumente\", \"Dokument erstellen\"]": { + "abdruck": "216bdc467154f33a", + "beleg": "#[Route('/new', name: 'admin_document_new', methods: ['GET', 'POST'])]", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"dokumente\", \"Dokumente auflisten\"]": { + "abdruck": "d0fc65218aa9ccd3", + "beleg": "#[Route('', name: 'admin_documents', methods: ['GET'])]", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"dokumente\", \"Markdown bereinigen\"]": { + "abdruck": "9e0e8ea0de452f7f", + "beleg": "$newVersion = $documentService->addVersion($document, $result['file_path'], $this->requireUser());", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"evaluation\", \"Berichte bereinigen\"]": { + "abdruck": "ab28043e52bdafa3", + "beleg": "public function cleanupReportHistory(string $scope, string $mode = 'trim'): array", + "datei": "src/Service/Admin/EvalAdminService.php" + }, + "[\"evaluation\", \"Eval-Berichte anzeigen\"]": { + "abdruck": "7c5a683645081b79", + "beleg": "#[Route('/', name: 'admin_evals_index', methods: ['GET'])]", + "datei": "src/Controller/Admin/AdminEvalController.php" + }, + "[\"evaluation\", \"Eval-Fälle ausführen\"]": { + "abdruck": "130685562e3eff09", + "beleg": "return $failed > 0 ? Command::FAILURE : Command::SUCCESS;", + "datei": "src/Command/AgentEvalRunCommand.php" + }, + "[\"evaluation\", \"Eval-Fälle parallelisieren\"]": { + "abdruck": "2d6d1b790ca8f991", + "beleg": "while (!$stopScheduling && $nextIndex < $caseCount && count($running) < $jobs) {", + "datei": "src/Command/AgentEvalParallelCommand.php" + }, + "[\"evaluation\", \"Evaluation ausführen\"]": { + "abdruck": "5b2305d1f3727b25", + "beleg": "#[Route('/run', name: 'admin_evals_run', methods: ['POST'])]", + "datei": "src/Controller/Admin/AdminEvalController.php" + }, + "[\"faelle\", \"Assistent anzeigen\"]": { + "abdruck": "d34e5813e73074d3", + "beleg": "public function caseWizard(Request $request, EvalAdminService $evals): Response", + "datei": "src/Controller/Admin/AdminEvalController.php" + }, + "[\"faelle\", \"Fall anlegen\"]": { + "abdruck": "c29d7fd91f3232df", + "beleg": "#[Route('/cases/new', name: 'admin_evals_case_new', methods: ['GET'])]", + "datei": "src/Controller/Admin/AdminEvalController.php" + }, + "[\"faelle\", \"Fall erstellen\"]": { + "abdruck": "52edb0d34124f34b", + "beleg": "#[Route('/cases', name: 'admin_evals_case_create', methods: ['POST'])]", + "datei": "src/Controller/Admin/AdminEvalController.php" + }, + "[\"faelle\", \"Fälle löschen bereitstellen\"]": { + "abdruck": "d3a7338ca875abcd", + "beleg": "#[Route('/cases/delete', name: 'admin_evals_case_delete', methods: ['POST'])]\n public function deleteCase(Request $request, EvalAdminService $evals): Response\n {\n $this->denyAccessUnlessGranted(ApplicationRoles::ROLE_KNOWLEDGE_ADMIN);", + "datei": "src/Controller/Admin/AdminEvalController.php" + }, + "[\"feedback\", \"Chat-Feedback anzeigen\"]": { + "abdruck": "380650cd110c8613", + "beleg": "#[Route('/admin/chat-feedback', name: 'admin_chat_feedback_index', methods: ['GET'])]", + "datei": "src/Controller/Admin/AdminChatFeedbackController.php" + }, + "[\"feedback\", \"Feedback exportieren\"]": { + "abdruck": "f4168bfa7d6e819a", + "beleg": "#[Route('/admin/chat-feedback/export', name: 'admin_chat_feedback_export', methods: ['GET'])]\n public function export(Request $request, ChatAnswerFeedbackRepository $repository): StreamedResponse\n {\n $this->denyAccessUnlessGranted(ApplicationRoles::ROLE_KNOWLEDGE_ADMIN);", + "datei": "src/Controller/Admin/AdminChatFeedbackController.php" + }, + "[\"feedback\", \"Feedback klassifizieren\"]": { + "abdruck": "722b8e9be1eda83d", + "beleg": "if ($processed % 100 === 0) {", + "datei": "src/Command/ChatFeedbackClassifyCommand.php" + }, + "[\"feedback\", \"Feedback löschen\"]": { + "abdruck": "774f9c113b07b54c", + "beleg": "public function delete(string $id, Request $request, ChatAnswerFeedbackRepository $repository, EntityManagerInterface $entityManager): Response", + "datei": "src/Controller/Admin/AdminChatFeedbackController.php" + }, + "[\"feedback\", \"Feedback-Details anzeigen\"]": { + "abdruck": "5ccfb944dd8353de", + "beleg": "#[Route('/admin/chat-feedback/{id}', name: 'admin_chat_feedback_show', requirements: ['id' => '[0-9a-fA-F-]{36}'], methods: ['GET'])]", + "datei": "src/Controller/Admin/AdminChatFeedbackController.php" + }, + "[\"feedback\", \"Feedback-Status aktualisieren\"]": { + "abdruck": "107aa5d09bbfd64c", + "beleg": "$status = trim((string) $request->request->get('status', ChatAnswerFeedback::REVIEW_STATUS_DONE));\n if ($status === ChatAnswerFeedback::REVIEW_STATUS_DONE) {\n $feedback->markReviewDone(trim((string) $request->request->get('reviewNote', '')) ?: null);\n $this->addFlash('success', 'Feedback wurde als erledigt markiert.');\n } else {\n $feedback->reopenReview();\n $this->addFlash('success', 'Feedback wurde wieder geöffnet.');\n }", + "datei": "src/Controller/Admin/AdminChatFeedbackController.php" + }, + "[\"feedback\", \"Feedback-Status prüfen\"]": { + "abdruck": "e08595a775786488", + "beleg": "$response = new JsonResponse([\n 'status' => 'ok',\n 'stored' => $feedback !== null,\n 'feedbackId' => $feedback !== null ? (string) $feedback->getId() : null,\n 'rating' => $feedback !== null ? $feedback->getRating() : null,\n ]);", + "datei": "src/Controller/ChatFeedbackController.php" + }, + "[\"knowledge-raeume\", \"Batch-Import durchführen\"]": { + "abdruck": "ed8e53ee87a33ecd", + "beleg": "final class KnowledgeBatchImportCommand extends Command", + "datei": "src/Command/KnowledgeBatchImportCommand.php" + }, + "[\"knowledge-raeume\", \"Chat-Freigabe umschalten\"]": { + "abdruck": "b0459d69691cd838", + "beleg": "#[Route('/admin/knowledge-spaces/provider-resource-chat', name: 'admin_knowledge_spaces_provider_resource_chat_update', methods: ['POST'])]", + "datei": "src/Controller/Admin/KnowledgeSpaceOverviewController.php" + }, + "[\"knowledge-raeume\", \"Chat-Verfügbarkeit prüfen\"]": { + "abdruck": "07ac7926675dc356", + "beleg": "#[Route('/admin/knowledge-spaces/chat-availability', name: 'admin_knowledge_spaces_chat_availability_update', methods: ['POST'])]", + "datei": "src/Controller/Admin/KnowledgeSpaceOverviewController.php" + }, + "[\"knowledge-raeume\", \"Facts prüfen\"]": { + "abdruck": "0150181090352e46", + "beleg": "$io->warning('No chunks with diagnostic ingest facts matched the current filter. Run a global reindex after extractor changes so index.ndjson contains the current fact schema.');", + "datei": "src/Command/IngestFactsInspectCommand.php" + }, + "[\"knowledge-raeume\", \"Kandidaten wählen\"]": { + "abdruck": "f3cfe523ec5c3401", + "beleg": "#[Route('/admin/knowledge-spaces/provider-candidate-select', name: 'admin_knowledge_spaces_provider_candidate_select', methods: ['POST'])]", + "datei": "src/Controller/Admin/KnowledgeSpaceOverviewController.php" + }, + "[\"knowledge-raeume\", \"Knowledge-Räume anzeigen\"]": { + "abdruck": "651989a1820b87cf", + "beleg": "#[Route('/admin/knowledge-spaces', name: 'admin_knowledge_spaces_overview', methods: ['GET'])]\n public function index(McpKnowledgeSpaceReadModel $readModel, KnowledgeSpaceAdminOverviewReadModel $adminOverviewReadModel, KnowledgeSpaceAvailabilityReadModel $availabilityReadModel, KnowledgeSpaceChatSelectorReadModel $chatSelectorReadModel, KnowledgeSpaceProviderResourceCandidateReadModel $providerResourceCandidateReadModel): Response\n {\n return $this->render('admin/knowledge_spaces/index.html.twig', [\n 'knowledgeSpaceReadModel' => $readModel->build(),\n 'knowledgeSpaceAdminOverview' => $adminOverviewReadModel->build(),\n 'knowledgeSpaceAvailability' => $availabilityReadModel->build(),\n 'chatKnowledgeSpaceSelector' => $chatSelectorReadModel->build(),\n 'knowledgeSpaceProviderResourceCandidates' => $providerResourceCandidateReadModel->build(),\n ]);\n }", + "datei": "src/Controller/Admin/KnowledgeSpaceOverviewController.php" + }, + "[\"knowledge-raeume\", \"Live-Vorschau laden\"]": { + "abdruck": "581e01a64ada02e6", + "beleg": "#[Route('/admin/knowledge-spaces/provider-resource-live-preview', name: 'admin_knowledge_spaces_provider_resource_live_preview', methods: ['POST'])]", + "datei": "src/Controller/Admin/KnowledgeSpaceOverviewController.php" + }, + "[\"knowledge-raeume\", \"Ressourcenprüfung durchführen\"]": { + "abdruck": "1d6a2b8d376cce22", + "beleg": "public function check(string $serverKey, string $resourceUri, string $mimeType = ''): McpResourcePolicyDecision", + "datei": "src/Mcp/McpResourcePolicyChecker.php" + }, + "[\"knowledge-raeume\", \"Textteile suchen\"]": { + "abdruck": "cb366acdc584d3cd", + "beleg": "@app.post(\"/search-chunks\")\ndef search_chunks(req: SearchRequest) -> List[Dict[str, Any]]:", + "datei": "python/vector/vector_service.py" + }, + "[\"knowledge-raeume\", \"Wissensräume prüfen\"]": { + "abdruck": "f329f8b7d149443c", + "beleg": "#[Route('/admin/knowledge-spaces/diagnostics/run', name: 'admin_knowledge_spaces_diagnostics_run', methods: ['POST'])]\n public function runDiagnostics(", + "datei": "src/Controller/Admin/KnowledgeSpaceOverviewController.php" + }, + "[\"konfiguration\", \"Ingest-Profil anlegen\"]": { + "abdruck": "88d9ebf11cc65de1", + "beleg": "#[Route('/create', name: 'admin_ingest_profile_create', methods: ['GET', 'POST'])]", + "datei": "src/Controller/Admin/IngestProfileController.php" + }, + "[\"konfiguration\", \"Ingest-Profile anzeigen\"]": { + "abdruck": "3bcd4f2eecf9e04d", + "beleg": "{% if p.active %}\n Aktiv\n {% else %}\n \n Inaktiv\n \n {% endif %}", + "datei": "templates/admin/ingest_profile/list.html.twig" + }, + "[\"konfiguration\", \"Konfiguration aktivieren\"]": { + "abdruck": "3cdcaacb5c30935e", + "beleg": "#[Route('/{id}/activate', name: 'admin_model_config_activate', methods: ['POST'])]", + "datei": "src/Controller/Admin/ModelGenerationConfigController.php" + }, + "[\"konfiguration\", \"Konfiguration anzeigen\"]": { + "abdruck": "be665b176d285ec7", + "beleg": "$json = json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);", + "datei": "src/Command/ConfigDumpEffectiveCommand.php" + }, + "[\"konfiguration\", \"Konfiguration bereitstellen\"]": { + "abdruck": "d726bc00b770d39d", + "beleg": "#[Route('/chat-messages/frontend', name: 'chat_messages_frontend', methods: ['GET'])]", + "datei": "src/Controller/ChatMessagesController.php" + }, + "[\"konfiguration\", \"Konfigurationen anzeigen\"]": { + "abdruck": "4d0677e36928af2f", + "beleg": "#[Route('/', name: 'admin_model_config_list')]\n public function list(ModelGenerationConfigAdminService $svc): Response\n {\n $this->denyAccessUnlessGranted(ApplicationRoles::ROLE_KNOWLEDGE_ADMIN);", + "datei": "src/Controller/Admin/ModelGenerationConfigController.php" + }, + "[\"konfiguration\", \"Konfigurationsmuster prüfen\"]": { + "abdruck": "0e0bc4972945d622", + "beleg": "$calls = $this->matchingCalls((string) $line, $suspiciousCalls);", + "datei": "src/Config/CorePatternAuditProvider.php" + }, + "[\"konfiguration\", \"Tool-Freigaben aktualisieren\"]": { + "abdruck": "564123f595ea652e", + "beleg": "#[Route('/admin/knowledge-spaces/provider-tool-allowlist', name: 'admin_knowledge_spaces_provider_tool_allowlist_update', methods: ['POST'])]\n public function updateProviderToolAllowlist(Request $request, McpAdminSourceStore $sourceStore): RedirectResponse", + "datei": "src/Controller/Admin/KnowledgeSpaceOverviewController.php" + }, + "[\"logs\", \"Logdatei anzeigen\"]": { + "abdruck": "e5823ed4e9f28bf2", + "beleg": "$content = $this->readLastLines($path, 1000);", + "datei": "src/Controller/Admin/AdminSystemLogController.php" + }, + "[\"logs\", \"Logdateien auflisten\"]": { + "abdruck": "65b9c55ff9cc0246", + "beleg": "foreach (\\glob($this->logDir . '/system*.log') ?: [] as $file) {", + "datei": "src/Controller/Admin/AdminSystemLogController.php" + }, + "[\"sonstiges\", \"post activate {id} bereitstellen\"]": { + "abdruck": "77751e07c0ac66e6", + "beleg": "if (!$this->isCsrfTokenValid('activate_ingest_profile_' . $profile->getId(), (string) $request->request->get('_token'))) {", + "datei": "src/Controller/Admin/IngestProfileController.php" + }, + "[\"sonstiges\", \"post admin enterprise check security bereitstellen\"]": { + "abdruck": "6fde0d762ab1f63a", + "beleg": "#[Route('/admin/enterprise/check/security', name: 'admin_enterprise_check_security', methods: ['POST'])]", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"sonstiges\", \"post {id} tags save bereitstellen\"]": { + "abdruck": "4b25cdb131288705", + "beleg": "#[Route('/{id}/tags/save', name: 'admin_document_tags_save', methods: ['POST'])]", + "datei": "src/Controller/Admin/DocumentTagController.php" + }, + "[\"system\", \"Access-Denied-Fehler bereitstellen\"]": { + "abdruck": "82cd2269b409655e", + "beleg": "if ($targetHomeRoute === 'admin_dashboard' && $this->security->isGranted(ApplicationRoles::ROLE_ADMIN_AREA)) {", + "datei": "src/Security/AccessDeniedPageRenderer.php" + }, + "[\"system\", \"Betriebsbereitschaft prüfen\"]": { + "abdruck": "447f0da9c71ca14d", + "beleg": "$report = $this->buildReport();", + "datei": "src/Command/EnterpriseOperationsReadinessCheckCommand.php" + }, + "[\"system\", \"Cache leeren\"]": { + "abdruck": "5fa28d5145b77c72", + "beleg": "if (!$this->isCsrfTokenValid('runtime_cache_clear', (string) $request->request->get('_token'))) {", + "datei": "src/Controller/Admin/DashboardController.php" + }, + "[\"system\", \"Daten neu laden\"]": { + "abdruck": "37040fd380c7eb93", + "beleg": "@app.post(\"/reload\")\ndef reload() -> Dict[str, str]:\n try:\n load_all()\n return {\"status\": \"reloaded\", \"stamp\": SERVICE_STAMP}\n except Exception as exc:\n logger.exception(\"reload failed\")\n raise HTTPException(status_code=500, detail=str(exc))", + "datei": "python/vector/vector_service.py" + }, + "[\"system\", \"Daten sichern\"]": { + "abdruck": "7ccd1004eac1418a", + "beleg": "protected function execute(InputInterface $input, OutputInterface $output): int", + "datei": "src/Command/EnterpriseRollingBackupCommand.php" + }, + "[\"system\", \"Deployment prüfen\"]": { + "abdruck": "2e5833bfbb397dfc", + "beleg": "if (!$this->isCsrfTokenValid('enterprise_check_deployment_scheduler', (string) $request->request->get('_token', ''))) {", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"system\", \"Dienststatus melden\"]": { + "abdruck": "f03c81a271cb0eb9", + "beleg": "@app.get(\"/health\")", + "datei": "python/vector/vector_service.py" + }, + "[\"system\", \"Flow-Grenze sperren\"]": { + "abdruck": "4e90cc73b0837ac4", + "beleg": "private function buildReport(): array\n {\n $root = rtrim($this->kernel->getProjectDir(), '/\\\\');\n $boundaries = AgentRunFlowBoundaryContract::boundaries();\n $actualSections = array_keys($boundaries);\n $missingFiles = $this->missingFiles($root, self::REQUIRED_FILES);\n $flowFiles = glob($root . '/src/Agent/Run/*Flow.php') ?: [];\n $flowSources = $this->combinedReadableSource($flowFiles);\n $agentRunner = $this->read($root . '/src/Agent/AgentRunner.php');\n $sourceLeakTrace = $this->buildSensitiveTraceLeakReport();\n $missingOwnerTokens = $this->missingTokens($agentRunner, self::AGENTRUNNER_CRITICAL_OWNER_TOKENS);\n $forbiddenFlowTokens = $this->presentTokens($flowSources, self::FORBIDDEN_FLOW_TOKENS);\n $badBoundaryContracts = $this->badBoundaryContracts($boundaries);\n $badSectionFlows = $this->badSectionFlows($boundaries);\n $debugTraceBuilderFindings = $this->debugTraceBuilderFindings($agentRunner, $this->read($root . '/src/Agent/Run/AgentRunDebugTracePayloadBuilder.php'));\n $capabilityBoundaryFindings = $this->capabilityBoundaryFindings(\n $this->read($root . '/src/Agent/Run/CapabilityContextFlow.php'),\n $this->read($root . '/src/Agent/Run/CapabilityContextResult.php')\n );\n $followUpActionBuilderFindings = $this->followUpActionBuilderFindings(\n $agentRunner,\n $this->read($root . '/src/Agent/Support/FollowUpActionBuilder.php')\n );\n $evidenceDiagnosticMetaBuilderFindings = $this->evidenceDiagnosticMetaBuilderFindings(\n $agentRunner,\n $this->read($root . '/src/Agent/Support/EvidenceDiagnosticMetaMessageBuilder.php')\n );\n $claimEvidencePresentationBuilderFindings = $this->claimEvidencePresentationBuilderFindings(\n $agentRunner,\n $this->read($root . '/src/Agent/Support/ClaimEvidencePresentationMessageBuilder.php')\n );", + "datei": "src/Command/AgentRunFlowBoundaryLockSelfTestCommand.php" + }, + "[\"system\", \"Neuindizierung starten\"]": { + "abdruck": "b4519b8d45b5d080", + "beleg": "#[Route('/global-reindex', name: 'admin_global_reindex', methods: ['POST'])]", + "datei": "src/Controller/Admin/IngestJobController.php" + }, + "[\"system\", \"Normalisierung prüfen\"]": { + "abdruck": "36bcb0a013c43f30", + "beleg": "/** @var list */\n private const REQUIRED_FILES = [\n 'src/Ingest/MarkdownNormalization/DocumentMarkdownNormalizationService.php',\n 'src/Ingest/MarkdownNormalization/DocumentMarkdownNormalizationPromptBuilder.php',\n 'src/Ingest/MarkdownNormalization/DocumentMarkdownNormalizationValidator.php',\n 'src/Ingest/MarkdownNormalization/DocumentMarkdownSourceTextCleaner.php',\n 'src/Ingest/MarkdownNormalization/DocumentDerivedMarkdownVersionWriter.php',\n 'src/Ingest/MarkdownNormalization/DocumentMarkdownSegmentationPlanService.php',\n 'src/Command/IngestMarkdownNormalizationFoundationSelfTestCommand.php',\n 'docs/retriex/ingest-markdown-normalization-foundation.md',\n 'README.md',\n 'PATCH_MANIFEST.md',\n 'GENRE_NEUTRAL_CORE_PATCHLINE.md',\n ];", + "datei": "src/Command/IngestMarkdownNormalizationFoundationSelfTestCommand.php" + }, + "[\"system\", \"Preview prüfen\"]": { + "abdruck": "175111522fc5db0e", + "beleg": "#[AsCommand(\n name: 'mto:agent:ingest:markdown-normalization-preview-self-test',\n description: 'Validate the admin Markdown normalization preview wiring without LLM, DB, ingest or answer side effects'\n)]", + "datei": "src/Command/IngestMarkdownNormalizationPreviewSelfTestCommand.php" + }, + "[\"system\", \"Promptversion aktivieren\"]": { + "abdruck": "2bd24ab6b032d071", + "beleg": "$svc->activate($prompt);", + "datei": "src/Controller/Admin/SystemPromptController.php" + }, + "[\"system\", \"Promptversion löschen\"]": { + "abdruck": "5dd7729167e2c812", + "beleg": "#[Route('/admin/system/prompt/{id}/delete', name: 'admin_system_prompt_delete', methods: ['POST'])]", + "datei": "src/Controller/Admin/SystemPromptController.php" + }, + "[\"system\", \"Promptversionen verwalten\"]": { + "abdruck": "35608f50dcb84951", + "beleg": "'all' => $this->repo->findBy([], ['version' => 'DESC']),", + "datei": "src/Service/Admin/SystemPromptAdminService.php" + }, + "[\"system\", \"Restore-Vorschau prüfen\"]": { + "abdruck": "1e0c758c14cafbd5", + "beleg": "private function addRestoreDryRunFlash(array $report): void", + "datei": "src/Controller/Admin/EnterpriseOperationsController.php" + }, + "[\"system\", \"Simulation ausführen\"]": { + "abdruck": "c50566f7d0f432ba", + "beleg": "if ($payloadJson !== '' && $payloadFile !== '') {\n throw new \\InvalidArgumentException('Use either --payload-json or --payload-file, not both.');\n }", + "datei": "src/Command/McpEvidenceDryRunCommand.php" + }, + "[\"system\", \"Systemzustand zurücksetzen\"]": { + "abdruck": "ec8e8511801fc5ca", + "beleg": "#[Route('/reset', name: 'admin_document_reset', methods: ['POST'])]", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"system\", \"Verzeichnis bereinigen\"]": { + "abdruck": "cacd399eaef94143", + "beleg": "#[Route('/cleanup', name: 'admin_knowledge_batch_cleanup', methods: ['POST'])]", + "datei": "src/Controller/Admin/KnowledgeBatchReportController.php" + }, + "[\"tags\", \"Tag-Rebuild-Auftrag ausführen\"]": { + "abdruck": "08bdc2dfadebb29a", + "beleg": "$job->markCompleted();", + "datei": "src/Command/TagRebuildRunJobCommand.php" + }, + "[\"tags\", \"Tags auflisten\"]": { + "abdruck": "f35e569340543788", + "beleg": "#[Route('', name: 'admin_tags_index', methods: ['GET'])]", + "datei": "src/Controller/Admin/TagController.php" + }, + "[\"tags\", \"Tags bearbeiten\"]": { + "abdruck": "a75df6fbceed8e9d", + "beleg": "#[Route('/{id}/tags', name: 'admin_document_tags_edit', methods: ['GET'])]", + "datei": "src/Controller/Admin/DocumentTagController.php" + }, + "[\"tags\", \"Tags suchen\"]": { + "abdruck": "d507a2144565b9a9", + "beleg": "@app.post(\"/search-tags\")\ndef search_tags(req: SearchRequest) -> List[Dict[str, Any]]:", + "datei": "python/vector/vector_service.py" + }, + "[\"titel\", \"Titel aktualisieren\"]": { + "abdruck": "f4226daad62eb2a6", + "beleg": "$document->updateTitle($title, Document::TITLE_SOURCE_MANUAL, false);", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"titel\", \"Titelvorschläge laden\"]": { + "abdruck": "09506400afa4f506", + "beleg": "$result = $titleSuggestionService->suggest($document);", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"uploads\", \"Berechtigungsmodus ändern\"]": { + "abdruck": "ec7ba210bc22e0ee", + "beleg": "#[Route('/chat-uploads/{uploadId}/authority-mode', name: 'chat_upload_authority_mode', requirements: ['uploadId' => '[a-f0-9]{32}'], methods: ['PATCH', 'POST'])]\n public function setAuthorityMode(Request $request, string $uploadId): JsonResponse", + "datei": "src/Controller/ChatUploadController.php" + }, + "[\"uploads\", \"Datei hochladen\"]": { + "abdruck": "abda7a007e492357", + "beleg": "$status = $this->isSizeError($e->getMessage())\n ? Response::HTTP_REQUEST_ENTITY_TOO_LARGE\n : Response::HTTP_BAD_REQUEST;", + "datei": "src/Controller/ChatUploadController.php" + }, + "[\"uploads\", \"Upload entfernen\"]": { + "abdruck": "c12063ad4ea6504a", + "beleg": "public function delete(Request $request, string $uploadId): JsonResponse", + "datei": "src/Controller/ChatUploadController.php" + }, + "[\"uploads\", \"Uploads auflisten\"]": { + "abdruck": "f715c27aaa2efe0b", + "beleg": "#[Route('/chat-uploads', name: 'chat_upload_list', methods: ['GET'])]", + "datei": "src/Controller/ChatUploadController.php" + }, + "[\"verlauf\", \"Verankerungen extrahieren\"]": { + "abdruck": "07982f2a65cfc9a3", + "beleg": "$anchors = $this->extractor->extractRecentAnchors($history, $maxTurns);", + "datei": "src/Command/TestStructuredHistoryAnchorsCommand.php" + }, + "[\"verlauf\", \"Verlauf abrufen\"]": { + "abdruck": "5245760a2672d725", + "beleg": "#[Route('/history', name: 'chat_history', methods: ['GET'])]", + "datei": "src/Controller/HistoryController.php" + }, + "[\"verlauf\", \"Verlauf löschen\"]": { + "abdruck": "a1e4bd366e494634", + "beleg": "$this->contextService->deleteHistory($clientId);", + "datei": "src/Controller/HistoryController.php" + }, + "[\"versionen\", \"Version ableiten\"]": { + "abdruck": "9d7b531eafa6b4db", + "beleg": "public function deriveVersion(\n string $versionId,\n Request $request,\n EntityManagerInterface $em,\n DocumentService $documentService,\n ParameterBagInterface $params,\n FormatText $formatText,\n DocumentVersionPreviewService $previewService,\n ): Response {", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"versionen\", \"Version einlesen\"]": { + "abdruck": "e104d93b6d3ca473", + "beleg": "#[Route(\n '/version/{versionId}/preview',\n name: 'admin_document_version_preview',\n requirements: ['versionId' => '[0-9a-fA-F\\-]{36}'],\n methods: ['GET']\n )]\n public function previewVersion(", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"versionen\", \"Version erstellen\"]": { + "abdruck": "e91ce1c1c6094cf1", + "beleg": "$documentService->addVersion($document, $filePath, $user);", + "datei": "src/Controller/Admin/DocumentController.php" + }, + "[\"versionen\", \"Versionvorschau anzeigen\"]": { + "abdruck": "a974b2f0fc1570d9", + "beleg": "return $this->json([\n 'ok' => true,\n 'preview' => $previewService->buildPreview(\n $version,\n max(0, (int) $request->query->get('offset', 0)),\n (int) $request->query->get('limit', 0) ?: null,\n ),\n ]);", + "datei": "src/Controller/Admin/DocumentController.php" + } + }, + "ohne_code": {}, + "ohne_karte": { + "befehl:mto:agent:admin:title-suggestions-batch-ux-self-test": { + "abdruck": "843d5ca642b321bb", + "beleg": "src/Command/AdminTitleSuggestionsBatchUxSelfTestCommand.php:13", + "feature": "diagnose", + "karten": "69d65c7a24056348", + "stelle": "befehl:mto:agent:admin:title-suggestions-batch-ux-self-test", + "titel": "Titelvorschläge-Selbsttest bereitstellen" + }, + "befehl:mto:agent:config:audit-source": { + "abdruck": "6230151689bef31c", + "beleg": "src/Command/ConfigSourceAuditCommand.php:16", + "feature": "diagnose", + "karten": "69d65c7a24056348", + "stelle": "befehl:mto:agent:config:audit-source", + "titel": "Konfigurationsquellen prüfen" + }, + "befehl:mto:agent:knowledge:batch-markdown-normalization-self-test": { + "abdruck": "3e48335eb38ac843", + "beleg": "src/Command/KnowledgeBatchMarkdownNormalizationSelfTestCommand.php:15", + "feature": "diagnose", + "karten": "69d65c7a24056348", + "stelle": "befehl:mto:agent:knowledge:batch-markdown-normalization-self-test", + "titel": "Batch-Markdown-Normalisierung testen" + }, + "befehl:mto:agent:mcp:policy-check": { + "abdruck": "8110a377aeb90a72", + "beleg": "src/Command/McpPolicyCheckCommand.php:15", + "feature": "agenten", + "karten": "69d65c7a24056348", + "stelle": "befehl:mto:agent:mcp:policy-check", + "titel": "MCP-Allowlist prüfen" + }, + "befehl:mto:agent:system:rebuild": { + "abdruck": "338b6ba198206984", + "beleg": "src/Command/SystemRebuildCommand.php:23", + "feature": "agenten", + "karten": "69d65c7a24056348", + "stelle": "befehl:mto:agent:system:rebuild", + "titel": "System rebuild bereitstellen" + }, + "einbinden:erweitert error/layout.html.twig": { + "abdruck": "7e0ec1ba9d60dfc2", + "beleg": "templates/bundles/TwigBundle/Exception/error.html.twig:1", + "feature": "system", + "karten": "69d65c7a24056348", + "stelle": "einbinden:erweitert error/layout.html.twig", + "titel": "Fehlerseite anzeigen" + }, + "route:get /admin/enterprise/operator-report.json": { + "abdruck": "f80c52683806f557", + "beleg": "src/Controller/Admin/EnterpriseOperationsController.php:222", + "feature": "backup", + "karten": "69d65c7a24056348", + "stelle": "route:get /admin/enterprise/operator-report.json", + "titel": "Operatorbericht als JSON exportieren" + }, + "route:get /admin/enterprise/operator-report.md": { + "abdruck": "013cf5bf01f75995", + "beleg": "src/Controller/Admin/EnterpriseOperationsController.php:233", + "feature": "berichte", + "karten": "69d65c7a24056348", + "stelle": "route:get /admin/enterprise/operator-report.md", + "titel": "Operatorbericht als Markdown herunterladen" + }, + "route:get /admin/jobs": { + "abdruck": "bb7ffeb8ab6206d7", + "beleg": "src/Controller/Admin/IngestJobController.php:19", + "feature": "auftraege", + "karten": "69d65c7a24056348", + "stelle": "route:get /admin/jobs", + "titel": "Ingest-Jobs auflisten" + }, + "route:get /admin/login": { + "abdruck": "26892f59f58a1343", + "beleg": "src/Controller/Admin/SecurityController.php:17", + "feature": "system", + "karten": "69d65c7a24056348", + "stelle": "route:get /admin/login", + "titel": "Admin-Login bereitstellen" + }, + "route:get /tags/status": { + "abdruck": "563ca03e6e7d0168", + "beleg": "src/Controller/Admin/DocumentTagController.php:64", + "feature": "tags", + "karten": "69d65c7a24056348", + "stelle": "route:get /tags/status", + "titel": "Tag-Rebuild-Status abfragen" + }, + "route:get /version/{versionId}/chunks": { + "abdruck": "5912e8ad04dff0b9", + "beleg": "src/Controller/Admin/DocumentController.php:362", + "feature": "dokumente", + "karten": "69d65c7a24056348", + "stelle": "route:get /version/{versionId}/chunks", + "titel": "Version-Chunks abrufen" + }, + "route:get /{batchId}": { + "abdruck": "aff9a8b22d9a3898", + "beleg": "src/Controller/Admin/KnowledgeBatchReportController.php:120", + "feature": "berichte", + "karten": "69d65c7a24056348", + "stelle": "route:get /{batchId}", + "titel": "Batch-Bericht anzeigen" + }, + "route:get /{id}/tags": { + "abdruck": "647012ad65e4e903", + "beleg": "src/Controller/Admin/DocumentTagController.php:20", + "feature": "tags", + "karten": "69d65c7a24056348", + "stelle": "route:get /{id}/tags", + "titel": "Tag-Zuordnung bearbeiten" + }, + "route:post /chat-feedback": { + "abdruck": "3580073b0c13af05", + "beleg": "src/Controller/ChatFeedbackController.php:58", + "feature": "feedback", + "karten": "69d65c7a24056348", + "stelle": "route:post /chat-feedback", + "titel": "Feedback speichern" + }, + "route:post /remove/{id}": { + "abdruck": "a1713c7060f2b0aa", + "beleg": "src/Controller/Admin/IngestProfileController.php:76", + "feature": "konfiguration", + "karten": "69d65c7a24056348", + "stelle": "route:post /remove/{id}", + "titel": "Ingest-Profil entfernen" + }, + "route:post /upload": { + "abdruck": "4dc0d28cbc695b67", + "beleg": "src/Controller/Admin/KnowledgeBatchReportController.php:65", + "feature": "berichte", + "karten": "69d65c7a24056348", + "stelle": "route:post /upload", + "titel": "Batch-Bericht hochladen" + }, + "route:post /version/{versionId}/activate": { + "abdruck": "19e7d9844ad77ac3", + "beleg": "src/Controller/Admin/DocumentController.php:549", + "feature": "versionen", + "karten": "69d65c7a24056348", + "stelle": "route:post /version/{versionId}/activate", + "titel": "Version aktivieren" + } + }, + "paare": { + "[\"[\\\"diagnose\\\", \\\"Konfiguration prüfen\\\"]\", \"[\\\"konfiguration\\\", \\\"Konfigurationsmuster prüfen\\\"]\"]": { + "abdruck": "15337f18a6737c8c", + "gleich": false + }, + "[\"[\\\"knowledge-raeume\\\", \\\"Batch-Import durchführen\\\"]\", \"[\\\"knowledge-raeume\\\", \\\"Ressourcenprüfung durchführen\\\"]\"]": { + "abdruck": "2986858d481560bc", + "gleich": false + }, + "[\"[\\\"knowledge-raeume\\\", \\\"Chat-Verfügbarkeit prüfen\\\"]\", \"[\\\"knowledge-raeume\\\", \\\"Ressourcenprüfung durchführen\\\"]\"]": { + "abdruck": "152316f10336728c", + "gleich": false + }, + "[\"[\\\"knowledge-raeume\\\", \\\"Facts prüfen\\\"]\", \"[\\\"knowledge-raeume\\\", \\\"Ressourcenprüfung durchführen\\\"]\"]": { + "abdruck": "b4dbd1bd2cdfad59", + "gleich": false + }, + "[\"[\\\"knowledge-raeume\\\", \\\"Live-Vorschau laden\\\"]\", \"[\\\"knowledge-raeume\\\", \\\"Ressourcenprüfung durchführen\\\"]\"]": { + "abdruck": "6bd6037f86a8638b", + "gleich": false + }, + "[\"[\\\"konfiguration\\\", \\\"Ingest-Profil anlegen\\\"]\", \"[\\\"konfiguration\\\", \\\"Ingest-Profile anzeigen\\\"]\"]": { + "abdruck": "54fa5dc37e4bce7b", + "gleich": false + }, + "[\"[\\\"konfiguration\\\", \\\"Konfiguration anzeigen\\\"]\", \"[\\\"konfiguration\\\", \\\"Konfigurationen anzeigen\\\"]\"]": { + "abdruck": "1a2b3ae854024ca6", + "gleich": false + } + }, + "stil": { + "[\"admin\", \"\"]": { + "abdruck": "a203875bd41900c1", + "probleme": [] + }, + "[\"admin\", \"Betrieb einsehen\"]": { + "abdruck": "92a486ddfff5158e", + "probleme": [] + }, + "[\"admin\", \"Dashboard anzeigen\"]": { + "abdruck": "54e5d6299d132ede", + "probleme": [ + { + "feature": "admin", + "feld": "regeln", + "funktion": "Dashboard anzeigen", + "ganzes_feld": true, + "original": "Rendered admin dashboard index html twig\nEnthält Chunk-Zähler und Chunk-Limit\nEnthält Vektor- und Tag-Gesundheitsdaten\nEnthält Reset-Konfiguration", + "problem": "Template-Pfad kein Feature-Inhalt. Chunk-Zähler und Limit sowie Vektor- und Tag-Daten sind je zwei Inhalte in einer Zeile", + "regel": "Genau eine Aussage je Zeile; zwei Aussagen werden zu zwei Regeln", + "vorschlag": "Chunk-Zähler und Chunk-Limit anzeigen\nVektor- und Tag-Gesundheitsdaten anzeigen\nReset-Konfiguration anzeigen" + } + ] + }, + "[\"admin\", \"Logout einleiten\"]": { + "abdruck": "42dcd7e9064bcbbf", + "probleme": [] + }, + "[\"admin\", \"Wiederherstellung testen\"]": { + "abdruck": "0a40315eeece5b67", + "probleme": [] + }, + "[\"admin\", \"Zum Dashboard weiterleiten\"]": { + "abdruck": "7b834b643e67b940", + "probleme": [] + }, + "[\"agenten\", \"\"]": { + "abdruck": "901c385fec70b938", + "probleme": [] + }, + "[\"agenten\", \"Agentenaktivität anzeigen\"]": { + "abdruck": "cd9f8ffc4b1305b9", + "probleme": [] + }, + "[\"agenten\", \"Chat-Auswahl-Guard testen\"]": { + "abdruck": "64ce9ac9cfcff1dc", + "probleme": [] + }, + "[\"agenten\", \"Fähigkeiten ermitteln\"]": { + "abdruck": "785628cbe59d669a", + "probleme": [] + }, + "[\"agenten\", \"Hybrid-Tool-Auswahl testen\"]": { + "abdruck": "ee09ee5102072416", + "probleme": [] + }, + "[\"agenten\", \"MCP-Allowlist prüfen\"]": { + "abdruck": "853ccb3f4e4aa8d4", + "probleme": [] + }, + "[\"agenten\", \"MCP-Gateway trocken ausführen\"]": { + "abdruck": "1439df287c8150b2", + "probleme": [] + }, + "[\"agenten\", \"MCP-Laufzeit-Gate prüfen\"]": { + "abdruck": "b3293656f686ae09", + "probleme": [ + { + "feature": "agenten", + "feld": "regeln", + "funktion": "MCP-Laufzeit-Gate prüfen", + "ganzes_feld": false, + "original": "Gate ohne Transport öffnen", + "problem": "Erste Regel ist Ablaufschritt statt Eigenschaft", + "regel": "Beschreibt eine Eigenschaft oder Bedingung, keinen Ablaufschritt", + "vorschlag": "Gate ohne Transport verfügbar" + }, + { + "feature": "agenten", + "feld": "testen", + "funktion": "MCP-Laufzeit-Gate prüfen", + "ganzes_feld": false, + "original": "JSON auf Status ready und Fehler prüfen", + "problem": "Letzte Zeile enthält Handlung statt Endzustand", + "regel": "Letzte Zeile beschreibt den Endzustand, keine Handlung", + "vorschlag": "JSON zeigt Status ready ohne Fehler" + } + ] + }, + "[\"agenten\", \"MCP-Laufzeitgrenze testen\"]": { + "abdruck": "080b368f6b310470", + "probleme": [] + }, + "[\"agenten\", \"MCP-Quelle prüfen\"]": { + "abdruck": "c1558584859c0dec", + "probleme": [] + }, + "[\"agenten\", \"Mit Agent chatten\"]": { + "abdruck": "00eafdf90dab665a", + "probleme": [] + }, + "[\"agenten\", \"Performance-Cache leeren\"]": { + "abdruck": "97e48547004e559b", + "probleme": [] + }, + "[\"agenten\", \"Produktlabel-Formatierer testen\"]": { + "abdruck": "c5831a681dbce9d2", + "probleme": [] + }, + "[\"agenten\", \"Release-Selbsttest bereitstellen\"]": { + "abdruck": "4d0951f85d841836", + "probleme": [] + }, + "[\"agenten\", \"Ressource abrufen\"]": { + "abdruck": "f41b71225f818920", + "probleme": [] + }, + "[\"agenten\", \"Ressource validieren\"]": { + "abdruck": "3d7999723f74822d", + "probleme": [] + }, + "[\"agenten\", \"Rollencode-Zuweisung prüfen\"]": { + "abdruck": "287ee050cc63c85a", + "probleme": [ + { + "feature": "agenten", + "feld": "testen", + "funktion": "Rollencode-Zuweisung prüfen", + "ganzes_feld": false, + "original": "Ausgabe auf Status OK prüfen", + "problem": "Zweiter Ablauf in einer Funktion", + "regel": "Genau ein Ablauf: handeln, handeln, Ergebnis", + "vorschlag": "" + } + ] + }, + "[\"agenten\", \"Stabilitäts-Selbsttest bereitstellen\"]": { + "abdruck": "3db549d48f744d79", + "probleme": [ + { + "feature": "agenten", + "feld": "testen", + "funktion": "Stabilitäts-Selbsttest bereitstellen", + "ganzes_feld": true, + "original": "Binconsole mto:agent:shop-followup-anchor-stability-self-test\nStatus OK prüfen\npassed größer 0 prüfen\nfailed gleich 0 prüfen\nBinconsole mit --json\nJSON-Status OK prüfen", + "problem": "Zweiter Ablauf für menschenlesbare Ausgabe", + "regel": "Zwei Abläufe in einer Funktion", + "vorschlag": "Binconsole mto:agent:shop-followup-anchor-stability-self-test --json ausführen\nExit-Code 0 prüfen\nJSON-Status OK prüfen\nJSON failed gleich 0 prüfen\nJSON passed größer 0 prüfen" + } + ] + }, + "[\"agenten\", \"System rebuild bereitstellen\"]": { + "abdruck": "5bfdef4e50e34918", + "probleme": [ + { + "feature": "agenten", + "feld": "testen", + "funktion": "System rebuild bereitstellen", + "ganzes_feld": true, + "original": "", + "problem": "Funktion benötigt Testschritte, Feld fehlt", + "regel": "Feld testen. Gibt es nur bei Funktionen, nie auf Kartenebene.", + "vorschlag": "System rebuild Befehl ausführen\nRebuild abgeschlossen" + } + ] + }, + "[\"agenten\", \"Vektordienst steuern\"]": { + "abdruck": "ac9028407142447d", + "probleme": [] + }, + "[\"agenten\", \"Wissensbatch finalisieren testen\"]": { + "abdruck": "ff209274e8194d00", + "probleme": [] + }, + "[\"anleitungen\", \"\"]": { + "abdruck": "cd6d903356c7e46e", + "probleme": [] + }, + "[\"anleitungen\", \"Anleitung anzeigen\"]": { + "abdruck": "899edf023676bec8", + "probleme": [] + }, + "[\"anleitungen\", \"Anleitungsübersicht öffnen\"]": { + "abdruck": "806b26a376c96a30", + "probleme": [] + }, + "[\"auftraege\", \"\"]": { + "abdruck": "af6f7983d90efdc8", + "probleme": [] + }, + "[\"auftraege\", \"Auftrag starten\"]": { + "abdruck": "b6eab1ba718ae1a4", + "probleme": [] + }, + "[\"auftraege\", \"Auftragsereignisse abrufen\"]": { + "abdruck": "c4b50cdc890f64a5", + "probleme": [] + }, + "[\"auftraege\", \"Auftragsstatus anzeigen\"]": { + "abdruck": "3b24cdd657d277e3", + "probleme": [] + }, + "[\"auftraege\", \"Auftragsstatus prüfen\"]": { + "abdruck": "00a4cdd2990b0add", + "probleme": [] + }, + "[\"auftraege\", \"Ingest-Job starten\"]": { + "abdruck": "72aec88bb6eff241", + "probleme": [] + }, + "[\"auftraege\", \"Ingest-Jobs auflisten\"]": { + "abdruck": "f7d0895bcadf912d", + "probleme": [] + }, + "[\"backup\", \"\"]": { + "abdruck": "45e98250435d775b", + "probleme": [] + }, + "[\"backup\", \"Backup herunterladen\"]": { + "abdruck": "e2f3abc461d9c194", + "probleme": [] + }, + "[\"backup\", \"Backup starten\"]": { + "abdruck": "566508ee6bfb61bc", + "probleme": [] + }, + "[\"backup\", \"Backup-Tauglichkeit prüfen\"]": { + "abdruck": "6eb57d4ef14f886c", + "probleme": [] + }, + "[\"backup\", \"Backup-Trockenlauf prüfen\"]": { + "abdruck": "0690893ed788267b", + "probleme": [] + }, + "[\"backup\", \"Backup-Wiederherstellung prüfen\"]": { + "abdruck": "dbc11a271214f791", + "probleme": [] + }, + "[\"backup\", \"Operatorbericht als JSON exportieren\"]": { + "abdruck": "14bef84729eaadf1", + "probleme": [] + }, + "[\"benutzer\", \"\"]": { + "abdruck": "32420f60cbf635b1", + "probleme": [] + }, + "[\"benutzer\", \"Benutzer aktivieren\"]": { + "abdruck": "96f95d98b60ce655", + "probleme": [] + }, + "[\"benutzer\", \"Benutzer anlegen\"]": { + "abdruck": "f05fc2e1c4187019", + "probleme": [] + }, + "[\"benutzer\", \"Benutzer auflisten\"]": { + "abdruck": "8321758658996847", + "probleme": [ + { + "feature": "benutzer", + "feld": "testen", + "funktion": "Benutzer auflisten", + "ganzes_feld": true, + "original": "Seite /admin/users aufrufen\nSeite zeigt Benutzerliste mit Rollen und Status\nFilter auf Status \"aktiv\" setzen\nListe zeigt nur aktive Benutzer", + "problem": "Schrägstrich in Pfad entfernt", + "regel": "Keine Klammern und keine Schrägstriche", + "vorschlag": "Seite admin Benutzer aufrufen\nFilter auf Status \"aktiv\" setzen\nListe zeigt nur aktive Benutzer" + } + ] + }, + "[\"benutzer\", \"Benutzer bearbeiten\"]": { + "abdruck": "f127b29c9c5bc74e", + "probleme": [] + }, + "[\"berichte\", \"\"]": { + "abdruck": "0f4156c5fc44424d", + "probleme": [] + }, + "[\"berichte\", \"Akzeptanzbericht generieren\"]": { + "abdruck": "f04707b53e234402", + "probleme": [] + }, + "[\"berichte\", \"Batch-Bericht anzeigen\"]": { + "abdruck": "f38e641b3339b8ab", + "probleme": [] + }, + "[\"berichte\", \"Batch-Bericht hochladen\"]": { + "abdruck": "9030b692a0e36c2a", + "probleme": [] + }, + "[\"berichte\", \"Bericht als JSON herunterladen\"]": { + "abdruck": "ddc360bbfd90df78", + "probleme": [] + }, + "[\"berichte\", \"Bericht löschen\"]": { + "abdruck": "469932b04c26e284", + "probleme": [] + }, + "[\"berichte\", \"Berichte auflisten\"]": { + "abdruck": "9080b473520828ed", + "probleme": [] + }, + "[\"berichte\", \"Operatorbericht als Markdown herunterladen\"]": { + "abdruck": "7c7899d0d1d192c9", + "probleme": [ + { + "feature": "berichte", + "feld": "testen", + "funktion": "Operatorbericht als Markdown herunterladen", + "ganzes_feld": true, + "original": "", + "problem": "Funktion ohne Ziel, Regeln und Testen", + "regel": "Jede Funktion hat Ziel, Regeln oder Testschritte — nie nur einen Titel", + "vorschlag": "Operatorbericht herunterladen\nDownload der Markdown-Datei" + } + ] + }, + "[\"berichte\", \"Übersicht rendern\"]": { + "abdruck": "6dc46bd6fede91df", + "probleme": [] + }, + "[\"chat\", \"\"]": { + "abdruck": "a1447aea8aded8a8", + "probleme": [] + }, + "[\"chat\", \"Abmelden ermöglichen\"]": { + "abdruck": "c0f05ddcafaea075", + "probleme": [] + }, + "[\"chat\", \"Chat streamen\"]": { + "abdruck": "e1e9cb8c9053e37b", + "probleme": [] + }, + "[\"chat\", \"Chatseite anzeigen\"]": { + "abdruck": "11e80969e49bdcba", + "probleme": [] + }, + "[\"diagnose\", \"\"]": { + "abdruck": "dabf1d8c23deb380", + "probleme": [] + }, + "[\"diagnose\", \"Abdeckung prüfen\"]": { + "abdruck": "329d2b8accf37a8c", + "probleme": [] + }, + "[\"diagnose\", \"Abrufgrenzen prüfen\"]": { + "abdruck": "2e96c8c9e81d5c08", + "probleme": [] + }, + "[\"diagnose\", \"Batch-Markdown-Normalisierung testen\"]": { + "abdruck": "e2381c7b61403312", + "probleme": [ + { + "feature": "diagnose", + "feld": "testen", + "funktion": "Batch-Markdown-Normalisierung testen", + "ganzes_feld": true, + "original": "", + "problem": "Testen fehlt, Funktion benötigt Testschritte", + "regel": "Jede Funktion hat Ziel, Regeln oder Testschritte — nie nur einen Titel", + "vorschlag": "Batch-Markdown-Dateien auswählen\nNormalisierung starten\nMarkdown-Dateien nach Regeln formatiert" + } + ] + }, + "[\"diagnose\", \"Bereitschaftsbericht ausgeben\"]": { + "abdruck": "08760e3d3d8b51db", + "probleme": [] + }, + "[\"diagnose\", \"Datenqualität prüfen\"]": { + "abdruck": "c511b22c8c39db86", + "probleme": [] + }, + "[\"diagnose\", \"Diagnose anzeigen\"]": { + "abdruck": "5c04af7f55f567b2", + "probleme": [] + }, + "[\"diagnose\", \"Genre-Hotspots prüfen\"]": { + "abdruck": "e030f3ee1c29b26b", + "probleme": [] + }, + "[\"diagnose\", \"Guard-Mechanismus prüfen\"]": { + "abdruck": "3b18f616a3db9276", + "probleme": [ + { + "feature": "diagnose", + "feld": "testen", + "funktion": "Guard-Mechanismus prüfen", + "ganzes_feld": true, + "original": "Befehl ausführen: mto:agent:proofing:unsupported-tool-term-guard-self-test\nStatus OK in JSON-Ausgabe prüfen\nAlle 8 Testfälle bestanden", + "problem": "Zwei getrennte Ergebnisse statt einem Ablauf", + "regel": "Genau ein Ablauf: handeln, handeln, Ergebnis", + "vorschlag": "Befehl ausführen: mto:agent:proofing:unsupported-tool-term-guard-self-test\nJSON-Ausgabe enthält Status OK und 8 bestandene Testfälle" + } + ] + }, + "[\"diagnose\", \"Hygieneregeln prüfen\"]": { + "abdruck": "ddfb86db54bf0bef", + "probleme": [] + }, + "[\"diagnose\", \"Indizierungszustand prüfen\"]": { + "abdruck": "208a457fe1c0d0b7", + "probleme": [] + }, + "[\"diagnose\", \"Konfiguration prüfen\"]": { + "abdruck": "8a8ce42e5d2051e8", + "probleme": [ + { + "feature": "diagnose", + "feld": "testen", + "funktion": "Konfiguration prüfen", + "ganzes_feld": true, + "original": "php bin/console mto:agent:config:validate ausführen\nErgebnis auf Fehler und Warnungen prüfen\nExitcode prüfen\nKonfiguration gültig: Exitcode 0\nphp bin/console mto:agent:config:validate --json ausführen\nJSON-Ausgabe enthält status, errors, warnings", + "problem": "Schrägstrich im Konsolenbefehl entfernt", + "regel": "Keine Klammern und keine Schrägstriche", + "vorschlag": "Konsolenbefehl mto:agent:config:validate ausführen\nErgebnis auf Fehler und Warnungen prüfen\nExitcode prüfen\nKonfiguration gültig: Exitcode 0" + } + ] + }, + "[\"diagnose\", \"Konfigurationsquellen prüfen\"]": { + "abdruck": "53ba45d064f6433a", + "probleme": [ + { + "feature": "diagnose", + "feld": "testen", + "funktion": "Konfigurationsquellen prüfen", + "ganzes_feld": true, + "original": "", + "problem": "Pflichtfelder bei Funktion fehlen", + "regel": "Jede Funktion hat Ziel, Regeln oder Testschritte — nie nur einen Titel", + "vorschlag": "Testschritte erforderlich" + } + ] + }, + "[\"diagnose\", \"Provenienz prüfen\"]": { + "abdruck": "82bbe9fc8808a6a8", + "probleme": [] + }, + "[\"diagnose\", \"Retrieval-Pipeline testen\"]": { + "abdruck": "c7469a1ab52e339a", + "probleme": [] + }, + "[\"diagnose\", \"Retrieval-Qualität testen\"]": { + "abdruck": "7b133381f3194f4f", + "probleme": [] + }, + "[\"diagnose\", \"Segmentierung prüfen\"]": { + "abdruck": "9c80d823344ee85b", + "probleme": [] + }, + "[\"diagnose\", \"Shop-Suche testen\"]": { + "abdruck": "86201015e42388f0", + "probleme": [] + }, + "[\"diagnose\", \"Sicherheitsstatus prüfen\"]": { + "abdruck": "763e7ad0e8d96136", + "probleme": [ + { + "feature": "diagnose", + "feld": "testen", + "funktion": "Sicherheitsstatus prüfen", + "ganzes_feld": true, + "original": "php bin/console mto:agent:enterprise:security-data-protection-readiness\nTabelle mit Cases wird ausgegeben\nphp bin/console mto:agent:enterprise:security-data-protection-readiness --json\nJSON-Objekt wird ausgegeben", + "problem": "Schrägstrich im Befehlspfad verboten", + "regel": "Keine Klammern und keine Schrägstriche", + "vorschlag": "mto:agent:enterprise:security-data-protection-readiness im Terminal ausführen\nTabelle mit Cases wird ausgegeben\nmto:agent:enterprise:security-data-protection-readiness mit JSON-Option im Terminal ausführen\nJSON-Objekt wird ausgegeben" + } + ] + }, + "[\"diagnose\", \"Stapel-Upload verifizieren\"]": { + "abdruck": "1d26cafba701a598", + "probleme": [ + { + "feature": "diagnose", + "feld": "regeln", + "funktion": "Stapel-Upload verifizieren", + "ganzes_feld": true, + "original": "Trockenlauf ohne Dokumentenimport\nRuft kein LLM auf\nÄndert keine Daten im Wissensspeicher\nGibt maschinenlesbares JSON aus\nPrüft CSRF-Schutz, Dienstintegration und Fortschrittsanzeige\nPrüft PDF-Schutz, Speichergrenzen und Leerraum-Bereinigung\nPrüft CLI-Progress und keine Agent-Verschaltung", + "problem": "Zeilen 5 6 7 enthalten jeweils mehrere Aussagen", + "regel": "Genau eine Aussage je Zeile; zwei Aussagen werden zu zwei Regeln", + "vorschlag": "Trockenlauf ohne Dokumentenimport\nRuft kein LLM auf\nÄndert keine Daten im Wissensspeicher\nGibt maschinenlesbares JSON aus\nPrüft CSRF-Schutz\nPrüft Dienstintegration\nPrüft Fortschrittsanzeige\nPrüft PDF-Schutz\nPrüft Speichergrenzen\nPrüft Leerraum-Bereinigung\nPrüft CLI-Progress\nPrüft keine Agent-Verschaltung" + } + ] + }, + "[\"diagnose\", \"Systemzustand prüfen\"]": { + "abdruck": "d28aa2acfe9cfac4", + "probleme": [] + }, + "[\"diagnose\", \"Tag-Index-Gesundheit prüfen\"]": { + "abdruck": "a48e532486b4c2b5", + "probleme": [] + }, + "[\"diagnose\", \"Tags neu indizieren\"]": { + "abdruck": "a037e610d8d69c42", + "probleme": [] + }, + "[\"diagnose\", \"Titelvorschläge-Selbsttest bereitstellen\"]": { + "abdruck": "86b944b2266d2b37", + "probleme": [] + }, + "[\"diagnose\", \"Verankerung testen\"]": { + "abdruck": "8ca4a84d17efdfa2", + "probleme": [] + }, + "[\"diagnose\", \"Vergleichsgrenzen validieren\"]": { + "abdruck": "bc540e615d0d5bd7", + "probleme": [] + }, + "[\"dokumente\", \"\"]": { + "abdruck": "4becdb2142c5bd23", + "probleme": [] + }, + "[\"dokumente\", \"Abschnitte laden\"]": { + "abdruck": "63a90ebf0595d865", + "probleme": [] + }, + "[\"dokumente\", \"Abschnittsqualität laden\"]": { + "abdruck": "c62844c88eabc50e", + "probleme": [] + }, + "[\"dokumente\", \"Dokument anzeigen\"]": { + "abdruck": "d6b054833ea79af3", + "probleme": [] + }, + "[\"dokumente\", \"Dokument entfernen\"]": { + "abdruck": "e64c95dd87a82000", + "probleme": [] + }, + "[\"dokumente\", \"Dokument erstellen\"]": { + "abdruck": "8e01d7cbd5a0a8a4", + "probleme": [] + }, + "[\"dokumente\", \"Dokumente auflisten\"]": { + "abdruck": "b7c2416d7d4cbbae", + "probleme": [ + { + "feature": "dokumente", + "feld": "testen", + "funktion": "Dokumente auflisten", + "ganzes_feld": true, + "original": "admin/documents öffnet die Übersicht\nDokumente werden mit Titeln angezeigt\nLMB auf Filterfeld\nFilterkriterium auswählen\nErgebnis zeigt gefilterte Dokumente", + "problem": "Schrägstrich in admin/documents und vermischte Abläufe", + "regel": "Keine Klammern und keine Schrägstriche", + "vorschlag": "admin Dokumente Übersicht öffnen\nDokumentenübersicht zeigt Dokumente mit Titeln\nLMB auf Filterfeld\nFilterkriterium auswählen\nGefilterte Dokumente anzeigen" + } + ] + }, + "[\"dokumente\", \"Markdown bereinigen\"]": { + "abdruck": "06b80c5a0e87b0a2", + "probleme": [] + }, + "[\"dokumente\", \"Version-Chunks abrufen\"]": { + "abdruck": "121d643dfeaa9d06", + "probleme": [] + }, + "[\"evaluation\", \"\"]": { + "abdruck": "594221238c11b947", + "probleme": [] + }, + "[\"evaluation\", \"Berichte bereinigen\"]": { + "abdruck": "a7042dc676807598", + "probleme": [] + }, + "[\"evaluation\", \"Eval-Berichte anzeigen\"]": { + "abdruck": "e5bef4df8f06ec4c", + "probleme": [] + }, + "[\"evaluation\", \"Eval-Fälle ausführen\"]": { + "abdruck": "d6df9edb6f759315", + "probleme": [] + }, + "[\"evaluation\", \"Eval-Fälle parallelisieren\"]": { + "abdruck": "27acbff82a31da6a", + "probleme": [] + }, + "[\"evaluation\", \"Evaluation ausführen\"]": { + "abdruck": "2b308fa2f538a538", + "probleme": [] + }, + "[\"faelle\", \"\"]": { + "abdruck": "e38157c616482b1c", + "probleme": [] + }, + "[\"faelle\", \"Assistent anzeigen\"]": { + "abdruck": "4e8e66ff7acfb7c0", + "probleme": [] + }, + "[\"faelle\", \"Fall anlegen\"]": { + "abdruck": "bce7e877c144ea9d", + "probleme": [] + }, + "[\"faelle\", \"Fall erstellen\"]": { + "abdruck": "ec52ed76fbd9d12b", + "probleme": [] + }, + "[\"faelle\", \"Fälle löschen bereitstellen\"]": { + "abdruck": "69713f6beacefbcc", + "probleme": [] + }, + "[\"feedback\", \"\"]": { + "abdruck": "4b64525f442c4972", + "probleme": [] + }, + "[\"feedback\", \"Chat-Feedback anzeigen\"]": { + "abdruck": "69466ab1f54c2cb9", + "probleme": [] + }, + "[\"feedback\", \"Feedback exportieren\"]": { + "abdruck": "ddb61be881c2bbff", + "probleme": [] + }, + "[\"feedback\", \"Feedback klassifizieren\"]": { + "abdruck": "9d766ebb18ca02c5", + "probleme": [] + }, + "[\"feedback\", \"Feedback löschen\"]": { + "abdruck": "d60ec5bc507ba562", + "probleme": [] + }, + "[\"feedback\", \"Feedback speichern\"]": { + "abdruck": "d48bb573cdb9705d", + "probleme": [] + }, + "[\"feedback\", \"Feedback-Details anzeigen\"]": { + "abdruck": "d6b5bce8fb06d510", + "probleme": [] + }, + "[\"feedback\", \"Feedback-Status aktualisieren\"]": { + "abdruck": "b403e18917069070", + "probleme": [] + }, + "[\"feedback\", \"Feedback-Status prüfen\"]": { + "abdruck": "b26f6d469ab858d2", + "probleme": [] + }, + "[\"knowledge-raeume\", \"\"]": { + "abdruck": "25228e3324851fe7", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Batch-Import durchführen\"]": { + "abdruck": "31019ec87c246d93", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Chat-Freigabe umschalten\"]": { + "abdruck": "080f4432ef5b203c", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Chat-Verfügbarkeit prüfen\"]": { + "abdruck": "603b7775de757a04", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Facts prüfen\"]": { + "abdruck": "3896b29ce690ad30", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Kandidaten wählen\"]": { + "abdruck": "d964a18b84dad74d", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Knowledge-Räume anzeigen\"]": { + "abdruck": "562a038e69aa6f0e", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Live-Vorschau laden\"]": { + "abdruck": "f728e6193791be38", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Ressourcenprüfung durchführen\"]": { + "abdruck": "b1a1ebfc2a7a3ee9", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Textteile suchen\"]": { + "abdruck": "e17ffa8ad1243dc9", + "probleme": [] + }, + "[\"knowledge-raeume\", \"Wissensräume prüfen\"]": { + "abdruck": "3a41f11618fa60df", + "probleme": [] + }, + "[\"konfiguration\", \"\"]": { + "abdruck": "92cf0d92545eb7ff", + "probleme": [ + { + "feature": "konfiguration", + "feld": "regeln", + "funktion": "", + "ganzes_feld": true, + "original": "ROLE_SUPER_ADMIN darf alle Funktionen aufrufen\nROLE_KNOWLEDGE_ADMIN darf Konfigurationen lesen\nPOST erfordert gültiges CSRF-Token\nFlash-Nachrichten zeigen Erfolg und Fehler\nJsonResponse ohne Browser-Cache-Header\nDefault-Ausgabe ist JSON\nIngest-Profil entfernen fehlt\nModel-Konfiguration löschen fehlt\nModel-Konfiguration Retrieval testen fehlt", + "problem": "Drei Zeilen beschreiben fehlende Features", + "regel": "Beschreibt eine Eigenschaft oder Bedingung, keinen Ablaufschritt", + "vorschlag": "ROLE_SUPER_ADMIN darf alle Funktionen aufrufen\nROLE_KNOWLEDGE_ADMIN darf Konfigurationen lesen\nPOST erfordert gültiges CSRF-Token\nFlash-Nachrichten zeigen Erfolg und Fehler\nJsonResponse ohne Browser-Cache-Header\nDefault-Ausgabe ist JSON" + } + ] + }, + "[\"konfiguration\", \"Ingest-Profil anlegen\"]": { + "abdruck": "9e5b29256daf2c06", + "probleme": [] + }, + "[\"konfiguration\", \"Ingest-Profil entfernen\"]": { + "abdruck": "0c1b8c259154ef6c", + "probleme": [ + { + "feature": "konfiguration", + "feld": "testen", + "funktion": "Ingest-Profil entfernen", + "ganzes_feld": true, + "original": "", + "problem": "Leer, widerspricht Regel Jede Funktion hat Ziel, Regeln oder Testschritte", + "regel": "Kein Satzzeichen am Zeilenende, kein Punkt und kein Semikolon", + "vorschlag": "Ingest-Profil auswählen\nLöschen betätigen\nIngest-Profil nicht mehr vorhanden" + } + ] + }, + "[\"konfiguration\", \"Ingest-Profile anzeigen\"]": { + "abdruck": "caf3406830504a3d", + "probleme": [] + }, + "[\"konfiguration\", \"Konfiguration aktivieren\"]": { + "abdruck": "d0348c558413f373", + "probleme": [] + }, + "[\"konfiguration\", \"Konfiguration anzeigen\"]": { + "abdruck": "c5e60cea343fde20", + "probleme": [] + }, + "[\"konfiguration\", \"Konfiguration bereitstellen\"]": { + "abdruck": "26a2e49c0ad08c5d", + "probleme": [] + }, + "[\"konfiguration\", \"Konfigurationen anzeigen\"]": { + "abdruck": "b99bbc6dc1dbb85b", + "probleme": [] + }, + "[\"konfiguration\", \"Konfigurationsmuster prüfen\"]": { + "abdruck": "548417111961dff3", + "probleme": [] + }, + "[\"konfiguration\", \"Tool-Freigaben aktualisieren\"]": { + "abdruck": "6a817eb0259e5a15", + "probleme": [] + }, + "[\"logs\", \"\"]": { + "abdruck": "8973dbd63027cc8d", + "probleme": [] + }, + "[\"logs\", \"Logdatei anzeigen\"]": { + "abdruck": "5cb3a44df5954a83", + "probleme": [] + }, + "[\"logs\", \"Logdateien auflisten\"]": { + "abdruck": "a99c8ae34ebbf477", + "probleme": [] + }, + "[\"sonstiges\", \"\"]": { + "abdruck": "1b9e9b354b4e4eb6", + "probleme": [] + }, + "[\"sonstiges\", \"Sicherheitsnachweis bereitstellen\"]": { + "abdruck": "4f9581ea69437237", + "probleme": [] + }, + "[\"sonstiges\", \"post activate {id} bereitstellen\"]": { + "abdruck": "97cd9a4ee22b4c8e", + "probleme": [] + }, + "[\"sonstiges\", \"post {id} tags save bereitstellen\"]": { + "abdruck": "c70846fc95f332de", + "probleme": [] + }, + "[\"system\", \"\"]": { + "abdruck": "cd76c21c32180982", + "probleme": [] + }, + "[\"system\", \"Access-Denied-Fehler bereitstellen\"]": { + "abdruck": "0c4867fdd18e405f", + "probleme": [] + }, + "[\"system\", \"Admin-Login bereitstellen\"]": { + "abdruck": "90977c98a07c9372", + "probleme": [] + }, + "[\"system\", \"Betriebsbereitschaft prüfen\"]": { + "abdruck": "875a43396ab59856", + "probleme": [ + { + "feature": "system", + "feld": "testen", + "funktion": "Betriebsbereitschaft prüfen", + "ganzes_feld": true, + "original": "Command ausführen ohne Option\nTabelle zeigt Status, Case und Details\nAlle Cases mit PASS erscheinen\nCommand mit --json ausführen\nJSON-Objekt mit status, summary und cases erscheint", + "problem": "Zweiter Ablauf entfernt, nur ein Ablauf erlaubt", + "regel": "Genau ein Ablauf: handeln, handeln, Ergebnis", + "vorschlag": "Command ausführen ohne Option\nTabelle zeigt Status, Case und Details" + } + ] + }, + "[\"system\", \"Cache leeren\"]": { + "abdruck": "fb93b62747244c97", + "probleme": [] + }, + "[\"system\", \"Daten neu laden\"]": { + "abdruck": "7b1bde58f2c6be89", + "probleme": [] + }, + "[\"system\", \"Daten sichern\"]": { + "abdruck": "a346f050ca9ca3dd", + "probleme": [] + }, + "[\"system\", \"Deployment prüfen\"]": { + "abdruck": "58f45050c3d6ddf2", + "probleme": [] + }, + "[\"system\", \"Dienststatus melden\"]": { + "abdruck": "53692da8a39ee4ee", + "probleme": [] + }, + "[\"system\", \"Fehlerseite anzeigen\"]": { + "abdruck": "ac91cfa7c4443a2c", + "probleme": [ + { + "feature": "system", + "feld": "testen", + "funktion": "Fehlerseite anzeigen", + "ganzes_feld": true, + "original": "", + "problem": "Funktion ohne Ziel, Regeln und Testen", + "regel": "Jede Funktion hat Ziel, Regeln oder Testschritte — nie nur einen Titel", + "vorschlag": "Fehlerseite auslösen\nFehlerseite prüft Inhalt\nFehlerseite angezeigt" + } + ] + }, + "[\"system\", \"Flow-Grenze sperren\"]": { + "abdruck": "7f8f2ff111578aee", + "probleme": [] + }, + "[\"system\", \"Neuindizierung starten\"]": { + "abdruck": "baab3281c00716ea", + "probleme": [] + }, + "[\"system\", \"Normalisierung prüfen\"]": { + "abdruck": "1d078a8c8739dce7", + "probleme": [] + }, + "[\"system\", \"Preview prüfen\"]": { + "abdruck": "36bfb9af2c395881", + "probleme": [] + }, + "[\"system\", \"Promptversion aktivieren\"]": { + "abdruck": "cf621d5db06669cd", + "probleme": [] + }, + "[\"system\", \"Promptversion löschen\"]": { + "abdruck": "4831087ddffa3a02", + "probleme": [] + }, + "[\"system\", \"Promptversionen verwalten\"]": { + "abdruck": "271419aa16b295c1", + "probleme": [] + }, + "[\"system\", \"Restore-Vorschau prüfen\"]": { + "abdruck": "79007d6f20f9f259", + "probleme": [] + }, + "[\"system\", \"Simulation ausführen\"]": { + "abdruck": "872c7daa285566a6", + "probleme": [] + }, + "[\"system\", \"Systemzustand zurücksetzen\"]": { + "abdruck": "aad55d89505af36e", + "probleme": [] + }, + "[\"system\", \"Verzeichnis bereinigen\"]": { + "abdruck": "c3a169bd14fc72ff", + "probleme": [] + }, + "[\"tags\", \"\"]": { + "abdruck": "0137270973dfabae", + "probleme": [] + }, + "[\"tags\", \"Tag-Rebuild-Auftrag ausführen\"]": { + "abdruck": "84922f94b261c3aa", + "probleme": [] + }, + "[\"tags\", \"Tag-Rebuild-Status abfragen\"]": { + "abdruck": "3b7cd1dfa6cce19b", + "probleme": [] + }, + "[\"tags\", \"Tag-Zuordnung bearbeiten\"]": { + "abdruck": "2c07ad450bffd805", + "probleme": [ + { + "feature": "tags", + "feld": "testen", + "funktion": "Tag-Zuordnung bearbeiten", + "ganzes_feld": true, + "original": "", + "problem": "Testen leer stattTestschritte zu enthalten", + "regel": "Jede Funktion hat Ziel, Regeln oder Testschritte — nie nur einen Titel", + "vorschlag": "[Tag auswählen]\n[Zuweisung ändern]\n[Änderung bestätigen]" + } + ] + }, + "[\"tags\", \"Tags auflisten\"]": { + "abdruck": "b9eeaa47d21451b3", + "probleme": [] + }, + "[\"tags\", \"Tags bearbeiten\"]": { + "abdruck": "b499aeba37fc4762", + "probleme": [] + }, + "[\"tags\", \"Tags suchen\"]": { + "abdruck": "bc800e0107e9e99e", + "probleme": [] + }, + "[\"titel\", \"\"]": { + "abdruck": "b771a18e13aba81c", + "probleme": [] + }, + "[\"titel\", \"Titel aktualisieren\"]": { + "abdruck": "5fd71fcaa6cf86b1", + "probleme": [] + }, + "[\"titel\", \"Titelvorschläge laden\"]": { + "abdruck": "7c5913d783929e93", + "probleme": [] + }, + "[\"uploads\", \"\"]": { + "abdruck": "bfee1441da40c5ca", + "probleme": [] + }, + "[\"uploads\", \"Berechtigungsmodus ändern\"]": { + "abdruck": "fe6824d5e74aa716", + "probleme": [] + }, + "[\"uploads\", \"Datei hochladen\"]": { + "abdruck": "097eed6431a3436c", + "probleme": [] + }, + "[\"uploads\", \"Upload entfernen\"]": { + "abdruck": "9743e4d26d8c92e4", + "probleme": [] + }, + "[\"uploads\", \"Uploads auflisten\"]": { + "abdruck": "5b8d1649c1128f87", + "probleme": [] + }, + "[\"verlauf\", \"\"]": { + "abdruck": "1ad061f8898591f2", + "probleme": [] + }, + "[\"verlauf\", \"Verankerungen extrahieren\"]": { + "abdruck": "c8b5823dc343a021", + "probleme": [] + }, + "[\"verlauf\", \"Verlauf abrufen\"]": { + "abdruck": "512f74a4d7093956", + "probleme": [] + }, + "[\"verlauf\", \"Verlauf löschen\"]": { + "abdruck": "3cd576b5811fc821", + "probleme": [] + }, + "[\"versionen\", \"\"]": { + "abdruck": "a2ff5a390898eadf", + "probleme": [] + }, + "[\"versionen\", \"Version ableiten\"]": { + "abdruck": "23c5eaf21b66893b", + "probleme": [] + }, + "[\"versionen\", \"Version aktivieren\"]": { + "abdruck": "f8c322e31e37620c", + "probleme": [] + }, + "[\"versionen\", \"Version einlesen\"]": { + "abdruck": "7a8b97e289a62d9e", + "probleme": [] + }, + "[\"versionen\", \"Version erstellen\"]": { + "abdruck": "0c0a4c71ade40480", + "probleme": [] + }, + "[\"versionen\", \"Versionvorschau anzeigen\"]": { + "abdruck": "eab759a8abfc20e7", + "probleme": [] + } + }, + "verworfen": {} +} diff --git a/daten/MtoRagSystem/.verzeichnis b/daten/MtoRagSystem/.verzeichnis new file mode 100644 index 0000000..22ab7ba --- /dev/null +++ b/daten/MtoRagSystem/.verzeichnis @@ -0,0 +1 @@ +/home/arbeit/arbeit/MtoRagSystem diff --git a/daten/MtoRagSystem/anbindung.md b/daten/MtoRagSystem/anbindung.md new file mode 100644 index 0000000..1f301e8 --- /dev/null +++ b/daten/MtoRagSystem/anbindung.md @@ -0,0 +1,157 @@ + +Anbindung +---------------------------------------- + +optional +---------------------------------------- + +Bindet einen externen Server kontrolliert an +---------------------------------------- + +- Ein Token wird nie gespeichert, nur sein Name +- Eine Anbindung startet eingeschaltet, ohne Chatfreigabe +- Eine Anbindung wirkt erst nach Freigabe +- Ein Import führt nie ein Werkzeug aus +- Ein Import liest keine Inhalte +- Anweisungen fremder Inhalte werden entfernt +- Ein Transport über Standardeingabe ist gesperrt +- Nur verschlüsselte Verbindungen sind erlaubt +- Interne Netze sind gesperrt +- Weiterleitungen werden nicht verfolgt +- Protokolle enthalten nur Metadaten +- Der Bereich braucht die höchste Rolle +---------------------------------------- + +Anbindung anlegen + +- Speichern folgt einer bestandenen Prüfung +- Ein Speichern ändert keine Antwort +- Ein Formulartoken ist Pflicht + +- Menüeintrag MCP Quellen wählen +- Reiter Anbindung anlegen wählen +- Formular ausfüllen +- Anbindung speichern +- Anbindung in der Übersicht +---------------------------------------- + +Anbindung prüfen + +Testet die Angaben gegen Erlaubnisliste und Regeln + +- Ohne Onlinetest entstehen keine Abrufe +- Das Ergebnis nennt den Grund +- Die Prüfung speichert nicht + +- Formular ausfüllen +- LMB auf Anbindung prüfen +- Prüfergebnis mit Begründung +---------------------------------------- + +Anbindung bearbeiten + +- Änderungen wirken erst nach dem Speichern +- Werkzeugdaten bleiben erhalten +- Zugewiesene Inhalte bleiben am Kurznamen gebunden + +- Übersicht öffnen +- LMB auf Bearbeiten +- Formular vorbefüllt +---------------------------------------- + +Anbindung umschalten + +Legt eine Anbindung vorübergehend still + +- Ausgewählte Inhalte bleiben gespeichert +- Eine stillgelegte Anbindung wirkt nicht +- Wiedereinschalten braucht keine neue Freigabe + +- Übersicht öffnen +- LMB auf Deaktivieren +- Zustandsmarke wechselt +---------------------------------------- + +Anbindung entfernen + +- Der Raum wird zuvor abgeschaltet +- Eine Rückfrage geht voraus + +- Übersicht öffnen +- LMB auf Entfernen +- Bestätigen +- Anbindung verschwindet +---------------------------------------- + +Ressource übernehmen + +Schreibt eine gefundene Ressource in die Anbindung + +- Nur erkannte Ressourcen sind übernehmbar +- Die Übernahme schaltet den Chat nicht ein + +- Serverinhalte aktualisieren +- LMB auf Ressource übernehmen +- Ressource in der Anbindung +---------------------------------------- + +Serverinhalte aktualisieren + +Erkennt Ressourcen, Werkzeuge und Vorlagen als Metadaten + +- Kein Werkzeug wird ausgeführt +- Vorlagen werden erkannt, nie ausgeführt +- Ressourcen werden nicht gelesen +- Gefundene Werkzeuge sind zunächst gesperrt + +- Übersicht öffnen +- LMB auf Inhalte aktualisieren +- Gefundene Inhalte sichtbar +---------------------------------------- + +Anbindung online prüfen + +Prüft eine gespeicherte Anbindung im Terminal + +- Geprüft werden Freigabe und ein Inhalt +- Ohne prüfbaren Inhalt bricht der Lauf ab +- Ein fehlendes Geheimnis blockt vorher +- Anfragen werden bereinigt protokolliert + +- Kommando mit Servernamen aufrufen +- Prüfbericht sichtbar +---------------------------------------- + +Schutzregeln ansehen + +Zeigt Grenzen und Systemprüfung der Anbindungen + +- Die Anzeige ruft nichts extern ab +- Freie Werkzeugnutzung ist gesperrt + +- Menüeintrag Quellen wählen +- Reiter Sicherheit wählen +- Grenzen und Prüfstand sichtbar +---------------------------------------- + +Freigaben prüfen + +Prüft die Serverliste der Grundeinstellung + +- Kein Transport wird geöffnet +- Das Ergebnis nennt Server, Fehler und Warnungen + +- Kommando aufrufen +- Prüfstand je Regel sichtbar +---------------------------------------- + +Brücke trocken testen + +Prüft Bereinigung und Belegbrücke ohne Serverkontakt + +- Nur lokale Nutzlasten werden geprüft +- Kein Transport, keine Chatwirkung +- Fremde Anweisungsmarker fallen weg + +- Kommando aufrufen +- Bereinigte Nutzlast sichtbar diff --git a/daten/MtoRagSystem/antwort.md b/daten/MtoRagSystem/antwort.md new file mode 100644 index 0000000..3fb4237 --- /dev/null +++ b/daten/MtoRagSystem/antwort.md @@ -0,0 +1,115 @@ + +Antwort +---------------------------------------- + +kern +---------------------------------------- + +Beantwortet eine Frage aus geprüften Quellen +---------------------------------------- + +- Nur Aussagen aus den Quellen +- Fehlende Werte werden nicht erfunden +- Keine Schätzung ersetzt einen fehlenden Wert +- Fakten und Ableitungen bleiben getrennt +- Ableitungen sind als solche markiert +- Eignung gilt als belegpflichtige Aussage +- Negativaussagen brauchen einen Quellenbeleg +- Werbesprache ist untersagt +- Sprache der Frage gilt für die Antwort +- Interne Belegkennungen bleiben auf Nachfrage beschränkt +- Interne Denktexte erreichen niemanden +- Die genutzte Datenbasis steht an der Antwort +- Trefferzahl aus Wissen und Shop liegt bei +- Die Antwortdauer wird ausgewiesen +- Ein Vertrauensabzeichen steht an der Antwort +- Wiederholungsschleifen werden sichtbar abgeschnitten +- Transparente Unsicherheit schlägt sichere Falschaussage +---------------------------------------- + +Frage stellen + +Sendet eine Frage und empfängt die Antwort laufend + +- Leere Frage wird abgewiesen +- Höchstens 10000 Zeichen +- Warnung ab 7500 Zeichen +- Erneutes Senden bleibt bis zum Ende gesperrt +- Entwurf überlebt einen Neuladen +- Unterbrochener Empfang wird fortgesetzt +- Ein Lauf verfällt nach 900 Sekunden +- Ein stehender Lauf wird beendet + +- Text eingeben +- Enter drücken +- Frage im Verlauf +- Antwort läuft ein +---------------------------------------- + +Antwort abbrechen + +Beendet eine laufende Antwort vorzeitig + +- Nur während des Empfangs möglich +- Der Serverlauf arbeitet weiter +- Der Vermerk gilt nur in der laufenden Ansicht +- Nach dem Neuladen steht die volle Antwort + +- Frage stellen +- LMB auf Abbrechen +- Abbruchvermerk im Verlauf +---------------------------------------- + +Frage erneut senden + +Wiederholt die Frage mit anderer Einstellung + +- Angeboten sind nur ungenutzte Varianten +- Der Klick setzt die Einstellung passend +- Während des Empfangs gesperrt + +- Frage stellen +- LMB auf eine Variante +- Frage erneut im Verlauf +---------------------------------------- + +Antwortmodus wählen + +Wählt zwischen gründlicher und schneller Antwort + +- Zwei Werte: Standard und schnell +- Ungültiger Wert fällt auf Standard +- Der schnelle Modus nutzt ein anderes Modell +- Der schnelle Modus antwortet ungenauer +- Die Wahl gilt für die ganze Unterhaltung + +- Chat-Einstellungen öffnen +- Antwortmodus wählen +- Modus an der nächsten Antwort +---------------------------------------- + +Datenbasis wählen + +Legt fest, ob Wissen oder Shopdaten zählen + +- Vier Werte: automatisch, Wissen, Shop, beides +- Unbekannter Wert fällt auf automatisch +- Nur Wissen löst keine Shopsuche aus +- Die genutzte Basis steht in der Antwort + +- Chat-Einstellungen öffnen +- Datenbasis wählen +- Basis in der Zusammenfassung +---------------------------------------- + +Folgeaktion auslösen + +Sendet eine vorgeschlagene Folgefrage sofort + +- Der Fragetext kommt vom Server +- Angebot entfällt bei ablehnender Antwort +- Während des Empfangs passiert nichts + +- Frage stellen +- LMB auf eine Folgeaktion +- Folgefrage im Verlauf diff --git a/daten/MtoRagSystem/auftrag.md b/daten/MtoRagSystem/auftrag.md new file mode 100644 index 0000000..6d78ced --- /dev/null +++ b/daten/MtoRagSystem/auftrag.md @@ -0,0 +1,85 @@ + +Auftrag +---------------------------------------- + +kern +---------------------------------------- + +Führt Indexierung und Neuaufbau nachvollziehbar aus +---------------------------------------- + +- Jeder Lauf hinterlässt einen Auftrag +- Der Auftrag nennt Typ, Zustand, Zeiten und Person +- Fünf Zustände bis zum Abbruch +- Nur der Neuaufbau schreibt eine Protokolldatei +- Nur ein Indexlauf läuft gleichzeitig +- Ein Strukturwechsel erzwingt einen sichtbaren Neuaufbau +- Ein unvollständiger Aufbau bricht ab +---------------------------------------- + +Aufträge einsehen + +Zeigt den Verlauf aller Indexläufe + +- Neueste Aufträge stehen oben +- Der Fehlertext endet in der Liste bei 120 Zeichen + +- Menüeintrag Aufträge wählen +- Auftragsliste sichtbar +---------------------------------------- + +Auftrag verfolgen + +Beobachtet einen einzelnen Lauf bis zum Ende + +- Die Kennung muss dem Kennungsformat folgen +- Der Stand wird zweisekündlich nachgeladen +- Geliefert werden Typ, Zustand, Zeiten und Fehler +- Das Nachladen endet mit dem Auftrag + +- Auftragsliste öffnen +- LMB auf eine Kennung +- Zustandsmarke wechselt +---------------------------------------- + +Index neu aufbauen + +Überführt vorgemerkte Änderungen in den Index + +- Nur die höchste Rolle darf starten +- Der Auftrag beginnt wartend +- Die Arbeit läuft im Hintergrund +- Ein Fehlstart markiert den Auftrag als gescheitert +- Nach Erfolg wird der Zwischenspeicher geleert + +- Dokumentliste öffnen +- LMB auf Index neu aufbauen +- Bestätigen +- Auftragsseite sichtbar +---------------------------------------- + +Auftrag ausführen + +Startet einen vorhandenen Auftrag im Terminal + +- Unbekannte Kennung wird abgewiesen +- Abgeschlossene Aufträge laufen nicht erneut +- Ein Trockenlauf vermeidet schwere Schritte + +- Kommando mit Kennung aufrufen +- Zustandszeile sichtbar +---------------------------------------- + +Index hart neu aufbauen + +Baut Chunks, Vektoren und Tags vollständig neu + +- Ohne Erzwingen bricht der Lauf ab +- Vier Schritte laufen in fester Reihenfolge +- Einzelne Schritte lassen sich überspringen +- Ein gescheiterter Schritt beendet den Lauf +- Ein Trockenlauf schreibt keine Indexdatei + +- Kommando mit Erzwingen aufrufen +- Vier Schritte sichtbar +- Gesundheitsstand am Ende diff --git a/daten/MtoRagSystem/batch.md b/daten/MtoRagSystem/batch.md new file mode 100644 index 0000000..82f685c --- /dev/null +++ b/daten/MtoRagSystem/batch.md @@ -0,0 +1,118 @@ + +Batch +---------------------------------------- + +optional +---------------------------------------- + +Importiert viele Dokumente in einem Lauf +---------------------------------------- + +- Höchstens 250 Dateien je Upload +- Erlaubt sind PDF, Text, Markdown und Word +- Geschützte PDF gelten als nicht verarbeitbar +- Doppelte Prüfsummen werden übersprungen +- Höchstens ein Neuaufbau je Lauf +- Ohne Indexwirkung entfällt der Neuaufbau +- Der Eingang wird nach dem Lauf geräumt +- Je gelungener Lauf entsteht ein Bericht +---------------------------------------- + +Batch hochladen + +Lädt viele Dateien gesammelt und verarbeitet sie + +- Ohne Datei bricht der Lauf ab +- Titel entstehen aus Dateinamen oder Manifest +- Schwache Titel werden markiert +- Wissenskarten entstehen nur auf Wunsch +- Aktivierung ohne Wissenskarte wird verworfen + +- Menüeintrag Batch wählen +- Dateien wählen +- Batch starten +- Ergebniszahlen sichtbar +---------------------------------------- + +Batch vorab prüfen + +Prüft einen Eingang ohne jede Schreibwirkung + +- Kein Dokument wird importiert +- Kein Modell wird aufgerufen +- Dateityp, Prüfsumme und Dubletten werden geprüft +- Zusatzschalter erzeugen eine Warnung + +- Kommando im Trockenlauf aufrufen +- Bericht mit Dateiliste sichtbar +---------------------------------------- + +Batch importieren + +Importiert einen Eingang im Terminal + +- Der Import ist über Prüfsummen wiederholbar +- Ohne eindeutigen Benutzer bricht der Lauf ab +- Der Kommandolauf hat keine Dateigrenze +- Erfolgreiche Quellen verlassen den Eingang +- Fehler und Übersprungenes landen getrennt +- Abgeleitete Versionen bleiben ohne Schalter inaktiv + +- Kommando mit Eingang aufrufen +- Bericht als Datei geschrieben +---------------------------------------- + +Berichte auflisten + +- Höchstens 100 Berichte, neueste oben +- Defekte Berichte werden übersprungen + +- Menüeintrag Batch wählen +- Berichtsliste sichtbar +---------------------------------------- + +Bericht ansehen + +Zeigt einen Lauf je Datei und Schritt + +- Die Kennung darf keine Sonderzeichen tragen +- Ein unbekannter Bericht meldet einen Fehler +- Die Ansicht startet keine Verarbeitung + +- Berichtsliste öffnen +- LMB auf Anzeigen +- Schritte und Dateien sichtbar +---------------------------------------- + +Bericht herunterladen + +- Zwei Formate: JSON und Markdown +- Eine fehlende Datei meldet einen Fehler + +- Berichtsliste öffnen +- LMB auf ein Format +- Datei im Download +---------------------------------------- + +Bericht löschen + +- Beide Formate fallen zusammen weg +- Dokumente und Index bleiben unberührt + +- Berichtsliste öffnen +- LMB auf Löschen +- Bestätigen +- Bericht verschwindet +---------------------------------------- + +Eingang bereinigen + +Räumt leere Ordner und falsche Ablagen auf + +- Die Bereinigung wirkt nur im Importverzeichnis +- Namenskollisionen bekommen einen Zähler +- Kein Einfluss auf Suche oder Antwort + +- Menüeintrag Batch wählen +- LMB auf Eingang bereinigen +- Zahl geräumter Ordner sichtbar diff --git a/daten/MtoRagSystem/beleg.md b/daten/MtoRagSystem/beleg.md new file mode 100644 index 0000000..a2e1565 --- /dev/null +++ b/daten/MtoRagSystem/beleg.md @@ -0,0 +1,71 @@ + +Beleg +---------------------------------------- + +kern +---------------------------------------- + +Weist nach, worauf eine Aussage sich stützt +---------------------------------------- + +- Belegquellen sind Wissen, Shop und URL-Inhalte +- Frühere Antworten belegen keine Fachwerte +- Jede Antwort erhält genau einen Belegzustand +- Direkt belegt gilt nur bei einem tragenden Beleg +- Verstreute Anforderungen ergeben schwach belegt +- Fehlende Pflichtangabe ergibt nicht vollständig belegt +- Ohne Quelle gilt nicht geprüft +- Jeder Beleg trägt eine Stärke +- Fehlende Pflichtmerkmale werden einzeln benannt +- Direkte Dokumentquellen stehen unter der Antwort +- Höchstens vier Quellentitel erscheinen +- Eine genutzte Uploaddatei bleibt in der Quellenliste +---------------------------------------- + +Belegdetails aufklappen + +Zeigt Prüfsignale hinter der Vertrauenslage + +- Ohne echte Signale erscheint keine Belegkarte +- Konflikte werden gesondert benannt +- Die Anzeige gilt für alle sichtbaren Antworten + +- Frage stellen +- LMB auf technische Details +- Claims und Belege sichtbar +---------------------------------------- + +Zusatzinfos umschalten + +Blendet Quellen und Folgeaktionen ein + +- Nur genutzte Quellen werden gelistet +- Die Einstellung überlebt einen Neuladen + +- Chat-Einstellungen öffnen +- Zusatzinfos umschalten +- Quellenblock verschwindet +---------------------------------------- + +Statusprotokoll einschalten + +Macht Prüf- und Quellenschritte sichtbar + +- Der Bereich öffnet sich beim Einschalten +- Statusinfos stehen neben dem Verlauf +- Fehlermeldungen bleiben immer sichtbar +- Prompts und Geheimnisse erscheinen nie + +- Chat-Einstellungen öffnen +- Statusprotokoll einschalten +- Seitenbereich mit Zeitleiste sichtbar +---------------------------------------- + +Statusprotokoll schließen + +- Schließen schaltet die Einstellung aus +- Der Zustand überlebt einen Neuladen + +- Statusprotokoll einschalten +- LMB auf Schließen im Bereich +- Bereich verschwindet diff --git a/daten/MtoRagSystem/benutzer.md b/daten/MtoRagSystem/benutzer.md new file mode 100644 index 0000000..4b34aa4 --- /dev/null +++ b/daten/MtoRagSystem/benutzer.md @@ -0,0 +1,82 @@ + +Benutzer +---------------------------------------- + +kern +---------------------------------------- + +Regelt Zugang und Rollen der Menschen +---------------------------------------- + +- Ein Passwort wird nur verschlüsselt gespeichert +- Eine E-Mail ist eindeutig +- Ein deaktiviertes Konto wird abgewiesen +- Niemand deaktiviert sich selbst +- Der letzte oberste Verwalter bleibt geschützt +- Die Verwaltung braucht die höchste Rolle +- Ein Konto lässt sich nicht löschen +- Deaktivierung beendet die laufende Sitzung +---------------------------------------- + +Benutzer filtern + +- Filter nach Text, Zustand und Rolle +- Die Suche trifft Namen, E-Mail und Abteilung +- Ein ungültiger Wert fällt auf alle +- Die Gesamtzahlen bleiben ungefiltert + +- Menüeintrag Benutzer wählen +- Filter setzen +- LMB auf Filtern +- Trefferzahl sichtbar +---------------------------------------- + +Benutzer erstellen + +- Das Passwort braucht acht Zeichen +- Die Wiederholung muss übereinstimmen +- Mindestens eine Rolle ist Pflicht +- Unbekannte Rollen werden abgewiesen +- Die Grundrolle ist nicht vergebbar + +- Benutzerliste öffnen +- Formular ausfüllen +- Rollen ankreuzen +- Erstellen +- Benutzer in der Liste +---------------------------------------- + +Benutzer bearbeiten + +- Leeres Passwortfeld ändert nichts +- Die oberste Rolle entzieht sich niemand selbst +- Namen enden bei 100 Zeichen +- Abteilung endet bei 120 Zeichen + +- Benutzerliste öffnen +- LMB auf Bearbeiten +- Felder ändern +- Speichern +- Änderung in der Liste +---------------------------------------- + +Benutzer umschalten + +Sperrt oder öffnet den Zugang sofort + +- Bestehende Rollen bleiben erhalten + +- Benutzerliste öffnen +- LMB auf Zustand +- Bestätigen +- Zustandsspalte wechselt +---------------------------------------- + +Benutzer im Terminal anlegen + +- Doppelte E-Mail wird abgewiesen +- Die Eingabe erfolgt abgefragt + +- Kommando aufrufen +- Angaben eintragen +- Benutzer angelegt diff --git a/daten/MtoRagSystem/betriebspruefung.md b/daten/MtoRagSystem/betriebspruefung.md new file mode 100644 index 0000000..229cd66 --- /dev/null +++ b/daten/MtoRagSystem/betriebspruefung.md @@ -0,0 +1,117 @@ + +Betriebsprüfung +---------------------------------------- + +optional +---------------------------------------- + +Bewertet Betriebsreife vor der Abnahme +---------------------------------------- + +- Jede Prüfung liest nur lokale Angaben +- Kein Chat, kein Shop, kein Modell läuft +- Ein Fehler setzt den Gesamtstand +- Ein fehlender Nachweis wird zur Warnung +- Ein Nachweis wird nie stillschweigend angenommen +- Geheimnisse bleiben Verweise +- Der Restore-Nachweis bleibt Betreiberaufgabe +- Das System richtet keine Zeitsteuerung ein +- Jedes Ergebnis landet bereinigt im Protokoll +---------------------------------------- + +Betrieb überblicken + +Fasst alle Prüfstände und die letzte Sicherung + +- Die Seite bewertet bei jedem Aufruf neu +- Nur ausgelöste Prüfungen landen im Protokoll +- Der nächste sinnvolle Schritt steht dabei + +- Menüeintrag Betrieb wählen +- Gesamtstand und Teilstände sichtbar +---------------------------------------- + +Sicherheit prüfen + +Prüft Rollen, Geheimnisse und Grenzen + +- Die Prüfung ersetzt kein externes Audit +- Geheimniswerte werden nicht gelesen + +- Betriebsseite öffnen +- LMB auf Sicherheit prüfen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Sicherungsweg prüfen + +Bewertet Pfad, Umfang und Restore-Nachweis + +- Es entsteht keine Sicherung +- Ein Restore-Erfolg wird nicht behauptet + +- Betriebsseite öffnen +- LMB auf Sicherungsweg prüfen +- Prüfpunkte sichtbar +---------------------------------------- + +Zeitsteuerung prüfen + +Bewertet Automatik, Turnus und Betreibernachweise + +- Der Betreiber dokumentiert Automatik selbst +- Nicht beschreibbare Pfade erzeugen Hinweise + +- Betriebsseite öffnen +- LMB auf Zeitsteuerung prüfen +- Nachweistabelle sichtbar +---------------------------------------- + +Protokoll einsehen + +Zeigt die zuletzt ausgelösten Prüfungen + +- Keine Prompts und keine Rohantworten +- Keine Geheimnisse und keine Zugangsdaten +- Der Text endet bei 220 Zeichen +- Höchstens 50 Einträge bleiben erhalten +- Die Anzeige zeigt die letzten acht + +- Betriebsseite öffnen +- Protokollbereich lesen +- Letzte Prüfungen sichtbar +---------------------------------------- + +Abnahmebericht ausgeben + +Lädt den bereinigten Bericht zur Abnahme + +- Zwei Formate: JSON und Markdown +- Die Datengrenze steht im Bericht +- Erledigte Aufgaben fallen weg +- Der Export startet keine Prüfung + +- Betriebsseite öffnen +- Format wählen +- Bericht im Download +---------------------------------------- + +Betriebsreife im Terminal prüfen + +- Nur ein grüner Stand endet ohne Fehler +- Warnungen ändern den Ausgang nicht + +- Kommando aufrufen +- Fallliste sichtbar +---------------------------------------- + +Unterlagen öffnen + +Zeigt Runbook und Checklisten im Adminbereich + +- Nur Markdown aus dem Projektverzeichnis +- Die Anzeige ist rein lesend + +- Menüeintrag Leitfäden wählen +- Dokument wählen +- Inhalt sichtbar diff --git a/daten/MtoRagSystem/claim.md b/daten/MtoRagSystem/claim.md new file mode 100644 index 0000000..3b790d7 --- /dev/null +++ b/daten/MtoRagSystem/claim.md @@ -0,0 +1,51 @@ + +Claim +---------------------------------------- + +kern +---------------------------------------- + +Prüft einzelne Aussagen der Antwort gegen Belege +---------------------------------------- + +- Geprüft werden Werte, Preise und Artikelnummern +- Geprüft werden URLs und Rollencodes +- Geprüft werden Relationen und Kompatibilitätsaussagen +- Ein Claim ohne Quelle gilt als unbelegt +- Ein unbelegter Claim setzt ein Prüfsignal +- Unbelegte Claims werden benannt +- Höchstens fünf Beispiele erscheinen +- Rollencodes gelten nur bei genauer Übereinstimmung +- Relationen brauchen beide Partner in einem Dokument +- Eine leere Antwort gilt als ungeprüft +- Sieben Claim-Arten stehen fest +---------------------------------------- + +Antwort bewerten + +Meldet falsche Zuordnung oder Quellenfehler zurück + +- Zwei Werte: zustimmend und ablehnend +- Ablehnung erlaubt einen Kommentar +- Kommentar wird auf 2000 Zeichen gekürzt +- Bewertung braucht eine fertige Antwort +- Eine fremde Antwort wird abgewiesen +- Die Oberfläche sperrt nach dem Speichern +- Ein erneuter Aufruf überschreibt die Bewertung +- Frage und Antwort werden mitgespeichert + +- Frage stellen +- LMB auf eine Bewertung +- Bestätigung sichtbar +---------------------------------------- + +Prompt kopieren + +Übernimmt die eigene Frage in die Zwischenablage + +- Kopiert wird nur der Fragetext +- Erfolg wird kurz gemeldet + +- Frage stellen +- LMB auf Kopieren +- Rückmeldung an der Schaltfläche diff --git a/daten/MtoRagSystem/diagnose.md b/daten/MtoRagSystem/diagnose.md new file mode 100644 index 0000000..59ca8f0 --- /dev/null +++ b/daten/MtoRagSystem/diagnose.md @@ -0,0 +1,84 @@ + +Diagnose +---------------------------------------- + +optional +---------------------------------------- + +Untersucht einzelne Teile des Antwortwegs +---------------------------------------- + +- Diagnosen ändern Antwortgüte und Wahrheitssicherung nicht +- Prompts und Rohantworten werden nie ausgegeben +- Betriebsfunktionen beeinflussen die Antwort nicht +---------------------------------------- + +Im Terminal fragen + +Stellt Fragen an das System ohne Oberfläche + +- Die Antwort läuft in Stücken ein +- Statusmeldungen stehen dazwischen +- Der Lauf löst echte Modellaufrufe aus + +- Kommando aufrufen +- Frage eintragen +- Antwort läuft ein +---------------------------------------- + +Suchweg testen + +Prüft den hybriden Suchweg zu einer Frage + +- Leere Frage wird abgewiesen +- Die Ausgabe nennt Dauer und Trefferzahl + +- Kommando mit Frage aufrufen +- Trefferliste sichtbar +---------------------------------------- + +Faktenabdeckung prüfen + +Prüft, wie gut Fakten eine Frage abdecken + +- Eine leere Frage wird abgewiesen +- Eine Mindestgüte ist wählbar + +- Kommando mit Frage aufrufen +- Abdeckung mit Zusammenfassung sichtbar +---------------------------------------- + +Ankerauflösung testen + +Prüft die Auflösung einer Folgefrage trocken + +- Kein Eingriff in die Laufzeit +- Mehrdeutige Anker werden verworfen +- Eine genannte Artikelnummer schlägt jeden Anker + +- Kommando mit Folgefrage aufrufen +- Auflösungsbericht sichtbar +---------------------------------------- + +Verlaufsanker auslesen + +Zieht Bezugsanker aus einem Gesprächsverlauf + +- Anker belegen keine Fachwerte +- Eingabe per Argument, Datei oder Strom +- Ein eingebauter Rauchtest ist wählbar + +- Kommando mit Rauchtest aufrufen +- Ankerliste sichtbar +---------------------------------------- + +Fakten inspizieren + +Untersucht gespeicherte Fakten der Chunkdatei + +- Eine fehlende Chunkdatei meldet einen Fehler +- Nur lesender Zugriff auf den Index +- Filter nach Text, Typ und Anzahl + +- Kommando mit Suchtext aufrufen +- Trefferliste sichtbar diff --git a/daten/MtoRagSystem/dokument.md b/daten/MtoRagSystem/dokument.md new file mode 100644 index 0000000..a4ae5a2 --- /dev/null +++ b/daten/MtoRagSystem/dokument.md @@ -0,0 +1,107 @@ + +Dokument +---------------------------------------- + +kern +---------------------------------------- + +Führt eine Wissensquelle über ihre Versionen +---------------------------------------- + +- Ein Dokument hält mehrere Versionen +- Genau eine Version ist aktiv +- Tags hängen am Dokument, nicht an der Version +- Schreiben an Dokument oder Version ändert den Index nicht +---------------------------------------- + +Dokumente filtern + +Grenzt die Liste nach Zustand und Pflege ein + +- Sechs Filter: Suche, Status, Index, Version, Titel, Tags +- Unbekannter Filterwert fällt auf alle +- Die Suche trifft Titel, Kennung und Dateiname +- Kennzahlen zählen immer den Gesamtbestand + +- Dokumentliste öffnen +- Filter setzen +- LMB auf Filtern +- Trefferzahl sichtbar +---------------------------------------- + +Dokument hochladen + +Legt eine Wissensquelle mit erster Version an + +- Die Datei ist Pflicht +- Ohne Titel dient der Dateiname als Titel +- Ein schwacher Titel bekommt einen Prüfhinweis +- Version eins entsteht aktiv +- Je Version wird eine Prüfsumme gespeichert +- Der Index bleibt bis zum Neuaufbau unverändert + +- Dokumentliste öffnen +- LMB auf neues Dokument +- Datei wählen +- Speichern +- Dokumentseite sichtbar +---------------------------------------- + +Titel ändern + +Ersetzt einen schwachen Titel fachlich + +- Leerer Titel wird abgewiesen +- Höchstens 255 Zeichen +- Der Prüfhinweis entfällt danach +- Index und Antwortlogik bleiben unberührt + +- Dokumentseite öffnen +- Titel ändern +- Speichern +- Titel als geprüft markiert +---------------------------------------- + +Titel vorschlagen lassen + +Erzeugt Titelkandidaten aus dem Dokumentanfang + +- Der Ausschnitt endet bei 9000 Zeichen +- Höchstens sechs Vorschläge +- Höchstens 120 Zeichen je Vorschlag +- Zu kurze Kandidaten fallen weg +- Ein Klick füllt nur das Feld +- Dokument, Version und Index bleiben unberührt + +- Dokumentseite öffnen +- LMB auf Titel vorschlagen +- Kandidat wählen +- Titelfeld gefüllt +---------------------------------------- + +Indexbereitschaft ansehen + +Zeigt, was den Index bisher nicht erreicht hat + +- Offene Änderungen werden gezählt +- Gelöschte Dokumente im Index werden benannt + +- Dokumentliste öffnen +- Bereitschaftsblock lesen +- Zahl offener Änderungen sichtbar +---------------------------------------- + +Dokument löschen + +Entfernt Dokument, Versionen und Dateien endgültig + +- Nur die höchste Rolle darf löschen +- Ein laufender Neuaufbau verhindert das Löschen +- Versionsdateien werden mitgelöscht +- Ein Auftrag hält den Vorgang fest +- Der Index ändert sich beim nächsten Neuaufbau + +- Dokumentliste öffnen +- LMB auf Löschen +- Bestätigen +- Dokument verschwindet diff --git a/daten/MtoRagSystem/evalfall.md b/daten/MtoRagSystem/evalfall.md new file mode 100644 index 0000000..7438a6b --- /dev/null +++ b/daten/MtoRagSystem/evalfall.md @@ -0,0 +1,77 @@ + +Evalfall +---------------------------------------- + +optional +---------------------------------------- + +Beschreibt einen prüfbaren Fall für die Antwortgüte +---------------------------------------- + +- Neun Falltypen stehen im Adminbereich +- Ein zehnter Typ läuft nur im Terminal +- Eine Fallkennung ist projektweit eindeutig +- Pflichtfelder sind Kennung, Typ und Frage +- Fälle liegen als Zeilendatei je Typ und Bereich +- Schreiben erfolgt mit ausschließender Sperre +---------------------------------------- + +Bereich wählen + +Schaltet zwischen Systembasis und Fachbereich + +- Der Bereich prägt jede weitere Handlung +- Fachbereiche liegen in eigenen Ordnern + +- Menüeintrag Eval Suite wählen +- LMB auf einen Bereichsreiter +- Fälle des Bereichs sichtbar +---------------------------------------- + +Evalfall anlegen + +- Doppelte Kennung wird abgewiesen +- Erwartung muss ein Objekt sein +- Verlauf muss eine Liste sein +- Ein Fehler verhindert jede Änderung + +- Menüeintrag Eval Suite wählen +- LMB auf neuer Test +- Formular ausfüllen +- Absenden +- Fall in der Datei +---------------------------------------- + +Evalfall geführt anlegen + +Legt einen Fall über einen Assistenten an + +- Eigener Entwurf mit eigener Fehlerprüfung + +- Menüeintrag Eval Suite wählen +- LMB auf Assistent +- Schritte ausfüllen +- Fall in der Datei +---------------------------------------- + +Evalfall ableiten + +Übernimmt einen gescheiterten Lauf als Fall + +- Kennung und Frage werden vorbelegt + +- Lauf mit Fehlschlag öffnen +- LMB auf Fall übernehmen +- Formular vorbefüllt +---------------------------------------- + +Evalfall löschen + +- Eine defekte Zeile verhindert die Änderung +- Unbekannte Kennung meldet einen Fehler +- Eine Rückfrage geht voraus + +- Seite neuer Test öffnen +- LMB auf Löschen +- Bestätigen +- Fall verschwindet diff --git a/daten/MtoRagSystem/evallauf.md b/daten/MtoRagSystem/evallauf.md new file mode 100644 index 0000000..aae1024 --- /dev/null +++ b/daten/MtoRagSystem/evallauf.md @@ -0,0 +1,100 @@ + +Evallauf +---------------------------------------- + +optional +---------------------------------------- + +Prüft die Antwortpipeline gegen gespeicherte Fälle +---------------------------------------- + +- Ein gescheiterter Fall setzt den Gesamtstand +- Eine leere Auswahl gilt nicht als Fehlschlag +- Berichte entstehen unteilbar +- Evals messen Fälle, nicht jede mögliche Frage +- Fünf Falltypen rufen das Modell +- Vier Falltypen laufen ohne Modell +---------------------------------------- + +Evallauf starten + +Führt Fälle aus dem Adminbereich aus + +- Der Lauf braucht die Wissensrolle +- Der Bericht wird zusätzlich archiviert +- Der Lauf blockiert die Anfrage bis zum Ende + +- Menüeintrag Eval Suite wählen +- Auswahl treffen +- Lauf starten +- Ergebnis je Fall sichtbar +---------------------------------------- + +Einzelfall erneut testen + +Wiederholt genau einen gescheiterten Fall + +- Nur der gewählte Fall läuft + +- Lauf mit Fehlschlag öffnen +- LMB auf erneut testen +- Ergebnis des Falls sichtbar +---------------------------------------- + +Läufe vergleichen + +Stellt zwei Berichte als Unterschied gegenüber + +- Der Vergleich nennt behoben, neu und entfernt + +- Menüeintrag Eval Suite wählen +- Vergleichsbasis wählen +- Unterschied sichtbar +---------------------------------------- + +Evallauf im Terminal ausführen + +- Die Auswahl folgt Typ und Bereich +- Ein Abbruch nach dem ersten Fehler ist wählbar +- Ein Lauf ohne Schreiben ist wählbar +- Fälle lassen sich nur auflisten + +- Kommando mit Typ aufrufen +- Ergebnis je Fall sichtbar +---------------------------------------- + +Evallauf parallelisieren + +Verteilt Fälle auf mehrere Kindprozesse + +- Zwischen einem und 32 Prozessen +- Vorgabe sind zwei Prozesse +- Ein Zeitlimit je Prozess ist wählbar +- Das Ergebnis ist ein Sammelbericht + +- Kommando mit Prozesszahl aufrufen +- Sammelbericht sichtbar +---------------------------------------- + +Berichte aufräumen + +- Nur erzeugte Dateinamen fallen weg +- Aufräumen behält 20 Läufe je Bereich +- Die Liste zeigt zehn Läufe + +- Menüeintrag Eval Suite wählen +- LMB auf Aufräumen +- Berichtszahl sinkt +---------------------------------------- + +Berichte löschen + +Entfernt alle Läufe eines Bereichs + +- Der aktuelle Lauf fällt mit weg +- Eine Rückfrage geht voraus + +- Menüeintrag Eval Suite wählen +- LMB auf alle löschen +- Bestätigen +- Berichtsliste leer diff --git a/daten/MtoRagSystem/fremdinhalt.md b/daten/MtoRagSystem/fremdinhalt.md new file mode 100644 index 0000000..e100caf --- /dev/null +++ b/daten/MtoRagSystem/fremdinhalt.md @@ -0,0 +1,138 @@ + +Fremdinhalt +---------------------------------------- + +optional +---------------------------------------- + +Prüft externe Inhalte vor jeder Nutzung +---------------------------------------- + +- Geprüft wird der ausgewählte Inhalt +- Ein Lesen führt kein Werkzeug aus +- Ein Lesen ändert die Antwortpipeline nicht +- Vorschauen sind gekürzt und bereinigt +- Externe Inhalte heben ihren Rang nicht selbst +- Der Bereich braucht die höchste Rolle +- Keine Übernahme ins Standardwissen erfolgt automatisch +---------------------------------------- + +Inhalt live prüfen + +Liest den ausgewählten Inhalt einmalig online + +- Nur der gewählte Inhalt wird gelesen +- Ohne Zutun wird nichts gespeichert + +- Übersicht öffnen +- LMB auf Inhalt prüfen +- Bestätigen +- Vorschau mit Abrufzahl +---------------------------------------- + +Inhalt bereitstellen + +Merkt einen gelesenen Inhalt als Kandidat vor + +- Chat und Antwortnutzung bleiben aus +- Der Kandidat startet ohne Freigabe +- Eine Rückfrage geht voraus + +- Inhalt live prüfen +- LMB auf bereitstellen +- Bestätigen +- Kandidat in der Liste +---------------------------------------- + +Inhalt auswählen + +Ordnet einen Inhalt einem Raum zur Prüfung zu + +- Zwei Arten: eigener Raum und Ergänzung +- Die Auswahl gilt schon als geprüft +- Die Auswahl schaltet den Chat nicht ein +- Standardwissen wird dadurch nicht ergänzt + +- Räume überblicken +- LMB auf Inhalt auswählen +- Bestätigen +- Inhalt im Freigabebereich +---------------------------------------- + +Inhalt entscheiden + +Gibt einen geprüften Inhalt frei oder stellt zurück + +- Fünf Wege bis zum Zurücksetzen +- Eine unbekannte Entscheidung wird abgewiesen +- Eine Freigabe schaltet den Chat nicht ein +- Die Notiz endet bei 1000 Zeichen + +- Freigabebereich öffnen +- LMB auf Inhalt ansehen +- Entscheidung wählen +- Zustandsmarke wechselt +---------------------------------------- + +Inhalt im Chat einschalten + +Fügt einen freigegebenen Inhalt dem Raum zu + +- Nur geprüfte Inhalte eines eigenen Raums +- Nicht vorbereitete Inhalte werden abgewiesen +- Suche und Belege bleiben unberührt +- Es entsteht kein gespeichertes Wissen + +- Freigabebereich öffnen +- LMB auf im Chat einschalten +- Inhalt als aktiv markiert +---------------------------------------- + +Kandidaten filtern + +Grenzt vorbereitete Inhalte nach Zustand ein + +- Filter nach Zustand, Anbindung, Art und Zeit +- Das Filtern ruft nichts extern ab + +- Vorbereitete Inhalte öffnen +- Filter setzen +- Trefferliste eingegrenzt +---------------------------------------- + +Kandidat entfernen + +Löscht einen vorbereiteten Inhalt endgültig + +- Die Vorschau fällt mit weg + +- Vorbereitete Inhalte öffnen +- LMB auf Entfernen +- Kandidat verschwindet +---------------------------------------- + +Kandidaten ausgeben + +Lädt vorbereitete Inhalte als Datei herunter + +- Zwei Formate: Markdown und JSONL +- Der Export gibt die gefilterte Menge aus +- Der Export wirkt nicht als Freigabe + +- Vorbereitete Inhalte öffnen +- Format wählen +- Herunterladen +- Datei im Download +---------------------------------------- + +Ressource lesen + +Liest eine freigegebene Ressource im Terminal + +- Nur erlaubte Server und Adressen +- Der Inhalt wird bereinigt +- Ausgegeben werden nur Metadaten und Prüfsumme +- Eine Kürzung wird gekennzeichnet + +- Kommando mit Adresse aufrufen +- Metadaten und Prüfsumme sichtbar diff --git a/daten/MtoRagSystem/indexprofil.md b/daten/MtoRagSystem/indexprofil.md new file mode 100644 index 0000000..51e6894 --- /dev/null +++ b/daten/MtoRagSystem/indexprofil.md @@ -0,0 +1,64 @@ + +Indexprofil +---------------------------------------- + +optional +---------------------------------------- + +Legt Struktur für Chunking und Einbettung fest +---------------------------------------- + +- Ein Profil ist unveränderlich +- Genau ein Profil ist aktiv +- Einsehen braucht die Wissensrolle +- Ändern braucht die höchste Rolle +- Die Version zählt beim Anlegen hoch +- Ein neues Profil entsteht inaktiv +---------------------------------------- + +Profile prüfen + +Gleicht das aktive Profil gegen den Index ab + +- Der Vergleich läuft gegen die Indexmetadaten +- Eine abweichende Zeile setzt den Gesamtstand +- Fehlende Metadaten gelten als Strukturabweichung +- Die Ansicht startet keinen Neuaufbau + +- Menüeintrag Indexprofile wählen +- Abweichungen je Zeile sichtbar +---------------------------------------- + +Profil anlegen + +- Chunkgröße von 50 bis 1000 in Schritten von 25 +- Überlappung von 25 bis 200 in Schritten von 25 +- Das Einbettungsmodell ist Pflicht +- Fehlende Pflichtwerte nennen das Feld +- Nur die höchste Rolle darf anlegen + +- Indexprofile öffnen +- Werte eintragen +- Profil erstellen +- Inaktives Profil sichtbar +---------------------------------------- + +Profil aktivieren + +- Das bisherige Profil wird deaktiviert +- Die Aktivierung startet keinen Neuaufbau + +- Indexprofile öffnen +- LMB auf Aktivieren +- Bestätigen +- Profil als aktiv markiert +---------------------------------------- + +Profil löschen + +- Der Löschweg erscheint nur bei inaktiven Profilen + +- Indexprofile öffnen +- LMB auf Löschen +- Bestätigen +- Profil verschwindet diff --git a/daten/MtoRagSystem/konfiguration.md b/daten/MtoRagSystem/konfiguration.md new file mode 100644 index 0000000..45db7ca --- /dev/null +++ b/daten/MtoRagSystem/konfiguration.md @@ -0,0 +1,46 @@ + +Konfiguration +---------------------------------------- + +optional +---------------------------------------- + +Prüft die wirksamen Einstellungen vor dem Betrieb +---------------------------------------- + +- Fachsemantik gehört in die Konfiguration +- Harte Sonderpfade im Antwortkern sind verboten +- Geänderter Kataloginhalt wirkt ohne Codeänderung +---------------------------------------- + +Konfiguration validieren + +- Fehler und Warnungen erscheinen getrennt +- Warnungen ändern den Ausgang nicht +- Regressionswächter melden nur Warnungen + +- Kommando aufrufen +- Fehler- und Warnliste sichtbar +---------------------------------------- + +Konfiguration ausgeben + +Zeigt die aufgelöste Einstellung zur Diagnose + +- Die Ausgabe ist nicht bereinigt +- Pfade und Adressen stehen darin +- Nur der Shopschlüssel bleibt verborgen + +- Kommando aufrufen +- Vollständige Ausgabe sichtbar +---------------------------------------- + +Quellen auditieren + +Prüft Herkunft, Muster und Fachneutralität + +- Reine Quelltextanalyse ohne Laufzeitwirkung +- Ein Fehlerstand beendet den Lauf + +- Kommando aufrufen +- Kennzahlen und Funde sichtbar diff --git a/daten/MtoRagSystem/modellprofil.md b/daten/MtoRagSystem/modellprofil.md new file mode 100644 index 0000000..8497f9a --- /dev/null +++ b/daten/MtoRagSystem/modellprofil.md @@ -0,0 +1,68 @@ + +Modellprofil +---------------------------------------- + +optional +---------------------------------------- + +Stellt Modell und Suchparameter der Antwort ein +---------------------------------------- + +- Höchstens ein Profil ist systemweit aktiv +- Ohne aktives Profil greifen die Vorgabewerte +- Die Version zählt je Modellname hoch +- Ein neues Profil entsteht inaktiv +- Ein aktives Profil lässt sich nicht löschen +- Nur fehlende Felder erben die Vorgabewerte +- Wertebereiche greifen erst beim Aktivieren +- Suchwerte werden still auf 1 bis 200 begrenzt +---------------------------------------- + +Profile auflisten + +- Das aktive Profil steht oben +- Die Anzeige startet keine Erzeugung + +- Menüeintrag Modellsetup wählen +- Profilliste sichtbar +---------------------------------------- + +Profil erstellen + +- Der Modellname ist Pflicht +- Nur die höchste Rolle darf anlegen + +- Profilliste öffnen +- Werte eintragen +- Absenden +- Inaktives Profil sichtbar +---------------------------------------- + +Profil aktivieren + +- Profilliste öffnen +- LMB auf Aktivieren +- Bestätigen +- Profil als aktiv markiert +---------------------------------------- + +Profil löschen + +- Profilliste öffnen +- LMB auf Löschen +- Bestätigen +- Profil verschwindet +---------------------------------------- + +Suche testen + +Prüft das Trefferverhalten eines Profils + +- Leere Frage liefert kein Ergebnis +- Der Test ändert das Profil nicht +- Der Test aktiviert das Profil nicht + +- Profilliste öffnen +- LMB auf Testen +- Frage eintragen +- Trefferliste sichtbar diff --git a/daten/MtoRagSystem/protokoll.md b/daten/MtoRagSystem/protokoll.md new file mode 100644 index 0000000..24dfe5d --- /dev/null +++ b/daten/MtoRagSystem/protokoll.md @@ -0,0 +1,43 @@ + +Protokoll +---------------------------------------- + +optional +---------------------------------------- + +Zeigt Betriebsmeldungen der Dienste +---------------------------------------- + +- Nur die höchste Rolle darf lesen +- Die Anzeige ist rein lesend +- Kein Löschen ist vorgesehen +---------------------------------------- + +Protokolle auflisten + +- Nur Dateien nach festem Namensmuster +- Neueste Änderung steht oben + +- Menüeintrag Protokolle wählen +- Dateiliste mit Größe sichtbar +---------------------------------------- + +Protokoll anzeigen + +- Höchstens 1000 Zeilen +- Gelesen wird vom Dateiende +- Eine fehlende Datei meldet einen Fehler + +- Protokollliste öffnen +- LMB auf Anzeigen +- Letzte Zeilen sichtbar +---------------------------------------- + +Vektorprotokoll anzeigen + +- Feste Quelle im Protokollverzeichnis +- Höchstens 500 Zeilen +- Eine fehlende Datei meldet einen Hinweis + +- Menüeintrag Vektorprotokoll wählen +- Letzte Zeilen sichtbar diff --git a/daten/MtoRagSystem/rueckmeldung.md b/daten/MtoRagSystem/rueckmeldung.md new file mode 100644 index 0000000..c1d4115 --- /dev/null +++ b/daten/MtoRagSystem/rueckmeldung.md @@ -0,0 +1,99 @@ + +Rückmeldung +---------------------------------------- + +optional +---------------------------------------- + +Sammelt Nutzerkritik für die Verbesserung +---------------------------------------- + +- Eine Rückmeldung hängt an einer Antwort +- Die Adminsicht braucht die Wissensrolle +- Ein Löschen ist endgültig +- Der Export enthält Frage und Antwort im Klartext +- Der Export folgt den gesetzten Filtern +---------------------------------------- + +Rückmeldungen filtern + +Grenzt Fälle nach zehn Merkmalen ein + +- Filter nach Bewertung und Bearbeitungsstand +- Filter nach Einordnung und Fehlerverdacht +- Filter nach Vorrang und Referenzwert +- Seitengröße wählbar mit 25, 50 oder 100 + +- Menüeintrag Chat-Feedback wählen +- Filter setzen +- Trefferliste sichtbar +---------------------------------------- + +Rückmeldung ansehen + +Zeigt einen Fall mit Frage und Antwort + +- Rückmeldungen filtern +- LMB auf einen Fall +- Frage und Antwort sichtbar +---------------------------------------- + +Rückmeldung erledigen + +- Eine Notiz ist möglich + +- Rückmeldung ansehen +- LMB auf erledigt +- Zustand wechselt +---------------------------------------- + +Rückmeldung wieder öffnen + +- Erledigte Rückmeldung ansehen +- LMB auf wieder öffnen +- Zustand wechselt +---------------------------------------- + +Rückmeldungen gesammelt erledigen + +Setzt den Stand für die ganze Auswahl + +- Auswahl über Kästchen oder Filter +- Höchstens 5000 Fälle je Aktion + +- Rückmeldungen filtern +- Auswahl treffen +- LMB auf Auswahl erledigen +- Zustände wechseln +---------------------------------------- + +Rückmeldung löschen + +- Rückmeldung ansehen +- LMB auf Löschen +- Bestätigen +- Eintrag verschwindet +---------------------------------------- + +Rückmeldungen ausgeben + +- Zwei Formate: Markdown und JSONL +- Der Export ist nicht bereinigt +- Vorgefertigte Auszüge je Vorrang + +- Rückmeldungen filtern +- Format wählen +- Datei im Download +---------------------------------------- + +Rückmeldungen einordnen + +Bestimmt Typ, Risiko und Vorrang im Terminal + +- Ohne Erzwingen nur ungeordnete Einträge +- Höchstens 5000 Einträge je Lauf +- Vorgabe sind 500 Einträge +- Zwischenstände werden gespeichert + +- Kommando aufrufen +- Zähler je Risiko sichtbar diff --git a/daten/MtoRagSystem/selbsttest.md b/daten/MtoRagSystem/selbsttest.md new file mode 100644 index 0000000..ac14084 --- /dev/null +++ b/daten/MtoRagSystem/selbsttest.md @@ -0,0 +1,76 @@ + +Selbsttest +---------------------------------------- + +optional +---------------------------------------- + +Sichert Grenzen des Systems gegen Rückschritte +---------------------------------------- + +- 23 Selbsttests decken die Regressionsfläche +- Jeder Test hat sein eigenes Kommando +- Es gibt kein Sammelkommando +- Jeder Test liefert Fallliste und Ausgang +- Jeder Test kennt eine maschinenlesbare Ausgabe +- 15 Tests prüfen nur den Quelltext +- Sechs Tests prüfen gemischt +- Zwei Tests prüfen nur Verhalten +---------------------------------------- + +Einzeltest ausführen + +Prüft eine benannte Grenze des Systems + +- Kein Modell, kein Netz, keine Antwort +- Keine Datenbank und kein Import +- Ein gescheiterter Fall beendet den Lauf + +- Kommandonamen aus der Übersicht holen +- Kommando aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Ingestgrenzen prüfen + +Sichert Markdown, Chunks und Batchgrenzen ab + +- Zwölf Kommandos decken diesen Bereich +- Ein Test räumt sein Verzeichnis selbst auf + +- Kommando aus der Ingestgruppe aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Anbindungsgrenzen prüfen + +Sichert Fremddaten und Werkzeuggrenzen ab + +- Drei Kommandos decken diesen Bereich +- Verbotene Zeichenketten gelten als Fall + +- Kommando aus der Anbindungsgruppe aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Architekturgrenzen prüfen + +Sichert Flussgrenzen und Produktregeln ab + +- Fünf Kommandos decken diesen Bereich +- Ein Test hängt an einer Freigabeversion + +- Kommando aus der Architekturgruppe aufrufen +- Fallliste mit Ständen sichtbar +---------------------------------------- + +Antwortgrenzen prüfen + +Sichert Anker, Prüfung und Raumauswahl ab + +- Drei Kommandos decken diesen Bereich +- Keine Chatantwort und kein Shopzugriff +- Unbelegte Begriffe bleiben unrepariert + +- Kommando aus der Antwortgruppe aufrufen +- Fallliste mit Ständen sichtbar diff --git a/daten/MtoRagSystem/shoptreffer.md b/daten/MtoRagSystem/shoptreffer.md new file mode 100644 index 0000000..a386971 --- /dev/null +++ b/daten/MtoRagSystem/shoptreffer.md @@ -0,0 +1,75 @@ + +Shoptreffer +---------------------------------------- + +optional +---------------------------------------- + +Liefert Preis und Verfügbarkeit aus dem Shop +---------------------------------------- + +- Der Preis stammt allein aus dem Shopdatensatz +- Ohne Shoppreis erscheint kein Preis +- Ein fehlender Preis wird nicht zu null +- Kostenlos gilt nur mit Quellenbeleg +- Verfügbarkeit stammt allein aus dem Shopfeld +- Die Produktadresse stammt aus dem Shoppfad +- Reine Wissensantworten tragen keine Shopadressen +- Ein Shoptreffer belegt keine technische Eignung +- Zubehör wird nicht als Hauptgerät ausgegeben +- Bündelangaben bleiben unzerlegt +- Gefilterte Treffer sind keine fehlenden Treffer +- Kein Treffer bedeutet nicht: gibt es nicht +- Ein Shopausfall wird gemeldet +- Bei automatischer Basis startet sie nur bei Kaufbezug +- Die Basis Shop erzwingt die Suche +- Die gesendete Suchanfrage wird offengelegt +- Bilder stammen aus dem Bildfeld desselben Datensatzes +---------------------------------------- + +Shopsuche auslösen + +Sucht aus einer Wissensantwort passende Produkte + +- Angebot entfällt bei gleicher Suche +- Angebot entfällt bei ablehnender Antwort +- Eine erweiterte Suche wird ausgewiesen + +- Frage stellen +- LMB auf Shopsuche +- Trefferliste sichtbar +---------------------------------------- + +Preis nachfragen + +Ruft Handelsdaten zum genannten Produkt ab + +- Angebot entfällt bei genanntem Preis +- Die Folgeantwort bleibt am Produkt + +- Frage nach einem Produkt stellen +- LMB auf Preis anzeigen +- Preis und Artikelnummer sichtbar +---------------------------------------- + +Treffer filtern + +Grenzt die Liste auf Zubehör oder Geräte ein + +- Angebot erscheint nur bei Wirkung +- Mehrdeutige Rollen gelten nicht als Gerät + +- Shopsuche auslösen +- LMB auf eine Rolle +- Liste eingegrenzt +---------------------------------------- + +Shopsuche diagnostizieren + +Prüft eine Suchanfrage samt Reparatur im Terminal + +- Der Zugriff läuft live gegen den Shop +- Die Reparatursuche bevorzugt den angefragten Code + +- Kommando mit Suchtext aufrufen +- Suchanfrage und Treffer sichtbar diff --git a/daten/MtoRagSystem/sicherung.md b/daten/MtoRagSystem/sicherung.md new file mode 100644 index 0000000..0595250 --- /dev/null +++ b/daten/MtoRagSystem/sicherung.md @@ -0,0 +1,90 @@ + +Sicherung +---------------------------------------- + +optional +---------------------------------------- + +Sichert Anwendung und Datenbank nachvollziehbar +---------------------------------------- + +- Geheimnisse werden nie mitkopiert +- Fremdbibliotheken und Zwischenspeicher bleiben draußen +- Ein Datenbankabzug entsteht auf Anforderung oder Vorgabe +- Eine Sperrdatei verhindert parallele Läufe +- Sieben Stände bleiben rollierend erhalten +- Symlinks werden übersprungen +- Ein Verzeichnis nennt Umfang und Kennung +- Eine gelungene Sicherung beweist keinen Restore +---------------------------------------- + +Sicherung testen + +Prüft den geplanten Umfang ohne Schreibvorgang + +- Keine Sicherungsdatei entsteht +- Keine alte Sicherung fällt weg +- Fehlende Pflichtquellen erscheinen als Warnung +- Fehlende Zusatzquellen zählen getrennt + +- Betriebsseite öffnen +- LMB auf Sicherung testen +- Umfang und Warnungen sichtbar +---------------------------------------- + +Sicherung starten + +- Ein Datenbankabzug braucht Schalter oder Vorgabe +- Das Verzeichnis nennt keinen Zugang +- Geräumte Sicherungen werden benannt +- Eine Rückfrage geht voraus + +- Betriebsseite öffnen +- LMB auf Sicherung starten +- Bestätigen +- Sicherung in der Liste +---------------------------------------- + +Sicherung herunterladen + +Holt ein Archiv für den Restore-Test + +- Nur die höchste Rolle darf herunterladen +- Nur gültige lokale Kennungen +- Der Abruf startet keine Sicherung + +- Betriebsseite öffnen +- LMB auf Herunterladen +- Archiv im Download +---------------------------------------- + +Restore prüfen + +Bewertet eine Sicherung als Wiederherstellungsgrundlage + +- Nur die höchste Rolle darf prüfen +- Es läuft keine Wiederherstellung +- Kein Datenbankimport erfolgt +- Gelesen werden Verzeichnis und Bestandteile +- Das Ergebnis liefert einen Plan + +- Betriebsseite öffnen +- LMB auf Restore prüfen +- Prüfpunkte und Plan sichtbar +---------------------------------------- + +Sicherung im Terminal erstellen + +- Ein Trockenlauf schreibt keine Datei +- Die Aufbewahrung ist wählbar + +- Kommando aufrufen +- Kennung und Umfang sichtbar +---------------------------------------- + +Restore im Terminal prüfen + +- Kein Netz, kein Modell, kein Chat + +- Kommando mit Kennung aufrufen +- Prüfpunkte und Plan sichtbar diff --git a/daten/MtoRagSystem/sitzung.md b/daten/MtoRagSystem/sitzung.md new file mode 100644 index 0000000..241fbe9 --- /dev/null +++ b/daten/MtoRagSystem/sitzung.md @@ -0,0 +1,83 @@ + +Sitzung +---------------------------------------- + +kern +---------------------------------------- + +Hält Zugang und Verlauf einer Unterhaltung +---------------------------------------- + +- Chat und Adminbereich teilen eine Anmeldung +- Ein Abmelden beendet beide Bereiche +- Der Verlauf hängt an einem Browserkennzeichen +- Ein Abmelden löscht dieses Kennzeichen nicht +- Deaktivierte Konten werden abgewiesen +- Der Verlauf löst nur Bezüge auf +- Der Verlauf belegt keine Fachwerte +- Ein Hinweis nennt Fehlerrisiko und Datennutzung +---------------------------------------- + +Am Chat anmelden + +- E-Mail und Passwort sind Pflicht +- Ohne Chatrolle erscheint eine Verbotsseite +- Falscher Zugang behält die E-Mail +- Angemeldete landen sofort im Chat + +- Anmeldeseite aufrufen +- E-Mail und Passwort eintragen +- Bestätigen +- Chat mit Verlauf sichtbar +---------------------------------------- + +Vom Chat abmelden + +- Gemerkte Einstellungen bleiben erhalten + +- LMB auf Abmelden +- Anmeldeseite sichtbar +---------------------------------------- + +Am Adminbereich anmelden + +- Ohne Adminrolle erscheint eine Verbotsseite +- Berechtigte landen auf der Systemübersicht +- Der letzte Benutzername ist vorbelegt + +- Adminanmeldung aufrufen +- E-Mail und Passwort eintragen +- Bestätigen +- Systemübersicht sichtbar +---------------------------------------- + +Vom Adminbereich abmelden + +- LMB auf Abmelden +- Anmeldeseite sichtbar +---------------------------------------- + +Verlauf löschen + +Entfernt Gespräch, Produktbezüge und Uploads + +- Während des Empfangs gesperrt +- Löscht alle temporären Uploads mit +- Keine Rückfrage, keine Wiederherstellung +- Danach fehlen alle Bezugsanker + +- LMB auf Verlauf löschen +- Verlauf leer +- Uploadliste leer +---------------------------------------- + +Hilfe öffnen + +Zeigt das Bedienhandbuch im Chat + +- Nur bei vorhandener Handbuchdatei +- Höchstens 512 KB werden gelesen +- Die Hilfe ändert keine Antwortlogik + +- LMB auf Hilfe +- Handbuch im Fenster sichtbar diff --git a/daten/MtoRagSystem/systemprompt.md b/daten/MtoRagSystem/systemprompt.md new file mode 100644 index 0000000..3827769 --- /dev/null +++ b/daten/MtoRagSystem/systemprompt.md @@ -0,0 +1,46 @@ + +Systemprompt +---------------------------------------- + +optional +---------------------------------------- + +Steuert die Grundanweisung an das Modell +---------------------------------------- + +- Genau eine Version ist aktiv +- Die Version zählt fortlaufend hoch +- Eine neue Version überschreibt keine alte +- Nur die höchste Rolle darf ändern +---------------------------------------- + +Version speichern + +- Leerer Inhalt wird abgewiesen +- Die neue Version wird sofort aktiv +- Die bisherige Version wird abgeschaltet + +- Menüeintrag Systemprompt wählen +- Text eintragen +- Speichern +- Neue aktive Version oben +---------------------------------------- + +Version aktivieren + +Schaltet auf eine frühere Version zurück + +- Systemprompt öffnen +- LMB auf Aktivieren +- Bestätigen +- Kennzeichnung wechselt +---------------------------------------- + +Version löschen + +- Eine aktive Version bleibt geschützt + +- Systemprompt öffnen +- LMB auf Löschen +- Bestätigen +- Version verschwindet diff --git a/daten/MtoRagSystem/tag.md b/daten/MtoRagSystem/tag.md new file mode 100644 index 0000000..6351030 --- /dev/null +++ b/daten/MtoRagSystem/tag.md @@ -0,0 +1,92 @@ + +Tag +---------------------------------------- + +optional +---------------------------------------- + +Lenkt die Suche über gepflegte Signale +---------------------------------------- + +- Drei Typen: allgemein, Katalogobjekt, Vertriebssignal +- Unbekannter Typ fällt auf allgemein +- Ein Slug ist eindeutig +- Jede Änderung stößt einen Neuaufbau an +- Ein laufender Neuaufbau verhindert einen zweiten +---------------------------------------- + +Tag anlegen + +- Slug und Bezeichnung sind Pflicht +- Der Slug wird kleingeschrieben +- Leerzeichen werden zu Bindestrichen +- Ein doppelter Slug wird abgewiesen + +- Tagliste öffnen +- Bezeichnung und Slug eintragen +- Anlegen +- Tag in der Liste +---------------------------------------- + +Tag löschen + +- Alle Zuweisungen fallen mit weg + +- Tagliste öffnen +- LMB auf Löschen +- Bestätigen +- Tag verschwindet +---------------------------------------- + +Dokumente zuweisen + +Ordnet einem Tag mehrere Dokumente zu + +- Nur aktive Dokumente stehen zur Wahl +- Doppelte Kennungen werden entfernt +- Nur Unterschiede werden geschrieben + +- Tagliste öffnen +- LMB auf Zuweisen +- Dokumente ankreuzen +- Speichern +- Zähler angepasst +---------------------------------------- + +Dokument-Tags bearbeiten + +Setzt die Tags eines einzelnen Dokuments + +- Tags erscheinen nach Typ sortiert +- Nicht angekreuzte Tags fallen weg + +- Dokumentliste öffnen +- LMB auf Tags +- Tags ankreuzen +- Speichern +- Neuaufbau angestoßen +---------------------------------------- + +Neuaufbau verfolgen + +Zeigt den Fortschritt des Tag-Neuaufbaus laufend + +- Der Stand wird zweisekündlich abgefragt +- Ein Lebenszeichen kommt zehnsekündlich +- Vier Zustände: wartend, laufend, fertig, gescheitert +- Das Zusehen stößt keinen Neuaufbau an + +- Tagliste öffnen +- Statuszeile beobachten +- Zustand wechselt bis fertig +---------------------------------------- + +Tagindex neu aufbauen + +Baut Tagexport und Tagvektoren im Terminal neu + +- Entweder Auftragskennung oder Neuanlage +- Eine Sperrdatei verhindert Parallelläufe + +- Kommando mit Neuanlage aufrufen +- Kennzahlen sichtbar diff --git a/daten/MtoRagSystem/upload.md b/daten/MtoRagSystem/upload.md new file mode 100644 index 0000000..963d239 --- /dev/null +++ b/daten/MtoRagSystem/upload.md @@ -0,0 +1,68 @@ + +Upload +---------------------------------------- + +kern +---------------------------------------- + +Stellt eine Datei als Quelle der Sitzung bereit +---------------------------------------- + +- Erlaubt sind PDF, Markdown und Text +- Höchstens drei Dateien je Sitzung +- Höchstens 10 MB je Datei +- Ein Upload verfällt nach 60 Minuten +- Uploads ändern die Wissensbasis nie +- Ein Upload beginnt nachrangig +- Ein Upload lässt sich auf vorrangig stellen +- Der ausgewertete Text endet bei 60000 Zeichen +- Der Client prüft, der Server prüft erneut +---------------------------------------- + +Datei hochladen + +- Eine leere Datei weist erst der Server ab +- Übergroße Datei wird abgewiesen +- Bei erreichtem Maximum ist der Zugang gesperrt +- Ein Upload beginnt nachrangig + +- LMB auf Hinzufügen +- Datei wählen +- Datei mit Größe sichtbar +---------------------------------------- + +Nutzung wählen + +Legt fest, ob der Upload allein zählt + +- Abfrage erscheint nach dem Hochladen +- Als eigener Raum zählt nur der Upload +- Als Ergänzung bleibt Standardwissen führend +- Ohne Freigabe bleibt Standardwissen wirksam + +- Datei hochladen +- Eine Nutzungsart wählen +- Wissensraum passt sich an +---------------------------------------- + +Upload priorisieren + +Hebt den Upload gegenüber dem Wissen an + +- Zwei Modi: nachrangig und vorrangig +- Als eigener Raum entfällt der Schalter +- Ein Widerspruch bleibt sichtbar ausgewiesen + +- Datei hochladen +- LMB auf den Rangvermerk +- Vermerk zeigt vorrangig +---------------------------------------- + +Upload entfernen + +- Wirkt nur auf eigene Uploads +- Ohne Upload fällt der Raum zurück + +- Datei hochladen +- LMB auf Entfernen +- Datei verschwindet diff --git a/daten/MtoRagSystem/version.md b/daten/MtoRagSystem/version.md new file mode 100644 index 0000000..678a70c --- /dev/null +++ b/daten/MtoRagSystem/version.md @@ -0,0 +1,135 @@ + +Version +---------------------------------------- + +kern +---------------------------------------- + +Hält einen unveränderlichen Stand eines Dokuments +---------------------------------------- + +- Eine Version wird nie überschrieben +- Jede Version trägt eine Prüfsumme +- Eine neue Version entsteht inaktiv +- Nur die aktive Version speist den Index +---------------------------------------- + +Version hochladen + +Legt einen Nachfolgestand als neue Version ab + +- Die Datei ist Pflicht +- Die Nummer zählt vom höchsten Stand hoch +- Die aktive Version bleibt unverändert + +- Dokumentseite öffnen +- LMB auf neue Version +- Datei wählen +- Hochladen +- Inaktive Version sichtbar +---------------------------------------- + +Originaltext ansehen + +Zeigt die Textbasis vor der Chunk-Erzeugung + +- Die Anzeige ändert die Datei nicht +- Jede Seite liefert 40000 Zeichen +- Eine angeforderte Seitengröße endet bei 80000 +- Weitere Seiten laden beim Blättern nach +- Nicht lesbare Formate melden einen Fehler + +- Dokumentseite öffnen +- LMB auf Original ansehen +- Text im Fenster sichtbar +---------------------------------------- + +Version ableiten + +Speichert korrigierten Text als neue Version + +- Die Arbeitskopie endet bei 180000 Zeichen +- Leerer Inhalt wird abgewiesen +- Der Dateiname nennt die Quellversion +- Quelle und aktive Version bleiben unberührt +- Die neue Version ist inaktiv + +- Originaltext ansehen +- Text anpassen +- Als neue Version speichern +- Inaktive Version sichtbar +---------------------------------------- + +Wissenskarte erzeugen + +Erstellt eine strukturierte Markdown-Fassung der Version + +- Die Quelle wird segmentiert verarbeitet +- Ein unvollständiger Plan bricht ab +- Der Zusammenbau erfolgt durch das System +- Der Nachweis nennt Modell und Segmentzahl +- Kein Index wird geschrieben +- Doppelklicks bleiben während des Laufs gesperrt + +- Dokumentseite öffnen +- LMB auf Wissenskarte erzeugen +- Bestätigen +- Neue inaktive Version sichtbar +---------------------------------------- + +Version aktivieren + +Wählt eine Version als künftige Antwortbasis + +- Genau eine Version bleibt aktiv +- Die Version wird zum Neuaufbau vorgemerkt +- Kein Auftrag und kein Neuaufbau startet +- Bis dahin gilt der letzte stabile Index + +- Dokumentseite öffnen +- LMB auf Version aktivieren +- Bestätigen +- Warnung zum Neuaufbau sichtbar +---------------------------------------- + +Version vormerken + +Markiert die aktive Version für den Neuaufbau + +- Nur die aktive Version lässt sich vormerken +- Es startet kein Einzellauf + +- Dokumentseite öffnen +- LMB auf vormerken +- Bestätigen +- Version als vorgemerkt markiert +---------------------------------------- + +Chunks lesen + +Zeigt die Chunks einer Version aus dem Index + +- Die Anzeige ändert keine Antwortlogik +- Höchstens 300 Chunks je Version +- Je Chunk höchstens 1400 Zeichen +- Je Chunk höchstens 30 Fakten +- Ohne Indexeinträge erscheint eine Warnung + +- Dokumentseite öffnen +- LMB auf Chunks lesen +- Chunkliste sichtbar +---------------------------------------- + +Chunkgüte vergleichen + +Stellt Original und Wissenskarte gegenüber + +- Die Prüfung läuft nur im Speicher +- Kein Index wird geschrieben +- Kein Modell wird aufgerufen +- Ein fehlendes Gegenstück meldet einen Hinweis +- Der Vergleich nennt Chunks, Tabellen und Fakten + +- Dokumentseite öffnen +- LMB auf Güte vergleichen +- Vergleich sichtbar diff --git a/daten/MtoRagSystem/vision.md b/daten/MtoRagSystem/vision.md new file mode 100644 index 0000000..62a5b93 --- /dev/null +++ b/daten/MtoRagSystem/vision.md @@ -0,0 +1,72 @@ + +Vision +---------------------------------------- + +vision +---------------------------------------- + +Antworten sollen nicht nur plausibel klingen, sondern nachprüfbar sein. +---------------------------------------- + +Beleggeführt antworten + +Jede Aussage bekommt einen nachvollziehbaren Belegzustand +- Was nicht in den Quellen steht, wird nicht behauptet +- Belegzustand und Abdeckung sind ablesbar +- Einzelne Aussagen werden gegen die Belege geprüft +---------------------------------------- + +Grenzen zeigen + +Fehlendes, Schwaches und Widersprüchliches bleibt sichtbar +- Fehlende Quellen werden benannt, nicht ersetzt +- Quellenkonflikte werden gezeigt statt zusammengeführt +- Transparente Unsicherheit schlägt sichere Falschaussage +---------------------------------------- + +Quellen trennen + +Fachwissen, Handelsdaten und Uploads bleiben unterscheidbar +- Ein Shoppreis belegt keine technische Eignung +- Wissensräume trennen die Bestände sichtbar +- Ein Upload bleibt temporär und nachrangig +---------------------------------------- + +Wissen pflegen + +Dokumente werden antwortfähig, nicht nur abgelegt +- Versionen bleiben einzeln nachvollziehbar +- Struktur, Chunks und Fakten sind einsehbar +- Ein Neuaufbau ist eine bewusste Entscheidung +---------------------------------------- + +Fremddaten kontrollieren + +Externe Quellen wirken nur nach bewusster Freigabe +- Nichts wird automatisch zu Standardwissen +- Nur lesende Werkzeuge, nie Schreibaktionen +- Jede Freigabe ist eine eigene Entscheidung +---------------------------------------- + +Fachfrei bleiben + +Fachsemantik gehört in Konfiguration, nicht in den Kern +- Harte Sonderpfade im Antwortkern sind verboten +- Ein Fachpaket ist pflegbar ohne Codeänderung +- Diagnosen verändern die Antwortgüte nicht +---------------------------------------- + +Betrieb nachweisen + +Der Betreiber kann belegen, dass das System trägt +- Prüfungen, Sicherungen und Berichte sind abrufbar +- Berichte enthalten keine Geheimnisse +- Ein Restore-Nachweis bleibt Aufgabe des Betreibers +---------------------------------------- + +Grenzen des Systems anerkennen + +Das System ersetzt keine Prüfung durch Menschen +- Es gibt keine Rechteverwaltung im Wissen +- Kein Ersatz für Audit, Rechtsrat oder Abkommen +- Evals messen Fälle, nicht universelle Wahrheit diff --git a/daten/MtoRagSystem/werkzeug.md b/daten/MtoRagSystem/werkzeug.md new file mode 100644 index 0000000..a14db82 --- /dev/null +++ b/daten/MtoRagSystem/werkzeug.md @@ -0,0 +1,56 @@ + +Werkzeug +---------------------------------------- + +optional +---------------------------------------- + +Erlaubt ein lesendes Werkzeug im Anbindungsraum +---------------------------------------- + +- Nur eindeutig lesende Werkzeuge sind erlaubt +- Werkzeuge mit Schreibrisiko bleiben gesperrt +- Eine Freigabe gilt nur für ihren Raum +- Das Modell schlägt vor, das System führt aus +- Ein freigegebenes Werkzeug läuft ohne Rückfrage +- Höchstens ein Werkzeug je Antwort +- Jede Nutzung erhält einen Nachweis +- Ein Werkzeugfehler wird sichtbar gemeldet +- Standardwissen und Shop bleiben ausgeschlossen +- Der Bereich braucht die höchste Rolle +---------------------------------------- + +Werkzeug freigeben + +- Nicht eindeutig lesende Werkzeuge bleiben gesperrt +- Der Grund für eine Sperre steht dabei +- Die Freigabe führt kein Werkzeug aus + +- Räume überblicken +- Abschnitt Werkzeuge aufklappen +- LMB auf freigeben +- Werkzeug als freigegeben markiert +---------------------------------------- + +Werkzeugfreigabe zurücknehmen + +- Die Rücknahme wirkt sofort + +- Räume überblicken +- Abschnitt Werkzeuge aufklappen +- LMB auf Freigabe entfernen +- Werkzeug wieder gesperrt +---------------------------------------- + +Werkzeugergebnis auswählen + +Ordnet ein gespeichertes Ergebnis einem Raum zu + +- Kein Werkzeug läuft dabei +- Ergebnisse bleiben gespeicherte Prüfinformationen +- Ergebnisse sind nicht live lesbar + +- Räume überblicken +- Abschnitt Ergebnisse aufklappen +- LMB auf auswählen +- Ergebnis im Freigabebereich diff --git a/daten/MtoRagSystem/wissensindex.md b/daten/MtoRagSystem/wissensindex.md new file mode 100644 index 0000000..5b682fc --- /dev/null +++ b/daten/MtoRagSystem/wissensindex.md @@ -0,0 +1,90 @@ + +Wissensindex +---------------------------------------- + +kern +---------------------------------------- + +Hält die durchsuchbare Fassung des Wissens +---------------------------------------- + +- Treffer unter der Mindestgüte fallen weg +- Jeder Treffer trägt eine Chunkkennung +- Dokument und Abschnitt kommen mit, sofern vorhanden +- Eine nicht erreichbare Suche liefert keine Treffer +- Ein veralteter Index wird gemeldet +- Ein unvollständiger Aufbau bricht ab +---------------------------------------- + +Systemstand ansehen + +Zeigt Chunkzahl und Gesundheit der Dienste + +- Die Anzeige schreibt nichts +- Die harte Chunkgrenze liegt bei 25000 + +- Menüeintrag Systemübersicht wählen +- Chunkzahl und Gesundheit sichtbar +---------------------------------------- + +Chunkindex einsehen + +- Nur die höchste Rolle darf einsehen +- Vorgabe 50, höchstens 200 Einträge je Seite +- Die Anzeige startet keinen Neuaufbau + +- Menüeintrag Wissensbasis wählen +- Metadaten und Einträge sichtbar +---------------------------------------- + +Zwischenspeicher leeren + +Verwirft kurzlebige Zwischenstände nach Wartung + +- Der Dienst kennt keine Antwortlogik +- Ein nicht erreichbarer Vektordienst ergibt eine Warnung +- Eine Rückfrage geht voraus + +- Systemübersicht öffnen +- LMB auf Zwischenspeicher leeren +- Bestätigen +- Ergebnismeldung sichtbar +---------------------------------------- + +Gesundheit prüfen + +Prüft Vektor- und Tagindex im Terminal + +- Gesund ist jeder Zustand mit Vorsilbe OK +- Es entsteht kein Schreibzugriff + +- Kommando aufrufen +- Prüfbericht sichtbar +---------------------------------------- + +Vektordienst steuern + +Startet, stoppt oder lädt den Vektordienst neu + +- Die Steuerung läuft über das Kontrollskript +- Das Zeitlimit beträgt 600 Sekunden + +- Kommando mit Aktion aufrufen +- Ausgabe des Skripts sichtbar +---------------------------------------- + +Wissen zurücksetzen + +Löscht Dokumente, Versionen, Tags und Indexdateien + +- Nur die höchste Rolle darf ausführen +- Die Funktion ist standardmäßig gesperrt +- Der Bestätigungstext muss wörtlich stimmen +- Zuvor entsteht eine Sicherung +- Ein Fehlschlag der Sicherung bricht ab + +- Systemübersicht öffnen +- Bestätigungstext eintippen +- Absenden +- Bestätigen +- Sicherungspfad sichtbar diff --git a/daten/MtoRagSystem/wissensraum.md b/daten/MtoRagSystem/wissensraum.md new file mode 100644 index 0000000..58c7074 --- /dev/null +++ b/daten/MtoRagSystem/wissensraum.md @@ -0,0 +1,97 @@ + +Wissensraum +---------------------------------------- + +kern +---------------------------------------- + +Bestimmt, welcher Bestand eine Antwort trägt +---------------------------------------- + +- Standardwissen ist immer verfügbar +- Standardwissen lässt sich nicht abschalten +- Ein Uploadraum antwortet nur aus dem Upload +- Ein Uploadraum kennt keinen stillen Rückfall +- Ein Anbindungsraum liest nur Freigegebenes +- Ein Anbindungsraum mischt kein Standardwissen +- Ein unbekannter Raum fällt auf Standardwissen +- Freigegebene Inhalte und Werkzeugergebnisse sind nachrangig +- Beide bleiben vom Rangvorteil ausgenommen +---------------------------------------- + +Wissensraum wählen + +Legt die Antwortgrundlage der Unterhaltung fest + +- Der Uploadraum braucht einen gültigen Upload +- Gesperrte Räume sind nicht wählbar +- Während des Empfangs gesperrt + +- Chat-Einstellungen öffnen +- Wissensraum wählen +- Raum in der Zusammenfassung +---------------------------------------- + +Räume überblicken + +Zeigt, welche Räume arbeiten und angeboten werden + +- Der Zugang braucht die höchste Rolle +- Anbindungen sind erst nach Freigabe wirksam + +- Menüeintrag Wissensräume wählen +- Räume mit Zählern sichtbar +---------------------------------------- + +Chatauswahl umschalten + +Gibt einen Raum für die Chatauswahl frei + +- Standardwissen bleibt gesperrt +- Ausschalten löscht keine Freigaben +- Wiedereinschalten braucht keine neue Freigabe +- Nicht vorgesehene Räume werden abgewiesen + +- Räume überblicken +- LMB auf Einschalten +- Raum als aktiv markiert +---------------------------------------- + +Freigegebenen Inhalt vorschauen + +Liest einen freigegebenen Inhalt vor der Entscheidung + +- Der Dialog liest nur auf Klick +- Kein Standardwissen und kein Werkzeug +- Es wird nichts gespeichert + +- Räume überblicken +- Freigabebereich öffnen +- LMB auf live lesen +- Textvorschau sichtbar +---------------------------------------- + +Herkunft ansehen + +Zeigt, welche Inhalte welchem Raum gehören + +- Reine Anzeige ohne Freigabe +- Kein externer Abruf entsteht + +- Räume überblicken +- Abschnitt Herkunft aufklappen +- Zuordnungen je Raum sichtbar +---------------------------------------- + +Raumgrenzen prüfen + +Führt sechs Selbsttests zu den Raumgrenzen aus + +- Es entsteht keine Chatantwort +- Kein Werkzeug wird ausgeführt +- Kein Inhalt wird live gelesen +- Netz und Speicher werden je Test ausgewiesen + +- Räume überblicken +- LMB auf Prüfungen ausführen +- Sammelergebnis sichtbar diff --git a/daten/MtoVariantConfigurator/.planung/.pruefung.json b/daten/MtoVariantConfigurator/.planung/.pruefung.json deleted file mode 100644 index f578988..0000000 --- a/daten/MtoVariantConfigurator/.planung/.pruefung.json +++ /dev/null @@ -1,537 +0,0 @@ -{ - "abdeckung": { - "einbinden:VariantConfiguratorPlugin": { - "abdruck": "823481507a44729d", - "funktion": "Konfigurationsdaten bereitstellen", - "trug": "5fbc8363b7cffe59" - }, - "einbinden:erweitert @Storefront/storefront/component/buy-widget/configurator.html.twig": { - "abdruck": "c6d031d6bc598089", - "funktion": "Konfigurator aktivieren", - "trug": "6cf5a2b08ce2371a" - }, - "einbinden:override sw-product-detail-variants": { - "abdruck": "2fcf518e7333458a", - "funktion": "", - "trug": "" - }, - "einbinden:register mto-vc-variants-card": { - "abdruck": "c472feadaac5ac71", - "funktion": "", - "trug": "" - }, - "hoeren:[data-mto-vc-gallery-next].click": { - "abdruck": "c402ad6f114e8c3d", - "funktion": "Galerie blättern", - "trug": "bacf45ebf9dd77b8" - }, - "hoeren:[data-mto-vc-gallery-prev].click": { - "abdruck": "f50d4f7effc60a06", - "funktion": "Galerie blättern", - "trug": "bacf45ebf9dd77b8" - }, - "hoeren:[data-mto-vc-lightbox-close].click": { - "abdruck": "89a22850af7694bb", - "funktion": "Galerie blättern", - "trug": "bacf45ebf9dd77b8" - }, - "hoeren:document.keydown": { - "abdruck": "7c018ebbfa346bee", - "funktion": "Schritt öffnen", - "trug": "efe9634e3080c073" - }, - "hoeren:el.click": { - "abdruck": "6a423a062267755c", - "funktion": "Nächsten Schritt anzeigen", - "trug": "f6b276e3fedf287d" - }, - "hoeren:info.click": { - "abdruck": "7a5a70dfb792bf19", - "funktion": "Optionsdetail öffnen", - "trug": "39fed29af6734cd4" - }, - "hoeren:info.keydown": { - "abdruck": "409cecf6fb3bbb4a", - "funktion": "Optionsdetail öffnen", - "trug": "39fed29af6734cd4" - }, - "hoeren:lightboxSelect.click": { - "abdruck": "9add2d2c77b440b5", - "funktion": "Ansicht schließen", - "trug": "24d52cc6d249d4f5" - }, - "hoeren:next.click": { - "abdruck": "d5b0cdcce40afcff", - "funktion": "Konfigurator schließen", - "trug": "1cc1a6b5fc943e03" - }, - "hoeren:prev.click": { - "abdruck": "6b8db8d885c0d6f8", - "funktion": "Konfigurator schließen", - "trug": "1cc1a6b5fc943e03" - }, - "hoeren:row.click": { - "abdruck": "b4ec6f63c613c35f", - "funktion": "Option wählen", - "trug": "80df89cf0c129387" - }, - "hoeren:thumb.click": { - "abdruck": "b4aa2111971f6886", - "funktion": "Bild wählen", - "trug": "0604a0a6875489b8" - }, - "hoeren:trigger.click": { - "abdruck": "e219933925adc81a", - "funktion": "Schritt öffnen", - "trug": "efe9634e3080c073" - }, - "reaktion:ProductPageLoadedEvent": { - "abdruck": "6f808b91c1a0c4f5", - "funktion": "Konfigurationsdaten bereitstellen", - "trug": "5fbc8363b7cffe59" - }, - "route:get /mto-variant-configurator/resolve/{productId}": { - "abdruck": "b14355d6007564a1", - "funktion": "Konfigurationsdaten bereitstellen", - "trug": "5fbc8363b7cffe59" - } - }, - "belege": { - "[\"auswahl-anstossen\", \"Gewählte Option anzeigen\"]": { - "abdruck": "626af3ee300b610a", - "beleg": "\n {{ mtoVcSelected ? mtoVcSelected.translated.name : 'mto.variantConfigurator.choose'|trans }}\n ", - "datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig" - }, - "[\"auswahl-anstossen\", \"Hinweistext anzeigen\"]": { - "abdruck": "b9baf394ca99d4e6", - "beleg": "{% if mtoVcBubble != mtoVcBubbleKey and mtoVcBubble is not empty %}\n

{{ mtoVcBubble|sw_sanitize }}

\n {% endif %}", - "datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig" - }, - "[\"auswahl-anstossen\", \"Schrittnummer anzeigen\"]": { - "abdruck": "b9e4deada2c3a6f1", - "beleg": "{{ 'mto.variantConfigurator.step'|trans({ '%step%': mtoVcStep })|sw_sanitize }}", - "datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig" - }, - "[\"beratung-anbieten\", \"Beratung erreichen\"]": { - "abdruck": "fa513f8d265ad713", - "beleg": "{% if ctaPhone is not empty %}\n \n {{ ctaPhone|sw_sanitize }}\n {% endif %}", - "datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig" - }, - "[\"beratung-anbieten\", \"Optionsübersicht öffnen\"]": { - "abdruck": "8aba7fb9bf50281b", - "beleg": "{% if pdfUrl %}\n \n {{ 'mto.variantConfigurator.allOptions'|trans|sw_sanitize }}\n \n {% else %}\n \n {% endif %}", - "datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig" - }, - "[\"beratung-anbieten\", \"Vertrauen zeigen\"]": { - "abdruck": "5b204dff7de6f96d", - "beleg": "{% if trustLogo %}\n \"\"\n{% endif %}", - "datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig" - }, - "[\"layout-zuweisen\", \"Konfigurator aktivieren\"]": { - "abdruck": "60a65511f06ae7fe", - "beleg": "", - "datei": "src/Resources/app/administration/src/component/mto-vc-variants-card/mto-vc-variants-card.html.twig" - }, - "[\"layout-zuweisen\", \"Optionsübersicht hinterlegen\"]": { - "abdruck": "97b421cf540a6cc2", - "beleg": "{% if pdfUrl %}\n \n {{ 'mto.variantConfigurator.allOptions'|trans|sw_sanitize }}\n \n {% else %}\n \n {% endif %}", - "datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig" - }, - "[\"layout-zuweisen\", \"Trust-Logo hinterlegen\"]": { - "abdruck": "1954311a4c3a9cc1", - "beleg": "$mediaId = $this->systemConfigService->get(\n MtoVariantConfigurator::CONFIG_TRUST_LOGO,\n $salesChannelId,\n );", - "datei": "src/Core/Content/Product/VariantResolveService.php" - }, - "[\"option-ansehen\", \"Ansicht schließen\"]": { - "abdruck": "6eac493d9a481e30", - "beleg": "if (!this._nodes.lightbox.hidden) {\n this._closeLightbox();\n } else {\n this._close();\n }", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"option-ansehen\", \"Option aus Ansicht wählen\"]": { - "abdruck": "b4223f8cf3e2456e", - "beleg": "this._nodes.lightboxSelect?.addEventListener('click', () => {\n if (this._lightboxOption) {\n this._selectOption(this.options.groups[this._currentStep], this._lightboxOption.id);\n }\n this._closeLightbox();\n });", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"option-ansehen\", \"Optionsdetail öffnen\"]": { - "abdruck": "59faab581e0fac7f", - "beleg": "info.addEventListener('click', open);\n info.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n open(event);\n }\n });", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"schritt-zeigen\", \"Eigenschaft benennen\"]": { - "abdruck": "dd54064a67689e2c", - "beleg": "this._nodes.title.textContent = group.name;", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"schritt-zeigen\", \"Optionen auflisten\"]": { - "abdruck": "a71af321f056608d", - "beleg": "if (option.media) {\n const visual = document.createElement('span');\n visual.className = 'mto-vc-option-media';\n const img = document.createElement('img');\n img.src = option.media;\n img.alt = '';\n img.loading = 'lazy';\n visual.appendChild(img);\n row.appendChild(visual);\n } else if (option.color) {\n const visual = document.createElement('span');\n visual.className = 'mto-vc-option-swatch';\n visual.style.backgroundColor = option.color;\n row.appendChild(visual);\n } else {\n row.classList.add('has-no-visual');\n }", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"schritt-zeigen\", \"Schrittstand anzeigen\"]": { - "abdruck": "aa7b8888103f8bd0", - "beleg": "this._nodes.counter.textContent = (this._snippets.stepCount || '__step__ / __total__')\n .replace('__step__', String(step))\n .replace('__total__', String(total));\n this._nodes.progress.style.width = `${(step / total) * 100}%`;", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"varianten-waehlen\", \"Auswahl übernehmen\"]": { - "abdruck": "21ccf5bc0286c95c", - "beleg": "if (optionId && select.value !== optionId) {\n select.value = optionId;\n lastChanged = select;\n }", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"varianten-waehlen\", \"Konfigurationsdaten bereitstellen\"]": { - "abdruck": "e6e5848381fce5aa", - "beleg": "$page->assign([", - "datei": "src/Subscriber/ProductPageSubscriber.php" - }, - "[\"varianten-waehlen\", \"Konfigurator schließen\"]": { - "abdruck": "1b7d4aea18cdb896", - "beleg": "_close() {\n this._closeLightbox();\n this._modalEl.hidden = true;\n document.body.classList.remove('mto-vc-modal-open');\n document.removeEventListener('keydown', this._keydownHandler);\n this._lastFocus?.focus();\n }", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"varianten-waehlen\", \"Nächsten Schritt anzeigen\"]": { - "abdruck": "3deee97595984a3e", - "beleg": "const isLast = this._nextUsableStep(this._currentStep + 1, 1) === null;\n this._nodes.next.textContent = isLast\n ? this._nodes.next.dataset.finishLabel\n : this._nodes.next.dataset.nextLabel;", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"varianten-waehlen\", \"Option wählen\"]": { - "abdruck": "4b9f7dc844cf7aac", - "beleg": "this._selected[group.id] = optionId;", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"varianten-waehlen\", \"Schritt öffnen\"]": { - "abdruck": "94b3aa8d50c53fc8", - "beleg": "this._triggers.forEach((trigger) => {\n trigger.addEventListener('click', (event) => {\n event.preventDefault();\n this._open(parseInt(trigger.dataset.mtoVcStepIndex, 10));\n });\n });", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"varianten-waehlen\", \"Vorherigen Schritt anzeigen\"]": { - "abdruck": "df5e60fe148da5e6", - "beleg": "this._nodes.prev.disabled = this._nextUsableStep(this._currentStep - 1, -1) === null;", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"vorschau-zeigen\", \"Bild wählen\"]": { - "abdruck": "ab1e74251036541a", - "beleg": "thumb.className = `mto-vc-thumb${index === this._galleryIndex ? ' is-active' : ''}`;", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"vorschau-zeigen\", \"Galerie blättern\"]": { - "abdruck": "6b28a5866629b878", - "beleg": "_stepGallery(delta) {\n if (this._gallery.length < 2) {\n return;\n }\n const count = this._gallery.length;\n this._galleryIndex = (this._galleryIndex + delta + count) % count;\n this._renderGallery();\n }", - "datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js" - }, - "[\"vorschau-zeigen\", \"Vorschau laden\"]": { - "abdruck": "413024bc244f7770", - "beleg": "return new JsonResponse($this->variantResolveService->resolveVariant($variantId, $context));", - "datei": "src/Storefront/Controller/VariantConfiguratorController.php" - } - }, - "ohne_code": {}, - "ohne_karte": {}, - "paare": { - "[\"[\\\"auswahl-anstossen\\\", \\\"Gewählte Option anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Hinweistext anzeigen\\\"]\"]": { - "abdruck": "450345e8a27f5695", - "gleich": false - }, - "[\"[\\\"auswahl-anstossen\\\", \\\"Gewählte Option anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Schrittnummer anzeigen\\\"]\"]": { - "abdruck": "60008fdb6d69349b", - "gleich": false - }, - "[\"[\\\"auswahl-anstossen\\\", \\\"Hinweistext anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Schrittnummer anzeigen\\\"]\"]": { - "abdruck": "3eaf19062d6d53a3", - "gleich": false - }, - "[\"[\\\"beratung-anbieten\\\", \\\"Beratung erreichen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\"]": { - "abdruck": "9d3da3bf8c127ae1", - "gleich": false - }, - "[\"[\\\"beratung-anbieten\\\", \\\"Beratung erreichen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Vertrauen zeigen\\\"]\"]": { - "abdruck": "2c3c62cb4b935c56", - "gleich": false - }, - "[\"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Vertrauen zeigen\\\"]\"]": { - "abdruck": "bf601d5dc7c6c507", - "gleich": false - }, - "[\"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": { - "abdruck": "bc9dc09e54b78a75", - "gleich": false - }, - "[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\"]": { - "abdruck": "5a4d802d668ddd55", - "gleich": false - }, - "[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": { - "abdruck": "eeed78a6284711f1", - "gleich": false - }, - "[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": { - "abdruck": "b4944e5aa4df871a", - "gleich": false - }, - "[\"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": { - "abdruck": "b91bdff82a120a8d", - "gleich": false - }, - "[\"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": { - "abdruck": "97268714e2b5d989", - "gleich": false - }, - "[\"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": { - "abdruck": "b52cedd4106ee837", - "gleich": false - }, - "[\"[\\\"option-ansehen\\\", \\\"Ansicht schließen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Option aus Ansicht wählen\\\"]\"]": { - "abdruck": "caa5ce4c5ff31774", - "gleich": false - }, - "[\"[\\\"option-ansehen\\\", \\\"Ansicht schließen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Optionsdetail öffnen\\\"]\"]": { - "abdruck": "462a46d7a2030874", - "gleich": false - }, - "[\"[\\\"option-ansehen\\\", \\\"Option aus Ansicht wählen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Optionsdetail öffnen\\\"]\"]": { - "abdruck": "8f695dfd90060204", - "gleich": false - }, - "[\"[\\\"schritt-zeigen\\\", \\\"Eigenschaft benennen\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Optionen auflisten\\\"]\"]": { - "abdruck": "5372df6b482e9a5c", - "gleich": false - }, - "[\"[\\\"schritt-zeigen\\\", \\\"Eigenschaft benennen\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Schrittstand anzeigen\\\"]\"]": { - "abdruck": "732d371c2135b53f", - "gleich": false - }, - "[\"[\\\"schritt-zeigen\\\", \\\"Optionen auflisten\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Schrittstand anzeigen\\\"]\"]": { - "abdruck": "590d6974e948c69c", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\"]": { - "abdruck": "34e23fca918e5dc0", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\"]": { - "abdruck": "eb521941a5dc979a", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": { - "abdruck": "271109c8b42cf5d5", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": { - "abdruck": "618d3c213492555a", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": { - "abdruck": "b45252ce7cc39ed9", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": { - "abdruck": "d7ade9bdd7d0c66e", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\"]": { - "abdruck": "97ceded85ca2035c", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": { - "abdruck": "ba83ab596b72af22", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": { - "abdruck": "6f23248b5fbd7be4", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": { - "abdruck": "7350e93a2a368ac1", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": { - "abdruck": "50753ef9f3d5c8b5", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": { - "abdruck": "b49e65e1c60b5307", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": { - "abdruck": "b165f28b36fc3637", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": { - "abdruck": "0bf509fed71f1c25", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": { - "abdruck": "de5acdbf92511e14", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": { - "abdruck": "7c9a06867c701267", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": { - "abdruck": "f45378da83876bae", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": { - "abdruck": "9fc4c9cf8ae1d7fb", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": { - "abdruck": "a71f8b8b92d1025c", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": { - "abdruck": "e3270a7176c63620", - "gleich": false - }, - "[\"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": { - "abdruck": "44e775b8e8b106d1", - "gleich": false - }, - "[\"[\\\"vorschau-zeigen\\\", \\\"Bild wählen\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Galerie blättern\\\"]\"]": { - "abdruck": "19851d2901c309a1", - "gleich": false - }, - "[\"[\\\"vorschau-zeigen\\\", \\\"Bild wählen\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Vorschau laden\\\"]\"]": { - "abdruck": "508415e6500f9fca", - "gleich": false - }, - "[\"[\\\"vorschau-zeigen\\\", \\\"Galerie blättern\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Vorschau laden\\\"]\"]": { - "abdruck": "86aa1f412d5a5dcd", - "gleich": false - } - }, - "stil": { - "[\"auswahl-anstossen\", \"\"]": { - "abdruck": "aeec25973dafe92f", - "probleme": [] - }, - "[\"auswahl-anstossen\", \"Gewählte Option anzeigen\"]": { - "abdruck": "59058982f7989af8", - "probleme": [] - }, - "[\"auswahl-anstossen\", \"Hinweistext anzeigen\"]": { - "abdruck": "b3568e0a2585d71c", - "probleme": [] - }, - "[\"auswahl-anstossen\", \"Schrittnummer anzeigen\"]": { - "abdruck": "117d58f0d4b21973", - "probleme": [] - }, - "[\"beratung-anbieten\", \"\"]": { - "abdruck": "4b0267b165360857", - "probleme": [] - }, - "[\"beratung-anbieten\", \"Beratung erreichen\"]": { - "abdruck": "cfdb65d682c3e068", - "probleme": [] - }, - "[\"beratung-anbieten\", \"Optionsübersicht öffnen\"]": { - "abdruck": "28d5587c78199c54", - "probleme": [] - }, - "[\"beratung-anbieten\", \"Vertrauen zeigen\"]": { - "abdruck": "8c00dec8d3ebf751", - "probleme": [] - }, - "[\"layout-zuweisen\", \"\"]": { - "abdruck": "1e0d2ca5296aabea", - "probleme": [] - }, - "[\"layout-zuweisen\", \"Konfigurator aktivieren\"]": { - "abdruck": "dca9bbf7361f5520", - "probleme": [] - }, - "[\"layout-zuweisen\", \"Optionsbild am Datensatz pflegen\"]": { - "abdruck": "cc0701aafd02ac3a", - "probleme": [] - }, - "[\"layout-zuweisen\", \"Optionsübersicht hinterlegen\"]": { - "abdruck": "de6c0e3e80d47496", - "probleme": [] - }, - "[\"layout-zuweisen\", \"Trust-Logo hinterlegen\"]": { - "abdruck": "ebd1a72ece157e69", - "probleme": [] - }, - "[\"option-ansehen\", \"\"]": { - "abdruck": "ace46c77101e26b3", - "probleme": [] - }, - "[\"option-ansehen\", \"Ansicht schließen\"]": { - "abdruck": "6bdaf5e60fb3baa9", - "probleme": [] - }, - "[\"option-ansehen\", \"Option aus Ansicht wählen\"]": { - "abdruck": "cc10af5dda4a7857", - "probleme": [] - }, - "[\"option-ansehen\", \"Optionsdetail öffnen\"]": { - "abdruck": "e00d07ce7b75d8fc", - "probleme": [] - }, - "[\"schritt-zeigen\", \"\"]": { - "abdruck": "f0d53ef421968759", - "probleme": [] - }, - "[\"schritt-zeigen\", \"Eigenschaft benennen\"]": { - "abdruck": "ec4828e2e9197083", - "probleme": [] - }, - "[\"schritt-zeigen\", \"Optionen auflisten\"]": { - "abdruck": "d8e6daed0f36098f", - "probleme": [] - }, - "[\"schritt-zeigen\", \"Schrittstand anzeigen\"]": { - "abdruck": "42a1c7f94c30f72d", - "probleme": [] - }, - "[\"varianten-waehlen\", \"\"]": { - "abdruck": "0835908894fa892c", - "probleme": [] - }, - "[\"varianten-waehlen\", \"Auswahl übernehmen\"]": { - "abdruck": "6683956c63370244", - "probleme": [] - }, - "[\"varianten-waehlen\", \"Konfigurationsdaten bereitstellen\"]": { - "abdruck": "498f3141e86f8db0", - "probleme": [] - }, - "[\"varianten-waehlen\", \"Konfigurator schließen\"]": { - "abdruck": "866918b327061449", - "probleme": [] - }, - "[\"varianten-waehlen\", \"Nächsten Schritt anzeigen\"]": { - "abdruck": "8d810a760dfec037", - "probleme": [] - }, - "[\"varianten-waehlen\", \"Option wählen\"]": { - "abdruck": "ac4eae399ac3a15e", - "probleme": [] - }, - "[\"varianten-waehlen\", \"Schritt öffnen\"]": { - "abdruck": "40f795456747214e", - "probleme": [] - }, - "[\"varianten-waehlen\", \"Vorherigen Schritt anzeigen\"]": { - "abdruck": "a63a26a8baea9c07", - "probleme": [] - }, - "[\"vorschau-zeigen\", \"\"]": { - "abdruck": "52976631fd09993a", - "probleme": [] - }, - "[\"vorschau-zeigen\", \"Bild wählen\"]": { - "abdruck": "a3e980ef7678a446", - "probleme": [] - }, - "[\"vorschau-zeigen\", \"Galerie blättern\"]": { - "abdruck": "47ccb441120c1470", - "probleme": [] - }, - "[\"vorschau-zeigen\", \"Vorschau laden\"]": { - "abdruck": "29e5951f170dba26", - "probleme": [] - } - }, - "verworfen": {} -} diff --git a/daten/MtoVariantConfigurator/.planung/.verlauf.json b/daten/MtoVariantConfigurator/.planung/.verlauf.json deleted file mode 100644 index 1135079..0000000 --- a/daten/MtoVariantConfigurator/.planung/.verlauf.json +++ /dev/null @@ -1,122 +0,0 @@ -[ - { - "titel": "„Lightbox“ geändert", - "dateien": { - "lightbox": "\nLightbox\n----------------------------------------\n\nkern\n----------------------------------------\n\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n\nAuswahl bestätigen\n\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option ist markiert\n- Lightbox geschlossen\n----------------------------------------\n\nKonfigurator schließen\n\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n\n- Option mit Bildauswahl öffnet die Lightbox\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n\nLightbox schließen\n\nEntfernt die vergrößerte Produktansicht wieder\n\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n\n- Modal öffnen\n- Option mit Bild wählen\n- Leinwand-Icon klicken\n- Lightbox sichtbar\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n\nLightbox öffnen\n\nZeigt das Produktfoto einer Variante option in Originalgröße\n\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n\nTastatur verwenden\n\nBedient Modal und Lightbox per Tastatur\n\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n" - } - }, - { - "titel": "„Konfigurator“ geändert", - "dateien": { - "konfigurator": "\nKonfigurator\n----------------------------------------\n\nkern\n----------------------------------------\n\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n\nGeführte Konfiguration aktivieren\n\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n\nKonfigurationsdaten abrufen\n\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator.\n\n- GET /mto-variant-configurator/resolve/{productId}\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n\n- GET /mto-variant-configurator/resolve/STRG-PRODUKT-ID?options=[{\"optionId\":\"farbe\",\"option\":\"rot\"}]\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n\nKonfigurator öffnen\n\nÖffnet den Konfigurator ab einem gewählten Schritt\n\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n\nKonfigurator-Karte registrieren\n\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n\nPlugin registrieren\n\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n" - } - }, - { - "titel": "„Konfigurator“ geändert", - "dateien": { - "konfigurator": "\nKonfigurator\n----------------------------------------\n\nkern\n----------------------------------------\n\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n\nGeführte Konfiguration aktivieren\n\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n\nKonfigurationsdaten abrufen\n\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator\n\n- GET /mto-variant-configurator/resolve/{productId}\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n\n- GET /mto-variant-configurator/resolve/STRG-PRODUKT-ID?options=[{\"optionId\":\"farbe\",\"option\":\"rot\"}]\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n\nKonfigurator öffnen\n\nÖffnet den Konfigurator ab einem gewählten Schritt\n\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n\nKonfigurator-Karte registrieren\n\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n\nPlugin registrieren\n\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n" - } - }, - { - "titel": "„Konfigurator“ geändert", - "dateien": { - "konfigurator": "\nKonfigurator\n----------------------------------------\n\nkern\n----------------------------------------\n\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n\nGeführte Konfiguration aktivieren\n\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n\nKonfigurationsdaten abrufen\n\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator\n\n- Endpoint mto-variant-configurator resolve\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n\n- GET /mto-variant-configurator/resolve/STRG-PRODUKT-ID?options=[{\"optionId\":\"farbe\",\"option\":\"rot\"}]\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n\nKonfigurator öffnen\n\nÖffnet den Konfigurator ab einem gewählten Schritt\n\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n\nKonfigurator-Karte registrieren\n\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n\nPlugin registrieren\n\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n" - } - }, - { - "titel": "„Galerie“ geändert", - "dateien": { - "galerie": "\nGalerie\n----------------------------------------\n\nkern\n----------------------------------------\n\nErmöglicht das Anzeigen und Durchblättern von Produktbildern im Konfigurator-Modal\n----------------------------------------\n\n- Einzelne Galerie pro Modal\n- Navigiert zyklisch\n- Ein Bild deaktiviert Navigation\n- Hauptbild über thumbnails aktualisierbar\n----------------------------------------\n\nGalerie nächste anzeigen\n\nZeigt das nächste Bild der Galerie\n\n- Mindestens 2 Bilder vorhanden\n- Zyklisch von letztem zu erstem Bild\n\n- Auf next-Button klicken\n- Nächstes Bild wird angezeigt\n----------------------------------------\n\nGalerie rückwärts blättern\n\nVorheriges Bild der Galerie anzeigen\n\n- Nur mit mindestens zwei Bildern\n- Springt von erstem zum letzten Bild\n- Aktualisiert Miniaturansicht\n\n- Vollmodus öffnen\n- Klick auf Vorheriges-Bild-Icon\n- Erstes Bild zeigt\n----------------------------------------\n\nGalerie vorherige anzeigen\n\nBlendet das vorherige Bild der Galerie ein\n\n- mto-vc-gallery-prev-Icon\n- Bei nur einem Bild keine Wirkung\n\n- Galerie mit mindestens zwei Bildern öffnen\n- LMB auf mto-vc-gallery-prev-Icon\n- Vorheriges Bild im Stage-Image angezeigt\n----------------------------------------\n\nGalerie vorwärts blättern\n\nZeigt das nächste Bild der Galerie\n\n- Geht bei weniger als zwei Bildern nicht\n- Springt vom letzten zum ersten Bild\n\n- Modal öffnen\n- Klick auf gallery-next\n- Nächstes Bild wird angezeigt\n- Klick erneut bei letztem Bild\n- Erstes Bild wird angezeigt\n----------------------------------------\n\nThumbnail auswählen\n\nGreift direkt auf ein Produktbild zu, ohne durch die Galerie zu blättern\n\n- Aktives Thumbnail zeigt x-Icon\n- Klick aktualisiert Hauptbild und Aktivzustand\n\n- Galerie mit mehreren Thumbnails öffnen\n- Klick auf Thumbnail\n- Hauptbild entspricht geklicktem Thumbnail\n" - } - }, - { - "titel": "„Lightbox“ geändert", - "dateien": { - "lightbox": "\nLightbox\n----------------------------------------\n\nkern\n----------------------------------------\n\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n\nAuswahl bestätigen\n\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n\nKonfigurator schließen\n\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n\n- Option mit Bildauswahl öffnet die Lightbox\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n\nLightbox schließen\n\nEntfernt die vergrößerte Produktansicht wieder\n\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n\n- Modal öffnen\n- Option mit Bild wählen\n- Leinwand-Icon klicken\n- Lightbox sichtbar\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n\nLightbox öffnen\n\nZeigt das Produktfoto einer Variante option in Originalgröße\n\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n\nTastatur verwenden\n\nBedient Modal und Lightbox per Tastatur\n\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n" - } - }, - { - "titel": "„Produkt“ geändert", - "dateien": { - "produkt": "\nProdukt\n----------------------------------------\n\nkern\n----------------------------------------\n\nStellt dem Produkttemplate Daten des Variantenkonfigurators bereit\n----------------------------------------\n\n- Inaktiver Konfigurator setzt mtoVariantConfiguratorActive auf false\n- Aktiver Konfigurator weist alle Konfigurator-Variablen zu\n- sw-product-detail-variants wird mit eigener Template-Datei überschrieben\n- mtoVariantConfiguratorTrustLogo fehlt in Regeln und Funktion\n- Produktseite laden: Testschritte beschreiben Ergebnis statt Handlung\n- Variantenansicht erweitern: Funktion hat keine Testschritte, nur Regeln\n----------------------------------------\n\nProduktseite laden\n\nBereitet Variant-Konfigurationsdaten für die Produktseite vor\n\n- mtoVariantConfiguratorActive false bei inaktivem Konfigurator\n- Alle Variablen bei aktivem Konfigurator zugewiesen\n- Initial-Variante für vorausgefülltes Modal geladen\n\n- Produkt mit aktivem Konfigurator öffnen\n- Seite vollständig laden\n- Template-Variablen prüfen\n- Seite ohne Konfigurator öffnen\n- mtoVariantConfiguratorActive ist false\n----------------------------------------\n\nVariantenansicht erweitern\n\nFügt der Produktdetail-Variantenansicht zusätzliche Felder oder Funktionen hinzu\n\n- Überschreibt sw-product-detail-variants\n- Eigene Template-Datei wird geladen\n\n- Produktdetailseite öffnen\n- Varianten-Bereich aufrufen\n- Erweiterte Felder oder Funktionen sichtbar\n" - } - }, - { - "titel": "„Lightbox“ geändert", - "dateien": { - "lightbox": "\nLightbox\n----------------------------------------\n\nkern\n----------------------------------------\n\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n\nAuswahl bestätigen\n\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n\nKonfigurator schließen\n\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n\n- Option mit Bildauswahl öffnet die Lightbox\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n\nLightbox schließen\n\nEntfernt die vergrößerte Produktansicht wieder\n\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n\nLightbox öffnen\n\nZeigt das Produktfoto einer Variante option in Originalgröße\n\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n\nTastatur verwenden\n\nBedient Modal und Lightbox per Tastatur\n\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n" - } - }, - { - "titel": "„Galerie“ geändert", - "dateien": { - "galerie": "\nGalerie\n----------------------------------------\n\nkern\n----------------------------------------\n\nErmöglicht das Anzeigen und Durchblättern von Produktbildern im Konfigurator-Modal\n----------------------------------------\n\n- Einzelne Galerie pro Modal\n- Navigiert zyklisch\n- Ein Bild deaktiviert Navigation\n- Hauptbild über thumbnails aktualisierbar\n----------------------------------------\n\nGalerie nächste anzeigen\n\nZeigt das nächste Bild der Galerie\n\n- Mindestens 2 Bilder vorhanden\n- Zyklisch von letztem zu erstem Bild\n\n- Auf next-Button klicken\n- Nächstes Bild wird angezeigt\n----------------------------------------\n\nGalerie rückwärts blättern\n\nVorheriges Bild der Galerie anzeigen\n\n- Nur mit mindestens zwei Bildern\n- Springt von erstem zum letzten Bild\n- Aktualisiert Miniaturansicht\n\n- Vollmodus öffnen\n- Klick auf Vorheriges-Bild-Icon\n- Erstes Bild zeigt\n----------------------------------------\n\nGalerie vorherige anzeigen\n\nBlendet das vorherige Bild der Galerie ein\n\n- mto-vc-gallery-prev-Icon\n- Bei nur einem Bild keine Wirkung\n\n- Galerie mit mindestens zwei Bildern öffnen\n- LMB auf mto-vc-gallery-prev-Icon\n- Vorheriges Bild im Stage-Image angezeigt\n----------------------------------------\n\nGalerie vorwärts blättern\n\nZeigt das nächste Bild der Galerie\n\n- Geht bei weniger als zwei Bildern nicht\n- Springt vom letzten zum ersten Bild\n\n- Modal öffnen\n- Klick auf gallery-next\n- Nächstes Bild wird angezeigt\n----------------------------------------\n\nThumbnail auswählen\n\nGreift direkt auf ein Produktbild zu, ohne durch die Galerie zu blättern\n\n- Aktives Thumbnail zeigt x-Icon\n- Klick aktualisiert Hauptbild und Aktivzustand\n\n- Galerie mit mehreren Thumbnails öffnen\n- Klick auf Thumbnail\n- Hauptbild entspricht geklicktem Thumbnail\n" - } - }, - { - "titel": "„Lightbox“ geändert", - "dateien": { - "lightbox": "\nLightbox\n----------------------------------------\n\nkern\n----------------------------------------\n\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n\nAuswahl bestätigen\n\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n\nKonfigurator schließen\n\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n\n- LMB auf Option mit Bildauswahl\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n\nLightbox schließen\n\nEntfernt die vergrößerte Produktansicht wieder\n\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n\nLightbox öffnen\n\nZeigt das Produktfoto einer Variante option in Originalgröße\n\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n\nTastatur verwenden\n\nBedient Modal und Lightbox per Tastatur\n\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n" - } - }, - { - "titel": "„Lightbox“ geändert", - "dateien": { - "lightbox": "\nLightbox\n----------------------------------------\n\nkern\n----------------------------------------\n\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n\n- lightboxSelect bestätigt Auswahl\n- lightboxSelect schließt\n- Escape schließt\n- x-Icon schließt\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n\nAuswahl bestätigen\n\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n\nKonfigurator schließen\n\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n\n- LMB auf Option mit Bildauswahl\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n\nLightbox schließen\n\nEntfernt die vergrößerte Produktansicht wieder\n\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n\nLightbox öffnen\n\nZeigt das Produktfoto einer Variante option in Originalgröße\n\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n\nTastatur verwenden\n\nBedient Modal und Lightbox per Tastatur\n\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n" - } - }, - { - "titel": "„Konfigurator“ geändert", - "dateien": { - "konfigurator": "\nKonfigurator\n----------------------------------------\n\nkern\n----------------------------------------\n\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n\nGeführte Konfiguration aktivieren\n\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n\nKonfigurationsdaten abrufen\n\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator\n\n- Endpoint mto-variant-configurator resolve\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n\n- Resolve-Endpunkt mit Produkt-ID und Option aufrufen\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n\nKonfigurator öffnen\n\nÖffnet den Konfigurator ab einem gewählten Schritt\n\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n\nKonfigurator-Karte registrieren\n\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n\nPlugin registrieren\n\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n" - } - }, - { - "titel": "„Lightbox“ geändert", - "dateien": { - "lightbox": "\nLightbox\n----------------------------------------\n\nkern\n----------------------------------------\n\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n\n- lightboxSelect bestätigt Auswahl\n- lightboxSelect schließt\n- Escape schließt\n- x-Icon schließt\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n\nAuswahl bestätigen\n\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n\nKonfigurator schließen\n\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n\n- LMB auf Option mit Bildauswahl\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n\nLightbox schließen\n\nEntfernt die vergrößerte Produktansicht wieder\n\n- x-Icon schließt\n- Escape schließt\n- Zurück zum Dialog gibt Focus\n\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n\nLightbox öffnen\n\nZeigt das Produktfoto einer Variante option in Originalgröße\n\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n\nTastatur verwenden\n\nBedient Modal und Lightbox per Tastatur\n\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n" - } - }, - { - "titel": "„Option ansehen“ geändert", - "dateien": { - "option-ansehen": "\nOption ansehen\n----------------------------------------\n\nkern\n----------------------------------------\n\nDer Kunde prüft eine Option groß, bevor er sie nimmt\n----------------------------------------\n\n- Nur Optionen mit Bild tragen den Hinweis\n- Optionsbilder erscheinen bis zwei Schritte\n- Ansicht liegt über dem Konfigurator\n----------------------------------------\n\nOptionsdetail öffnen\n\nZeigt Bild und Namen einer Option in voller Größe\n\n- i-Icon öffnet die Ansicht\n- Enter öffnet die Ansicht\n- Leertaste öffnet die Ansicht\n\n- Konfigurator öffnen\n- LMB auf i-Icon einer Option\n- Große Ansicht erscheint\n----------------------------------------\n\nOption aus Ansicht wählen\n\nÜbernimmt die betrachtete Option in die Auswahl\n\n- Knopf übernimmt und schließt die Ansicht\n- Schritt bleibt derselbe\n\n- Optionsdetail öffnen\n- LMB auf Wählen-Knopf\n- Option ist gewählt\n----------------------------------------\n\nAnsicht schließen\n\nKehrt zur Optionsliste zurück ohne Auswahl\n\n- x-Icon schließt die Ansicht\n- Escape schließt die Ansicht\n- Konfigurator bleibt offen\n\n- Optionsdetail öffnen\n- Escape drücken\n- Optionsliste erscheint wieder\n" - } - }, - { - "titel": "„Varianten wählen“ geändert", - "dateien": { - "varianten-waehlen": "\nVarianten wählen\n----------------------------------------\n\nkern\n----------------------------------------\n\nDer Kunde findet Schritt für Schritt eine bestellbare Kombination\n----------------------------------------\n\n- Erster Schritt zeigt alle Optionen seiner Eigenschaft\n- Folgeschritte zeigen nur kombinierbare Optionen\n- Reihenfolge der Schritte kommt aus dem Backend\n- Ohne Auswahl greifen die Standardvarianten des Elternartikels\n- Schritte ohne gültige Option werden übersprungen\n- Eine Auswahl wechselt den Schritt nicht\n- Ungültige Folgeauswahl fällt beim Wechsel weg\n- Escape schließt den Konfigurator\n- Tabulator bleibt im Dialog\n----------------------------------------\n\nSchritt öffnen\n\nÖffnet den Konfigurator beim angeklickten Schritt\n\n- LMB auf einen Schritt öffnet das Modal\n- Offener Konfigurator wechselt nur den Schritt\n- Modal hängt am Seitenkörper\n\n- Produktseite öffnen\n- LMB auf zweiten Schritt\n- Modal öffnet bei Schritt 2\n----------------------------------------\n\nOption wählen\n\nÜbernimmt eine Option in die laufende Auswahl\n\n- Gewählte Option ist hervorgehoben\n- Nicht kombinierbare Optionen sind gesperrt\n- Auswahl verwirft ungültige Folgeschritte\n\n- Konfigurator öffnen\n- LMB auf eine Option\n- Option ist hervorgehoben\n----------------------------------------\n\nNächsten Schritt anzeigen\n\nFührt zum nächsten Schritt mit gültigen Optionen\n\n- Weiter-Knopf heißt am letzten Schritt Fertig\n- Leere Schritte werden übersprungen\n\n- Konfigurator öffnen\n- LMB auf Weiter-Knopf\n- Nächster Schritt erscheint\n----------------------------------------\n\nVorherigen Schritt anzeigen\n\nFührt zurück zum letzten Schritt mit Optionen\n\n- Zurück-Knopf ist am ersten Schritt gesperrt\n- Leere Schritte werden übersprungen\n\n- Zum zweiten Schritt gehen\n- LMB auf Zurück-Knopf\n- Erster Schritt erscheint\n----------------------------------------\n\nAuswahl übernehmen\n\nWechselt das Produkt auf die gewählte Variante\n\n- Fertig schreibt die Auswahl in die Auswahlfelder\n- Unbesuchte Schritte bekommen die erste gültige Option\n- Der Variantenwechsel von Shopware führt den Wechsel aus\n\n- Alle Schritte durchgehen\n- LMB auf Fertig-Knopf\n- Seite zeigt die gewählte Variante\n----------------------------------------\n\nKonfigurator schließen\n\nBeendet die Auswahl ohne Wechsel der Variante\n\n- x-Icon schließt das Modal\n- Escape schließt das Modal\n- Fokus kehrt zum Auslöser zurück\n\n- Konfigurator öffnen\n- Escape drücken\n- Modal ist geschlossen\n" - } - }, - { - "titel": "„Vorschau zeigen“ geändert", - "dateien": { - "vorschau-zeigen": "\nVorschau zeigen\n----------------------------------------\n\nkern\n----------------------------------------\n\nDer Kunde sieht Bild und Preis der gewählten Kombination\n----------------------------------------\n\n- Preis stimmt mit dem Preis der Produktseite überein\n- Antwort wird nicht zwischengespeichert\n- Späte Antworten überholter Anfragen werden verworfen\n- Ohne eigene Bilder greifen die Bilder des Elternartikels\n----------------------------------------\n\nVorschau laden\n\nHolt Bilder und Preis zur laufenden Auswahl\n\n- Jede Auswahl löst eine neue Anfrage aus\n- Ohne Treffer bleibt die Produkt-ID als Rückfall\n- Erstes Bild ist das Titelbild der Variante\n\n- Konfigurator öffnen\n- Andere Option wählen\n- Bild und Preis ändern sich\n----------------------------------------\n\nGalerie blättern\n\nZeigt weitere Bilder der gewählten Variante\n\n- Pfeil-Icons blättern vor und zurück\n- Nach dem letzten Bild folgt das erste\n- Bei einem Bild bleibt die Navigation aus\n\n- Konfigurator öffnen\n- LMB auf Vor-Icon\n- Nächstes Bild erscheint\n----------------------------------------\n\nBild wählen\n\nWechselt das große Bild über die Vorschaubilder\n\n- Aktives Vorschaubild ist hervorgehoben\n- Großes Bild folgt der Wahl\n\n- Konfigurator öffnen\n- LMB auf drittes Vorschaubild\n- Großes Bild zeigt dieses Motiv\n" - } - }, - { - "titel": "„Varianten wählen“ geändert", - "dateien": { - "varianten-waehlen": "\nVarianten wählen\n----------------------------------------\n\nkern\n----------------------------------------\n\nDer Kunde findet Schritt für Schritt eine bestellbare Kombination\n----------------------------------------\n\n- Erster Schritt zeigt alle Optionen seiner Eigenschaft\n- Folgeschritte zeigen nur kombinierbare Optionen\n- Der Ablauf trägt beliebig viele Eigenschaften\n- Reihenfolge der Schritte kommt aus dem Backend\n- Ohne Auswahl greifen die Standardvarianten des Elternartikels\n- Schritte ohne gültige Option werden übersprungen\n- Eine Auswahl wechselt den Schritt nicht\n- Ungültige Folgeauswahl fällt beim Wechsel weg\n- Auf kleinen Bildschirmen bleibt der Ablauf derselbe\n- Escape schließt den Konfigurator\n- Tabulator bleibt im Dialog\n----------------------------------------\n\nSchritt öffnen\n\nÖffnet den Konfigurator beim angeklickten Schritt\n\n- LMB auf einen Schritt öffnet das Modal\n- Offener Konfigurator wechselt nur den Schritt\n- Modal hängt am Seitenkörper\n\n- Produktseite öffnen\n- LMB auf zweiten Schritt\n- Modal öffnet bei Schritt 2\n----------------------------------------\n\nOption wählen\n\nÜbernimmt eine Option in die laufende Auswahl\n\n- Gewählte Option ist hervorgehoben\n- Nicht kombinierbare Optionen sind gesperrt\n- Auswahl verwirft ungültige Folgeschritte\n- Schritt bleibt nach der Wahl derselbe\n\n- Konfigurator öffnen\n- LMB auf eine Option\n- Option ist hervorgehoben\n----------------------------------------\n\nNächsten Schritt anzeigen\n\nFührt zum nächsten Schritt mit gültigen Optionen\n\n- Weiter-Knopf heißt am letzten Schritt Fertig\n- Leere Schritte werden übersprungen\n\n- Konfigurator öffnen\n- LMB auf Weiter-Knopf\n- Nächster Schritt erscheint\n----------------------------------------\n\nVorherigen Schritt anzeigen\n\nFührt zurück zum letzten Schritt mit Optionen\n\n- Zurück-Knopf ist am ersten Schritt gesperrt\n- Leere Schritte werden übersprungen\n\n- Zum zweiten Schritt gehen\n- LMB auf Zurück-Knopf\n- Erster Schritt erscheint\n----------------------------------------\n\nAuswahl übernehmen\n\nWechselt das Produkt auf die gewählte Variante\n\n- Fertig schreibt die Auswahl in die Auswahlfelder\n- Unbesuchte Schritte bekommen die erste gültige Option\n- Der Variantenwechsel von Shopware führt den Wechsel aus\n- Die Seite zeigt danach die Adresse der Variante\n\n- Alle Schritte durchgehen\n- LMB auf Fertig-Knopf\n- Produktseite zeigt die gewählte Variante\n----------------------------------------\n\nKonfigurator schließen\n\nBeendet die Auswahl ohne Wechsel der Variante\n\n- x-Icon schließt das Modal\n- Escape schließt das Modal\n- Fokus kehrt zum Auslöser zurück\n\n- Konfigurator öffnen\n- Escape drücken\n- Modal ist geschlossen\n" - } - }, - { - "titel": "„Layout zuweisen“ geändert", - "dateien": { - "layout-zuweisen": "\nLayout zuweisen\n----------------------------------------\n\nkern\n----------------------------------------\n\nEin Händler entscheidet je Produkt, ob die geführte Auswahl erscheint\n----------------------------------------\n\n- Einstellungen liegen auf dem Varianten-Tab des Produkts\n- Werte stehen in den customFields des Produkts\n- Bearbeiten erfordert das Recht product.editor\n- Ohne Zuweisung bleibt das Standardlayout aktiv\n----------------------------------------\n\nKonfigurator aktivieren\n\nSchaltet die geführte Variantenauswahl für ein Produkt frei\n\n- Schalter steht auf dem Varianten-Tab\n- Aktiv ersetzt die Buybox des Produkts\n- Inaktiv zeigt das Standardlayout von Shopware\n\n- Produkt im Admin öffnen\n- Varianten-Tab öffnen\n- Schalter aktivieren und speichern\n- Buybox zeigt die geführte Auswahl\n----------------------------------------\n\nOptionsübersicht hinterlegen\n\nHinterlegt ein PDF mit allen Varianten und Kombinationen\n\n- Medienfeld steht auf dem Varianten-Tab\n- Feld hängt am Hauptartikel\n- Ohne PDF bleibt der Knopf unsichtbar\n\n- Varianten-Tab öffnen\n- PDF im Medienfeld wählen\n- Produkt speichern\n- Modal zeigt den Knopf für Optionen\n----------------------------------------\n\nTrust-Logo hinterlegen\n\nZeigt ein Vertrauenssiegel neben dem Gesamtpreis\n\n- Logo steht in der Plugin-Konfiguration\n- Gilt für den ganzen Verkaufskanal\n- Ohne Logo erscheint nur der Text\n\n- Plugin-Konfiguration öffnen\n- Logo im Medienfeld wählen\n- Modal zeigt das Logo am Preis\n----------------------------------------\n\nOptionsbild zuordnen\n\noffen\n\nHinterlegt je Variante ein Farbbild oder Materialbild\n\n- Zuordnung erfolgt auf Variantenebene\n- Bild erscheint neben der Option im Modal\n\n- Variante im Admin öffnen\n- Bild der Variante zuordnen\n- Modal zeigt das Bild an der Option\n" - } - }, - { - "titel": "„Varianten wählen“ geändert", - "dateien": { - "varianten-waehlen": "\nVarianten wählen\n----------------------------------------\n\nkern\n----------------------------------------\n\nDer Kunde findet Schritt für Schritt eine bestellbare Kombination\n----------------------------------------\n\n- Erster Schritt zeigt alle Optionen seiner Eigenschaft\n- Folgeschritte zeigen nur kombinierbare Optionen\n- Der Ablauf trägt beliebig viele Eigenschaften\n- Reihenfolge der Schritte kommt aus dem Backend\n- Ohne Auswahl greifen die Standardvarianten des Elternartikels\n- Schritte ohne gültige Option werden übersprungen\n- Eine Auswahl wechselt den Schritt nicht\n- Ungültige Folgeauswahl fällt beim Wechsel weg\n- Auf kleinen Bildschirmen bleibt der Ablauf derselbe\n- Escape schließt den Konfigurator\n- Tabulator bleibt im Dialog\n----------------------------------------\n\nSchritt öffnen\n\nÖffnet den Konfigurator beim angeklickten Schritt\n\n- LMB auf einen Schritt öffnet das Modal\n- Offener Konfigurator wechselt nur den Schritt\n- Modal hängt am Seitenkörper\n\n- Produktseite öffnen\n- LMB auf zweiten Schritt\n- Modal öffnet bei Schritt 2\n----------------------------------------\n\nOption wählen\n\nÜbernimmt eine Option in die laufende Auswahl\n\n- Gewählte Option ist hervorgehoben\n- Nicht kombinierbare Optionen sind gesperrt\n- Auswahl verwirft ungültige Folgeschritte\n- Schritt bleibt nach der Wahl derselbe\n\n- Konfigurator öffnen\n- LMB auf eine Option\n- Option ist hervorgehoben\n----------------------------------------\n\nNächsten Schritt anzeigen\n\nFührt zum nächsten Schritt mit gültigen Optionen\n\n- Weiter-Knopf heißt am letzten Schritt Fertig\n- Leere Schritte werden übersprungen\n\n- Konfigurator öffnen\n- LMB auf Weiter-Knopf\n- Nächster Schritt erscheint\n----------------------------------------\n\nVorherigen Schritt anzeigen\n\nFührt zurück zum letzten Schritt mit Optionen\n\n- Zurück-Knopf ist am ersten Schritt gesperrt\n- Leere Schritte werden übersprungen\n\n- Zum zweiten Schritt gehen\n- LMB auf Zurück-Knopf\n- Erster Schritt erscheint\n----------------------------------------\n\nAuswahl übernehmen\n\nWechselt das Produkt auf die gewählte Variante\n\n- Fertig überträgt die Auswahl in die Auswahlfelder\n- Unbesuchte Schritte bekommen die erste gültige Option\n- Shopware führt den Variantenwechsel aus\n\n- Alle Schritte durchgehen\n- LMB auf Fertig-Knopf\n- Produktseite zeigt die gewählte Variante\n----------------------------------------\n\nKonfigurator schließen\n\nBeendet die Auswahl ohne Wechsel der Variante\n\n- x-Icon schließt das Modal\n- Escape schließt das Modal\n- Fokus kehrt zum Auslöser zurück\n\n- Konfigurator öffnen\n- Escape drücken\n- Modal ist geschlossen\n" - } - }, - { - "titel": "„Schritt zeigen“ geändert", - "dateien": { - "schritt-zeigen": "\nSchritt zeigen\n----------------------------------------\n\nkern\n----------------------------------------\n\nDer Kunde weiß im Modal, wo er steht und was er wählt\n----------------------------------------\n\n- Optionen stehen rechts, die Bilder links\n- Lange Optionslisten lassen sich scrollen\n----------------------------------------\n\nEigenschaft benennen\n\nZeigt den Namen der Eigenschaft des aktuellen Schritts\n\n- Name steht als Überschrift über der Liste\n- Name kommt aus der Eigenschaftsgruppe\n\n- Konfigurator öffnen\n- Überschrift nennt die erste Eigenschaft\n----------------------------------------\n\nSchrittstand anzeigen\n\nZeigt den aktuellen Schritt und die Gesamtzahl\n\n- Zähler nennt Schritt und Gesamtzahl\n- Balken wächst mit dem Fortschritt\n- Text kommt aus einem Textbaustein\n\n- Konfigurator öffnen\n- Zähler zeigt 1 von 3\n----------------------------------------\n\nOptionen auflisten\n\nZeigt alle Optionen der Eigenschaft mit Namen und Bild\n\n- Jede Option nennt ihren Namen\n- Bild erscheint nur bis zwei Schritte\n- Ohne Bild erscheint der Farbwert\n- Ohne Farbwert bleibt die Zeile ohne Zeichen\n\n- Konfigurator öffnen\n- Jede Option zeigt ihren Namen\n" - } - } -] diff --git a/daten/MtoVariantConfigurator/.planung/auswahl-anstossen.md b/daten/MtoVariantConfigurator/.planung/auswahl-anstossen.md deleted file mode 100644 index 665f2fa..0000000 --- a/daten/MtoVariantConfigurator/.planung/auswahl-anstossen.md +++ /dev/null @@ -1,49 +0,0 @@ - -Auswahl anstoßen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde erkennt in der Buybox die Reihenfolge der Schritte ----------------------------------------- - -- Jede Eigenschaft bildet einen eigenen Schritt -- Natives Auswahlfeld bleibt für den Variantenwechsel erhalten -- Eigene Darstellung gilt unabhängig vom Anzeigetyp der Eigenschaft -- Ohne aktives Layout erscheint die Standard-Buybox ----------------------------------------- - -Schrittnummer anzeigen - -Zeigt neben jeder Eigenschaft ihre Position im Ablauf - -- Beschriftung nennt das Wort Schritt und die Nummer -- Nummer folgt der Reihenfolge aus dem Backend - -- Produktseite öffnen -- Erste Eigenschaft zeigt Schritt 1 ----------------------------------------- - -Hinweistext anzeigen - -Erklärt dem Kunden, worauf er im Schritt achtet - -- Text kommt aus einem Textbaustein je Schritt -- Leerer Textbaustein blendet den Hinweis aus -- Hinweis hängt an der Nummer statt an der Eigenschaft - -- Textbaustein für Schritt 1 füllen -- Produktseite öffnen -- Hinweis steht unter der Überschrift ----------------------------------------- - -Gewählte Option anzeigen - -Zeigt am Schritt, welche Option gerade gilt - -- Ohne Auswahl steht dort Bitte wählen -- Vorbelegung erscheint ohne Zutun des Kunden - -- Hauptartikel ohne Variante öffnen -- Jeder Schritt nennt eine Option diff --git a/daten/MtoVariantConfigurator/.planung/beratung-anbieten.md b/daten/MtoVariantConfigurator/.planung/beratung-anbieten.md deleted file mode 100644 index c0beeb5..0000000 --- a/daten/MtoVariantConfigurator/.planung/beratung-anbieten.md +++ /dev/null @@ -1,47 +0,0 @@ - -Beratung anbieten ----------------------------------------- - -optional ----------------------------------------- - -Der Kunde findet im Konfigurator Vertrauen und einen Kontakt ----------------------------------------- - -- Alle Texte kommen aus Textbausteinen -- Leerer Textbaustein blendet den Bereich aus ----------------------------------------- - -Vertrauen zeigen - -Zeigt Siegel und Zusage neben dem Gesamtpreis - -- Logo stammt aus der Plugin-Konfiguration -- Ohne Logo bleibt der Text stehen - -- Konfigurator öffnen -- Siegel steht neben dem Preis ----------------------------------------- - -Beratung erreichen - -Bietet eine Telefonnummer für Fragen zur Konfiguration - -- Nummer ist als Telefonlink klickbar -- Leere Nummer blendet den Bereich aus - -- Konfigurator öffnen -- LMB auf die Nummer -- Telefon-App öffnet sich ----------------------------------------- - -Optionsübersicht öffnen - -Öffnet das hinterlegte PDF mit allen Optionen - -- Knopf erscheint nur mit hinterlegtem PDF -- PDF öffnet in einem neuen Tab - -- Konfigurator öffnen -- LMB auf Optionen-Knopf -- PDF öffnet in neuem Tab diff --git a/daten/MtoVariantConfigurator/.planung/layout-zuweisen.md b/daten/MtoVariantConfigurator/.planung/layout-zuweisen.md deleted file mode 100644 index 1e06c7a..0000000 --- a/daten/MtoVariantConfigurator/.planung/layout-zuweisen.md +++ /dev/null @@ -1,69 +0,0 @@ - -Layout zuweisen ----------------------------------------- - -kern ----------------------------------------- - -Ein Händler entscheidet je Produkt, ob die geführte Auswahl erscheint ----------------------------------------- - -- Einstellungen liegen auf dem Varianten-Tab des Produkts -- Werte stehen in den customFields des Produkts -- Bearbeiten erfordert das Recht product.editor -- Ohne Zuweisung bleibt das Standardlayout aktiv ----------------------------------------- - -Konfigurator aktivieren - -Schaltet die geführte Variantenauswahl für ein Produkt frei - -- Schalter steht auf dem Varianten-Tab -- Aktiv ersetzt die Buybox des Produkts -- Inaktiv zeigt das Standardlayout von Shopware - -- Produkt im Admin öffnen -- Varianten-Tab öffnen -- Schalter aktivieren und speichern -- Buybox zeigt die geführte Auswahl ----------------------------------------- - -Optionsübersicht hinterlegen - -Hinterlegt ein PDF mit allen Varianten und Kombinationen - -- Medienfeld steht auf dem Varianten-Tab -- Feld hängt am Hauptartikel -- Ohne PDF bleibt der Knopf unsichtbar - -- Varianten-Tab öffnen -- PDF im Medienfeld wählen -- Produkt speichern -- Modal zeigt den Knopf für Optionen ----------------------------------------- - -Trust-Logo hinterlegen - -Zeigt ein Vertrauenssiegel neben dem Gesamtpreis - -- Logo steht in der Plugin-Konfiguration -- Gilt für den ganzen Verkaufskanal -- Ohne Logo erscheint nur der Text - -- Plugin-Konfiguration öffnen -- Logo im Medienfeld wählen -- Modal zeigt das Logo am Preis ----------------------------------------- - -Optionsbild am Datensatz pflegen - -offen - -Hinterlegt das Bild einer Option am Datensatz der Variante - -- Feld liegt im Formular der einzelnen Variante -- Heute stammt das Bild aus der Eigenschaftsgruppe - -- Variante im Admin öffnen -- Bildfeld der Variante füllen -- Variante speichern diff --git a/daten/MtoVariantConfigurator/.planung/option-ansehen.md b/daten/MtoVariantConfigurator/.planung/option-ansehen.md deleted file mode 100644 index bda54d3..0000000 --- a/daten/MtoVariantConfigurator/.planung/option-ansehen.md +++ /dev/null @@ -1,51 +0,0 @@ - -Option ansehen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde prüft eine Option groß, bevor er sie nimmt ----------------------------------------- - -- Nur Optionen mit Bild tragen den Hinweis -- Ansicht liegt über dem Konfigurator ----------------------------------------- - -Optionsdetail öffnen - -Zeigt Bild und Namen einer Option in voller Größe - -- i-Icon öffnet die Ansicht -- Enter öffnet die Ansicht -- Leertaste öffnet die Ansicht - -- Konfigurator öffnen -- LMB auf i-Icon einer Option -- Große Ansicht erscheint ----------------------------------------- - -Option aus Ansicht wählen - -Übernimmt die betrachtete Option in die Auswahl - -- Knopf übernimmt die Option -- Knopf schließt die Ansicht -- Schritt bleibt derselbe - -- Optionsdetail öffnen -- LMB auf Wählen-Knopf -- Option ist gewählt ----------------------------------------- - -Ansicht schließen - -Kehrt zur Optionsliste zurück ohne Auswahl - -- x-Icon schließt die Ansicht -- Escape schließt die Ansicht -- Konfigurator bleibt offen - -- Optionsdetail öffnen -- Escape drücken -- Optionsliste erscheint wieder diff --git a/daten/MtoVariantConfigurator/.planung/schritt-zeigen.md b/daten/MtoVariantConfigurator/.planung/schritt-zeigen.md deleted file mode 100644 index 3ceb620..0000000 --- a/daten/MtoVariantConfigurator/.planung/schritt-zeigen.md +++ /dev/null @@ -1,49 +0,0 @@ - -Schritt zeigen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde weiß im Modal, wo er steht und was er wählt ----------------------------------------- - -- Optionen stehen rechts -- Bilder links -- Lange Optionslisten lassen sich scrollen ----------------------------------------- - -Eigenschaft benennen - -Zeigt den Namen der Eigenschaft des aktuellen Schritts - -- Name steht als Überschrift über der Liste -- Name kommt aus der Eigenschaftsgruppe - -- Konfigurator öffnen -- Überschrift nennt die erste Eigenschaft ----------------------------------------- - -Schrittstand anzeigen - -Zeigt den aktuellen Schritt und die Gesamtzahl - -- Zähler nennt Schritt und Gesamtzahl -- Balken wächst mit dem Fortschritt -- Text kommt aus einem Textbaustein - -- Konfigurator öffnen -- Zähler zeigt 1 von 3 ----------------------------------------- - -Optionen auflisten - -Zeigt alle Optionen der Eigenschaft mit Namen und Bild - -- Jede Option nennt ihren Namen -- Bild erscheint nur bis zwei Schritte -- Ohne Bild erscheint der Farbwert -- Ohne Farbwert bleibt die Zeile ohne Zeichen - -- Konfigurator öffnen -- Jede Option zeigt ihren Namen diff --git a/daten/MtoVariantConfigurator/.planung/varianten-waehlen.md b/daten/MtoVariantConfigurator/.planung/varianten-waehlen.md deleted file mode 100644 index c732ab7..0000000 --- a/daten/MtoVariantConfigurator/.planung/varianten-waehlen.md +++ /dev/null @@ -1,109 +0,0 @@ - -Varianten wählen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde findet Schritt für Schritt eine bestellbare Kombination ----------------------------------------- - -- Erster Schritt zeigt alle Optionen seiner Eigenschaft -- Folgeschritte zeigen nur kombinierbare Optionen -- Der Ablauf trägt beliebig viele Eigenschaften -- Reihenfolge der Schritte kommt aus dem Backend -- Ohne Auswahl greifen die Standardvarianten des Elternartikels -- Schritte ohne gültige Option werden übersprungen -- Eine Auswahl wechselt den Schritt nicht -- Ungültige Folgeauswahl fällt beim Wechsel weg -- Auf kleinen Bildschirmen bleibt der Ablauf derselbe -- Escape schließt den Konfigurator -- Tabulator bleibt im Dialog ----------------------------------------- - -Schritt öffnen - -Öffnet den Konfigurator beim angeklickten Schritt - -- LMB auf einen Schritt öffnet das Modal -- Offener Konfigurator wechselt nur den Schritt -- Modal hängt am Seitenkörper - -- Produktseite öffnen -- LMB auf zweiten Schritt -- Modal öffnet bei Schritt 2 ----------------------------------------- - -Option wählen - -Übernimmt eine Option in die laufende Auswahl - -- Gewählte Option ist hervorgehoben -- Nicht kombinierbare Optionen sind gesperrt -- Auswahl verwirft ungültige Folgeschritte -- Schritt bleibt nach der Wahl derselbe - -- Konfigurator öffnen -- LMB auf eine Option -- Option ist hervorgehoben ----------------------------------------- - -Nächsten Schritt anzeigen - -Führt zum nächsten Schritt mit gültigen Optionen - -- Weiter-Knopf heißt am letzten Schritt Fertig -- Leere Schritte werden übersprungen - -- Konfigurator öffnen -- LMB auf Weiter-Knopf -- Nächster Schritt erscheint ----------------------------------------- - -Vorherigen Schritt anzeigen - -Führt zurück zum letzten Schritt mit Optionen - -- Zurück-Knopf ist am ersten Schritt gesperrt -- Leere Schritte werden übersprungen - -- Zum zweiten Schritt gehen -- LMB auf Zurück-Knopf -- Erster Schritt erscheint ----------------------------------------- - -Auswahl übernehmen - -Wechselt das Produkt auf die gewählte Variante - -- Fertig überträgt die Auswahl in die Auswahlfelder -- Unbesuchte Schritte bekommen die erste gültige Option -- Shopware führt den Variantenwechsel aus - -- Alle Schritte durchgehen -- LMB auf Fertig-Knopf -- Produktseite zeigt die gewählte Variante ----------------------------------------- - -Konfigurator schließen - -Beendet die Auswahl ohne Wechsel der Variante - -- x-Icon schließt das Modal -- Escape schließt das Modal -- Fokus kehrt zum Auslöser zurück - -- Konfigurator öffnen -- Escape drücken -- Modal ist geschlossen ----------------------------------------- - -Konfigurationsdaten bereitstellen - -Legt der Produktseite alles bei, was der Konfigurator braucht - -- Kombinationen stammen vom Hauptartikel -- Ohne aktives Layout bleibt die Beilage aus - -- Produktseite mit aktivem Layout öffnen -- Seite trägt Kombinationen und Vorbelegung diff --git a/daten/MtoVariantConfigurator/.planung/vorschau-zeigen.md b/daten/MtoVariantConfigurator/.planung/vorschau-zeigen.md deleted file mode 100644 index d4704fd..0000000 --- a/daten/MtoVariantConfigurator/.planung/vorschau-zeigen.md +++ /dev/null @@ -1,53 +0,0 @@ - -Vorschau zeigen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde sieht Bild und Preis der gewählten Kombination ----------------------------------------- - -- Preis stimmt mit dem Preis der Produktseite überein -- Antwort wird nicht zwischengespeichert -- Späte Antworten überholter Anfragen werden verworfen -- Ohne eigene Bilder greifen die Bilder des Elternartikels ----------------------------------------- - -Vorschau laden - -Holt Bilder und Preis zur laufenden Auswahl - -- Jede Auswahl löst eine neue Anfrage aus -- Titelbild der Variante steht an erster Stelle -- Ohne Treffer bleibt die Produkt-ID als Rückfall - -- Konfigurator öffnen -- Andere Option wählen -- Bild und Preis ändern sich ----------------------------------------- - -Galerie blättern - -Zeigt weitere Bilder der gewählten Variante - -- Pfeil-Icons blättern vor -- Pfeil-Icons blättern zurück -- Nach dem letzten Bild folgt das erste -- Bei einem Bild bleibt die Navigation aus - -- Konfigurator öffnen -- LMB auf Vor-Icon -- Nächstes Bild erscheint ----------------------------------------- - -Bild wählen - -Wechselt das große Bild über die Vorschaubilder - -- Aktives Vorschaubild ist hervorgehoben -- Großes Bild folgt der Wahl - -- Konfigurator öffnen -- LMB auf drittes Vorschaubild -- Großes Bild zeigt dieses Motiv diff --git a/daten/MtoVariantConfigurator/.verzeichnis b/daten/MtoVariantConfigurator/.verzeichnis new file mode 100644 index 0000000..6a49a44 --- /dev/null +++ b/daten/MtoVariantConfigurator/.verzeichnis @@ -0,0 +1 @@ +/home/arbeit/arbeit/BeckhuisSwag6/custom/static-plugins/MtoVariantConfigurator diff --git a/daten/MtoVariantConfigurator/auswahl-anstossen.md b/daten/MtoVariantConfigurator/auswahl-anstossen.md deleted file mode 100644 index 665f2fa..0000000 --- a/daten/MtoVariantConfigurator/auswahl-anstossen.md +++ /dev/null @@ -1,49 +0,0 @@ - -Auswahl anstoßen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde erkennt in der Buybox die Reihenfolge der Schritte ----------------------------------------- - -- Jede Eigenschaft bildet einen eigenen Schritt -- Natives Auswahlfeld bleibt für den Variantenwechsel erhalten -- Eigene Darstellung gilt unabhängig vom Anzeigetyp der Eigenschaft -- Ohne aktives Layout erscheint die Standard-Buybox ----------------------------------------- - -Schrittnummer anzeigen - -Zeigt neben jeder Eigenschaft ihre Position im Ablauf - -- Beschriftung nennt das Wort Schritt und die Nummer -- Nummer folgt der Reihenfolge aus dem Backend - -- Produktseite öffnen -- Erste Eigenschaft zeigt Schritt 1 ----------------------------------------- - -Hinweistext anzeigen - -Erklärt dem Kunden, worauf er im Schritt achtet - -- Text kommt aus einem Textbaustein je Schritt -- Leerer Textbaustein blendet den Hinweis aus -- Hinweis hängt an der Nummer statt an der Eigenschaft - -- Textbaustein für Schritt 1 füllen -- Produktseite öffnen -- Hinweis steht unter der Überschrift ----------------------------------------- - -Gewählte Option anzeigen - -Zeigt am Schritt, welche Option gerade gilt - -- Ohne Auswahl steht dort Bitte wählen -- Vorbelegung erscheint ohne Zutun des Kunden - -- Hauptartikel ohne Variante öffnen -- Jeder Schritt nennt eine Option diff --git a/daten/MtoVariantConfigurator/beratung-anbieten.md b/daten/MtoVariantConfigurator/beratung-anbieten.md deleted file mode 100644 index c0beeb5..0000000 --- a/daten/MtoVariantConfigurator/beratung-anbieten.md +++ /dev/null @@ -1,47 +0,0 @@ - -Beratung anbieten ----------------------------------------- - -optional ----------------------------------------- - -Der Kunde findet im Konfigurator Vertrauen und einen Kontakt ----------------------------------------- - -- Alle Texte kommen aus Textbausteinen -- Leerer Textbaustein blendet den Bereich aus ----------------------------------------- - -Vertrauen zeigen - -Zeigt Siegel und Zusage neben dem Gesamtpreis - -- Logo stammt aus der Plugin-Konfiguration -- Ohne Logo bleibt der Text stehen - -- Konfigurator öffnen -- Siegel steht neben dem Preis ----------------------------------------- - -Beratung erreichen - -Bietet eine Telefonnummer für Fragen zur Konfiguration - -- Nummer ist als Telefonlink klickbar -- Leere Nummer blendet den Bereich aus - -- Konfigurator öffnen -- LMB auf die Nummer -- Telefon-App öffnet sich ----------------------------------------- - -Optionsübersicht öffnen - -Öffnet das hinterlegte PDF mit allen Optionen - -- Knopf erscheint nur mit hinterlegtem PDF -- PDF öffnet in einem neuen Tab - -- Konfigurator öffnen -- LMB auf Optionen-Knopf -- PDF öffnet in neuem Tab diff --git a/daten/MtoVariantConfigurator/hilfe.md b/daten/MtoVariantConfigurator/hilfe.md new file mode 100644 index 0000000..9fcc6be --- /dev/null +++ b/daten/MtoVariantConfigurator/hilfe.md @@ -0,0 +1,40 @@ + +Hilfe +---------------------------------------- + +optional +---------------------------------------- + +Bietet Unterstützung während der Auswahl an +---------------------------------------- + +- Ein Übersichtsdokument ist je Produkt pflegbar +- Ohne Dokument entfällt der Zugang +- Ein Vertrauenslogo ist je Verkaufskanal pflegbar +- Ohne Logo bleibt nur der Text +- Ohne Vertrauenstext bleibt das Logo verborgen +- Alle Texte liegen als Textbausteine bei +- Textbausteine gelten shopweit je Sprache +- Deutsch, Englisch und Niederländisch liegen bei +- Ohne Rufnummer entfällt der Anrufweg +---------------------------------------- + +Übersicht öffnen + +Zeigt alle Kombinationen als Dokument + +- Das Dokument öffnet in einem neuen Reiter + +- Konfigurator öffnen +- LMB auf alle Optionen ansehen +- Dokument im neuen Reiter +---------------------------------------- + +Beratung anrufen + +- Die Rufnummer wird als Anrufweg gesetzt +- Leerzeichen, Striche und Klammern fallen weg + +- Konfigurator öffnen +- LMB auf die Rufnummer +- Anrufweg geöffnet diff --git a/daten/MtoVariantConfigurator/konfigurator.md b/daten/MtoVariantConfigurator/konfigurator.md new file mode 100644 index 0000000..8ec990f --- /dev/null +++ b/daten/MtoVariantConfigurator/konfigurator.md @@ -0,0 +1,100 @@ + +Konfigurator +---------------------------------------- + +kern +---------------------------------------- + +Führt Schritt für Schritt zur passenden Variante +---------------------------------------- + +- Nur bei aktivem Konfigurator-Layout +- Ein Schritt je Eigenschaftsgruppe +- Die Reihenfolge folgt den Gruppen des Produkts +- Ohne Gruppen bleibt der Konfigurator aus +- Nur die Produktdetailseite nutzt ihn +- Ohne Fenster wirken die Schrittzeilen nicht +- Das Fenster hängt am Seitenkörper +- Ein veraltetes Fenster wird entfernt +- Die Seite hinter dem Fenster scrollt nicht +- Ohne Bilder klappt der Bildbereich weg +---------------------------------------- + +Konfigurator öffnen + +Startet die Auswahl bei einem gewählten Schritt + +- Jede Schrittzeile öffnet ihren eigenen Schritt +- Der vorherige Fokus wird gemerkt +- Der Fokus springt auf Weiter +- Die Vorschau wird beim Öffnen geholt + +- Produktseite mit Konfigurator öffnen +- LMB auf eine Schrittzeile +- Fenster mit diesem Schritt sichtbar +---------------------------------------- + +Konfigurator schließen + +- Escape schließt das Fenster +- Ein Klick auf den Hintergrund schließt +- Der Fokus kehrt zum Auslöser zurück +- Die Wahl wird dabei verworfen + +- Konfigurator öffnen +- LMB auf Schließen +- Produktseite wieder sichtbar +---------------------------------------- + +Schritt wechseln + +Bewegt sich vorwärts und rückwärts durch die Schritte + +- Ein Schritt ohne gültige Option wird übersprungen +- Zurück bleibt am ersten Schritt gesperrt +- Der letzte Schritt beschriftet die Schaltfläche um + +- Konfigurator öffnen +- LMB auf Weiter +- Nächster Schritt sichtbar +---------------------------------------- + +Fortschritt ablesen + +Zeigt, an welcher Stelle der Auswahl man steht + +- Der Zähler nennt Schritt und Gesamtzahl +- Der Balken wächst mit dem Schritt +- Beide zählen übersprungene Schritte mit + +- Konfigurator öffnen +- LMB auf Weiter +- Zähler und Balken gewachsen +---------------------------------------- + +Auswahl abschließen + +Übergibt die Auswahl an den Variantenwechsel + +- Ein ausgelassener Schritt wird ergänzt +- Ergänzt wird die erste gültige Option +- Der Wechsel läuft über die Auswahlfelder +- Das Fenster schließt vor dem Wechsel + +- Konfigurator öffnen +- Bis zum letzten Schritt gehen +- LMB auf Fertig +- Produktseite zeigt die Variante +---------------------------------------- + +Mit der Tastatur bedienen + +Hält die Bedienung ohne Maus geschlossen + +- Der Fokus bleibt im Fenster +- Escape schließt zuerst die Großansicht +- Die Steuerung liegt am Dokument + +- Konfigurator öffnen +- Mehrfach Tab drücken +- Fokus bleibt im Fenster diff --git a/daten/MtoVariantConfigurator/layout-zuweisen.md b/daten/MtoVariantConfigurator/layout-zuweisen.md deleted file mode 100644 index 1e06c7a..0000000 --- a/daten/MtoVariantConfigurator/layout-zuweisen.md +++ /dev/null @@ -1,69 +0,0 @@ - -Layout zuweisen ----------------------------------------- - -kern ----------------------------------------- - -Ein Händler entscheidet je Produkt, ob die geführte Auswahl erscheint ----------------------------------------- - -- Einstellungen liegen auf dem Varianten-Tab des Produkts -- Werte stehen in den customFields des Produkts -- Bearbeiten erfordert das Recht product.editor -- Ohne Zuweisung bleibt das Standardlayout aktiv ----------------------------------------- - -Konfigurator aktivieren - -Schaltet die geführte Variantenauswahl für ein Produkt frei - -- Schalter steht auf dem Varianten-Tab -- Aktiv ersetzt die Buybox des Produkts -- Inaktiv zeigt das Standardlayout von Shopware - -- Produkt im Admin öffnen -- Varianten-Tab öffnen -- Schalter aktivieren und speichern -- Buybox zeigt die geführte Auswahl ----------------------------------------- - -Optionsübersicht hinterlegen - -Hinterlegt ein PDF mit allen Varianten und Kombinationen - -- Medienfeld steht auf dem Varianten-Tab -- Feld hängt am Hauptartikel -- Ohne PDF bleibt der Knopf unsichtbar - -- Varianten-Tab öffnen -- PDF im Medienfeld wählen -- Produkt speichern -- Modal zeigt den Knopf für Optionen ----------------------------------------- - -Trust-Logo hinterlegen - -Zeigt ein Vertrauenssiegel neben dem Gesamtpreis - -- Logo steht in der Plugin-Konfiguration -- Gilt für den ganzen Verkaufskanal -- Ohne Logo erscheint nur der Text - -- Plugin-Konfiguration öffnen -- Logo im Medienfeld wählen -- Modal zeigt das Logo am Preis ----------------------------------------- - -Optionsbild am Datensatz pflegen - -offen - -Hinterlegt das Bild einer Option am Datensatz der Variante - -- Feld liegt im Formular der einzelnen Variante -- Heute stammt das Bild aus der Eigenschaftsgruppe - -- Variante im Admin öffnen -- Bildfeld der Variante füllen -- Variante speichern diff --git a/daten/MtoVariantConfigurator/option-ansehen.md b/daten/MtoVariantConfigurator/option-ansehen.md deleted file mode 100644 index bda54d3..0000000 --- a/daten/MtoVariantConfigurator/option-ansehen.md +++ /dev/null @@ -1,51 +0,0 @@ - -Option ansehen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde prüft eine Option groß, bevor er sie nimmt ----------------------------------------- - -- Nur Optionen mit Bild tragen den Hinweis -- Ansicht liegt über dem Konfigurator ----------------------------------------- - -Optionsdetail öffnen - -Zeigt Bild und Namen einer Option in voller Größe - -- i-Icon öffnet die Ansicht -- Enter öffnet die Ansicht -- Leertaste öffnet die Ansicht - -- Konfigurator öffnen -- LMB auf i-Icon einer Option -- Große Ansicht erscheint ----------------------------------------- - -Option aus Ansicht wählen - -Übernimmt die betrachtete Option in die Auswahl - -- Knopf übernimmt die Option -- Knopf schließt die Ansicht -- Schritt bleibt derselbe - -- Optionsdetail öffnen -- LMB auf Wählen-Knopf -- Option ist gewählt ----------------------------------------- - -Ansicht schließen - -Kehrt zur Optionsliste zurück ohne Auswahl - -- x-Icon schließt die Ansicht -- Escape schließt die Ansicht -- Konfigurator bleibt offen - -- Optionsdetail öffnen -- Escape drücken -- Optionsliste erscheint wieder diff --git a/daten/MtoVariantConfigurator/option.md b/daten/MtoVariantConfigurator/option.md new file mode 100644 index 0000000..cc0015e --- /dev/null +++ b/daten/MtoVariantConfigurator/option.md @@ -0,0 +1,63 @@ + +Option +---------------------------------------- + +kern +---------------------------------------- + +Bietet je Schritt nur passende Ausprägungen an +---------------------------------------- + +- Der erste Schritt bietet alles an +- Spätere Schritte hängen an der bisherigen Wahl +- Spätere Schritte sperren unerreichbare Optionen +- Ein Schritt ohne Auswahlfeld wirkt nicht +- Gesperrte Optionen bleiben sichtbar +- Optionsbilder gibt es nur bis zwei Schritte +- Das Bild stammt aus der Konfiguratoreinstellung +- Sonst dient das Bild der Ausprägung +- Ohne Bild dient die Farbe als Merkmal +- Ohne Bild und Farbe steht nur der Name +---------------------------------------- + +Option wählen + +Legt die Ausprägung des aktuellen Schritts fest + +- Die Wahl wechselt den Schritt nicht +- Spätere unpassende Wahlen fallen weg +- Der Fokus bleibt auf der gewählten Zeile + +- Konfigurator öffnen +- LMB auf eine Option +- Option als gewählt markiert +---------------------------------------- + +Option vergrößern + +Zeigt das Optionsbild groß mit Namen + +- Nur Optionen mit Bild sind vergrößerbar +- Enter und Leertaste öffnen ebenfalls + +- Konfigurator öffnen +- LMB auf Mehr Info +- Großansicht mit Bild sichtbar +---------------------------------------- + +Großansicht schließen + +- Escape schließt zuerst die Großansicht + +- Option vergrößern +- LMB auf Schließen +- Optionsliste wieder sichtbar +---------------------------------------- + +Option aus Großansicht wählen + +- Die Großansicht schließt danach + +- Option vergrößern +- LMB auf Option wählen +- Option als gewählt markiert diff --git a/daten/MtoVariantConfigurator/produkt.md b/daten/MtoVariantConfigurator/produkt.md new file mode 100644 index 0000000..9076cee --- /dev/null +++ b/daten/MtoVariantConfigurator/produkt.md @@ -0,0 +1,60 @@ + +Produkt +---------------------------------------- + +kern +---------------------------------------- + +Legt fest, welches Produkt den Konfigurator nutzt +---------------------------------------- + +- Die Einstellung liegt in den Zusatzfeldern +- Die Zusatzfelder bleiben importierbar +- Die Karte sitzt im Reiter Varianten +- Ohne Bearbeitungsrecht bleiben die Felder gesperrt +- Die Felder erscheinen nicht im allgemeinen Bereich +- Installieren und Aktualisieren tun dasselbe +- Eine alte Produktzuordnung wird entfernt +- Deinstallieren räumt die Felder nicht auf +---------------------------------------- + +Konfigurator aktivieren + +Schaltet das geführte Layout für ein Produkt frei + +- Ohne Freischaltung greift das Standardlayout + +- Produkt im Verwaltungsbereich öffnen +- Reiter Varianten wählen +- Schalter umlegen +- Speichern +- Konfigurator auf der Produktseite sichtbar +---------------------------------------- + +Übersichtsdokument hinterlegen + +Verknüpft ein Dokument mit allen Kombinationen + +- Gespeichert wird die Kennung als Text +- Es gibt keine Beziehung zum Medium +- Ein gelöschtes Medium lässt den Zugang verschwinden +- Ein leeres Feld entfernt die Verknüpfung + +- Produkt im Verwaltungsbereich öffnen +- Reiter Varianten wählen +- Dokument wählen +- Speichern +- Zugang im Konfigurator sichtbar +---------------------------------------- + +Vertrauenslogo hinterlegen + +Setzt das Logo neben dem Gesamtpreis + +- Die Einstellung gilt je Verkaufskanal +- Das Logo stammt aus der Medienverwaltung + +- Plugin-Einstellungen öffnen +- Logo wählen +- Speichern +- Logo im Konfigurator sichtbar diff --git a/daten/MtoVariantConfigurator/schritt-zeigen.md b/daten/MtoVariantConfigurator/schritt-zeigen.md deleted file mode 100644 index 3ceb620..0000000 --- a/daten/MtoVariantConfigurator/schritt-zeigen.md +++ /dev/null @@ -1,49 +0,0 @@ - -Schritt zeigen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde weiß im Modal, wo er steht und was er wählt ----------------------------------------- - -- Optionen stehen rechts -- Bilder links -- Lange Optionslisten lassen sich scrollen ----------------------------------------- - -Eigenschaft benennen - -Zeigt den Namen der Eigenschaft des aktuellen Schritts - -- Name steht als Überschrift über der Liste -- Name kommt aus der Eigenschaftsgruppe - -- Konfigurator öffnen -- Überschrift nennt die erste Eigenschaft ----------------------------------------- - -Schrittstand anzeigen - -Zeigt den aktuellen Schritt und die Gesamtzahl - -- Zähler nennt Schritt und Gesamtzahl -- Balken wächst mit dem Fortschritt -- Text kommt aus einem Textbaustein - -- Konfigurator öffnen -- Zähler zeigt 1 von 3 ----------------------------------------- - -Optionen auflisten - -Zeigt alle Optionen der Eigenschaft mit Namen und Bild - -- Jede Option nennt ihren Namen -- Bild erscheint nur bis zwei Schritte -- Ohne Bild erscheint der Farbwert -- Ohne Farbwert bleibt die Zeile ohne Zeichen - -- Konfigurator öffnen -- Jede Option zeigt ihren Namen diff --git a/daten/MtoVariantConfigurator/schrittzeile.md b/daten/MtoVariantConfigurator/schrittzeile.md new file mode 100644 index 0000000..fce3cb0 --- /dev/null +++ b/daten/MtoVariantConfigurator/schrittzeile.md @@ -0,0 +1,30 @@ + +Schrittzeile +---------------------------------------- + +kern +---------------------------------------- + +Zeigt je Gruppe die aktuelle Wahl auf der Seite +---------------------------------------- + +- Eine Zeile je Eigenschaftsgruppe +- Die Zeile nennt Gruppe und Schrittnummer +- Vor dem Start steht eine Aufforderung darin +- Danach steht die Vorauswahl darin +- Ein Hinweistext gibt es bis Schritt fünf +- Ein leerer Hinweistext bleibt verborgen +- Das Auswahlfeld bleibt verborgen im Seitenaufbau +- Das Auswahlfeld trägt den echten Variantenwechsel +---------------------------------------- + +Wahl ablesen + +Zeigt die aktuell gewählte Ausprägung je Gruppe + +- Der Seitenaufbau zeigt die Wahl der Variante +- Fehlt sie, zeigt die Zeile die erste Option + +- Produktseite mit Konfigurator öffnen +- Schrittzeilen lesen +- Gewählte Ausprägung sichtbar diff --git a/daten/MtoVariantConfigurator/variante.md b/daten/MtoVariantConfigurator/variante.md new file mode 100644 index 0000000..dff2279 --- /dev/null +++ b/daten/MtoVariantConfigurator/variante.md @@ -0,0 +1,48 @@ + +Variante +---------------------------------------- + +kern +---------------------------------------- + +Verbindet eine Auswahl mit einem echten Artikel +---------------------------------------- + +- Nur aktive Varianten zählen +- Sichtbarkeit im Verkaufskanal wird nicht geprüft +- Jede Variante nennt ihre Ausprägungen +- Die Vorauswahl kommt aus den Auswahlfeldern +- Vorgaben greifen nur bei leerem Feld +- Die Vorgabe folgt der Hauptvariante +- Sonst gelten die Ausprägungen des Artikels +- Sonst die erste aktive nach Artikelnummer +- Eine Wahl ohne Variante fällt weg +- Die Gruppe bleibt dann ohne Wahl +- Die Auflösung nutzt die Standardsuche +- Ohne Treffer bleibt das Ausgangsprodukt stehen +---------------------------------------- + +Variante auflösen + +Findet den Artikel zur gewählten Zusammenstellung + +- Der Abruf nennt die gewechselte Gruppe +- Eine unlesbare Anfrage gilt als leer + +- Konfigurator öffnen +- Option wählen +- Preis der Variante sichtbar +---------------------------------------- + +Variante übernehmen + +Wechselt die Produktseite auf den Artikel + +- Der Wechsel läuft über den Standardweg +- Ein Signal am letzten geänderten Feld genügt +- Ohne Änderung bleibt die Seite stehen +- Die Übernahme lädt die Produktseite neu + +- Konfigurator öffnen +- Auswahl abschließen +- Produktseite zeigt die Variante diff --git a/daten/MtoVariantConfigurator/varianten-waehlen.md b/daten/MtoVariantConfigurator/varianten-waehlen.md deleted file mode 100644 index c732ab7..0000000 --- a/daten/MtoVariantConfigurator/varianten-waehlen.md +++ /dev/null @@ -1,109 +0,0 @@ - -Varianten wählen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde findet Schritt für Schritt eine bestellbare Kombination ----------------------------------------- - -- Erster Schritt zeigt alle Optionen seiner Eigenschaft -- Folgeschritte zeigen nur kombinierbare Optionen -- Der Ablauf trägt beliebig viele Eigenschaften -- Reihenfolge der Schritte kommt aus dem Backend -- Ohne Auswahl greifen die Standardvarianten des Elternartikels -- Schritte ohne gültige Option werden übersprungen -- Eine Auswahl wechselt den Schritt nicht -- Ungültige Folgeauswahl fällt beim Wechsel weg -- Auf kleinen Bildschirmen bleibt der Ablauf derselbe -- Escape schließt den Konfigurator -- Tabulator bleibt im Dialog ----------------------------------------- - -Schritt öffnen - -Öffnet den Konfigurator beim angeklickten Schritt - -- LMB auf einen Schritt öffnet das Modal -- Offener Konfigurator wechselt nur den Schritt -- Modal hängt am Seitenkörper - -- Produktseite öffnen -- LMB auf zweiten Schritt -- Modal öffnet bei Schritt 2 ----------------------------------------- - -Option wählen - -Übernimmt eine Option in die laufende Auswahl - -- Gewählte Option ist hervorgehoben -- Nicht kombinierbare Optionen sind gesperrt -- Auswahl verwirft ungültige Folgeschritte -- Schritt bleibt nach der Wahl derselbe - -- Konfigurator öffnen -- LMB auf eine Option -- Option ist hervorgehoben ----------------------------------------- - -Nächsten Schritt anzeigen - -Führt zum nächsten Schritt mit gültigen Optionen - -- Weiter-Knopf heißt am letzten Schritt Fertig -- Leere Schritte werden übersprungen - -- Konfigurator öffnen -- LMB auf Weiter-Knopf -- Nächster Schritt erscheint ----------------------------------------- - -Vorherigen Schritt anzeigen - -Führt zurück zum letzten Schritt mit Optionen - -- Zurück-Knopf ist am ersten Schritt gesperrt -- Leere Schritte werden übersprungen - -- Zum zweiten Schritt gehen -- LMB auf Zurück-Knopf -- Erster Schritt erscheint ----------------------------------------- - -Auswahl übernehmen - -Wechselt das Produkt auf die gewählte Variante - -- Fertig überträgt die Auswahl in die Auswahlfelder -- Unbesuchte Schritte bekommen die erste gültige Option -- Shopware führt den Variantenwechsel aus - -- Alle Schritte durchgehen -- LMB auf Fertig-Knopf -- Produktseite zeigt die gewählte Variante ----------------------------------------- - -Konfigurator schließen - -Beendet die Auswahl ohne Wechsel der Variante - -- x-Icon schließt das Modal -- Escape schließt das Modal -- Fokus kehrt zum Auslöser zurück - -- Konfigurator öffnen -- Escape drücken -- Modal ist geschlossen ----------------------------------------- - -Konfigurationsdaten bereitstellen - -Legt der Produktseite alles bei, was der Konfigurator braucht - -- Kombinationen stammen vom Hauptartikel -- Ohne aktives Layout bleibt die Beilage aus - -- Produktseite mit aktivem Layout öffnen -- Seite trägt Kombinationen und Vorbelegung diff --git a/daten/MtoVariantConfigurator/vision.md b/daten/MtoVariantConfigurator/vision.md new file mode 100644 index 0000000..c44c088 --- /dev/null +++ b/daten/MtoVariantConfigurator/vision.md @@ -0,0 +1,48 @@ + +Vision +---------------------------------------- + +vision +---------------------------------------- + +Eine Variante zu finden soll leicht sein, auch bei vielen Kombinationen. +---------------------------------------- + +Schritt für Schritt führen + +Der Kunde entscheidet eine Sache nach der anderen +- Jede Eigenschaft bekommt einen eigenen Schritt +- Der Fortschritt ist jederzeit ablesbar +- Der Weg zurück bleibt offen +---------------------------------------- + +Sackgassen verhindern + +Nur Wege anbieten, die zu einem Artikel führen +- Unerreichbare Ausprägungen bleiben gesperrt +- Eine spätere Wahl passt sich der früheren an +- Am Ende steht ein Artikel aus aktiven Varianten +---------------------------------------- + +Wirkung sofort zeigen + +Bild und Preis folgen jeder Entscheidung +- Die Bilder zeigen die gewählte Zusammenstellung +- Der Preis gilt für den angemeldeten Kunden +- Während der Auswahl wird nicht neu geladen +---------------------------------------- + +Ohne Standard brechen + +Der Shop bleibt in seinen gewohnten Bahnen +- Der Variantenwechsel läuft über den Standardweg +- Das Layout gilt nur für freigeschaltete Produkte +- Einstellungen bleiben mit dem Produkt importierbar +---------------------------------------- + +Beim Zweifel helfen + +Wer unsicher ist, findet Hilfe ohne Umweg +- Eine Übersicht aller Kombinationen ist erreichbar +- Die Beratung ist aus dem Konfigurator erreichbar +- Vertrauenshinweise stehen beim Preis diff --git a/daten/MtoVariantConfigurator/vorschau-zeigen.md b/daten/MtoVariantConfigurator/vorschau-zeigen.md deleted file mode 100644 index d4704fd..0000000 --- a/daten/MtoVariantConfigurator/vorschau-zeigen.md +++ /dev/null @@ -1,53 +0,0 @@ - -Vorschau zeigen ----------------------------------------- - -kern ----------------------------------------- - -Der Kunde sieht Bild und Preis der gewählten Kombination ----------------------------------------- - -- Preis stimmt mit dem Preis der Produktseite überein -- Antwort wird nicht zwischengespeichert -- Späte Antworten überholter Anfragen werden verworfen -- Ohne eigene Bilder greifen die Bilder des Elternartikels ----------------------------------------- - -Vorschau laden - -Holt Bilder und Preis zur laufenden Auswahl - -- Jede Auswahl löst eine neue Anfrage aus -- Titelbild der Variante steht an erster Stelle -- Ohne Treffer bleibt die Produkt-ID als Rückfall - -- Konfigurator öffnen -- Andere Option wählen -- Bild und Preis ändern sich ----------------------------------------- - -Galerie blättern - -Zeigt weitere Bilder der gewählten Variante - -- Pfeil-Icons blättern vor -- Pfeil-Icons blättern zurück -- Nach dem letzten Bild folgt das erste -- Bei einem Bild bleibt die Navigation aus - -- Konfigurator öffnen -- LMB auf Vor-Icon -- Nächstes Bild erscheint ----------------------------------------- - -Bild wählen - -Wechselt das große Bild über die Vorschaubilder - -- Aktives Vorschaubild ist hervorgehoben -- Großes Bild folgt der Wahl - -- Konfigurator öffnen -- LMB auf drittes Vorschaubild -- Großes Bild zeigt dieses Motiv diff --git a/daten/MtoVariantConfigurator/vorschau.md b/daten/MtoVariantConfigurator/vorschau.md new file mode 100644 index 0000000..0437297 --- /dev/null +++ b/daten/MtoVariantConfigurator/vorschau.md @@ -0,0 +1,52 @@ + +Vorschau +---------------------------------------- + +kern +---------------------------------------- + +Zeigt Bilder und Preis der gewählten Zusammenstellung +---------------------------------------- + +- Bilder und Preis kommen vom Server +- Das Deckelbild steht immer vorn +- Weitere Bilder folgen ihrer Position +- Ohne eigene Bilder greifen die des Hauptprodukts +- Der Preis kommt aus dem Verkaufskanal +- Der Preis gilt in der gewählten Währung +- Das Format folgt der aktiven Sprache +- Späte Antworten überholter Abrufe fallen weg +- Die Vorschau wird nie zwischengespeichert +---------------------------------------- + +Vorschau abrufen + +Holt Bilder und Preis zur aktuellen Wahl + +- Der Abruf läuft bei jeder Wahl +- Jeder Abruf springt auf das erste Bild +- Ohne passende Variante gilt das Elternprodukt +- Eine unlesbare Antwort ändert nichts + +- Konfigurator öffnen +- Option wählen +- Bilder und Preis aktualisiert +---------------------------------------- + +Bild wechseln + +- Ein einzelnes Bild lässt sich nicht wechseln +- Nach dem letzten Bild folgt das erste + +- Konfigurator öffnen +- LMB auf nächstes Bild +- Nächstes Bild sichtbar +---------------------------------------- + +Bild aus Leiste wählen + +- Das gewählte Bild ist markiert + +- Konfigurator öffnen +- LMB auf ein Vorschaubild +- Bild in voller Größe sichtbar diff --git a/daten/Planer/.planung/karten-besprechen.md b/daten/Planer/.planung/anweisung.md similarity index 51% rename from daten/Planer/.planung/karten-besprechen.md rename to daten/Planer/.planung/anweisung.md index 984d38e..255c5b9 100644 --- a/daten/Planer/.planung/karten-besprechen.md +++ b/daten/Planer/.planung/anweisung.md @@ -1,61 +1,52 @@ -Karten besprechen +Anweisung ---------------------------------------- optional ---------------------------------------- -Entwickelt Karten im Gespräch mit der KI +Lässt die KI Features aus einer Beschreibung entwerfen ---------------------------------------- -- Die KI schreibt nie selbst in eine Karte +- Die KI schreibt nie selbst in ein Feature - Sie beschreibt den Sollzustand - Was sich ändert, rechnet der Code aus -- Vorschläge sehen aus wie bei der Prüfung - Neue Funktionen gelten als offen -- Das Gespräch überlebt den Neustart - Die letzten 30 Wortmeldungen bleiben -- Gespräch und Prüfung teilen eine Spalte +- Nur Anweisungen oder Prüfung ist offen ---------------------------------------- -Gespräch öffnen +Anweisungen öffnen -- Stift-Icon in der Kopfzeile -- Icon leuchtet bei offenem Gespräch +- Öffnet sich mit der Planung -- LMB auf Stift-Icon -- Gespräch geöffnet +- LMB auf Anweisungen in der Kopfzeile +- Anweisungen geöffnet -Nachricht senden +Anweisung senden Sagt der KI, was das Projekt können soll -- Enter sendet +- Leere Anweisung wird abgelehnt - Eigene Zeile erscheint sofort - Text bleibt bei einem Fehler stehen +- Tippen bleibt während der Antwort möglich - Text eingeben - Enter drücken - Antwort und Vorschläge erscheinen -Vorgeschlagene Karte anlegen +Anweisungen verwerfen -Macht aus einem Umriss eine echte Karte +Streicht alles Gesagte, die Features bleiben -- Gestrichelter Rand vor dem Annehmen +- Rückfrage vor dem Löschen -- LMB auf Haken am Umriss -- Karte angelegt +- LMB auf Verwerfen bei den Anweisungen +- Bestätigen +- Anweisungen geleert -Gespräch verwerfen - -- Löscht nur das Gespräch -- Karten bleiben unberührt +Anweisungen schließen -- LMB auf Papierkorb-Icon -- Gespräch geleert - -Gespräch schließen - -- LMB auf x-Icon +- LMB auf Schließen bei den Anweisungen - Spalte wieder frei diff --git a/daten/Planer/.planung/design.md b/daten/Planer/.planung/design.md deleted file mode 100644 index 54257c1..0000000 --- a/daten/Planer/.planung/design.md +++ /dev/null @@ -1,44 +0,0 @@ - -Design ----------------------------------------- - -optional ----------------------------------------- - -Hält die Oberfläche lesbar und ruhig ----------------------------------------- - -- Karten stapeln sich lückenlos in Spalten -- Lesefeld ist in der Breite gedeckelt -- Leisten scrollen nicht mit -- Schmale Fenster stapeln die Bereiche -- Klickflächen sind mindestens 28 Pixel -- Textkontrast erfüllt die Lesbarkeitsschwelle -- Kontextmenü bleibt im Fenster -- Modal setzt den Fokus ins Eingabefeld -- Escape schließt das Modal ----------------------------------------- - -Eingabe mit Enter bestätigen - -Spart den Weg zum Knopf - -- Gilt in einzeiligen Feldern -- Escape verwirft stattdessen - -- Modal öffnen -- Text eingeben -- Enter drücken -- Eingabe übernommen - -Kontextmenü schließen - -Räumt ein offenes Menü aus dem Weg - -- Klick daneben schließt es -- Escape schließt es -- Ein neues Menü verdrängt das alte - -- RMB auf eine Karte -- LMB daneben -- Menü geschlossen diff --git a/daten/Planer/.planung/feature.md b/daten/Planer/.planung/feature.md new file mode 100644 index 0000000..19ec543 --- /dev/null +++ b/daten/Planer/.planung/feature.md @@ -0,0 +1,90 @@ + +Feature +---------------------------------------- + +kern +---------------------------------------- + +Hält fest, was ein Projekt können soll +---------------------------------------- + +- Eine Markdown-Datei je Feature +- Die Datei ist die Wahrheit +- Titel bestimmt den Dateinamen +- Namensgleichheit bekommt eine Nummer +- Fremde Marker bleiben erhalten +- Sortiert nach Vision, kern, optional +- Innerhalb der Gruppe alphabetisch +---------------------------------------- + +Feature anlegen + +- Titel ist Pflicht + +- RMB auf den Hauptbereich +- Klick auf "Feature erstellen" +- Titel eingeben +- Bestätigen +- Feature angelegt und offen + +Feature öffnen + +Zeigt alle Felder und gibt sie zum Anpassen frei + +- Kompakt bleiben Regeln und Details verborgen +- Höchstens ein Feature offen +- Ein Feature mit Befunden öffnet sich sofort + +- LMB auf ein kompaktes Feature +- LMB auf ein zweites +- Erstes wieder kompakt + +Feature schließen + +- Feature öffnen +- MMB auf das Feature +- Feature wieder kompakt + +Feature anpassen + +Ändert Titel, Ziel oder Regeln + +- Nur im offenen Feature +- Neuer Titel aktualisiert den Dateinamen +- Leerer Titel wird verworfen +- Verlassen speichert +- Escape verwirft + +- Feature öffnen +- LMB auf ein Feld des Features +- Text ändern +- Feature angepasst + +Feature einstufen + +Trennt tragende von verzichtbaren Features + +- Entweder kern oder optional + +- Feature öffnen +- LMB auf die Einstufung +- Einstufung gewechselt + +Feature durchsuchen + +Findet das Feature, ohne alle zu lesen + +- Sucht in allen Feldern +- Zählt Ausgeblendete mit + +- Suchwort eingeben +- Nur passende Features bleiben + +Feature entfernen + +- Rückfrage vor dem Entfernen + +- RMB auf das Feature +- Klick auf "Feature entfernen" +- Bestätigen +- Feature entfernt diff --git a/daten/Planer/.planung/features.md b/daten/Planer/.planung/features.md deleted file mode 100644 index 04d00f8..0000000 --- a/daten/Planer/.planung/features.md +++ /dev/null @@ -1,109 +0,0 @@ - -Features ----------------------------------------- - -kern ----------------------------------------- - -Hält fest, was ein Projekt können soll ----------------------------------------- - -- Eine Markdown-Datei je Feature -- Die Datei ist die Wahrheit -- Titel bestimmt den Dateinamen -- Namensgleichheit bekommt eine Nummer -- Fremde Marker bleiben erhalten -- Alphabetisch sortiert -- Anpassen nur im Vollmodus -- Verlassen speichert -- Escape verwirft ----------------------------------------- - -Anzeigemodus umschalten - -Kompaktmodus zum Lesen, Vollmodus zum Anpassen - -- Standard ist Kompaktmodus -- Vollmodus zeigt alle Felder -- Augen-Icon rechts oben - -- MMB auf Featurecard -- Modus umgeschaltet - -Feature anlegen - -- +-Icon -- Feature öffnet im Vollmodus - -- RMB auf Hauptbereich -- Klick auf "Feature erstellen" -- Namen im Modal eingeben -- Bestätigen mit LMB -- Feature angelegt - -Feature einstufen - -Trennt tragende von verzichtbaren Features - -- Kern blau umrandet -- Optional grün umrandet -- Badge zeigt die Einstufung - -- Vollmodus öffnen -- LMB auf Badge -- Einstufung gewechselt - -Feature durchsuchen - -Findet die Karte, ohne alle zu lesen - -- Sucht in allen Feldern -- Zählt Ausgeblendete mit - -- Suchwort eingeben -- Nur passende Karten bleiben - -Feature entfernen - -- x-Icon - -- RMB auf Featurecard -- Klick auf "Feature entfernen" -- Bestätigen im Modal -- Feature entfernt - -Feature verschieben - -Hängt ein Feature in ein anderes Projekt um - -- Datei wandert -- Datei wird nicht kopiert -- Nur bei mehreren Projekten - -- RMB auf Featurecard -- Klick auf "Feature verschieben" -- Zielprojekt wählen -- Feature verschoben - -Regeln anpassen - -- Vollmodus öffnen -- LMB auf Regeln der Karte -- Text ändern -- Regeln angepasst - -Titel anpassen - -- Aktualisiert den Dateinamen - -- Vollmodus öffnen -- LMB auf Titel der Karte -- Text ändern -- Titel angepasst - -Ziel anpassen - -- Vollmodus öffnen -- LMB auf Ziel der Karte -- Text ändern -- Ziel angepasst diff --git a/daten/Planer/.planung/funktion.md b/daten/Planer/.planung/funktion.md new file mode 100644 index 0000000..7c6e17f --- /dev/null +++ b/daten/Planer/.planung/funktion.md @@ -0,0 +1,66 @@ + +Funktion +---------------------------------------- + +kern +---------------------------------------- + +Zerlegt ein Feature in testbare Stücke mit Stand +---------------------------------------- + +- Gehört zu genau einem Feature +- Eine Regel je Zeile +- Ein Testschritt je Zeile +- Ziel bleibt freiwillig +- Regeln bleiben freiwillig +- Testschritte sind Pflicht +---------------------------------------- + +Funktion anlegen + +- Titel ist Pflicht +- Gilt als gebaut + +- Feature öffnen +- RMB auf das Feature +- Klick auf "Funktion erstellen" +- Titel eingeben +- Bestätigen +- Funktion angelegt + +Funktion anpassen + +Ändert Titel, Ziel, Regeln oder Testschritte + +- Nur im offenen Feature +- Leerer Titel wird verworfen +- Verlassen speichert +- Escape verwirft + +- Feature öffnen +- LMB auf ein Feld der Funktion +- Text ändern +- Funktion angepasst + +Funktion einstufen + +Trennt Bewiesenes von Unbewiesenem + +- Entweder offen oder gebaut +- Offen heißt unbewiesen +- Zurücksetzen bestellt eine Prüfung durch Claude +- Der Agent hakt eine geprüfte Funktion selbst ab + +- Feature öffnen +- LMB auf den Stand +- Stand gewechselt + +Funktion entfernen + +- Rückfrage vor dem Entfernen + +- Feature öffnen +- RMB auf die Funktion +- Klick auf "Funktion entfernen" +- Bestätigen +- Funktion entfernt diff --git a/daten/Planer/.planung/funktionen.md b/daten/Planer/.planung/funktionen.md deleted file mode 100644 index c65e957..0000000 --- a/daten/Planer/.planung/funktionen.md +++ /dev/null @@ -1,98 +0,0 @@ - -Funktionen ----------------------------------------- - -kern ----------------------------------------- - -Zerlegt ein Feature in prüfbare Stücke ----------------------------------------- - -- Gehört zu genau einem Feature -- Offen heißt bestellt, nicht gebaut -- Neue Funktionen von Hand gelten als gebaut -- Reihenfolge frei wählbar -- Ziel bleibt freiwillig -- Regeln bleiben freiwillig -- Testen bleibt freiwillig -- Anpassen nur im Vollmodus -- Verlassen speichert -- Escape verwirft ----------------------------------------- - -Funktion anlegen - -- +-Icon - -- Vollmodus öffnen -- RMB auf Featurecard -- Klick auf "Funktion erstellen" -- Namen im Modal eingeben -- Bestätigen mit LMB -- Funktion angelegt - -Funktion entfernen - -- x-Icon - -- Vollmodus öffnen -- RMB auf Funktion -- Klick auf "Funktion entfernen" -- Bestätigen im Modal -- Funktion entfernt - -Stand umschalten - -Trennt Bestelltes von Gebautem - -- Marke rechts vom Titel -- Offen ist gelb -- Gebaut ist ein Haken -- Kompakt erscheint nur die offene Marke - -- Vollmodus öffnen -- LMB auf die Marke -- Stand gewechselt - -Funktion verschieben - -Bringt die Schritte in ihre natürliche Folge - -- Reihenfolge steht in der Datei - -- Vollmodus öffnen -- RMB auf Funktion -- Klick auf "Nach oben" -- Funktion verschoben - -Titel anpassen - -- Vollmodus öffnen -- LMB auf Funktionstitel -- Text ändern -- Titel angepasst - -Ziel anpassen - -- Vollmodus öffnen -- LMB auf Ziel der Funktion -- Text ändern -- Ziel angepasst - -Regeln anpassen - -- Eine Regel je Zeile - -- Vollmodus öffnen -- LMB auf Regeln der Funktion -- Text ändern -- Regeln angepasst - -Testschritte anpassen - -- Ein Schritt je Zeile - -- Vollmodus öffnen -- LMB auf Testen der Funktion -- Text ändern -- Testschritte angepasst diff --git a/daten/Planer/.planung/k1-1024.png b/daten/Planer/.planung/k1-1024.png index 2a67485..b06955a 100644 Binary files a/daten/Planer/.planung/k1-1024.png and b/daten/Planer/.planung/k1-1024.png differ diff --git a/daten/Planer/.planung/k1-1280.png b/daten/Planer/.planung/k1-1280.png index a37b08c..a44f5e6 100644 Binary files a/daten/Planer/.planung/k1-1280.png and b/daten/Planer/.planung/k1-1280.png differ diff --git a/daten/Planer/.planung/k1-1600.png b/daten/Planer/.planung/k1-1600.png index 4ac7549..33a3e60 100644 Binary files a/daten/Planer/.planung/k1-1600.png and b/daten/Planer/.planung/k1-1600.png differ diff --git a/daten/Planer/.planung/k1-390.png b/daten/Planer/.planung/k1-390.png index 2132bc6..0b6ef75 100644 Binary files a/daten/Planer/.planung/k1-390.png and b/daten/Planer/.planung/k1-390.png differ diff --git a/daten/Planer/.planung/k1-640.png b/daten/Planer/.planung/k1-640.png index 3041925..a40822e 100644 Binary files a/daten/Planer/.planung/k1-640.png and b/daten/Planer/.planung/k1-640.png differ diff --git a/daten/Planer/.planung/k1-820.png b/daten/Planer/.planung/k1-820.png index 485f121..42f2614 100644 Binary files a/daten/Planer/.planung/k1-820.png and b/daten/Planer/.planung/k1-820.png differ diff --git a/daten/Planer/.planung/karten-pruefen.md b/daten/Planer/.planung/karten-pruefen.md deleted file mode 100644 index cd0ae23..0000000 --- a/daten/Planer/.planung/karten-pruefen.md +++ /dev/null @@ -1,82 +0,0 @@ - -Karten prüfen ----------------------------------------- - -optional ----------------------------------------- - -Meldet, wo eine Karte vom Soll abweicht ----------------------------------------- - -- Ein Lauf je Projekt -- Ergebnis überlebt keinen Neustart -- Zugang steht in .env -- Fehlender Zugang bricht sichtbar ab -- Jeder Vorschlag ist für sich anwendbar -- Jeder Vorschlag nennt seinen Beleg -- Eine Katalogdatei je Feld im Ordner stil -- Neue Katalogdatei wirkt ohne Codeänderung ----------------------------------------- - -Alle Vorschläge annehmen - -- Haken-Icon oben in der Karte -- Zahl nennt die Menge - -- Prüfung durchlaufen lassen -- LMB auf Haken-Icon der Karte -- Alle Vorschläge übernommen - -Alle Vorschläge verwerfen - -- x-Icon oben in der Karte - -- Prüfung durchlaufen lassen -- LMB auf x-Icon der Karte -- Alle Vorschläge verworfen - -Problemstelle anspringen - -Führt vom Panel-Eintrag zur betroffenen Karte - -- Karte blitzt kurz auf - -- Prüfung durchlaufen lassen -- LMB auf Eintrag im Panel -- Karte im Editor sichtbar - -Prüfung beenden - -- x-Icon oben im Panel - -- Prüfung durchlaufen lassen -- LMB auf x-Icon im Panel -- Panel geschlossen - -Stil prüfen - -Prüft die Form gegen den Katalog - -- Prüf-Icon in der Kopfzeile -- Wortzahl und Satzzeichen misst der Code - -- LMB auf Prüf-Icon -- Fortschritt unter dem Icon -- Fehlerhafte Karten rot markiert - -Vorschlag annehmen - -- Haken-Icon: ✓ -- Übrige Vorschläge bleiben stehen - -- Prüfung durchlaufen lassen -- LMB auf Haken-Icon -- Vorschlag in der Datei - -Vorschlag verwerfen - -- x-Icon: ✕ - -- Prüfung durchlaufen lassen -- LMB auf x-Icon -- Vorschlag verschwunden diff --git a/daten/Planer/.planung/planung.md b/daten/Planer/.planung/planung.md new file mode 100644 index 0000000..89edce6 --- /dev/null +++ b/daten/Planer/.planung/planung.md @@ -0,0 +1,91 @@ + +Planung +---------------------------------------- + +optional +---------------------------------------- + +Zeigt gesammelte Änderungen, bis sie zusammen gelten +---------------------------------------- + +- Höchstens eine Planung je Projekt +- Die Planung überlebt einen Neustart +- Übersicht zeigt den Projektstand +- Planung zeigt den Stand mit Änderungen +- Die Übersicht ist dabei nicht bearbeitbar +- Jede Änderung wird als neu, weg oder anders markiert +- Markierungen erscheinen ohne Neuladen +- Gestrichene Features bleiben sichtbar +- Anweisungen und Gedächtnis gehören dazu +---------------------------------------- + +Planung beginnen + +- Die Anweisungen öffnen sich mit + +- LMB auf den Sichtschalter +- Planung aktiv und Anweisungen offen + +Sicht wechseln + +Zeigt wahlweise den Projektstand oder den Plan + +- Die sichtbare Seite ist benannt +- Die Menge geänderter Features steht dabei +- Übersicht schließt die Anweisungen + +- LMB auf den Sichtschalter +- Übersicht ohne Änderungen sichtbar + +Änderung zurücknehmen + +Holt ein Feature auf den Projektstand zurück + +- Der Rest der Planung bleibt + +- LMB auf Zurücknehmen am Feature +- Feature wie im Projektstand + +Planung umsetzen + +Macht den Plan zum neuen Projektstand + +- Rückfrage vor dem Umsetzen +- Rückfrage nennt das Arbeitsverzeichnis + +- LMB auf Umsetzen in der Kopfzeile +- Bestätigen +- Features sind der Projektstand + +Planung implementieren lassen + +Claude setzt die Änderungen im Code um + +- Nur mit festgelegtem Verzeichnis +- Die Vision gehört nie zum Auftrag +- Die Planung bleibt, bis Claude fertig ist +- Offene Funktionen gehören immer zum Auftrag +- Claude prüft sie gegen ihre Testschritte +- Ungeprüftes bleibt offen und wird benannt +- Jeder Schritt wird abgehakt, sobald er fällt +- Ein abgehakter Schritt macht die Funktion gebaut +- Ein Fehlschlag nimmt gesetzte Haken nicht zurück +- Übernommen wird erst nach Erfolg +- Fehlschlag übernimmt nichts +- Ein Agent je Projekt + +- Verzeichnis festlegen +- Planung mit Änderungen umsetzen +- Schritte haken nacheinander ab +- Danach sind die Features der Projektstand + +Planung verwerfen + +Wirft den Plan weg, der Stand bleibt + +- Rückfrage vor dem Verwerfen +- Gesperrt, solange der Agent arbeitet + +- LMB auf Verwerfen in der Kopfzeile +- Bestätigen +- Projektstand unverändert diff --git a/daten/Planer/.planung/projekte.md b/daten/Planer/.planung/projekt.md similarity index 55% rename from daten/Planer/.planung/projekte.md rename to daten/Planer/.planung/projekt.md index 8faed7a..38c2ea4 100644 --- a/daten/Planer/.planung/projekte.md +++ b/daten/Planer/.planung/projekt.md @@ -1,16 +1,15 @@ -Projekte +Projekt ---------------------------------------- kern ---------------------------------------- -Gruppiert Features für ein Projekt +Bündelt die Features einer Anwendung samt Verzeichnis ---------------------------------------- - Ordner unter daten ist das Projekt - Alphabetisch sortiert -- Aktives Projekt ist hervorgehoben - Auswahl überlebt das Neuladen - Entfernen nimmt die Features mit - Verlassen speichert @@ -19,35 +18,50 @@ Gruppiert Features für ein Projekt Projekt anlegen -- +-Icon +- Name ist Pflicht +- Doppelter Name wird abgelehnt - Projekt wird direkt aufgerufen -- RMB auf Sidebar +- RMB auf die Projektliste - Klick auf "Projekt erstellen" -- Namen im Modal eingeben -- Bestätigen mit LMB +- Namen eingeben +- Bestätigen - Projekt angelegt Projekt aufrufen -- LMB auf Projektname +- LMB auf einen Projektnamen - Features angezeigt Projekt umbenennen -- Stift-Icon +- Doppelter Name wird abgelehnt -- RMB auf Projektname +- RMB auf den Projektnamen - Klick auf "Projekt anpassen" - Namen ändern -- Außerhalb klicken - Name angepasst +Projektverzeichnis festlegen + +Sagt, wo der Agent die Planung implementiert + +- Absoluter Pfad +- Wurzel wird abgelehnt +- Heimat wird abgelehnt +- Leere Eingabe setzt zurück +- Wandert beim Umbenennen mit + +- RMB auf den Projektnamen +- Klick auf "Projektverzeichnis festlegen" +- Pfad eingeben +- Verzeichnis festgelegt + Projekt entfernen -- x-Icon +- Rückfrage vor dem Entfernen -- RMB auf Projektname +- RMB auf den Projektnamen - Klick auf "Projekt entfernen" -- Bestätigen im Modal +- Bestätigen - Projekt entfernt diff --git a/daten/Planer/.planung/pruefung.md b/daten/Planer/.planung/pruefung.md new file mode 100644 index 0000000..55f1a30 --- /dev/null +++ b/daten/Planer/.planung/pruefung.md @@ -0,0 +1,46 @@ + +Prüfung +---------------------------------------- + +optional +---------------------------------------- + +Findet Features, die dem Stil-Katalog widersprechen +---------------------------------------- + +- Ein Lauf je Projekt +- Ergebnis überlebt keinen Neustart +- Zugang steht in .env +- Fehlender Zugang bricht sichtbar ab +- Eine Katalogdatei je Feld im Ordner stil +- Neue Katalogdatei wirkt ohne Codeänderung +- Wortzahl und Satzzeichen misst der Code +- Die Vision wird nie geprüft +---------------------------------------- + +Prüfung starten + +Prüft die Form gegen den Katalog + +- Zweiter Start hängt sich an den Lauf +- Fortschritt ist ablesbar + +- LMB auf Prüfen in der Kopfzeile +- Fortschritt läuft +- Abweichende Features gemeldet + +Prüfung beenden + +- Vorschläge der KI bleiben stehen + +- Prüfung durchlaufen lassen +- LMB auf Schließen im Panel +- Ergebnis verworfen + +Befund aufrufen + +Führt vom Befund zum betroffenen Feature + +- Prüfung durchlaufen lassen +- LMB auf einen Befund +- Feature im Bild diff --git a/daten/Planer/.planung/vision-festhalten.md b/daten/Planer/.planung/vision-2.md similarity index 52% rename from daten/Planer/.planung/vision-festhalten.md rename to daten/Planer/.planung/vision-2.md index 0086aa2..3761d3f 100644 --- a/daten/Planer/.planung/vision-festhalten.md +++ b/daten/Planer/.planung/vision-2.md @@ -1,53 +1,44 @@ -Vision festhalten +Vision ---------------------------------------- optional ---------------------------------------- -Hält fest, wie es gedacht ist +Beschreibt, wohin das Projekt soll ---------------------------------------- - Höchstens eine je Projekt -- Goldener Rand -- Steht als erste Karte -- Nur Titel und ein Textfeld -- Text wird als Markdown gezeigt +- Wird nicht eingestuft - Keine Prüfung ändert sie +- Kein Agent setzt sie um +- Die KI bekommt sie als Vorlage ---------------------------------------- -Anzeigemodus umschalten - -Kompaktmodus zum Lesen, Vollmodus zum Anpassen - -- Standard ist Kompaktmodus -- Kompakt zeigt nur die obersten Punkte -- Augen-Icon rechts oben -- Vollmodus geht über alle Spalten - -- MMB auf die Vision -- Modus umgeschaltet - Vision anlegen + +- Nur wenn keine da ist -- RMB auf Hauptbereich +- Projekt ohne Vision wählen +- RMB auf den Hauptbereich - Klick auf "Vision erstellen" -- Vision angelegt +- Vision steht im Projekt +- Ein zweites Erstellen ist gesperrt Vision anpassen - -- Anpassen nur im Vollmodus -- Verlassen speichert -- Escape verwirft + +Ändert den Text der Vision -- Vollmodus öffnen +- Vision öffnen - LMB auf den Text - Text ändern - Vision angepasst Vision entfernen + +- Rückfrage vor dem Entfernen - RMB auf die Vision - Klick auf "Vision entfernen" -- Bestätigen im Modal +- Bestätigen - Vision entfernt diff --git a/daten/Planer/.planung/vision.md b/daten/Planer/.planung/vision.md index 3f87d66..29eab1b 100644 --- a/daten/Planer/.planung/vision.md +++ b/daten/Planer/.planung/vision.md @@ -5,15 +5,28 @@ Vision vision ---------------------------------------- -- (Basis) Projekte und ihre Features manuell verwalten -- Mit Hilfe von KI-Chat Live Projekte entwickeln und Features erweitern - - Ich schreibe mit der KI und definiere meine Idee - - Die KI zeigt mir Live wie sich die Features ändern - - Ich verbessere und die KI passt Live an - - Wenn ich zufrieden bin, dann lasse ich die Features von der KI implementieren -- (später) Zu einem ausgewählten Projekt analysiert die KI alle kompakten Informationen dazu - - Ich wähle ein Verzeichnis das als Quelle dient - - Die Quelle wird durch ein System geschickt, dass kompakte Informationen extrahiert - - Die kompakten Informationen enthalten das Wissen zu dem WIE vom Projekt - - Also ich brauche die Funktionen und Regeln zum Projekt, nicht wie es Implementiert wird - - Es werden Features zum Projekt generiert, die es komplett abbilden + +---------------------------------------- + +Projekte verwalten + +Projekte und ihre Features manuell verwalten + +Projekterweiterungen mit KI planen + +Mit Hilfe von KI-Chat Live Projekte entwickeln und Features erweitern +- Ich schreibe mit der KI und definiere meine Idee +- Die KI zeigt mir Live wie sich die Features ändern +- Ich verbessere und die KI passt Live an +- Wenn ich zufrieden bin, dann lasse ich die Features von der KI implementieren + +Projekt extrahieren + +Zu einem ausgewählten Projekt analysiert die KI alle kompakten Informationen dazu +- Ich wähle ein Verzeichnis das als Quelle dient +- Die Quelle wird durch ein System geschickt, dass kompakte Informationen extrahiert + - Die kompakten Informationen enthalten das Wissen zu dem WIE vom Projekt + - Also ich brauche die Funktionen und Regeln zum Projekt, nicht wie es Implementiert wird +- Es werden Features zum Projekt generiert, die es komplett abbilden + +- Für später vermerkt diff --git a/daten/Planer/.planung/vorschlag.md b/daten/Planer/.planung/vorschlag.md new file mode 100644 index 0000000..ee8d8dd --- /dev/null +++ b/daten/Planer/.planung/vorschlag.md @@ -0,0 +1,56 @@ + +Vorschlag +---------------------------------------- + +optional +---------------------------------------- + +Legt Änderungen zur Zustimmung vor +---------------------------------------- + +- Kommt aus Prüfung oder Anweisung +- Beide werden gleich behandelt +- Jeder Vorschlag ist für sich anwendbar +- Jeder Vorschlag nennt seine Katalogzeile +- Vorschlag zeigt weg und neu +- Überlebt eine Stilprüfung +- Projektwechsel verwirft alle +---------------------------------------- + +Vorschlag annehmen + +- Übrige Vorschläge bleiben stehen +- Unpassender Vorschlag bleibt stehen + +- Prüfung durchlaufen lassen +- LMB auf Annehmen am Vorschlag +- Vorschlag in der Datei + +Vorschlag verwerfen + +- Prüfung durchlaufen lassen +- LMB auf Verwerfen am Vorschlag +- Vorschlag verschwunden + +Vorschläge des Features annehmen + +Übernimmt alle Befunde eines Features + +- Prüfung durchlaufen lassen +- LMB auf Annehmen im Feature +- Alle Vorschläge übernommen + +Vorschläge des Features verwerfen + +- Prüfung durchlaufen lassen +- LMB auf Verwerfen im Feature +- Alle Vorschläge verworfen + +Vorgeschlagenes Feature anlegen + +Macht aus einem Vorschlag ein echtes Feature + +- Sammelaktion ab drei Vorschlägen + +- LMB auf Annehmen am Vorschlag +- Feature angelegt diff --git a/daten/Planer/karten-besprechen.md b/daten/Planer/anweisung.md similarity index 51% rename from daten/Planer/karten-besprechen.md rename to daten/Planer/anweisung.md index 984d38e..255c5b9 100644 --- a/daten/Planer/karten-besprechen.md +++ b/daten/Planer/anweisung.md @@ -1,61 +1,52 @@ -Karten besprechen +Anweisung ---------------------------------------- optional ---------------------------------------- -Entwickelt Karten im Gespräch mit der KI +Lässt die KI Features aus einer Beschreibung entwerfen ---------------------------------------- -- Die KI schreibt nie selbst in eine Karte +- Die KI schreibt nie selbst in ein Feature - Sie beschreibt den Sollzustand - Was sich ändert, rechnet der Code aus -- Vorschläge sehen aus wie bei der Prüfung - Neue Funktionen gelten als offen -- Das Gespräch überlebt den Neustart - Die letzten 30 Wortmeldungen bleiben -- Gespräch und Prüfung teilen eine Spalte +- Nur Anweisungen oder Prüfung ist offen ---------------------------------------- -Gespräch öffnen +Anweisungen öffnen -- Stift-Icon in der Kopfzeile -- Icon leuchtet bei offenem Gespräch +- Öffnet sich mit der Planung -- LMB auf Stift-Icon -- Gespräch geöffnet +- LMB auf Anweisungen in der Kopfzeile +- Anweisungen geöffnet -Nachricht senden +Anweisung senden Sagt der KI, was das Projekt können soll -- Enter sendet +- Leere Anweisung wird abgelehnt - Eigene Zeile erscheint sofort - Text bleibt bei einem Fehler stehen +- Tippen bleibt während der Antwort möglich - Text eingeben - Enter drücken - Antwort und Vorschläge erscheinen -Vorgeschlagene Karte anlegen +Anweisungen verwerfen -Macht aus einem Umriss eine echte Karte +Streicht alles Gesagte, die Features bleiben -- Gestrichelter Rand vor dem Annehmen +- Rückfrage vor dem Löschen -- LMB auf Haken am Umriss -- Karte angelegt +- LMB auf Verwerfen bei den Anweisungen +- Bestätigen +- Anweisungen geleert -Gespräch verwerfen - -- Löscht nur das Gespräch -- Karten bleiben unberührt +Anweisungen schließen -- LMB auf Papierkorb-Icon -- Gespräch geleert - -Gespräch schließen - -- LMB auf x-Icon +- LMB auf Schließen bei den Anweisungen - Spalte wieder frei diff --git a/daten/Planer/darkmode.md b/daten/Planer/darkmode.md deleted file mode 100644 index 11c604c..0000000 --- a/daten/Planer/darkmode.md +++ /dev/null @@ -1,23 +0,0 @@ - -Darkmode ----------------------------------------- - -optional ----------------------------------------- - -Passt die Anwendung ans Umgebungslicht an ----------------------------------------- - -- Auto folgt der Systemeinstellung -- Zustand überlebt das Neuladen -- Kein Flackern beim Laden ----------------------------------------- - -Darkmode umschalten - -- Nacht-Icon: ☾ -- Tag-Icon: ☀ -- Auto-Icon: A - -- LMB auf Icon in der Kopfzeile -- Modus gewechselt diff --git a/daten/Planer/design.md b/daten/Planer/design.md deleted file mode 100644 index 54257c1..0000000 --- a/daten/Planer/design.md +++ /dev/null @@ -1,44 +0,0 @@ - -Design ----------------------------------------- - -optional ----------------------------------------- - -Hält die Oberfläche lesbar und ruhig ----------------------------------------- - -- Karten stapeln sich lückenlos in Spalten -- Lesefeld ist in der Breite gedeckelt -- Leisten scrollen nicht mit -- Schmale Fenster stapeln die Bereiche -- Klickflächen sind mindestens 28 Pixel -- Textkontrast erfüllt die Lesbarkeitsschwelle -- Kontextmenü bleibt im Fenster -- Modal setzt den Fokus ins Eingabefeld -- Escape schließt das Modal ----------------------------------------- - -Eingabe mit Enter bestätigen - -Spart den Weg zum Knopf - -- Gilt in einzeiligen Feldern -- Escape verwirft stattdessen - -- Modal öffnen -- Text eingeben -- Enter drücken -- Eingabe übernommen - -Kontextmenü schließen - -Räumt ein offenes Menü aus dem Weg - -- Klick daneben schließt es -- Escape schließt es -- Ein neues Menü verdrängt das alte - -- RMB auf eine Karte -- LMB daneben -- Menü geschlossen diff --git a/daten/Planer/feature.md b/daten/Planer/feature.md new file mode 100644 index 0000000..19ec543 --- /dev/null +++ b/daten/Planer/feature.md @@ -0,0 +1,90 @@ + +Feature +---------------------------------------- + +kern +---------------------------------------- + +Hält fest, was ein Projekt können soll +---------------------------------------- + +- Eine Markdown-Datei je Feature +- Die Datei ist die Wahrheit +- Titel bestimmt den Dateinamen +- Namensgleichheit bekommt eine Nummer +- Fremde Marker bleiben erhalten +- Sortiert nach Vision, kern, optional +- Innerhalb der Gruppe alphabetisch +---------------------------------------- + +Feature anlegen + +- Titel ist Pflicht + +- RMB auf den Hauptbereich +- Klick auf "Feature erstellen" +- Titel eingeben +- Bestätigen +- Feature angelegt und offen + +Feature öffnen + +Zeigt alle Felder und gibt sie zum Anpassen frei + +- Kompakt bleiben Regeln und Details verborgen +- Höchstens ein Feature offen +- Ein Feature mit Befunden öffnet sich sofort + +- LMB auf ein kompaktes Feature +- LMB auf ein zweites +- Erstes wieder kompakt + +Feature schließen + +- Feature öffnen +- MMB auf das Feature +- Feature wieder kompakt + +Feature anpassen + +Ändert Titel, Ziel oder Regeln + +- Nur im offenen Feature +- Neuer Titel aktualisiert den Dateinamen +- Leerer Titel wird verworfen +- Verlassen speichert +- Escape verwirft + +- Feature öffnen +- LMB auf ein Feld des Features +- Text ändern +- Feature angepasst + +Feature einstufen + +Trennt tragende von verzichtbaren Features + +- Entweder kern oder optional + +- Feature öffnen +- LMB auf die Einstufung +- Einstufung gewechselt + +Feature durchsuchen + +Findet das Feature, ohne alle zu lesen + +- Sucht in allen Feldern +- Zählt Ausgeblendete mit + +- Suchwort eingeben +- Nur passende Features bleiben + +Feature entfernen + +- Rückfrage vor dem Entfernen + +- RMB auf das Feature +- Klick auf "Feature entfernen" +- Bestätigen +- Feature entfernt diff --git a/daten/Planer/features.md b/daten/Planer/features.md deleted file mode 100644 index 04d00f8..0000000 --- a/daten/Planer/features.md +++ /dev/null @@ -1,109 +0,0 @@ - -Features ----------------------------------------- - -kern ----------------------------------------- - -Hält fest, was ein Projekt können soll ----------------------------------------- - -- Eine Markdown-Datei je Feature -- Die Datei ist die Wahrheit -- Titel bestimmt den Dateinamen -- Namensgleichheit bekommt eine Nummer -- Fremde Marker bleiben erhalten -- Alphabetisch sortiert -- Anpassen nur im Vollmodus -- Verlassen speichert -- Escape verwirft ----------------------------------------- - -Anzeigemodus umschalten - -Kompaktmodus zum Lesen, Vollmodus zum Anpassen - -- Standard ist Kompaktmodus -- Vollmodus zeigt alle Felder -- Augen-Icon rechts oben - -- MMB auf Featurecard -- Modus umgeschaltet - -Feature anlegen - -- +-Icon -- Feature öffnet im Vollmodus - -- RMB auf Hauptbereich -- Klick auf "Feature erstellen" -- Namen im Modal eingeben -- Bestätigen mit LMB -- Feature angelegt - -Feature einstufen - -Trennt tragende von verzichtbaren Features - -- Kern blau umrandet -- Optional grün umrandet -- Badge zeigt die Einstufung - -- Vollmodus öffnen -- LMB auf Badge -- Einstufung gewechselt - -Feature durchsuchen - -Findet die Karte, ohne alle zu lesen - -- Sucht in allen Feldern -- Zählt Ausgeblendete mit - -- Suchwort eingeben -- Nur passende Karten bleiben - -Feature entfernen - -- x-Icon - -- RMB auf Featurecard -- Klick auf "Feature entfernen" -- Bestätigen im Modal -- Feature entfernt - -Feature verschieben - -Hängt ein Feature in ein anderes Projekt um - -- Datei wandert -- Datei wird nicht kopiert -- Nur bei mehreren Projekten - -- RMB auf Featurecard -- Klick auf "Feature verschieben" -- Zielprojekt wählen -- Feature verschoben - -Regeln anpassen - -- Vollmodus öffnen -- LMB auf Regeln der Karte -- Text ändern -- Regeln angepasst - -Titel anpassen - -- Aktualisiert den Dateinamen - -- Vollmodus öffnen -- LMB auf Titel der Karte -- Text ändern -- Titel angepasst - -Ziel anpassen - -- Vollmodus öffnen -- LMB auf Ziel der Karte -- Text ändern -- Ziel angepasst diff --git a/daten/Planer/funktion.md b/daten/Planer/funktion.md new file mode 100644 index 0000000..7c6e17f --- /dev/null +++ b/daten/Planer/funktion.md @@ -0,0 +1,66 @@ + +Funktion +---------------------------------------- + +kern +---------------------------------------- + +Zerlegt ein Feature in testbare Stücke mit Stand +---------------------------------------- + +- Gehört zu genau einem Feature +- Eine Regel je Zeile +- Ein Testschritt je Zeile +- Ziel bleibt freiwillig +- Regeln bleiben freiwillig +- Testschritte sind Pflicht +---------------------------------------- + +Funktion anlegen + +- Titel ist Pflicht +- Gilt als gebaut + +- Feature öffnen +- RMB auf das Feature +- Klick auf "Funktion erstellen" +- Titel eingeben +- Bestätigen +- Funktion angelegt + +Funktion anpassen + +Ändert Titel, Ziel, Regeln oder Testschritte + +- Nur im offenen Feature +- Leerer Titel wird verworfen +- Verlassen speichert +- Escape verwirft + +- Feature öffnen +- LMB auf ein Feld der Funktion +- Text ändern +- Funktion angepasst + +Funktion einstufen + +Trennt Bewiesenes von Unbewiesenem + +- Entweder offen oder gebaut +- Offen heißt unbewiesen +- Zurücksetzen bestellt eine Prüfung durch Claude +- Der Agent hakt eine geprüfte Funktion selbst ab + +- Feature öffnen +- LMB auf den Stand +- Stand gewechselt + +Funktion entfernen + +- Rückfrage vor dem Entfernen + +- Feature öffnen +- RMB auf die Funktion +- Klick auf "Funktion entfernen" +- Bestätigen +- Funktion entfernt diff --git a/daten/Planer/funktionen.md b/daten/Planer/funktionen.md deleted file mode 100644 index c65e957..0000000 --- a/daten/Planer/funktionen.md +++ /dev/null @@ -1,98 +0,0 @@ - -Funktionen ----------------------------------------- - -kern ----------------------------------------- - -Zerlegt ein Feature in prüfbare Stücke ----------------------------------------- - -- Gehört zu genau einem Feature -- Offen heißt bestellt, nicht gebaut -- Neue Funktionen von Hand gelten als gebaut -- Reihenfolge frei wählbar -- Ziel bleibt freiwillig -- Regeln bleiben freiwillig -- Testen bleibt freiwillig -- Anpassen nur im Vollmodus -- Verlassen speichert -- Escape verwirft ----------------------------------------- - -Funktion anlegen - -- +-Icon - -- Vollmodus öffnen -- RMB auf Featurecard -- Klick auf "Funktion erstellen" -- Namen im Modal eingeben -- Bestätigen mit LMB -- Funktion angelegt - -Funktion entfernen - -- x-Icon - -- Vollmodus öffnen -- RMB auf Funktion -- Klick auf "Funktion entfernen" -- Bestätigen im Modal -- Funktion entfernt - -Stand umschalten - -Trennt Bestelltes von Gebautem - -- Marke rechts vom Titel -- Offen ist gelb -- Gebaut ist ein Haken -- Kompakt erscheint nur die offene Marke - -- Vollmodus öffnen -- LMB auf die Marke -- Stand gewechselt - -Funktion verschieben - -Bringt die Schritte in ihre natürliche Folge - -- Reihenfolge steht in der Datei - -- Vollmodus öffnen -- RMB auf Funktion -- Klick auf "Nach oben" -- Funktion verschoben - -Titel anpassen - -- Vollmodus öffnen -- LMB auf Funktionstitel -- Text ändern -- Titel angepasst - -Ziel anpassen - -- Vollmodus öffnen -- LMB auf Ziel der Funktion -- Text ändern -- Ziel angepasst - -Regeln anpassen - -- Eine Regel je Zeile - -- Vollmodus öffnen -- LMB auf Regeln der Funktion -- Text ändern -- Regeln angepasst - -Testschritte anpassen - -- Ein Schritt je Zeile - -- Vollmodus öffnen -- LMB auf Testen der Funktion -- Text ändern -- Testschritte angepasst diff --git a/daten/Planer/k1-1024.png b/daten/Planer/k1-1024.png index 2a67485..b06955a 100644 Binary files a/daten/Planer/k1-1024.png and b/daten/Planer/k1-1024.png differ diff --git a/daten/Planer/k1-1280.png b/daten/Planer/k1-1280.png index a37b08c..a44f5e6 100644 Binary files a/daten/Planer/k1-1280.png and b/daten/Planer/k1-1280.png differ diff --git a/daten/Planer/k1-1600.png b/daten/Planer/k1-1600.png index 4ac7549..33a3e60 100644 Binary files a/daten/Planer/k1-1600.png and b/daten/Planer/k1-1600.png differ diff --git a/daten/Planer/k1-390.png b/daten/Planer/k1-390.png index 2132bc6..0b6ef75 100644 Binary files a/daten/Planer/k1-390.png and b/daten/Planer/k1-390.png differ diff --git a/daten/Planer/k1-640.png b/daten/Planer/k1-640.png index 3041925..a40822e 100644 Binary files a/daten/Planer/k1-640.png and b/daten/Planer/k1-640.png differ diff --git a/daten/Planer/k1-820.png b/daten/Planer/k1-820.png index 485f121..42f2614 100644 Binary files a/daten/Planer/k1-820.png and b/daten/Planer/k1-820.png differ diff --git a/daten/Planer/karten-pruefen.md b/daten/Planer/karten-pruefen.md deleted file mode 100644 index cd0ae23..0000000 --- a/daten/Planer/karten-pruefen.md +++ /dev/null @@ -1,82 +0,0 @@ - -Karten prüfen ----------------------------------------- - -optional ----------------------------------------- - -Meldet, wo eine Karte vom Soll abweicht ----------------------------------------- - -- Ein Lauf je Projekt -- Ergebnis überlebt keinen Neustart -- Zugang steht in .env -- Fehlender Zugang bricht sichtbar ab -- Jeder Vorschlag ist für sich anwendbar -- Jeder Vorschlag nennt seinen Beleg -- Eine Katalogdatei je Feld im Ordner stil -- Neue Katalogdatei wirkt ohne Codeänderung ----------------------------------------- - -Alle Vorschläge annehmen - -- Haken-Icon oben in der Karte -- Zahl nennt die Menge - -- Prüfung durchlaufen lassen -- LMB auf Haken-Icon der Karte -- Alle Vorschläge übernommen - -Alle Vorschläge verwerfen - -- x-Icon oben in der Karte - -- Prüfung durchlaufen lassen -- LMB auf x-Icon der Karte -- Alle Vorschläge verworfen - -Problemstelle anspringen - -Führt vom Panel-Eintrag zur betroffenen Karte - -- Karte blitzt kurz auf - -- Prüfung durchlaufen lassen -- LMB auf Eintrag im Panel -- Karte im Editor sichtbar - -Prüfung beenden - -- x-Icon oben im Panel - -- Prüfung durchlaufen lassen -- LMB auf x-Icon im Panel -- Panel geschlossen - -Stil prüfen - -Prüft die Form gegen den Katalog - -- Prüf-Icon in der Kopfzeile -- Wortzahl und Satzzeichen misst der Code - -- LMB auf Prüf-Icon -- Fortschritt unter dem Icon -- Fehlerhafte Karten rot markiert - -Vorschlag annehmen - -- Haken-Icon: ✓ -- Übrige Vorschläge bleiben stehen - -- Prüfung durchlaufen lassen -- LMB auf Haken-Icon -- Vorschlag in der Datei - -Vorschlag verwerfen - -- x-Icon: ✕ - -- Prüfung durchlaufen lassen -- LMB auf x-Icon -- Vorschlag verschwunden diff --git a/daten/Planer/planung.md b/daten/Planer/planung.md new file mode 100644 index 0000000..89edce6 --- /dev/null +++ b/daten/Planer/planung.md @@ -0,0 +1,91 @@ + +Planung +---------------------------------------- + +optional +---------------------------------------- + +Zeigt gesammelte Änderungen, bis sie zusammen gelten +---------------------------------------- + +- Höchstens eine Planung je Projekt +- Die Planung überlebt einen Neustart +- Übersicht zeigt den Projektstand +- Planung zeigt den Stand mit Änderungen +- Die Übersicht ist dabei nicht bearbeitbar +- Jede Änderung wird als neu, weg oder anders markiert +- Markierungen erscheinen ohne Neuladen +- Gestrichene Features bleiben sichtbar +- Anweisungen und Gedächtnis gehören dazu +---------------------------------------- + +Planung beginnen + +- Die Anweisungen öffnen sich mit + +- LMB auf den Sichtschalter +- Planung aktiv und Anweisungen offen + +Sicht wechseln + +Zeigt wahlweise den Projektstand oder den Plan + +- Die sichtbare Seite ist benannt +- Die Menge geänderter Features steht dabei +- Übersicht schließt die Anweisungen + +- LMB auf den Sichtschalter +- Übersicht ohne Änderungen sichtbar + +Änderung zurücknehmen + +Holt ein Feature auf den Projektstand zurück + +- Der Rest der Planung bleibt + +- LMB auf Zurücknehmen am Feature +- Feature wie im Projektstand + +Planung umsetzen + +Macht den Plan zum neuen Projektstand + +- Rückfrage vor dem Umsetzen +- Rückfrage nennt das Arbeitsverzeichnis + +- LMB auf Umsetzen in der Kopfzeile +- Bestätigen +- Features sind der Projektstand + +Planung implementieren lassen + +Claude setzt die Änderungen im Code um + +- Nur mit festgelegtem Verzeichnis +- Die Vision gehört nie zum Auftrag +- Die Planung bleibt, bis Claude fertig ist +- Offene Funktionen gehören immer zum Auftrag +- Claude prüft sie gegen ihre Testschritte +- Ungeprüftes bleibt offen und wird benannt +- Jeder Schritt wird abgehakt, sobald er fällt +- Ein abgehakter Schritt macht die Funktion gebaut +- Ein Fehlschlag nimmt gesetzte Haken nicht zurück +- Übernommen wird erst nach Erfolg +- Fehlschlag übernimmt nichts +- Ein Agent je Projekt + +- Verzeichnis festlegen +- Planung mit Änderungen umsetzen +- Schritte haken nacheinander ab +- Danach sind die Features der Projektstand + +Planung verwerfen + +Wirft den Plan weg, der Stand bleibt + +- Rückfrage vor dem Verwerfen +- Gesperrt, solange der Agent arbeitet + +- LMB auf Verwerfen in der Kopfzeile +- Bestätigen +- Projektstand unverändert diff --git a/daten/Planer/projekte.md b/daten/Planer/projekt.md similarity index 55% rename from daten/Planer/projekte.md rename to daten/Planer/projekt.md index 8faed7a..38c2ea4 100644 --- a/daten/Planer/projekte.md +++ b/daten/Planer/projekt.md @@ -1,16 +1,15 @@ -Projekte +Projekt ---------------------------------------- kern ---------------------------------------- -Gruppiert Features für ein Projekt +Bündelt die Features einer Anwendung samt Verzeichnis ---------------------------------------- - Ordner unter daten ist das Projekt - Alphabetisch sortiert -- Aktives Projekt ist hervorgehoben - Auswahl überlebt das Neuladen - Entfernen nimmt die Features mit - Verlassen speichert @@ -19,35 +18,50 @@ Gruppiert Features für ein Projekt Projekt anlegen -- +-Icon +- Name ist Pflicht +- Doppelter Name wird abgelehnt - Projekt wird direkt aufgerufen -- RMB auf Sidebar +- RMB auf die Projektliste - Klick auf "Projekt erstellen" -- Namen im Modal eingeben -- Bestätigen mit LMB +- Namen eingeben +- Bestätigen - Projekt angelegt Projekt aufrufen -- LMB auf Projektname +- LMB auf einen Projektnamen - Features angezeigt Projekt umbenennen -- Stift-Icon +- Doppelter Name wird abgelehnt -- RMB auf Projektname +- RMB auf den Projektnamen - Klick auf "Projekt anpassen" - Namen ändern -- Außerhalb klicken - Name angepasst +Projektverzeichnis festlegen + +Sagt, wo der Agent die Planung implementiert + +- Absoluter Pfad +- Wurzel wird abgelehnt +- Heimat wird abgelehnt +- Leere Eingabe setzt zurück +- Wandert beim Umbenennen mit + +- RMB auf den Projektnamen +- Klick auf "Projektverzeichnis festlegen" +- Pfad eingeben +- Verzeichnis festgelegt + Projekt entfernen -- x-Icon +- Rückfrage vor dem Entfernen -- RMB auf Projektname +- RMB auf den Projektnamen - Klick auf "Projekt entfernen" -- Bestätigen im Modal +- Bestätigen - Projekt entfernt diff --git a/daten/Planer/pruefung.md b/daten/Planer/pruefung.md new file mode 100644 index 0000000..55f1a30 --- /dev/null +++ b/daten/Planer/pruefung.md @@ -0,0 +1,46 @@ + +Prüfung +---------------------------------------- + +optional +---------------------------------------- + +Findet Features, die dem Stil-Katalog widersprechen +---------------------------------------- + +- Ein Lauf je Projekt +- Ergebnis überlebt keinen Neustart +- Zugang steht in .env +- Fehlender Zugang bricht sichtbar ab +- Eine Katalogdatei je Feld im Ordner stil +- Neue Katalogdatei wirkt ohne Codeänderung +- Wortzahl und Satzzeichen misst der Code +- Die Vision wird nie geprüft +---------------------------------------- + +Prüfung starten + +Prüft die Form gegen den Katalog + +- Zweiter Start hängt sich an den Lauf +- Fortschritt ist ablesbar + +- LMB auf Prüfen in der Kopfzeile +- Fortschritt läuft +- Abweichende Features gemeldet + +Prüfung beenden + +- Vorschläge der KI bleiben stehen + +- Prüfung durchlaufen lassen +- LMB auf Schließen im Panel +- Ergebnis verworfen + +Befund aufrufen + +Führt vom Befund zum betroffenen Feature + +- Prüfung durchlaufen lassen +- LMB auf einen Befund +- Feature im Bild diff --git a/daten/Planer/vision-festhalten.md b/daten/Planer/vision-2.md similarity index 52% rename from daten/Planer/vision-festhalten.md rename to daten/Planer/vision-2.md index 0086aa2..3761d3f 100644 --- a/daten/Planer/vision-festhalten.md +++ b/daten/Planer/vision-2.md @@ -1,53 +1,44 @@ -Vision festhalten +Vision ---------------------------------------- optional ---------------------------------------- -Hält fest, wie es gedacht ist +Beschreibt, wohin das Projekt soll ---------------------------------------- - Höchstens eine je Projekt -- Goldener Rand -- Steht als erste Karte -- Nur Titel und ein Textfeld -- Text wird als Markdown gezeigt +- Wird nicht eingestuft - Keine Prüfung ändert sie +- Kein Agent setzt sie um +- Die KI bekommt sie als Vorlage ---------------------------------------- -Anzeigemodus umschalten - -Kompaktmodus zum Lesen, Vollmodus zum Anpassen - -- Standard ist Kompaktmodus -- Kompakt zeigt nur die obersten Punkte -- Augen-Icon rechts oben -- Vollmodus geht über alle Spalten - -- MMB auf die Vision -- Modus umgeschaltet - Vision anlegen + +- Nur wenn keine da ist -- RMB auf Hauptbereich +- Projekt ohne Vision wählen +- RMB auf den Hauptbereich - Klick auf "Vision erstellen" -- Vision angelegt +- Vision steht im Projekt +- Ein zweites Erstellen ist gesperrt Vision anpassen - -- Anpassen nur im Vollmodus -- Verlassen speichert -- Escape verwirft + +Ändert den Text der Vision -- Vollmodus öffnen +- Vision öffnen - LMB auf den Text - Text ändern - Vision angepasst Vision entfernen + +- Rückfrage vor dem Entfernen - RMB auf die Vision - Klick auf "Vision entfernen" -- Bestätigen im Modal +- Bestätigen - Vision entfernt diff --git a/daten/Planer/vision.md b/daten/Planer/vision.md index 3f87d66..29eab1b 100644 --- a/daten/Planer/vision.md +++ b/daten/Planer/vision.md @@ -5,15 +5,28 @@ Vision vision ---------------------------------------- -- (Basis) Projekte und ihre Features manuell verwalten -- Mit Hilfe von KI-Chat Live Projekte entwickeln und Features erweitern - - Ich schreibe mit der KI und definiere meine Idee - - Die KI zeigt mir Live wie sich die Features ändern - - Ich verbessere und die KI passt Live an - - Wenn ich zufrieden bin, dann lasse ich die Features von der KI implementieren -- (später) Zu einem ausgewählten Projekt analysiert die KI alle kompakten Informationen dazu - - Ich wähle ein Verzeichnis das als Quelle dient - - Die Quelle wird durch ein System geschickt, dass kompakte Informationen extrahiert - - Die kompakten Informationen enthalten das Wissen zu dem WIE vom Projekt - - Also ich brauche die Funktionen und Regeln zum Projekt, nicht wie es Implementiert wird - - Es werden Features zum Projekt generiert, die es komplett abbilden + +---------------------------------------- + +Projekte verwalten + +Projekte und ihre Features manuell verwalten + +Projekterweiterungen mit KI planen + +Mit Hilfe von KI-Chat Live Projekte entwickeln und Features erweitern +- Ich schreibe mit der KI und definiere meine Idee +- Die KI zeigt mir Live wie sich die Features ändern +- Ich verbessere und die KI passt Live an +- Wenn ich zufrieden bin, dann lasse ich die Features von der KI implementieren + +Projekt extrahieren + +Zu einem ausgewählten Projekt analysiert die KI alle kompakten Informationen dazu +- Ich wähle ein Verzeichnis das als Quelle dient +- Die Quelle wird durch ein System geschickt, dass kompakte Informationen extrahiert + - Die kompakten Informationen enthalten das Wissen zu dem WIE vom Projekt + - Also ich brauche die Funktionen und Regeln zum Projekt, nicht wie es Implementiert wird +- Es werden Features zum Projekt generiert, die es komplett abbilden + +- Für später vermerkt diff --git a/daten/Planer/vorschlag.md b/daten/Planer/vorschlag.md new file mode 100644 index 0000000..ee8d8dd --- /dev/null +++ b/daten/Planer/vorschlag.md @@ -0,0 +1,56 @@ + +Vorschlag +---------------------------------------- + +optional +---------------------------------------- + +Legt Änderungen zur Zustimmung vor +---------------------------------------- + +- Kommt aus Prüfung oder Anweisung +- Beide werden gleich behandelt +- Jeder Vorschlag ist für sich anwendbar +- Jeder Vorschlag nennt seine Katalogzeile +- Vorschlag zeigt weg und neu +- Überlebt eine Stilprüfung +- Projektwechsel verwirft alle +---------------------------------------- + +Vorschlag annehmen + +- Übrige Vorschläge bleiben stehen +- Unpassender Vorschlag bleibt stehen + +- Prüfung durchlaufen lassen +- LMB auf Annehmen am Vorschlag +- Vorschlag in der Datei + +Vorschlag verwerfen + +- Prüfung durchlaufen lassen +- LMB auf Verwerfen am Vorschlag +- Vorschlag verschwunden + +Vorschläge des Features annehmen + +Übernimmt alle Befunde eines Features + +- Prüfung durchlaufen lassen +- LMB auf Annehmen im Feature +- Alle Vorschläge übernommen + +Vorschläge des Features verwerfen + +- Prüfung durchlaufen lassen +- LMB auf Verwerfen im Feature +- Alle Vorschläge verworfen + +Vorgeschlagenes Feature anlegen + +Macht aus einem Vorschlag ein echtes Feature + +- Sammelaktion ab drei Vorschlägen + +- LMB auf Annehmen am Vorschlag +- Feature angelegt diff --git a/daten/RAG/admin.md b/daten/RAG/admin.md deleted file mode 100644 index 09b173d..0000000 --- a/daten/RAG/admin.md +++ /dev/null @@ -1,93 +0,0 @@ - -Admin ----------------------------------------- - -kern ----------------------------------------- - -Bietet Zugriff auf Enterprise-Betriebsdaten und Systemüberwachung für Administratoren ----------------------------------------- - -- POST-Operationen erfordern gültiges CSRF-Token -- Wiederherstellung erfordert ROLE_SUPER_ADMIN -- Ergebnis jeder Operation als Flash-Meldung -- Backup-Download erfordert ROLE_SUPER_ADMIN ----------------------------------------- - -Betrieb einsehen - -Verschafft Admins einen Überblick über den Betriebszustand aller Systeme - -- Backup- und Restore-Bereitschaft zeigt Status -- Sicherheit und Datenschutz zeigt Bereitschaft -- Deployment-Scheduler zeigt Bereitschaft -- Backup-Übersicht zeigt vorhandene Sicherungen -- Operator-Prüfprotokoll zeigt letzte 8 Prüfungen -- Übersicht kombiniert alle Berichte - -- Admin-Dashboard öffnen -- Backup- und Restore-Bereitschaft anzeigen -- Sicherheit und Datenschutz anzeigen -- Deployment-Scheduler anzeigen -- Backup-Übersicht mit vorhandenen Sicherungen -- Operator-Prüfprotokoll mit letzten 8 Einträgen -- Kombinierte Übersicht aller Berichte ----------------------------------------- - -Dashboard anzeigen - -Zeigt Systemzustand und Konfiguration im Admin-Bereich - -- Rendered admin dashboard index html twig -- Enthält Chunk-Zähler und Chunk-Limit -- Enthält Vektor- und Tag-Gesundheitsdaten -- Enthält Reset-Konfiguration - -- Admin-Dashboard aufrufen -- HTTP 200 zurückerhalten -- admin-dashboard-index-html-twigt Template prüfen -- Chunk-Zähler im Response vorhanden -- Vektor-Gesundheitsdaten im Response vorhanden ----------------------------------------- - -Logout einleiten - -Beendet die aktive Adminsession sicher - -- GET oder POST an Admin-Logout startet Logout -- Wird vom Framework-Sicherheitssystem abgefangen -- Leere Methoden-Signatur -- Löscht Session und Authentifizierungsdaten - -- Klick auf Logout-Button im Admin -- Weiterleitung zur Login-Seite -- Session beendet ----------------------------------------- - -Wiederherstellung testen - -Prueft ob ein Backup sich vollständig wiederherstellen laesst - -- Benoetigt ROLE_SUPER_ADMIN -- POST-Request mit CSRF-Token -- Prueft angegebene Backup-ID gegen Muster retriex-backup-YYYYMMDD-HHMMSS -- Trockenlauf ohne tatsaechliche Wiederherstellung -- Ergebnis als Flash-Meldung nach Startseite - -- Admin-Enterprise-Seite aufrufen -- Dry-Run-Wiederherstellung mit gueltigem CSRF-Token absenden -- Rueckleitung auf Admin-Enterprise mit Flash-Meldung pruefen -- Flash-Meldung zeigt Warnungen und Fehler oder Erfolg ----------------------------------------- - -Zum Dashboard weiterleiten - -Leitet admin und admin- auf das Dashboard um - -- Admin leitet zum Dashboard um -- Verhindert doppelten Inhalt - -- admin aufrufen -- Weiterleitung zu dashboard prüfen -- admin-Abschluss aufrufen -- Weiterleitung zu dashboard prüfen diff --git a/daten/RAG/agenten.md b/daten/RAG/agenten.md deleted file mode 100644 index 15dbf65..0000000 --- a/daten/RAG/agenten.md +++ /dev/null @@ -1,286 +0,0 @@ - -Agenten ----------------------------------------- - -kern ----------------------------------------- - -Steuert Agentenaktivitaet und prueft deren Komponenten automatisiert ----------------------------------------- - -- JSON-Ausgabe bei gesetztem --json Flag -- Self-TestsFuehrenKeineMCPTransportAufrufeAus -- AgentenaktivitaetSeiteAusQueryParameterPage -- LimitZwischen1Und200Standardmaessig50 -- StreamingGibtJedesTokenSofortAus -- Inspector liefert paths, meta und ndjson -- paths zeigen konfigurierte Agentenlogikdateien -- meta enthält Statistiken zur Agentenaktivität -- ndjson enthält paginierte Aktivitätseinträge ----------------------------------------- - -Agentenaktivität anzeigen - -Zeigt eine liste der agentenaktivitäten - -- Seite aus Query-Parameter page -- Limit zwischen 1 und 200 -- Standardlimit 50 - -- Admin-System-Agent abrufen -- Antwort ist 200 -- Debug-Count zeigt Itemanzahl ----------------------------------------- - -Chat-Auswahl-Guard testen - -Validiert dass der Chat-Auswahl-Guard korrekt funktioniert - -- Command mto:agent:knowledge-space:chat-selection-guard-self-test -- json gibt strukturierte Daten aus -- Exit-Code 0 bei Status OK, sonst 1 - -- Command mit --json Flag ausführen -- JSON mit status summary cases enthält -- Exit-Code entspricht Status ----------------------------------------- - -Fähigkeiten ermitteln - -Listet verfügbare Resources, Tools und Prompts eines Admin-MCP-Servers auf - -- Benötigt gespeicherten Admin-MCP-Server -- read liest Resource-URIs metadaten -- json maschinelles Format -- Status ready bei erfolgreicher Erkennung -- Runtime-Calls gezählt - -- Befehl mit gespeichertem Servernamen ausführen -- Ausgabe auf Status ready prüfen -- Resources, Tools und Prompts in Ausgabe ----------------------------------------- - -Hybrid-Tool-Auswahl testen - -Stellt sicher, dass LLM-Vorschlag und RetrieX-Validierung bei der Tool-Auswahl zusammenarbeiten - -- Planner besteht eigenen Self-Test -- AgentRunner nutzt LLM für Vorschlag vor RetrieX-Validierung -- Loader zeigt Status beim Tool-Auswählen -- Model-Config enthält dediziertes mcp_tool_selection-Modell - -- mto:agent:mcp:hybrid-tool-selection-planner-self-test --json ausführen -- JSON-Ausgabe auf status OK prüfen -- Alle vier Cases mit Status PASS vorhanden ----------------------------------------- - -MCP-Gateway trocken ausführen - -Prüft ob eine Resource die Gateway-Policy erfüllt und welches Evidence erzeugt wird - -- Kein MCP-Transport wird geöffnet -- fixture nutzt eingebaute Testdaten -- Exit-Code 0 bei Status ready -- json gibt Ergebnis als JSON aus - -- bin console mto agent mcp gateway-dry-run --fixture ausführen -- Ausgabe zeigt status ready ----------------------------------------- - -MCP-Laufzeit-Gate prüfen - -Prüft ob ein MCP-Read-Only-Zugriff erlaubt ist, ohne Transport zu öffnen - -- Gate ohne Transport öffnen -- fixture nutzt eingebaute Testdaten -- assume-enabled simuliert aktivierte MCP-Konfiguration -- JSON-Ausgabe verfügbar - -- Console-Befehl mit --json ausführen -- Exit-Code auf SUCCESS prüfen -- JSON auf Status ready und Fehler prüfen ----------------------------------------- - -MCP-Laufzeitgrenze testen - -Validiert, dass MCP-Server nur Admin-gesteuert und begrenzt in der Antwort-Runtime verwendet werden - -- McpDataRoomStore nur in Admin, CLI, ReadModels referenziert -- Keine externen MCP-Abrufe in Runtime-Boundary -- Keine Chat-, Retrieval- oder Evidence-Beruehrung -- Tool-Nachweise unterscheiden sichtbare Tool-Ausfuehrung -- Tool-first-Inhalts-Fallback bleibt im Statusprotokoll sichtbar -- Live-Inhalts-Fallback buendelt MCP-JSON-RPC-Resource-Reads - -- Rueckgabewert pruefen: Exitcode 0 bestaetigt OK -- Rueckgabewert pruefen: Exitcode 1 bestaetigt FAIL ----------------------------------------- - -MCP-Quelle prüfen - -Prüft eine gespeicherte Admin-MCP-Quelle als registrierungskompatible Richtlinie - -- Lokale Prüfung ohne MCP-Transport -- server wählt die gespeicherte Quelle -- audit-all prüft alle Quellen -- online führt einen Nur-Lese-Netzwerktest durch -- json gibt nur Metadaten aus - -- mto:agent:mcp:admin-source-check --server=my_source -- Ergebnis zeigt Status, Label und Fehler ----------------------------------------- - -Mit Agent chatten - -Stellt Fragen an den KI-Agenten und empfängt Antworten in Echtzeit - -- Streaming-Ausgabe jedes Tokens sofort -- Beendet auf Eingabe von exit -- Beendet auf Strg+C -- Leerer Prompt beendet -- user-id Standardwert ist cli - -- mto:agent:chat ausführen -- Frage eingeben -- Antwort tokenweise empfangen -- exit eingeben -- CLI beendet ----------------------------------------- - -Performance-Cache leeren - -Leert alle RetrieX Runtime-Caches und den Python Vector-Service-Query-Cache - -- Löscht den PHP Runtime-Cache -- Löscht optional den Vector-Service-Query-Cache -- skip-vector-service überspringt den Vector-Service-Cache -- json gibt maschinenlesbare Ausgabe aus - -- php bin console mto:agent:performance:cache:clear json ----------------------------------------- - -Produktlabel-Formatierer testen - -Validiert die p465-Formatter-Extraktion ohne Laufzeiteffekte - -- Liest nur lokale Quelldateien -- Ruft keine Chat-, Retrieval-, Shop-, MCP- oder LLM-Dienste auf -- Prüft AgentRunner-Delegation an ProductLabelFormatter -- Prüft Formatter-Besitz reiner Anzeige-Methoden -- Prüft Formatter-Besitz reiner Label-Methoden -- Prüft Abwesenheit von Runtime-Dependencies im Formatter -- Prüft Abwesenheit von p465-Methoden im AgentRunner -- Prüft Dokumentationsabdeckung in allen Referenzdateien - -- Produktlabel-Formatter-Selbsttest mit --json ausführen -- JSON zeigt status OK und 11 PASS ----------------------------------------- - -Release-Selbsttest bereitstellen - -Validiert den v1.10.8 Release-Lock ohne Seiteneffekte im Chat-Pipeline, Agent-Runtime, Retrieval, Ranking, Shop, Followup, Evidence oder Truth Layer. - -- Prüft 22 Release-Artefakte -- Prüft 8 zentrale Produktdokumente auf v1.10.8 -- Prüft 16 Required-Release-Phrasen -- Liest nur lokale Dateien -- Führt keine Chat-, LLM- oder MCP-Live-Aufrufe aus -- Führt keine Retrieval-, Shop- oder Netzaufrufe aus - -- Ausgabe zeigt Status PASS -- JSON zeigt status OK und runtime_calls 0 ----------------------------------------- - -Ressource abrufen - -Liest eine erlaubte MCP-Ressource über die CLI ab - -- Nur allowlisted Ressourcen abrufbar -- MIME-Typ geprüft -- Ergebnis enthält Status, Metadaten und Fehler - -- Befehl mit Optionen ausführen -- Kurzformat prüfen -- json Flag verwenden -- Status ready und Ressource vorhanden ----------------------------------------- - -Ressource validieren - -Ermöglicht das Prüfen, ob eine MCP-Ressource_URI auf der Allowlist steht - -- Prüft URI gegen konfigurierten Allowlist-Eintrag -- Prüft MIME-Type gegen erlaubte Typen des Eintrags -- Gibt Fehler und Warnungen aus -- CLI-Exit-Code spiegelt Entscheidung wider - -- CLI-Befehl mit --server und --resource-uri ausführen -- Option --mime-type ergänzen -- Exit-Code zeigt Ergebnis an ----------------------------------------- - -Rollencode-Zuweisung prüfen - -Validiert die p465b-Rollencode-Zuweisungs-Grenzen ohne Laufzeiteffekte - -- Prüft statische Artefakte nur -- Keine Chat-, Retrieval- oder LLM-Laufzeit -- Keine Shop-Suche -- Keine MCP-Aufrufe -- ProductLabelFormatter bleibt frei von Shop, Retrieval, Evidence und LLM -- AgentRunner bleibt Orchestrator - -- Befehl ausführen: mto:agent:architecture:product-role-code-assignment-guard-self-test -- Ausgabe auf Status OK prüfen -- Ergebnis: status = OK oder FAIL mit Details ----------------------------------------- - -Stabilitäts-Selbsttest bereitstellen - -Validierung der Shop- und Follow-up-Ankerwächter vor dem Deployment - -- Prüft REQUIRED_METHODS in AgentRunner.php -- Prüft keine FORBIDDEN_GUARD_MARKERS in Ankerwächter-Methoden -- Liest PATCH_MANIFEST.md und patch_history-Dateien -- Erzeugt Report ohne Runtime-Seiteneffekte -- json gibt maschinenlesbares Format aus - -- Binconsole mto:agent:shop-followup-anchor-stability-self-test -- Status OK prüfen -- passed größer 0 prüfen -- failed gleich 0 prüfen -- Binconsole mit --json -- JSON-Status OK prüfen ----------------------------------------- - -System rebuild bereitstellen ----------------------------------------- - -Vektordienst steuern - -Steuert den Vektorsuchdienst über die Kommandozeile - -- Rufzeit 300 Sekunden -- Standard-Host 0.0.0.0 -- Standard-Port 8090 -- Ruft Vector-Kontrollskript auf - -- Status wird angezeigt ----------------------------------------- - -Wissensbatch finalisieren testen - -Prüft die Verknüpfung von Batch-Abschluss und Bericht ohne Seiteneffekte - -- Prüft ohne Import, LLM-Aufruf oder Index-Rebuild -- Neun Prüfungen für Routing, Report und Abhängigkeiten -- Gibt FAIL bei einer einzigen fehlgeschlagenen Prüfung -- JSON-Ausgabe enthält status, scope, checks und failed - -- Command ausführen: mto:agent:knowledge:batch-finalize-self-test -- Ausgabe zeigt status OK oder FAIL -- JSON-Flag setzen: --json -- JSON enthält status und failed-Liste ----------------------------------------- - -MCP-Allowlist prüfen diff --git a/daten/RAG/anleitungen.md b/daten/RAG/anleitungen.md deleted file mode 100644 index 6754020..0000000 --- a/daten/RAG/anleitungen.md +++ /dev/null @@ -1,43 +0,0 @@ - -Anleitungen ----------------------------------------- - -kern ----------------------------------------- - -Zeigt Anleitungen als gerendertes Markdown im Admin-Bereich ----------------------------------------- - -- Erste H1 als Titel -- Ohne H1 wird Slug als Titel verwendet -- H1 erscheint doppelt: als Titel und im gerenderten Inhalt ----------------------------------------- - -Anleitung anzeigen - -Liest eine Markdown-Datei und zeigt sie als HTML gerendert an - -- Ungültiger Slug wirft 404 -- Fehlende Datei wirft 404 -- Titel aus erster H1 oder aus Slug -- Markdown als HTML gerendert - -- admin guides beispiel-seite aufrufen -- Titel und HTML-Inhalt sehen -- admin guides ungueltig aufrufen -- 404-Fehlerseite ----------------------------------------- - -Anleitungsübersicht öffnen - -Listet alle verfügbaren Anleitungen zur schnellen Auswahl auf - -- Markdown-Dateien aus bestimmtem Ordner -- Erste Überschrift als Titel -- Ohne Ordner wird leere Liste angezeigt -- Alphabetisch nach Titel sortiert -- Ungültige Dateinamen ignoriert - -- Admin-Bereich öffnen -- Klick auf Anleitungen -- Anleitungen alphabetisch aufgelistet diff --git a/daten/RAG/auftraege.md b/daten/RAG/auftraege.md deleted file mode 100644 index e00a675..0000000 --- a/daten/RAG/auftraege.md +++ /dev/null @@ -1,94 +0,0 @@ - -Aufträge ----------------------------------------- - -kern ----------------------------------------- - -Verarbeitet asynchrone Aufgaben mit Verfolgung von Status und Ereignissen ----------------------------------------- - -- ROLE_ADMIN_AREA für Admin-Statusabruf erforderlich -- Admin-Bereich für Ereignisse gilt ohne Events-Endpunkt -- Antwort enthält lastEventId, updatedAt, startedAt, completedAt, runningStaleAfterSeconds -- Vollständiger Kontext muss explizit angefordert werden, Standard ist eingeschränkter Kontext -- Abgeschlossene, fehlgeschlagene und abgebrochene Ingest-Jobs werden mit Exitcode SUCCESS beendet -- Dry-Run gibt im Output einen Hinweis zum Zwischenspeicher-Status aus -- Ingest-Job-Verarbeitung leert PHP-Laufzeit- und Vector-Service-Cache nach Abschluss ----------------------------------------- - -Auftrag starten - -Übermittelt einen Prompt zur asynchronen Verarbeitung im Hintergrund - -- Leere Prompts werden abgelehnt -- Prompts über dem Zeichenlimit werden abgelehnt -- Ungültige Upload-IDs werden abgelehnt -- Job-ID besteht aus 48 Hexadezimalzeichen -- Erstellt Job mit Status pending - -- POST ask-jobs mit gültigem Prompt -- Antwort enthält jobId -- Statuscode ist 200 -- POST ask-jobs mit leerem Prompt -- Statuscode ist 400 -- POST ask-jobs mit zu langem Prompt -- Statuscode ist 413 ----------------------------------------- - -Auftragsereignisse abrufen - -Ermöglicht dem Client, Auftragsereignisse zu pollen - -- Unbekannte Auftrags-ID gibt HTTP 404 zurück -- Veraltete laufende Aufträge werden als fehlgeschlagen markiert -- Ereignisse nach after werden zurückgegeben - -- GET ask-jobs jobId events after 0 -- Antwort enthält status, events, lastEventId -- Unbekannte jobId gibt HTTP 404 ----------------------------------------- - -Auftragsstatus anzeigen - -Ermöglicht dem Admin, den aktuellen Status eines Auftrags ohne Seitenreload zu prüfen - -- ROLE_ADMIN_AREA erforderlich -- JSON mit id, type, status, startedAt, finishedAt, errorMessage, logPath -- 404 bei unbekannter Auftrags-ID - -- Detailseite eines Auftrags öffnen -- Statusabfrage per AJAX auslösen -- JSON mit status und Zeitstempeln empfangen ----------------------------------------- - -Auftragsstatus prüfen - -Ermöglicht das Prüfen des aktuellen Zustands eines Auftrags - -- jobId ist eine 48-stellige Hexadezimalzahl -- Ungültige jobId liefert Status missing -- Abgelaufene Aufträge werden als failed markiert -- Antwort enthält status, message, timestamps und serverTime - -- ask-jobs-Endpunkt mit jobId aufrufen -- JSON-Antwort mit Status prüfen -- Status pending, running, completed, interrupted oder failed zurückgegeben ----------------------------------------- - -Ingest-Job starten - -Startet einen bereitgestellten Ingest-Job über seine UUID - -- Job-ID als Pflichtargument erforderlich -- Job-Status muss ausführbar sein -- Abgeschlossene Jobs werden nicht erneut ausgeführt -- Dry-Run vermeidet Seiteneffekte -- Fehler führen zu FAILURE-Exitcode - -- Befehl mit gültiger Job-ID ausführen -- Job wird verarbeitet -- Erfolgsmeldung erscheint ----------------------------------------- - -Ingest-Jobs auflisten diff --git a/daten/RAG/backup.md b/daten/RAG/backup.md deleted file mode 100644 index 7d8afa6..0000000 --- a/daten/RAG/backup.md +++ /dev/null @@ -1,97 +0,0 @@ - -Backup ----------------------------------------- - -kern ----------------------------------------- - -Erstellt, prüft und stellt Backups bereit ----------------------------------------- - -- POST-Routen erfordern CSRF-Token -- Super Admin darf Restore-Prüfungen ausführen -- Flash-Meldung zeigt Status nach jeder Aktion -- Alle Prüfungen werden protokolliert -- Backup-IDs folgen dem Muster retriex-backup-Datum-Uhrzeit -- json gibt maschinenlesbare Ausgabe zurück -- Ungueltiges CSRF-Token zeigt Flash-Meldung -- Backup herunterladen mit "Neueste" waehlt aktuelles Backup -- Operator-Report als JSON exportieren -- Deployment-Scheduler-Pruefung mit Beschreibung in Flash-Meldung -- Sicherheit-und-Datenschutz-Pruefung mit Beschreibung in Flash-Meldung -- Backup-Dry-Run erwähnt fehlende Dateischreibweise in Flash-Meldung ----------------------------------------- - -Backup herunterladen - -Ermöglicht dem Super Admin das Herunterladen einer Sicherungsdatei - -- Nur Super Admin -- Backup-ID aus Liste oder "Neueste" -- Fehlgeschlagener Download zeigt Flash-Meldung -- Erfolgreicher Download protokolliert OperatorCheckProtocol - -- admin_enterprise_operations öffnen -- Backup-ID aus Liste auswählen -- Klick auf Download-Button -- Datei im Browser heruntergeladen ----------------------------------------- - -Backup starten - -Erstellt eine Sicherungskopie mit allen konfigurierten Quellen - -- CSRF-Token erforderlich -- Ablauf im Operator-Protokoll -- Flash-Meldung je nach Status -- Database-Dump als Option - -- Backup-Endpunkt per POST aufrufen -- _token und include_database_dump senden -- Flash-Meldung zeigt Status -- Backup erstellt ----------------------------------------- - -Backup-Tauglichkeit prüfen - -Prüft ob das System alle Voraussetzungen für Backup und Restore erfüllt - -- JSON-Ausgabe mit --json -- Tabelle zeigt alle Testfälle -- Rückgabe SUCCESS bei Status OK - -- Befehl mto:agent:enterprise:backup-restore-readiness ausführen -- Tabelle mit Testfällen prüfen -- Rückgabe SUCCESS bei Status OK ----------------------------------------- - -Backup-Trockenlauf prüfen - -Prüft die Wiederherstellbarkeit eines Backups ohne tatsächlichen Restore - -- Nur Super-Admin darf Funktion ausführen -- CSRF-Token wird geprüft -- Report wird im Prüfprotokoll aufgezeichnet -- Flash-Nachricht zeigt Status, Backup-ID und Anzahl Warnungen sowie Fehler - -- POST an admin enterprise restore dry-run latest -- Erfolg: Redirect zur Übersicht mit Flash-Nachricht -- Fehler: Redirect zur Übersicht mit Fehlermeldung ----------------------------------------- - -Backup-Wiederherstellung prüfen - -Prüft ob Backup-Pfad, Restore-Nachweis und Betreiberhinweise vorhanden sind - -- CSRF-Token erforderlich -- Flash-Meldung zeigt Zusammenfassung -- Protokolliert den Check - -- POST an /admin/enterprise/check/backup-restore -- ungültiges CSRF-Token senden -- Weiterleitung mit Fehlermeldung -- gültiges CSRF-Token senden -- Weiterleitung mit Zusammenfassung ----------------------------------------- - -Operatorbericht als JSON exportieren diff --git a/daten/RAG/benutzer.md b/daten/RAG/benutzer.md deleted file mode 100644 index ea18020..0000000 --- a/daten/RAG/benutzer.md +++ /dev/null @@ -1,89 +0,0 @@ - -Benutzer ----------------------------------------- - -kern ----------------------------------------- - -Ermöglicht Super-Admins die Verwaltung aller Benutzer des Systems ----------------------------------------- - -- POST-Requests erfordern gültiges CSRF-Token -- Mindestens eine Rolle erforderlich -- Statusfilter akzeptiert nur all, active, inactive -- Statusfilter default bei ungueltigem Wert ist all -- Rollefilter default bei ungueltiger Rolle ist all -- Vorname ist optional -- Abteilung ist optional -- Passwort ist erforderlich -- is_active ist standardmaessig inaktiv -- Rollen werden als Array uebergeben -- Bearbeiten erfordert aktuellen Benutzer -- Benutzer-ID muss UUID-Format haben ----------------------------------------- - -Benutzer aktivieren - -Aktiviert oder deaktiviert einen Benutzer sofort - -- Nur ROLE_SUPER_ADMIN hat Zugriff -- POST mit gültigem CSRF-Token nötig -- Umschalten zwischen Aktiv und Inaktiv -- Redirect zur Übersicht nach Umschalten - -- Admin-Übersicht öffnen -- LMB auf Toggle-Button eines aktiven Benutzers -- Benutzer ist inaktiv ----------------------------------------- - -Benutzer anlegen - -Legt einen Anwendungsbenutzer über die Konsole an - -- E-Mail gültig und einmalig -- Passwort mindestens 8 Zeichen -- Passwort zweimal identisch eingegeben -- Mindestens eine Rolle zugewiesen - -- mto-agent-user-create aufrufen -- Ungültige E-Mail eingeben -- Validierungsfehler erwarten -- Gültige E-Mail eingeben -- Zu kurzes Passwort eingeben -- Validierungsfehler erwarten -- Passwort eingeben -- Anderes Passwort wiederholen -- Validierungsfehler erwarten -- Passwort wiederholen -- Rollen auswählen -- Benutzeraktivierung bestätigen -- Ausgabe zeigt E-Mail Rolle Aktiv ----------------------------------------- - -Benutzer auflisten - -Zeigt admin-seitig alle Benutzer mit Filteroptionen an - -- Nur Super-Admin darf zugreifen -- Filterung nach Suchbegriff, Status und Rolle -- Standardfilterung ohne Parameter zeigt alle - -- Seite /admin/users aufrufen -- Seite zeigt Benutzerliste mit Rollen und Status -- Filter auf Status "aktiv" setzen -- Liste zeigt nur aktive Benutzer ----------------------------------------- - -Benutzer bearbeiten - -Änderungen an Benutzerdaten speichern - -- Super Admin erforderlich -- CSRF-Token erforderlich -- E-Mail muss gültig sein -- Neues Passwort optional - -- Bearbeitungsseite für Benutzer öffnen -- Formular mit geänderten Daten absenden -- Erfolgsmeldung anzeigen -- Zur Übersicht redirect diff --git a/daten/RAG/berichte.md b/daten/RAG/berichte.md deleted file mode 100644 index c18287b..0000000 --- a/daten/RAG/berichte.md +++ /dev/null @@ -1,90 +0,0 @@ - -Berichte ----------------------------------------- - -kern ----------------------------------------- - -Berichte aus Enterprise-Diensten generieren, herunterladen und löschen ----------------------------------------- - -- Rolle SUPER_ADMIN statt EDITOR für Bericht als JSON herunterladen erforderlich -- Akzeptanzbericht generieren fehlt Ausgabe als Markdown für Nachweisprotokoll -- FAIL-Status: Exitcode 1 nur im JSON-Modus -- Operatorbericht als Markdown herunterladen fehlt als Funktion ----------------------------------------- - -Akzeptanzbericht generieren - -Zeigt zusammengefasste Ergebnisse der Operator-Prüfungen im Terminal - -- markdown-Option gibt Markdown aus -- json-Option gibt JSON aus -- Standardausgabe formatiert als Tabelle - -- Kommando mit markdown-Option ausführen -- Markdown-Tabelle erscheint ----------------------------------------- - -Bericht als JSON herunterladen - -Exportiert einen Batch-Bericht als JSON-Datei zum Speichern - -- Rolle EDITOR erforderlich -- Format muss json oder md sein -- Datei muss existieren - -- Batch-Übersicht öffnen -- LMB auf JSON-Download-Link eines Batch-Berichts -- Datei wird heruntergeladen ----------------------------------------- - -Bericht löschen - -Entfernt einen nicht mehr benötigten Batch-Bericht dauerhaft - -- POST-Methode erforderlich -- CSRF-Token obligatorisch -- Nur ROLE_EDITOR hat Zugriff -- Erfolgs- oder Warnmeldung als Flash -- Zur Berichte-Übersicht weitergeleitet - -- Batch-Bericht öffnen -- Löschen-Schaltfläche klicken -- Bestätigungsdialog bestätigen -- Zur Übersicht weitergeleitet -- Flash-Meldung 'gelöscht' sichtbar ----------------------------------------- - -Berichte auflisten - -Zeigt alle Batch-Importe zur Übersicht - -- listReports liefert alle Berichte -- defaultReportDir wird übergeben - -- GET admin knowledge-batches aufrufen -- Seite mit Berichtsliste wird angezeigt ----------------------------------------- - -Übersicht rendern - -Zeigt den Betriebszustand aller Enterprise-Komponenten auf einen Blick - -- Baut Berichte aller Enterprise-Dienste -- json gibt maschinenlesbares JSON aus -- Ohne Flag formatiert SymfonyStyle-Ausgabe -- FAIL-Status gibt Exitcode 1 zurück - -- php bin console mto:agent:enterprise:operations-overview --json -- JSON-Ausgabe enthält Felder status, progress, components, primary_action -- Exitcode ist 1 bei Status FAIL ----------------------------------------- - -Operatorbericht als Markdown herunterladen ----------------------------------------- - -Batch-Bericht hochladen ----------------------------------------- - -Batch-Bericht anzeigen diff --git a/daten/RAG/chat.md b/daten/RAG/chat.md deleted file mode 100644 index aaf5b5e..0000000 --- a/daten/RAG/chat.md +++ /dev/null @@ -1,53 +0,0 @@ - -Chat ----------------------------------------- - -kern ----------------------------------------- - -Ermöglicht authentifizierten Nutzern, Prompts zu senden und Antworten als Event-Stream zu empfangen ----------------------------------------- - -- Eigener Login-Bereich -- Upload-IDs werden gegen Client-ID validiert -- CHAT_HANDBOOK.md wird aus Projektverzeichnis gelesen -- Fehlende oder leere CHAT_HANDBOOK.md als nicht verfügbar -- Anonym bei fehlendem Namen -- Handbook maximal 512 KB ----------------------------------------- - -Abmelden ermöglichen - -- Abmelden wählen -- Anmeldung beendet ----------------------------------------- - -Chat streamen - -Liefert eine Chat-Antwort als kontinuierlichen Datenstrom im Browser - -- POST mit Prompt im Body -- Prompt zu lang: Stream mit error-Event -- Prompt leer: Stream mit error-Event -- Upload-IDs werden validiert -- Antwort im Format text event-stream -- retry: 3000 bei Verbindungsproblemen - -- Ask-SSE-Endpunkt mit gültigem Prompt ansprechen -- Daten-Chunks aus Stream empfangen -- event: done als Abschluss ----------------------------------------- - -Chatseite anzeigen - -Zeigt die Chatseite mit Prompt-Benutzername und Wissensraum-Auswahl - -- Liest CHAT_HANDBOOK.md aus dem Projektverzeichnis -- Fehlende oder leere Datei wird als nicht verfügbar behandelt -- Eigene Vorlage: chat index.html.twig - -- GET chat aufrufen -- Seite rendert ohne Fehler -- Prompt-Benutzername ist Anonym -- Wissensraum-Auswahl wird angezeigt -- Handbuch-Verfügbarkeit wird angezeigt diff --git a/daten/RAG/diagnose.md b/daten/RAG/diagnose.md deleted file mode 100644 index dd908e2..0000000 --- a/daten/RAG/diagnose.md +++ /dev/null @@ -1,386 +0,0 @@ - -Diagnose ----------------------------------------- - -kern ----------------------------------------- - -Ermöglicht Betreibern die Überprüfung von Systemzustand, Konfiguration und Datenqualität ohne produktive Änderungen ----------------------------------------- - -- Alle Diagnosekommandos bieten --json-Ausgabe -- Exit-Code 0 spiegelt Status OK wider -- Exit-Code 1 zeigt Fehler oder Befunde an -- Diagnoseoperationen verändern keine Daten -- Kein Diagnosebefehl ruft LLM während der Prüfung auf -- MAX_LINE_BYTES = 2097152 -- limit-Option: Standardwert 10 -- Diagnostic-only-Hinweis im Footer -- Patchline-Pruefung bei Architecture Release Lock -- Genau ein AgentRunner-Boundary-Call sichtbar ----------------------------------------- - -Abdeckung prüfen - -Prüft ob gespeicherte Ingest-Facts eine Anfrage abdecken - -- Query muss nicht leer sein -- index.ndjson muss existieren -- Treffer nach State-Rang und Score sortiert -- json gibt maschinenlesbare Daten zurück - -- Command mit Query ausführen -- Diagnoseausgabe mit Abdeckungsdaten prüfen -- Command mit --json ausführen -- JSON-Struktur mit rows und summary prüfen -- Command mit --min-score und --limit ausführen -- Gefilterte Treffer nach Score geordnet ----------------------------------------- - -Abrufgrenzen prüfen - -Prüft ob Retrieval-Architekturgrenzen eingehalten werden - -- Required-Dateien sind vorhanden -- AgentRunner besitzt Retrieval-Orchestrierung -- Genau ein Boundary-Call in AgentRunner -- Boundary-Service bleibt dünn -- Flow bleibt trace-only -- ReadModel bleibt beschränkt -- PostCallFocus erweitert keinen Constructor -- RetrieverInterface bleibt minimal -- HybridRetriever bleibt in Retrieval-Layer -- Dokumentation sichert Architecture Release Lock - -- Command ausführen mit --json -- Ausgabe zeigt Status OK ----------------------------------------- - -Bereitschaftsbericht ausgeben - -Prüft Bereitschaft von Deployment und Scheduler und zeigt Ergebnisse an - -- json-Option gibt maschinenlesbares JSON aus -- Standardausgabe zeigt DefinitionList und Tabelle -- Exit-Code 0 bei Status OK - -- Befehl mit --json ausführen -- JSON-Ausgabe validieren -- Befehl ohne Option ausführen -- Tabelle mit Status OK prüfen ----------------------------------------- - -Datenqualität prüfen - -Prüft die Qualität von Text-Chunks im Original und nach Markdown-Umsetzung auf Datenverluste - -- Liest ausschließlich ohne Index-Schreibzugriff -- Kein Ranking und keine Antwortlogik -- Argument document-id ist erforderlich -- Option version wählt eine bestimmte Dokumentversion -- Option json liefert maschinenlesbare Ausgabe - -- php bin/console mto:agent:ingest:chunk-quality {uuid} -- Ausgabe zeigt Titel und ausgewählte Version -- Abschnitt Original zeigt Chunk-Profil -- Abschnitt Markdown zeigt Chunk-Profil -- Abschnitt Vergleich zeigt Kennzahlen und Delta -- Abschnitt Interpretation zeigt strukturierte Hinweise ----------------------------------------- - -Diagnose anzeigen - -Ermöglicht dem Administrator die MCP-Anbindungen und Wissensraum-Inhalte zu prüfen und zu verwalten - -- Nur Super-Administratoren haben Zugriff -- Vier Ansichten: Übersicht, Anbindung, Wissensräume, System -- Vorgangsvarianten werden als Flash-Meldungen zurückgemeldet -- Formularaktionen erfordern gültiges CSRF-Token -- Transienter Zustand wird über POST-GET-Redirect erhalten - -- Admin-MCP-Seite aufrufen -- Route antwortet mit Status 200 -- Übersicht der Anbindungen sichtbar ----------------------------------------- - -Genre-Hotspots prüfen - -Entdeckt genrespezifische Begriffe im Kerncode, die das Sprachmodell beeinflussen können - -- Ergebnis ist schreibgeschützt -- json gibt maschinenlesbare Daten aus -- strict gibt Nicht-Null-Exit-Code bei Befunden aus -- details zeigt alle Ergebniszeilen - -- Terminal öffnen -- Befehl ohne Parameter ausführen -- Zusammenfassung mit Befunden erscheint ----------------------------------------- - -Guard-Mechanismus prüfen - -Prüft die Guard-Implementierung ohne Seiteneffekte - -- Liest nur lokale Dateien -- Keine Runtime-Aufrufe -- Prüft 8 Testfälle - -- Befehl ausführen: mto:agent:proofing:unsupported-tool-term-guard-self-test -- Status OK in JSON-Ausgabe prüfen -- Alle 8 Testfälle bestanden ----------------------------------------- - -Hygieneregeln prüfen - -Prüft ob Batch-Hygieneregeln korrekt implementiert und nicht in die Antwortlaufzeit verdrahtet sind - -- source_noise_cleaner_entfernt_PDF_Restzeichen -- validator_entfernt_QUELLSEGMENT_Echo -- directory_cleanup_entfernt_leere_Admin-Upload_Ordner -- directory_cleanup_verschiebt_Legacy_failed_Eintraege -- batch_reports_sind_loeschbar_mit_CSRF_Schutz -- document_delete_bereinigt_physische_Dateien -- failed_skipped_resolvt_ausserhalb_inbox -- keine_Hygiene_Dienste_in_Antwortlaufzeit_verdrahtet - -- Befehl `mto:agent:knowledge:batch-hygiene-self-test` ausfuehren -- JSON-Ausgabe pruefen -- Alle Faelle Status OK ----------------------------------------- - -Indizierungszustand prüfen - -Prüft automatisch, ob der verzögerte Indizierungsvertrag in allen Dateien korrekt umgesetzt ist - -- Liest Controller, Services, Repositories und Templates ein -- Prüft 19 Vertragsfälle zum verzögerten Indizierungsworkflow -- Gibt Zusammenfassung oder strukturiertes JSON aus -- Gibt Erfolgscode bei allen bestandenen Fällen zurück - -- Befehl mit --json ausführen -- Ausgabe auf "OK" oder "FAILED" prüfen -- FEHLGESCHLAGEN: Case entfernt ungültigen startJob-Aufruf in activateVersion -- FEHLGESCHLAGEN: Case entfernt verzögertes setCurrentVersion in documentService -- Alle Cases bestanden: Rückgabewert Command::SUCCESS ----------------------------------------- - -Konfiguration prüfen - -Prüft ob alle RetrieX-Einstellungen gültig sind und zeigt Fehler oder Warnungen an - -- mto:agent:config:validate als Konsolenbefehl verfügbar -- Gibt Fehler und Warnungen aus -- json gibt maschinenlesbares Ergebnis aus -- Rückgabewert 0 bei gültiger Konfiguration -- Rückgabewert 1 bei ungültiger Konfiguration -- Regression Guardrails werden geprüft - -- php bin/console mto:agent:config:validate ausführen -- Ergebnis auf Fehler und Warnungen prüfen -- Exitcode prüfen -- Konfiguration gültig: Exitcode 0 -- php bin/console mto:agent:config:validate --json ausführen -- JSON-Ausgabe enthält status, errors, warnings ----------------------------------------- - -Provenienz prüfen - -Prüft ob Provenienzdiagnostik ohne Ranking- oder Antwortwirkung funktioniert - -- Liest Ingest-Service, Admin-Inspektor, Template und Styles -- Prüft Provenienz-Metadaten in NDJSON -- Prüft Diagnostik-Metadaten in NDJSON -- Prüft Sidecar-Lesen ohne LLM-Aufruf -- Prüft Admin-Ansicht mit Provenienz und Heading-Pfad -- Prüft Read-only-Label in UI -- Prüft Kein Antwort-Runtime-Einfluss -- Prüft Genre-Neutralität der Diagnostik - -- mto agent ingest markdown-derived-chunk-diagnostics-self-test ausführen -- Kommando endet erfolgreich -- Ausgabe zeigt status OK -- Alle 8 Cases zeigen status OK ----------------------------------------- - -Retrieval-Pipeline testen - -Ermöglicht die Überprüfung der Retrieval-Pipeline mit detailliertem Debug-Output - -- Prompt als Argument erforderlich -- Leerer Prompt erzeugt Fehler -- json gibt Rohdaten ohne Formatierung aus -- show-text zeigt ungekürzte Chunk-Texte - -- mto:agent:retrieval:test mit Prompt ausführen -- Ausgabe auf Pipeline-Summary prüfen -- mto:agent:retrieval:test --json ausführen -- JSON-Struktur mit duration_ms und results vorhanden ----------------------------------------- - -Retrieval-Qualität testen - -Prüft ob die Konfiguration passende Inhalte findet - -- Erfordert ROLE_KNOWLEDGE_ADMIN -- GET zeigt leere Maske -- POST führt TestRetrieval aus - -- Seite test-retrieval öffnen -- Prompt eingeben und absenden -- Ergebnisse werden angezeigt ----------------------------------------- - -Segmentierung prüfen - -Prüft ob Segmentierung korrekt ausgeführt wird - -- Liest alle relevanten Dateien ein -- Prüft required_files_present -- Prüft execution_uses_complete_segment_plan -- Prüft segment_prompt_is_fragment_only -- Prüft llm_called_per_segment_with_long_transport -- Prüft sidecar_records_segment_processing_without_raw_payloads -- Prüft generated_version_remains_inactive -- Prüft no_index_or_answer_runtime_wiring -- Prüft no_genre_runtime_gate_markers -- Report enthält Status und Zusammenfassung - -- mto:agent:ingest:segmented-markdown-normalization-self-test ausführen -- Status OK oder FAIL prüfen -- Testläufe als Zusammenfassung sehen ----------------------------------------- - -Shop-Suche testen - -Prüft die Shop-Suche mit detaillierter Ausgabe von Suchvorschau, Ergebnissen und optionalem Repair - -- Standard-Query: 'zeige mir produkte unter 5000 euro' -- repair aktiviert zusätzliche Search-Repair-Suche -- json gibt maschinenlesbare Ausgabe aus -- Primärsuche wird immer ausgeführt - -- mto:agent:test:shop-search ausführen -- Suchvorschau und Primärergebnisse prüfen -- mto:agent:test:shop-search laptop --repair ausführen -- Repair-Auswertung mit Ergebnissen prüfen -- mto:agent:test:shop-search laptop --json ausführen -- JSON-Ausgabe mit query, preview und repair prüfen ----------------------------------------- - -Sicherheitsstatus prüfen - -Prüft den Security- und Datenschutz-Bereitschaftsgrad ohne Seiteneffekte - -- Kommandoname: mto:agent:enterprise:security-data-protection-readiness -- json gibt maschinenlesbares JSON aus -- Erfolg bei Status OK -- Fehler bei Status nicht OK - -- php bin/console mto:agent:enterprise:security-data-protection-readiness -- Tabelle mit Cases wird ausgegeben -- php bin/console mto:agent:enterprise:security-data-protection-readiness --json -- JSON-Objekt wird ausgegeben ----------------------------------------- - -Stapel-Upload verifizieren - -Prüft die Integrität des Batch-Upload-Systems ohne Dokumente zu importieren - -- Trockenlauf ohne Dokumentenimport -- Ruft kein LLM auf -- Ändert keine Daten im Wissensspeicher -- Gibt maschinenlesbares JSON aus -- Prüft CSRF-Schutz, Dienstintegration und Fortschrittsanzeige -- Prüft PDF-Schutz, Speichergrenzen und Leerraum-Bereinigung -- Prüft CLI-Progress und keine Agent-Verschaltung - -- PHP-Befehl aus src Command KnowledgeBatchAdminUploadSelfTestCommand.php ausführen -- Alle 10 Cases in der Tabelle prüfen -- Jeder Case zeigt Status OK oder FAIL ----------------------------------------- - -Systemzustand prüfen - -Prüft NDJSON und FAISS-Konsistenz - -- Gibt JSON aus -- OK-Status gibt SUCCESS zurück -- Fehler-Status gibt FAILURE zurück - -- php bin console mto:agent:vector:health -- Konsistente Indices: OK-Status in JSON -- Fehler: FAILURE und Fehlermeldung in JSON ----------------------------------------- - -Tag-Index-Gesundheit prüfen - -Prüft die Konsistenz zwischen Tag-Daten und FAISS-Index - -- summary zeigt Zusammenfassung statt JSON -- Exitcode 0 bei Status OK oder OK_EMPTY -- Exitcode 1 bei allen anderen Status -- Prüft tags_ndjson_exists, vector_exists, meta_valid - -- bin console mto:agent:tag:health ausführen -- LMB auf --summary -- Zusammenfassung mit Status, Zählern und Gültigkeit -- Befehl mit Exitcode 0 beendet ----------------------------------------- - -Tags neu indizieren - -Echtzeitaktualisierung des Neuindizierungsfortschritts im Browser - -- Lädt alle 2 Sekunden neuen Status -- Sendet Ereignis nur bei Hash-Änderung -- Sendet Keepalive alle 10 Sekunden -- Endet bei Verbindungsabbruch - -- Stream-Endpunkt aufrufen -- MIME-Typ text event stream prüfen -- Antwortet mit Stream -- Event-Stream antwortet ----------------------------------------- - -Verankerung testen - -Diagnostiziert die Verankerung von Nachfolgedialogen in der Historie - -- Kein Laufzeitverhalten geändert -- Report als Text oder JSON ausgebbar -- sample führt integrierten Smoke-Test aus -- Historie aus Datei, STDIN oder Option lesbar - -- Sample-Dry-Run ausführen -- Text-Report auf erkennbaren Anker prüfen -- Kernprodukt und Nachfolgedialog identifizieren ----------------------------------------- - -Vergleichsgrenzen validieren - -Prueft, ob alle Dateien und Muster fuer die Chunk-Qualitaetsvalidierung vorhanden sind - -- Liest src Service Admin DocumentChunkQualityComparisonService php -- Liest src Command IngestChunkQualityCommand php -- Liest src Controller Admin DocumentController php -- Liest templates admin document show html twig -- Liest public assets styles base css -- Liest DocumentMarkdownSegmentationPlanService php -- Liest AgentRunner php und KnowledgeIngestService php -- Prueft Dateien auf vorhandene Strings mit str_contains -- Prueft Dateien auf abwesende Strings mit !str_contains -- Gibt FAIL zurueck sobald ein Fall fehlschlaegt -- x-Icon - -- php bin console mto agent ingest chunk-quality-self-test ausfuehren -- Rueckgabe auf vollstaendige Faelle pruefen -- Status OK bei allen gueltigen Implementierungen ----------------------------------------- - -Titelvorschläge-Selbsttest bereitstellen ----------------------------------------- - -Konfigurationsquellen prüfen ----------------------------------------- - -Batch-Markdown-Normalisierung testen diff --git a/daten/RAG/dokumente.md b/daten/RAG/dokumente.md deleted file mode 100644 index 19eafa7..0000000 --- a/daten/RAG/dokumente.md +++ /dev/null @@ -1,127 +0,0 @@ - -Dokumente ----------------------------------------- - -kern ----------------------------------------- - -Organisiert Dokumente mit Versionierung und prüft deren Bereitschaft für den Wissensindex ----------------------------------------- - -- POST-Operationen erfordern CSRF-Token -- Versionen absteigend nach Versionsnummer sortiert -- Fehler bei API-Routen liefern ok=false mit Meldung -- Dateien im konfigurierten Upload-Verzeichnis gespeichert -- Index-Neuaufbau erfordert bewusste Auslösung -- Titelvorschläge erzeugen: Endpunkt fehlt -- Version ableiten: Endpunkt fehlt -- Version aktivieren: Endpunkt fehlt -- Version ingest: Endpunkt fehlt -- Formularansicht GET fehlt -- TagController mit Tag erstellen, Tag entfernen, Tag zuweisen fehlt ----------------------------------------- - -Abschnitte laden - -Markiert eine Dokumentversion für den nächsten Index-Neuaufbau - -- Nur aktive Versionen sind zulässig -- CSRF-Token erforderlich -- Editor-Rolle erforderlich - -- Abschnitte über Admin-Endpunkt laden mit gültigem Token -- Aktive Version auswählen -- Erfolgsmeldung: Version für Index-Neuaufbau vorgemerkt ----------------------------------------- - -Abschnittsqualität laden - -Zeigt Qualitätskennzahlen der Textabschnitte einer Dokumentversion im Admin-Bereich - -- Benötigt ROLE_EDITOR -- Liefert JSON mit Qualitätsdaten -- Fehler liefert ok=false mit Fehlermeldung - -- Admin-Endpunkt abrufen -- Valides CSRF und Version vorhanden -- JSON mit ok=true und quality-Daten ----------------------------------------- - -Dokument anzeigen - -Zeigt alle Details eines Dokuments mit Versionshistorie und Qualitätsindikatoren - -- Nur Benutzer mit ROLE_EDITOR -- DocumentVersionPreviewService lädt Inhalt -- DocumentChunkInspectionService prüft Segmentierung -- DocumentMarkdownNormalizationInspector analysiert Markdown -- DocumentIndexReadinessService zeigt Indexbereitschaft - -- Admin-Dokumentenansicht öffnen -- Seite zeigt Dokument mit Versionen und Qualitätsdaten -- Chunk-Übersicht sichtbar -- Markdown-Normalisierungsstatus sichtbar -- Index-Bereitschaftsanzeige sichtbar ----------------------------------------- - -Dokument entfernen - -Entfernt ein Dokument dauerhaft aus dem System - -- Entfernt alle Versionen des Dokuments -- Loescht verknuepfte Ingest-Jobs -- Bereinigt zugeordnete Dateien - -- Entfernen-Knopf betaetigen -- Bestaetigung bestaetigen -- Dokument nicht mehr in Uebersicht ----------------------------------------- - -Dokument erstellen - -Erstellt ein neues Dokument aus einer hochgeladenen Datei - -- Erfordert Rolle ROLE_EDITOR -- Nur POST-Requests erzeugen ein Dokument -- CSRF-Token Pflicht -- Hochgeladene Datei Pflicht -- Titel Pflicht -- Titel maximal 255 Zeichen -- Dateiname normiert -- Datei gespeichert im konfigurierten Upload-Verzeichnis - -- Admin-Dokumente-Neu aufrufen -- Formular mit Datei und Titel absenden -- Erfolgsmeldung und Weiterleitung zur Dokumentdetailseite ----------------------------------------- - -Dokumente auflisten - -Zeigt alle Dokumente mit Statistiken und Filtern an - -- Filter werden aus URL-Parametern geladen -- Aktive Filter werden hervorgehoben -- Zeigt Statistiken zur Dokumentenübersicht -- Index-Bereitschaft wird angezeigt - -- admin/documents öffnet die Übersicht -- Dokumente werden mit Titeln angezeigt -- LMB auf Filterfeld -- Filterkriterium auswählen -- Ergebnis zeigt gefilterte Dokumente ----------------------------------------- - -Markdown bereinigen - -Erstellt eine normalisierte Markdown-Version aus dem Original - -- CSRF-Token erforderlich -- Neue Version ist inaktiv -- Abgeleitet von ausgewaehlter Version - -- Seite der Dokumentversion öffnen -- POST an markdown-normalize-Endpunkt senden -- Neue inaktive Version erzeugt ----------------------------------------- - -Version-Chunks abrufen diff --git a/daten/RAG/evaluation.md b/daten/RAG/evaluation.md deleted file mode 100644 index 79feecf..0000000 --- a/daten/RAG/evaluation.md +++ /dev/null @@ -1,100 +0,0 @@ - -Evaluation ----------------------------------------- - -kern ----------------------------------------- - -Führt Testläufe für AI-Agenten aus und liefert strukturierte Berichte ----------------------------------------- - -- ROLE_KNOWLEDGE_ADMIN für alle Admin-Funktionen -- CSRF-Token für alle POST-Operationen -- Berichte als JSON-Dateien gespeichert -- Exitcode FAILURE bei einem oder mehr Fehlern -- Standardtyp retrieval ohne explizite Angabe -- Parallele Ausführung als Child-Prozesse -- Reportdateiname ist retrieval-last-run.json -- Meta-Review-Signale werden als PASS+REVIEW angezeigt -- json gibt den vollständigen Bericht als JSON aus -- no-write unterdrückt das Schreiben der Reportdatei -- list-cases listet Eval-Fälle ohne Ausführung -- duration-profile zeigt Laufzeitprofil der langsamsten Fälle -- jobs bestimmt die Anzahl paralleler Child-Prozesse -- Report enthält scheduled_children und max_running_children -- Report enthält wall_duration_ms und summed_case_duration_ms -- Fail-Fast im Parallelmodus ist soft und sammelt laufende Prozesse ----------------------------------------- - -Berichte bereinigen - -Entfernt alte oder alle Testläufe aus dem Dateisystem, um Speicherplatz freizugeben - -- Nur Admins mit ROLE_KNOWLEDGE_ADMIN -- POST nur mit gültigem CSRF-Token -- mode=trim löscht alle außer der letzten Konfiguration -- mode=delete_all löscht alle historischen Testläufe -- report_scope=all wirkt auf alle Bereiche - -- POST cleanup mit mode trim und CSRF-Token -- Erfolg zeigt gelöschte Anzahl -- POST cleanup mit mode delete_all -- Löschung bestätigt ----------------------------------------- - -Eval-Berichte anzeigen - -Ermöglicht das Anzeigen von Eval-Berichten mit Vergleich und Übersicht - -- ROLE_KNOWLEDGE_ADMIN erforderlich -- type-Parameter bestimmt den Berichtstyp -- scope und genre bestimmen den Eval-Kontext -- compare_report zeigt Vergleichsbericht an - -- Admin-Bereich öffnen -- GET admin evals aufrufen -- Bericht wird mit Übersicht angezeigt ----------------------------------------- - -Eval-Fälle ausführen - -Führt Eval-Fälle für den RetrieX-Agenten aus und meldet Ergebnisse - -- Selector enthält Typ und optional Ziel und Falltyp -- case führt nur den Eval-Fall mit dieser ID aus -- Report wird als JSON-Datei geschrieben -- Exitcode ist FAILURE bei einem oder mehr fehlgeschlagenen Fällen - -- mto:agent:eval:run retrieval ausführen -- Passende Eval-Fälle werden geladen -- Jeder Fall zeigt PASS oder FAIL mit Dauer -- Zusammenfassung zeigt total, passed, failed ----------------------------------------- - -Eval-Fälle parallelisieren - -Führt Eval-Fälle gleichzeitig in Child-Prozessen aus, um die Wandzeit zu verkürzen - -- Erstellt einen Pool mit maximal --jobs Child-Prozessen -- Terminiert überzählige Child-Prozesse bei Timeout -- Fail-Fast bricht das Scheduling nach dem ersten Fehler ab -- Ergebnisse werden in der ursprünglichen Reihenfolge zurückgegeben -- Child-Prozesse werden nach Abschluss bereinigt - -- Kommando mit --jobs 4 ausführen -- Läuft mit der angegebenen Anzahl paralleler Child-Prozesse -- Alle Fälle werden ausgeführt und Ergebnisse gesammelt -- Pool endet mit Ergebnissen in Eingabereihenfolge ----------------------------------------- - -Evaluation ausführen - -Führt Testsuite aus und zeigt das Ergebnis - -- Erfordert Rolle ROLE_KNOWLEDGE_ADMIN -- CSRF-Token erforderlich -- Flash zeigt Zusammenfassung mit Bestehensrate - -- Als Admin Rolle an AdminEvalController senden -- POST an Admin-Evals-Run mit gültigem _token -- Flash-Meldung zeigt Testergebnis diff --git a/daten/RAG/faelle.md b/daten/RAG/faelle.md deleted file mode 100644 index 148c764..0000000 --- a/daten/RAG/faelle.md +++ /dev/null @@ -1,74 +0,0 @@ - -Fälle ----------------------------------------- - -kern ----------------------------------------- - -Verwalten von Testfällen für das Evaluationssystem ----------------------------------------- - -- Jede POST-Operation erfordert ein gültiges CSRF-Token -- Leerer Entwurf wird bereitgestellt, wenn keine Quelle angegeben ist -- source_type und source_case_id erstellen Entwurf aus Testergebnis -- Erfolgreiches Erstellen leitet auf Indexseite um -- Index zeigt Zusammenfassung aller Fälle nach Typ -- type-Parameter defaultet auf 'retrieval' -- Wizard bietet leeren Entwurf zum Ausfüllen -- Wizard-Erstellung erfordert CSRF-Token -- case_delete erfordert eval_scope als separaten Parameter ----------------------------------------- - -Assistent anzeigen - -Führt durch die Erstellung eines Tests mit Hilfestellung - -- Erfordert ROLE_KNOWLEDGE_ADMIN -- Type ist retrieval, wenn nicht unterstützt -- Leerer Entwurf wird bereitgestellt - -- Admin-Evals-Cases-Wizard aufrufen -- Seite mit Assistent wird angezeigt ----------------------------------------- - -Fall anlegen - -Bereitet ein Formular zum Anlegen eines neuen Testfalls vor - -- Nur ROLE_KNOWLEDGE_ADMIN hat Zugriff -- Erstellt Entwurf aus existierendem Testergebnis bei source_type und source_case_id -- Erstellt leeren Entwurf ohne Quelle - -- Seite für neuen Fall aufrufen -- Formular mit Fall-Entwurf wird angezeigt ----------------------------------------- - -Fall erstellen - -Legt einen neuen Testfall an - -- CSRF-Token erforderlich -- ROLE_KNOWLEDGE_ADMIN erforderlich -- type, id und prompt sind Pflicht -- evalScope bestimmt core oder genre -- Genre ist kontextabhängig optional -- Erfolg leitet auf Indexseite um - -- admin evals cases new öffnen -- Formular ausfüllen und absenden -- Erfolgsmeldung erscheint -- Weiterleitung auf Indexseite ----------------------------------------- - -Fälle löschen bereitstellen - -Ermöglicht das Entfernen nicht mehr benötigter Tests - -- Nur Benutzer mit Rolle KNOWLEDGE_ADMIN -- POST mit gültigem CSRF-Token -- Erfordert type, case_id, eval_scope und _token - -- Seite mit Fall öffnen -- POST an admin-evals-cases-delete mit korrekten Parametern senden -- Flash-Meldung zeigt Bestätigung -- Weiterleitung zur Fall-Erstellungsseite diff --git a/daten/RAG/feedback.md b/daten/RAG/feedback.md deleted file mode 100644 index 9313d84..0000000 --- a/daten/RAG/feedback.md +++ /dev/null @@ -1,128 +0,0 @@ - -Feedback ----------------------------------------- - -kern ----------------------------------------- - -Ermöglicht Admins das Klassifizieren, Exportieren und Verwalten von Nutzerfeedback zu Chat-Antworten ----------------------------------------- - -- ROLE_KNOWLEDGE_ADMIN für Admin-Zugriff -- CSRF-Token für alle POST-Operationen -- Exportformate auf md und jsonl beschränkt -- Feedbackklassifizierung verarbeitet maximal 500 Einträge -- Feedbackklassifizierung begrenzt auf Limit 1–5000 -- Feedbackklassifizierung flushet in 100er-Schritten -- Batch-Statusaktualisierung begrenzt auf 5000 Einträge -- Batch-Status gilt für ausgewählte oder aktuell gefilterte Einträge -- Statistiken zeigen Zusammenfassung aller Fälle -- Statistiken zeigen Gesamt Daumen hoch Daumen runter Offen Erledigt -- Statistiken zeigen Fehlerverdacht, Review-Priorität und Referenzwert je Stufe -- Standardfilter zeigt aktive offene Fälle reviewState=active ----------------------------------------- - -Chat-Feedback anzeigen - -Zeigt Feedbackfälle mit Statistiken, Filtern und Sammelaktionen - -- Statistiken passen sich an Filter an -- Batch-Aktionen gelten nur für sichtbare Einträge -- Löschen entfernt den Eintrag dauerhaft -- Erledigte Fälle verbleiben als Historie - -- Seite über Sidebar öffnen -- Feedback-Tabelle mit Einträgen prüfen -- Filter 'Erledigt' wählen und anwenden -- Tabelle zeigt erledigte Einträge ----------------------------------------- - -Feedback exportieren - -Ermöglicht das Herunterladen von Feedback-Daten zur Analyse - -- Zugriff nur mit ROLE_KNOWLEDGE_ADMIN -- Nur md und jsonl erlaubt -- Dateiname enthält Priorität und Zeitstempel -- Streamt Daten zur Schonung des Speichers -- Content-Type passend zum Format -- Content-Disposition als Anhang - -- Export als md aufrufen -- Dateianhang mit korrektem Namen -- Inhalt ist Markdown ----------------------------------------- - -Feedback klassifizieren - -Wertet Feedback automatisch aus und ordnet es zur Admin-Prüfung ein - -- Batch-Verarbeitung in 100er-Schritten -- Limit zwischen 1 und 5000 -- force verarbeitet bereits klassifizierte Einträge -- Setzt type, score, risk, issue_risk, priority, reference, reason - -- Console-Befehl mto:agent:feedback:classify ausführen -- Verarbeitungszähler in Ausgabe prüfen -- Zusammenfassung nach Typen in Ausgabe ----------------------------------------- - -Feedback löschen - -Entfernt Feedback dauerhaft aus der Verwaltung - -- Nur ROLE_KNOWLEDGE_ADMIN -- CSRF-Token erforderlich -- Feedback muss existieren - -- admin_chat_feedback_show öffnen -- POST an admin_chat_feedback_delete mit gültigem Token -- Weiterleitung zur Übersicht -- Feedback nicht mehr in Liste ----------------------------------------- - -Feedback-Details anzeigen - -Zeigt alle Details eines Feedback-Falls an - -- Erfordert ROLE_KNOWLEDGE_ADMIN -- Feedback wird anhand der UUID geladen -- 404-Exception bei nicht gefundenem Feedback - -- Feedback-Endpunkt mit UUID aufrufen -- Feedback-Detailseite rendert -- Feedback-Objekt in Template verfügbar ----------------------------------------- - -Feedback-Status aktualisieren - -Markiert Feedback als erledigt oder öffnet es wieder - -- Status ist entweder erledigt oder offen -- CSRF-Token erforderlich -- Erledigt mit optionalem Review-Notiz -- Aktion endet mit Redirect - -- Detailseite öffnen -- Status-Button klicken -- Optional Review-Notiz eingeben -- Formular absenden -- Feedback mit aktualisiertem Status ----------------------------------------- - -Feedback-Status prüfen - -Prüft, ob Feedback zu einer Chat-Antwort bereits existiert - -- Ungültige Daten antworten mit HTTP 400 -- Fehler beim Abrufen antworten mit stored=false -- stored ist true bei vorhandenem Feedback -- stored ist false bei fehlendem Feedback - -- Anfrage an Feedback-Status-Endpunkt mit gültigen Daten senden -- Feedback in der Datenbank prüfen -- stored entspricht dem Ergebnis in der Datenbank -- FeedbackId und rating stimmen überein ----------------------------------------- - -Feedback speichern diff --git a/daten/RAG/knowledge-raeume.md b/daten/RAG/knowledge-raeume.md deleted file mode 100644 index a995150..0000000 --- a/daten/RAG/knowledge-raeume.md +++ /dev/null @@ -1,141 +0,0 @@ - -Knowledge-Räume ----------------------------------------- - -kern ----------------------------------------- - -Stellt Knowledge-Räume bereit und verwaltet deren Inhalte sowie Anbindungen ----------------------------------------- - -- CSRF-Token wird bei POST-Anfragen geprüft -- no-report verhindert das Schreiben von Berichtsdateien -- Anbindung Tool-Allowlist aktualisiert separate Anbindung ----------------------------------------- - -Batch-Import durchführen - -Importiert Wissensdokumente aus einem Verzeichnis in den Wissensspeicher - -- upload-dir ist Zieldateiverzeichnis -- user-email identifiziert Ersteller -- activate-derived-on-success erfordert normalize-markdown -- dry-run erzeugt keine Dateien oder Versionen -- reindex startet genau einen Indexlauf -- Berichte ohne --no-report in report-dir - -- Batch-Import im Dry-Run-Modus ausführen -- PHPUnit-Test KnowledgeBatchImportCommandTest ausführen -- Erfolgsstatus und Reportdateien prüfen ----------------------------------------- - -Chat-Freigabe umschalten - -Aktiviert oder deaktiviert den Chat-Zugriff für einen gespeicherten Inhalt - -- Nur POST-Anfragen werden akzeptiert -- CSRF-Token wird geprüft -- Kanditat-ID muss existieren - -- Seite mit Anbindungsinhalten öffnen -- POST an Endpunkt senden -- candidate_id senden -- chat_enabled senden -- Übersicht wird angezeigt ----------------------------------------- - -Chat-Verfügbarkeit prüfen - -Schaltet den Chat-Zugriff für einen Wissensraum ein oder aus - -- POST-Request erforderlich -- CSRF-Token wird geprüft -- Ungültiges Token zeigt Fehlermeldung -- Unterscheidet Server-Ressource, gespeicherte Ressource und Standard-Raum -- Erfolgreiche Änderung zeigt Bestätigung - -- POST an admin_knowledge_spaces_chat_availability_update mit _token und chat_enabled -- Leerer RaumId liefert Flash danger -- Gültiger Toggle liefert Flash success -- Chat-Verfügbarkeit geändert ----------------------------------------- - -Facts prüfen - -Prüft die diagnostischen Ingest-Facts im Index auf Vollständigkeit und korrekte Struktur - -- type filtert nach spezifischem Fact-Typ -- query durchsucht Titel, Text und alle Fact-Felder -- Standard-Limit zeigt maximal 10 Chunks -- json gibt maschinenlesbare Ausgabe zurück -- Warnung bei fehlenden oder leeren Fakten - -- Befehl ohne Argumente ausführen -- Chunk-Überschriften mit Metriken prüfen -- Warnung bei leerem Ergebnis prüfen ----------------------------------------- - -Kandidaten wählen - -Wählt einen Tool- oder Resource-Kandidaten zur Wissensraumnutzung aus - -- CSRF-Token erforderlich -- Nur Tool- oder Resource-Kandidaten verarbeitbar -- Kandidat wird nach Auswahl auf approved gesetzt -- Weiterleitung zur Überblickansicht mit Review-Dialog - -- Überblickansicht öffnen -- POST an provider-candidate-select mit source_key, candidate_kind -- Flash-Nachricht über Erfolg oder Warnung -- Redirect zur Überblickansicht mit provider_review_open=1 ----------------------------------------- - -Knowledge-Räume anzeigen - -Stellt alle Knowledge-Räume mit Status und Anbindungen übersichtlich dar - -- Lädt Verfügbarkeit und Chat-Auswahl -- Lädt Anbindungsinhalte und Kandidaten -- Rendert admin knowledge-spaces index html-twig - -- Admin-Seite Knowledge-Räume aufrufen -- Seite mit Wissensraum-Übersicht prüfen -- Knowledge-Räume mit Verfügbarkeit angezeigt ----------------------------------------- - -Live-Vorschau laden - -Lädt Ressourceninhalt live zur Prüfung vor Freigabe - -- POST-Request mit gültigem CSRF-Token -- Gibt JSON mit Inhalt und Status zurück -- Nur für Ressourcen vom Typ resource verfügbar - -- POST an admin knowledge-spaces provider-resource-live-preview mit candidate_id -- Response enthält JSON mit ok und content -- Im Dialog erscheint der live gelesene Inhalt ----------------------------------------- - -Ressourcenprüfung durchführen ----------------------------------------- - -Textteile suchen - -Findet Textteile, die einer Suchanfrage semantisch ähneln - -- Gibt Treffer absteigend nach Ähnlichkeit zurück -- Limit wird auf maximal 200 begrenzt -- Optionale doc_ids filtern Treffer nach Dokument -- Ohne doc_ids werden Treffer aus allen Dokumenten zurückgegeben - -- POST such-chunks mit query und limit -- Antwort enthält sortierte Treffer mit chunk_id ----------------------------------------- - -Wissensräume prüfen - -Prüft die Funktionsfähigkeit aller Wissensraum-Komponenten - -- Admin-Übersicht öffnen -- Diagnose starten -- Alle Prüfungen bestanden diff --git a/daten/RAG/konfiguration.md b/daten/RAG/konfiguration.md deleted file mode 100644 index 68a45f6..0000000 --- a/daten/RAG/konfiguration.md +++ /dev/null @@ -1,129 +0,0 @@ - -Konfiguration ----------------------------------------- - -kern ----------------------------------------- - -Stellt Konfigurationsdaten für Ingest-Profile, Modelle, Chat-Nachrichten und Agent bereit ----------------------------------------- - -- ROLE_SUPER_ADMIN darf alle Funktionen aufrufen -- ROLE_KNOWLEDGE_ADMIN darf Konfigurationen lesen -- POST erfordert gültiges CSRF-Token -- Flash-Nachrichten zeigen Erfolg und Fehler -- JsonResponse ohne Browser-Cache-Header -- Default-Ausgabe ist JSON -- Ingest-Profil entfernen fehlt -- Model-Konfiguration löschen fehlt -- Model-Konfiguration Retrieval testen fehlt ----------------------------------------- - -Ingest-Profil anlegen - -Legt ein Ingest-Profil an, das Dokument-Importe steuert - -- Nur Super-Admin kann aufrufen -- CSRF-Token erforderlich -- Erfolgsmeldung bei Anlage - -- Seite admin-ingest-profiles-create öffnen -- Alle Felder ausfüllen -- Formular absenden -- Erfolgsmeldung bestätigt Anlage ----------------------------------------- - -Ingest-Profile anzeigen - -- ROLE_KNOWLEDGE_ADMIN erforderlich -- Tabelle mit Spalten -- Aktives Profil hervorgehoben - -- Admin-Bereich öffnen -- Seite "Ingest-Profiles" aufrufen -- Tabelle mit Profilen sichtbar ----------------------------------------- - -Konfiguration aktivieren - -Macht eine Konfiguration zur aktiven Konfiguration - -- Nur SUPER_ADMIN darf diese Funktion auslösen -- POST-Request erforderlich - -- admin_model_config_list öffnen -- POST-Request an activate-Endpunkt senden -- Weiterleitung zur Liste -- Konfiguration ist aktiv ----------------------------------------- - -Konfiguration anzeigen - -Zeigt die aktuelle RetrieX-Konfiguration zur Diagnose - -- Standardausgabe ist JSON -- summary zeigt formatierte Übersicht -- Zeigt alle Konfigurationsbereiche - -- Befehl ausführen: mto:agent:config:dump-effective -- JSON-Ausgabe mit Config-Struktur ----------------------------------------- - -Konfiguration bereitstellen - -Liefert dem Chatfrontend alle nötigen Konfigurationsdaten in einem Request - -- Keine Browser-Cache-Header -- JsonResponse mit Konfigurationsdaten -- Mischt Konfiguration aus drei Quellen - -- GET chat-messages-frontend -- Antwort ist JsonResponse -- Enthält limits.prompt und limits.uploads -- Keine Browser-Cache-Header gesetzt ----------------------------------------- - -Konfigurationen anzeigen - -Zeigt alle Model-Generation-Konfigurationen im Admin-Bereich - -- ROLE_KNOWLEDGE_ADMIN erforderlich - -- Admin-Endpoint für Model-Konfiguration aufrufen -- LMB auf Konfiguration in der Liste -- Liste der Konfigurationen sichtbar ----------------------------------------- - -Konfigurationsmuster prüfen - -Prüft alle PHP-Dateien auf Verwendung von Kernmustern und markierten Token - -- Ohne Option wird eine Zusammenfassung angezeigt -- json gibt das vollständige Ergebnis maschinenlesbar aus -- details zeigt die Warnungen als Tabelle -- all fügt niedrigpriore REVIEW-Befunde hinzu -- Fehlende Dateien werden als skipped_files gezählt - -- mto:agent:config:audit-patterns ausführen -- Zusammenfassung mit Zählern prüfen -- json anhängen und JSON-Struktur validieren -- details anhängen und Tabelle prüfen -- all anhängen und REVIEW-Zeilen prüfen ----------------------------------------- - -Tool-Freigaben aktualisieren - -Schaltet einzelne Werkzeuge einer Anbindung im Chat frei oder sperrt sie - -- Freigabe toggelt zwischen an und aus -- Ungültiges Token zeigt Fehlermeldung -- Erfolg zeigt Bestätigung -- Fehler zeigt Exception-Nachricht - -- Admin-Übersicht öffnen -- POST-Anfrage mit source_key, tool_name und tool_enabled senden -- Flash-Message prüfen -- Zurückleitung zur Übersicht ----------------------------------------- - -Ingest-Profil entfernen diff --git a/daten/RAG/logs.md b/daten/RAG/logs.md deleted file mode 100644 index 33fff19..0000000 --- a/daten/RAG/logs.md +++ /dev/null @@ -1,46 +0,0 @@ - -Logs ----------------------------------------- - -kern ----------------------------------------- - -Ermöglicht Superadmins das Einsehen und Durchsuchen von Systemprotokollen ----------------------------------------- - -- Logdateien liegen im Verzeichnis var log -- Systemlogdateien heißen system-JJJJ-MM-TT.log -- Letzte 1000 Zeilen werden gelesen -- Dateien werden rückwärts gelesen -- Fehlende Systemlogdatei wirft 404 -- Logdateien werden neueste zuerst aufgelistet -- AdminVectorLogController liest 500 Zeilen statt 1000 -- AdminVectorLogController zeigt Meldung statt 404 bei fehlender Datei ----------------------------------------- - -Logdatei anzeigen - -Zeigt den Inhalt einer Systemlogdatei an - -- Erfordert ROLE_SUPER_ADMIN -- Liest die letzten 1000 Zeilen der Datei -- Dateiname folgt dem Muster system-JJJJ-MM-TT.log -- Nicht vorhandene Datei erzeugt 404 -- Liest rückwärts vom Dateiende für Speichereffizienz - -- Route admin system-logs view 2024-01-15 aufrufen -- Seite mit Loginhalt wird angezeigt -- Datei existiert im Dateisystem unter var log ----------------------------------------- - -Logdateien auflisten - -Zeigt alle System-Logdateien zum Download oder zur Einsicht an - -- Nur ROLE_SUPER_ADMIN hat Zugriff -- Listet alle system*.log-Dateien auf -- Neueste Datei zuerst - -- Als Super-Admin anmelden -- admin system-logs aufrufen -- Logdateien absteigend nach Datum diff --git a/daten/RAG/sonstiges.md b/daten/RAG/sonstiges.md deleted file mode 100644 index 13a6d7a..0000000 --- a/daten/RAG/sonstiges.md +++ /dev/null @@ -1,64 +0,0 @@ - -Sonstiges ----------------------------------------- - -kern ----------------------------------------- - -Bietet administrative Verwaltungsfunktionen für Profile, Sicherheitsprüfungen und Dokument-Tags ----------------------------------------- - -- Super-Admin-Rolle für Profile aktivieren und Sicherheitsprüfung -- Editor-Rolle für Tags speichern -- CSRF-Token für jeden POST-Aufruf geprüft -- Flash-Warnung bei ungültigem Token oder fehlerhafter Eingabe -- Erfolgreiche Prüfung leitet zur Übersicht weiter -- activate wirft AccessDeniedException, kein Flash bei ungültigem Token -- POST admin-enterprise-check-deployment-scheduler bereitstellen -- POST admin-enterprise-check-backup-restore bereitstellen -- POST admin-enterprise-restore-dry-run-latest bereitstellen -- GET admin-enterprise-operator-report-json bereitstellen -- GET IngestProfile-Liste bereitstellen -- GET Dokument-Tags bearbeiten bereitstellen -- GET Tag-Rebuild-Status abfragen bereitstellen ----------------------------------------- - -post activate {id} bereitstellen - -Macht ein Ingest-Profil zur aktiven Konfiguration - -- Nur Super-Admins -- CSRF-Token erforderlich - -- Admin-Bereich öffnen -- LMB auf "Aktivieren"-Schaltfläche -- Flash-Benachrichtigung zeigt Erfolg -- Profil in Liste als aktiv markiert ----------------------------------------- - -Sicherheitsnachweis bereitstellen - -Erfüllt die Nachweispflicht für Sicherheit und Datenschutz - -- CSRF-Token erforderlich -- Report aus lokaler Konfiguration -- Prüfung im Betreiberprotokoll erfasst -- Redirect zur Übersicht - -- Enterprise-Operations öffnen -- Prüfung für Sicherheit und Datenschutz auslösen -- Zurückleitung zur Übersicht mit Flash-Meldung ----------------------------------------- - -post {id} tags save bereitstellen - -Speichert Tag-Zuordnungen eines Dokuments und startet den Rebuild - -- Erfordert ROLE_EDITOR -- Prüft CSRF-Token -- Fehlerhafte Eingabe zeigt Flash-Warnung -- Erfolg zeigt Flash-Meldung und leitet weiter - -- Tags-Editor für Dokument öffnen -- Tag-IDs im Formular absenden -- Flash-Meldung "Tags wurden aktualisiert" sichtbar diff --git a/daten/RAG/system.md b/daten/RAG/system.md deleted file mode 100644 index 4c2ded1..0000000 --- a/daten/RAG/system.md +++ /dev/null @@ -1,304 +0,0 @@ - -System ----------------------------------------- - -kern ----------------------------------------- - -Ermöglicht Systemadministration, Betriebsvalidierung und Datenmanagement für Admins ----------------------------------------- - -- ROLE_ADMIN_AREA für Adminbereich -- ROLE_SUPER_ADMIN für Super-Admin-Funktionen -- ROLE_EDITOR für Bearbeitungsfunktionen -- Flash-Meldungen zeigen Operationsergebnisse -- Fehlgeschlagene Validierung bricht Operation ab -- Rollenabhängige Startseite nach Anmeldung -- Restore-Vorschau führt kein Restore aus -- Bestätigungsphrase "KNOWLEDGE ENDGÜLTIG LÖSCHEN" ist hardcoded -- Fehlermeldungstext "Die Anfrage konnte nicht verarbeitet" ist nicht dokumentiert ----------------------------------------- - -Access-Denied-Fehler bereitstellen - -Zeigt eine informative Fehlerseite mit kontextabhängigen Weiterleitungen an - -- Fehlercode 403 im Titel -- Rollenabhängige Startseite -- Anmeldung für Gäste -- Rolle "Chat" führt zum Chat -- Rolle "Admin" führt zum Dashboard - -- Seite ohne Anmeldung aufrufen -- Klick auf geschützte Ressource -- error403-Seite mit Anmelde-Button ----------------------------------------- - -Betriebsbereitschaft prüfen - -Validiert die Enterprise-Readiness-Baseline ohne Chat-Runtime-Nebeneffekte - -- Erkennt fehlende Readiness-, Doku-, Boundary-, Backup- und Command-Artefakte -- Prüft Quell-, Konfigurations-, Dokumentations- und Eval-Verzeichnisse -- Validiert alle Services-Imports in Services-Konfiguration -- Prüft Governance-Dokument auf Maintainability-, Readiness- und Genre-Neutralitätsmarker -- Validiert Enterprise-Dokumente auf Betriebsbaseline-Marker -- Prüft Console-Binary auf Vorhandensein -- Prüft Command-Referenz auf alle Enterprise-Commands -- Prüft zentrale Qualitätschecks in der Command-Referenz -- Warnt bei fehlenden oder nicht beschreibbaren Betriebsverzeichnissen - -- Command ausführen ohne Option -- Tabelle zeigt Status, Case und Details -- Alle Cases mit PASS erscheinen -- Command mit --json ausführen -- JSON-Objekt mit status, summary und cases erscheint ----------------------------------------- - -Cache leeren - -Leert den PHP-Runtime-Cache und den Vector-Service Query-Cache - -- POST erfordert gültiges CSRF-Token -- Erfolgreiches Leeren zeigt success-Flash -- Fehler zeigt danger-Flash und bricht ab - -- POST an admin-runtime-cache-clear mit korrektem _token -- Erfolgreicher Flash erscheint -- Redirect zu admin-dashboard -- Cache nach dem Leeren leer ----------------------------------------- - -Daten neu laden - -Synchronisiert alle Indizes und das Embedding-Modell mit dem Dateisystem - -- Lädt Chunk-Index neu -- Lädt Tag-Index neu -- Lädt Embedding-Modell neu -- Leert den Query-Cache -- Gibt Service-Stempel zurück -- HTTPException bei Fehler - -- POST-Reload-Endpunkt aufrufen -- 200 OK -- status: reloaded ----------------------------------------- - -Daten sichern - -Erstellt periodische Sicherungskopien, um Datenverlust zu verhindern - -- Kopiert Dateien ins Sicherungsverzeichnis -- Entfernt Sicherungen jenseits der Aufbewahrungsfrist -- Datenbankdump als optionale Sicherung -- Dry-Run validiert den Plan ohne zu schreiben -- JSON-Ausgabe für maschinelle Verarbeitung - -- mto:agent:enterprise:backup-run mit --json ausführen -- JSON-Status auf SUCCESS prüfen -- backup_id und target im JSON vorhanden ----------------------------------------- - -Deployment prüfen - -Prüft Deployment-Bereitschaft und protokolliert das Ergebnis - -- CSRF-Token wird geprüft -- DeploymentSchedulerReadinessService liefert Report -- Prüfung wird im OperatorCheckProtocol protokolliert -- Flash-Meldung zeigt Status der Prüfung - -- POST an Admin-Endpoint für Deployment-Prüfung senden -- Weiterleitung zu admin_enterprise_operations -- Flash-Meldung zeigt Deployment-Status ----------------------------------------- - -Dienststatus melden - -Ermöglicht die Überwachung der Betriebsbereitschaft des Dienstes - -- Gibt JSON zurück -- Enthält immer Status ok -- Enthält alle Komponentenzustände - -- GET an health-Endpunkt senden -- Antwort prüfen -- Status ok vorhanden ----------------------------------------- - -Flow-Grenze sperren - -Validiert die passive AgentRunner-Flow-Boundary-Linie ohne Runtime-Nebeneffekte - -- Prueft vollstaendige und geordnete Flow-Sections -- Validiert AgentRunContext gegen deklarierte Boundaries -- Prueft Boundary-Vertraege auf trace-only-Grenzen -- Prueft kritische Runtime-Eigner-Token im AgentRunner -- Prueft Flow-Qellen auf verbotene Runtime-Aufrufsignaturen -- Prueft Patchline-Dokumentation auf aktuellen Flow-Lock - -- Kommando `mto:agent:architecture:flow-boundary-lock-self-test` ausfuehren -- Alle Pruefungen bestaetigen OK -- Status OK zurueckgemeldet ----------------------------------------- - -Neuindizierung starten - -Startet eine vollständige Neuindizierung aller Inhalte als Hintergrundprozess - -- Erfordert ROLE_SUPER_ADMIN -- CSRF-Token wird geprüft -- Fehlgeschlagener Start zeigt Flash-Meldung und Weiterleitung - -- POST an Global-Reindex-Endpoint mit gültigem CSRF-Token absenden -- Redirect nach admin_job_show mit neuer Job-ID prüfen -- Flash-Meldung Global Reindex wurde gestartet prüfen ----------------------------------------- - -Normalisierung prüfen - -Prüft ob die Normalisierungs-Infrastruktur korrekt aufgebaut ist - -- required_files_present -- prompt_is_versioned_and_markdown_only -- llm_transport_is_fit_for_large_ingest_prompt -- segmented_execution_boundary_present -- foundation_is_not_wired_into_automatic_runtime -- provenance_sidecar_is_safe -- validator_cleans_wrapper_and_common_prose -- validator_sanitizes_segment_code_fence_markers -- validator_blocks_failure_answer -- validator_removes_source_echo_markers -- source_noise_cleaner_removes_binary_pdf_artifact_lines -- no_genre_runtime_gate_markers - -- mto:agent:ingest:markdown-normalization-foundation-self-test ausführen -- Alle Testfälle mit OK bestätigt -- Status OK im Report ----------------------------------------- - -Preview prüfen - -Validiert die korrekte Verdrahtung der Admin-Markdown-Normalisierung ohne Nebeneffekte - -- Liest Controller, Template und Inspector -- Prüft explizite Admin-Aktion ohne automatische Verdrahtung -- Prüft read-only Provenienz ohne Prompt- oder Raw-Speicherung -- Prüft genreneutrale Verdrahtung - -- Bin console mto:agent:ingest:markdown-normalization-preview-self-test ausführen -- Ausgabe auf Status OK prüfen -- Alle Testfälle bestanden ----------------------------------------- - -Promptversion aktivieren - -Macht eine gespeicherte Promptversion zur aktiven Version - -- Nur Super-Admins haben Zugriff -- Aktivierung durch POST-Request -- CSRF-Token wird geprüft -- Aktivierte Version wird als aktuell markiert -- Fehler zeigen eine Flash-Meldung - -- System-Prompt-Verwaltung öffnen -- LMB auf "Aktivieren" neben einer inaktiven Version -- Flash-Meldung "Version aktiviert" erscheint -- Version zeigt aktivierten Zustand ----------------------------------------- - -Promptversion löschen - -Entfernt eine nicht mehr benötigte Promptversion dauerhaft - -- Super Admin erforderlich -- Post-Request erforderlich - -- LMB auf Löschen-Button der Version -- Bestätigung bestätigen -- Erfolgsmeldung wird angezeigt -- Version nicht mehr in Liste ----------------------------------------- - -Promptversionen verwalten - -Erstellt neue Versionen und listet vorhandene auf - -- POST erstellt neue Version -- GET listet alle Versionen auf -- Aktive Version hervorgehoben -- Neueste Version zuerst sortiert - -- POST mit gültigen Daten absenden -- Erfolgsmeldung sichtbar ----------------------------------------- - -Restore-Vorschau prüfen - -Zeigt eine Vorschau des letzten Backups ohne Daten wiederherzustellen - -- Nur Super-Admin -- CSRF-Token erforderlich -- Kein Restore wird ausgeführt -- Ergebnis als Flash-Meldung - -- Als Super-Admin anmelden -- POST an Admin-Restore-Endpunkt dry-run latest -- Flash-Meldung mit Ergebnis -- Zurück zur Übersicht ----------------------------------------- - -Simulation ausführen - -Testet die MCP-Evidence-Sanilisierung ohne AgentRunner - -- JSON und Datei schließen sich gegenseitig aus -- Fehlende Eingabe lädt Fixture -- Rückgabe enthält sanitisiertes Payload und EvidenceItem - -- php bin\console mto:agent:mcp:evidence-dry-run --payload-json='{}' -- Befehl zeigt JSON-Ausgabe mit Status -- Status ist OK oder empty ----------------------------------------- - -Systemzustand zurücksetzen - -Setzt alle Dokumentversionen und den Wissensindex auf den Ausgangszustand zurück - -- Nur POST-Requests werden akzeptiert -- CSRF-Token wird geprüft -- Benutzer muss ROLE_EDITOR besitzen -- Löscht alle Dokumentversionen -- Setzt alle Ingest-Jobs zurück -- Leert den Wissensindex -- Gibt eine Bestätigungsmeldung aus - -- POST an Admin-Endpunkt zum Zurücksetzen senden -- CSRF-Token im Request mitgeben -- Erfolgsmeldung prüfen -- Alle Versionen und Ingest-Jobs entfernt ----------------------------------------- - -Verzeichnis bereinigen - -Hält den Eingangsbereich sauber und vermeidet vollaufende Speicher durch verwaiste Dateien - -- Nur POST erlaubt -- CSRF-Token erforderlich -- ROLE_EDITOR erforderlich -- Leere Upload-Ordner werden entfernt -- Alte fehlgeschlagene Ablagen werden verschoben -- Alte übersprungene Ablagen werden verschoben -- Warnungen als Flash-Meldungen ausgegeben - -- POST an Admin-Batch-Cleanup senden -- Gültiges CSRF-Token übergeben -- Berichtsübersicht öffnet sich -- Erfolgsmeldung mit Bereinigungszähler ----------------------------------------- - -Admin-Login bereitstellen ----------------------------------------- - -Fehlerseite anzeigen diff --git a/daten/RAG/tags.md b/daten/RAG/tags.md deleted file mode 100644 index 5573d32..0000000 --- a/daten/RAG/tags.md +++ /dev/null @@ -1,63 +0,0 @@ - -Tags ----------------------------------------- - -kern ----------------------------------------- - -Verwaltet verschlagwortbare Tags und stellt sie für die semantische Suche bereit ----------------------------------------- - -- Tag erstellen: Formular öffnen, ausfüllen, absenden -- Tag löschen: RMB, Klick auf Tag entfernen -- Tag zuweisen: Formular öffnen, Tag auswählen, speichern ----------------------------------------- - -Tag-Rebuild-Auftrag ausführen - -Erstellt Tag-Suchindex-Dateien - -- Lock verhindert gleichzeitige Ausführung -- tags.ndjson existiert nach Export -- Job endet mit Status completed oder failed -- Lock wird immer freigegeben - -- CLI-Befehl mit --create ausführen -- Job-Status ist running -- tags.ndjson existiert im Export-Verzeichnis -- vector_tags.index ist erstellt -- Job-Status ist completed ----------------------------------------- - -Tags auflisten - -Zeigt alle Tags im Administrationsbereich an - -- Nur für Benutzer mit ROLE_EDITOR sichtbar -- GET-Anfrage auf Admin-Tags-Endpunkt - -- GET-Anfrage an Admin-Tags-Endpunkt senden -- Seite mit Tag-Liste wird angezeigt ----------------------------------------- - -Tags bearbeiten - -- Funktion fehlt ----------------------------------------- - -Tags suchen - -- Ergebnisse nach Ähnlichkeit geordnet -- Enthält label und tag_type -- Optionale Filterung nach doc_ids -- Leerer Query führt zu Fehler - -- Suchanfrage mit query sales senden -- Antwort enthält Tags mit label -- Jedes Ergebnis hat tag_type ----------------------------------------- - -Tag-Zuordnung bearbeiten ----------------------------------------- - -Tag-Rebuild-Status abfragen diff --git a/daten/RAG/titel.md b/daten/RAG/titel.md deleted file mode 100644 index 0b7534b..0000000 --- a/daten/RAG/titel.md +++ /dev/null @@ -1,40 +0,0 @@ - -Titel ----------------------------------------- - -kern ----------------------------------------- - -Ermöglicht das Ändern und Vorschlagen von Dokumenttiteln im Admin-Bereich ----------------------------------------- - -- Titeländerung ändert bestehende Versionen nicht ----------------------------------------- - -Titel aktualisieren - -Ändert den Titel eines Dokuments manuell - -- CSRF-Token erforderlich -- Titel nicht leer -- Titel maximal 255 Zeichen -- Bestehende Versionen unverändert - -- Seite mit Titel-Feld öffnen -- LMB auf Speichern-Button klicken -- Flash-Meldung zeigt Erfolg -- Neuer Titel in der Überschrift ----------------------------------------- - -Titelvorschläge laden - -Erhält auf Basis des Dokumentinhalts alternative Titelvorschläge - -- Editoren-Rolle erforderlich -- CSRF-Token wird geprüft -- Ohne Vorschläge wird Fehler zurückgegeben -- Rückgabe als JSON mit ok-Flag - -- Dokumentdetailseite öffnen -- LMB auf Titelvorschläge-Schaltfläche -- JSON mit Titelvorschlägen empfangen diff --git a/daten/RAG/uploads.md b/daten/RAG/uploads.md deleted file mode 100644 index 73420aa..0000000 --- a/daten/RAG/uploads.md +++ /dev/null @@ -1,75 +0,0 @@ - -Uploads ----------------------------------------- - -kern ----------------------------------------- - -Verwaltet temporäre Datei-Uploads im Chat und persistente Batch-Uploads im Admin-Bereich ----------------------------------------- - -- Upload-Größenlimit liefert Status 413 -- Admin-Uploads erfordern Editor-Rolle -- CSRF-Token bei Admin-Upload geprüft -- Temporäre Uploads werden nach Ablauf gelöscht -- Batch-Reports als JSON und Markdown verfügbar -- Upload-Grenzen werden für das Frontend bereitgestellt -- limits enthält erlaubte Dateitypen, Grenzen pro Sitzung, Dateigröße und Ablaufzeit ----------------------------------------- - -Berechtigungsmodus ändern - -Ändert den Berechtigungsmodus eines Chat-Uploads auf einen erlaubten Wert - -- PATCH oder POST erforderlich -- clientId aus Request-Cookie ermittelt -- authorityMode aus Body gelesen -- Unbekannter Modus führt zu Fehler - -- PATCH auf Chat-Upload-Endpunkt mit authorityMode im Body senden -- Erfolg: status ok und aktualisierter Upload zurück ----------------------------------------- - -Datei hochladen - -Speichert eine Datei und gibt den aktuellen Upload-Status zurück - -- Nur eine Datei pro Anfrage erlaubt -- Dateityp und Größe werden geprüft -- Upload wird mit Client-ID verknüpft -- Fehler werden als JSON zurückgegeben -- Größenlimit-Überschreitung liefert Status 413 - -- POST chat-uploads mit Datei im Feld file -- Antwort enthält status ok und Upload-ID -- Anfrage ohne Datei gibt Fehler zurück ----------------------------------------- - -Upload entfernen - -Entfernt einzelne oder alle Uploads aus der Sitzung - -- DELETE entfernt Upload mit ID -- POST entfernt alle Uploads der Sitzung -- Unbekannte ID gibt Status missing -- Antwort enthält aktualisierte Upload-Liste - -- DELETE auf Upload-ID -- Status ok in Antwort -- Upload nicht mehr in Liste -- POST auf Leeren-Button -- Uploads-Liste leer ----------------------------------------- - -Uploads auflisten - -Zeigt verfügbare Uploads und deren Grenzen an - -- Löscht abgelaufene Uploads des Clients -- Liefert enabled-Flag -- Liefert Uploads des Clients -- Liefert alle Grenzen für das Frontend - -- Anfrage an Chat-Uploads senden -- JSON-Antwort prüfen -- enabled, uploads und limits vorhanden diff --git a/daten/RAG/verlauf.md b/daten/RAG/verlauf.md deleted file mode 100644 index 1efb6d0..0000000 --- a/daten/RAG/verlauf.md +++ /dev/null @@ -1,57 +0,0 @@ - -Verlauf ----------------------------------------- - -kern ----------------------------------------- - -Bietet Zugriff auf und Löschung von Gesprächsverläufen ----------------------------------------- - -- json-Ausgabe als JSON -- Löscht Konversation -- Löscht Commerce-Referenzen -- Löscht Uploads -- Badge fehlt -- sample Option nicht dokumentiert -- Testen für leere Eingabe fehlt -- Regel Nur eine Eingabequelle gleichzeitig nur dokumentiert nicht getestet ----------------------------------------- - -Verankerungen extrahieren - -Ermöglicht das Extrahieren strukturierter Verankerungen aus Konversationsverläufen - -- Liest Verlaufstext aus Argument, Datei oder STDIN -- Nur eine Eingabequelle gleichzeitig -- json gibt Ergebnis als JSON aus -- max-turns begrenzt die analysierten Turns - -- Befehl mit --sample ausführen -- Extrahierte Verankerungen im Ausgabetext ----------------------------------------- - -Verlauf abrufen - -Lädt gespeicherte Konversation zum Wiederherstellen der Chatansicht - -- Identität aus Cookie -- Rohdaten in Benachrichtigungen umgewandelt -- Leere Geschichte gibt leeres Array zurück - -- History-Endpunkt aufrufen -- Antwort prüfen -- Array mit role und text pro Nachricht ----------------------------------------- - -Verlauf löschen - -Entfernt alle Daten des aktuellen Clients aus dem Verlauf - -- POST-Endpoint -- Löscht Konversation, Commerce-Referenzen und Uploads -- Gibt {"status": "ok"} zurück - -- POST an history-delete senden -- Antwort prüfen: HTTP 200 -- Antwort enthält {"status": "ok"} diff --git a/daten/RAG/versionen.md b/daten/RAG/versionen.md deleted file mode 100644 index 32f4ca3..0000000 --- a/daten/RAG/versionen.md +++ /dev/null @@ -1,75 +0,0 @@ - -Versionen ----------------------------------------- - -kern ----------------------------------------- - -Verwaltet Versionen eines Dokuments mit Ablegen, Erstellen, Einlesen und Aktivieren ----------------------------------------- - -- Versionen absteigend nach Versionsnummer sortiert -- Preview-Daten als JSON mit ok-Feld -- Version-Aktivierung mit CSRF-Schutz -- Version-Aktivierung zeigt Flash-Nachricht -- Neue Version zeigt Flash-Nachricht -- Ableiten zeigt CSRF-Fehler bei ungültigem Token -- Ableiten zeigt Fehler bei leerem Inhalt -- Neue Version zeigt Fehler bei fehlender Datei ----------------------------------------- - -Version ableiten - -Erstellt eine neue Version aus bearbeitbaren Originaldaten - -- Lädt die Originaldaten-Vorschau der Quellversion -- POST erfordert gültiges CSRF-Token -- Neue Version ist nach Erstellung inaktiv -- Leerer Inhalt wird abgelehnt - -- Ableiten-Seite der Quellversion öffnen -- Bearbeitbaren Quelltext im Formular anzeigen -- POST mit Quelltext und CSRF-Token absenden -- Neue Dokumentversion erstellt und Redirect zu Dokument ----------------------------------------- - -Version einlesen - -- Gibt JSON mit Preview-Daten zurück -- Fehler als JSON mit ok: false - -- Dokument-Detailseite öffnen -- LMB auf Version klicken -- Vorschau-Request abwarten -- JSON enthält ok: true und preview ----------------------------------------- - -Version erstellen - -Ermöglicht das Hinzufügen einer neuen Dokumentversion - -- GET zeigt Formular mit Dokument-ID -- POST erfordert gültiges CSRF-Token -- POST erfordert hochgeladene Datei -- Hochgeladene Datei wird in Upload-Verzeichnis verschoben -- DocumentService erstellt neue Version - -- Admin-URL für neue Dokumentversion aufrufen -- Formular mit Datei und CSRF-Token POSTen -- Erfolgsmeldung Neue Dokumentversion wurde hochgeladen -- Weiterleitung auf Dokumentdetailseite ----------------------------------------- - -Versionvorschau anzeigen - -Zeigt den Originaltext einer Dokumentversion in einem ausschnitt an - -- LMB auf Version -- Zeigt Textausschnitt mit Offset und Limit - -- Dokumentdetail öffnen -- API version preview abrufen -- preview enthält Textausschnitt ----------------------------------------- - -Version aktivieren diff --git a/daten/TFT/.pruefung.json b/daten/TFT/.pruefung.json deleted file mode 100644 index 18207e0..0000000 --- a/daten/TFT/.pruefung.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "abdeckung": { - "bedienen:act": { - "abdruck": "965eccb9356235b1", - "funktion": "Shop sperren", - "trug": "b6a2ab03493b74c5" - }, - "bedienen:buy": { - "abdruck": "63c51977c098cde3", - "funktion": "Item kaufen", - "trug": "f3d6ca24335fa3b1" - }, - "bedienen:buyXp": { - "abdruck": "1a0c5247f488c54c", - "funktion": "XP kaufen", - "trug": "45683c6493a79b31" - }, - "bedienen:equip": { - "abdruck": "e9e549414ab5a0d1", - "funktion": "Einheit ausrüsten", - "trug": "8c6d6267f598e37d" - }, - "bedienen:move": { - "abdruck": "8ce9d559861ca921", - "funktion": "", - "trug": "" - }, - "bedienen:next": { - "abdruck": "0b481f13ca9aebf9", - "funktion": "Runde fortsetzen", - "trug": "45149ffb5a41db45" - }, - "bedienen:p": { - "abdruck": "88b57fbbc98d450c", - "funktion": "Gegner einblenden", - "trug": "b7192893969b60f4" - }, - "bedienen:pickAugment": { - "abdruck": "ba2ea2a567fcde9c", - "funktion": "Augment auswählen", - "trug": "7a76e5f3d13ef6d7" - }, - "bedienen:reroll": { - "abdruck": "fd56403509531bb6", - "funktion": "XP kaufen", - "trug": "45683c6493a79b31" - }, - "bedienen:start": { - "abdruck": "710cd74615808655", - "funktion": "Spiel starten", - "trug": "84ca0e724728251f" - }, - "befehl:autoplay": { - "abdruck": "7b035ff596c12934", - "funktion": "", - "trug": "" - }, - "befehl:build-artifact": { - "abdruck": "153fed8ab2aa1f5b", - "funktion": "Statische Daten herunterladen", - "trug": "8390b7b7807ab3f0" - }, - "befehl:calibrate": { - "abdruck": "e816c00e7793250b", - "funktion": "Ranglisten-Matches crawlen", - "trug": "a9e766bc343f6751" - }, - "befehl:crawl": { - "abdruck": "c9bb4cca017189c1", - "funktion": "Statische Daten herunterladen", - "trug": "8390b7b7807ab3f0" - }, - "befehl:extract": { - "abdruck": "9595995ee5598702", - "funktion": "Statische Daten herunterladen", - "trug": "8390b7b7807ab3f0" - }, - "befehl:fetch-static": { - "abdruck": "2207bccdebcd9aa4", - "funktion": "", - "trug": "" - }, - "befehl:refresh": { - "abdruck": "b8b8e201706f4c19", - "funktion": "Spiele automatisch spielen", - "trug": "3ef945fdc4f98631" - }, - "route:get /api/game/{game_id}": { - "abdruck": "7391585929a1342c", - "funktion": "Spielstand abrufen", - "trug": "85b87d6154b2363b" - }, - "route:get /health": { - "abdruck": "bf52cace58ae302a", - "funktion": "Systemzustand prüfen", - "trug": "3a72c3a11d536884" - }, - "route:post /api/game": { - "abdruck": "fe2b8a04ab08ae82", - "funktion": "Spiel starten", - "trug": "84ca0e724728251f" - }, - "route:post /api/game/{game_id}/action": { - "abdruck": "952a1c6a5b3a9372", - "funktion": "Spielaktion ausführen", - "trug": "274b16ec98a7a650" - } - }, - "belege": { - "[\"analyse\", \"Analysedaten generieren\"]": { - "abdruck": "6a39ed91dabae20c", - "beleg": "\"learned\": learned or {},", - "datei": "backend/tft/model/artifact.py" - }, - "[\"analyse\", \"Endboards erfassen\"]": { - "abdruck": "f8be70adea2b51f5", - "beleg": "def extract_all(conn, static: dict) -> tuple[int, Counter]:", - "datei": "backend/tft/matches/extract.py" - }, - "[\"analyse\", \"Platzierungen testen\"]": { - "abdruck": "ed43baf02f00a9f5", - "beleg": "def calibrate(conn, artifact: dict, holdout_only: bool = False, score_fn=None) -> dict:", - "datei": "backend/tft/model/calibrate.py" - }, - "[\"einheit\", \"Einheit ausrüsten\"]": { - "abdruck": "dc58e2411954a192", - "beleg": "def equip(p: PlayerState, item_idx: int, board_idx: int, artifact: dict | None = None) -> None:", - "datei": "backend/tft/sim/player.py" - }, - "[\"einheit\", \"Einheit verschieben\"]": { - "abdruck": "298448c773048dde", - "beleg": "def move(p: PlayerState, where: str, idx: int) -> None:\n src, dst = (p.bench, p.board) if where == \"bench\" else (p.board, p.bench)\n if not (0 <= idx < len(src)):\n raise InvalidAction(\"no unit there\")\n if dst is p.board and len(p.board) >= p.level:\n raise InvalidAction(\"board full for your level\")\n if dst is p.bench and len(p.bench) >= BENCH_SIZE:\n raise InvalidAction(\"bench full\")\n dst.append(src.pop(idx))", - "datei": "backend/tft/sim/player.py" - }, - "[\"pipeline\", \"Pipeline ausführen\"]": { - "abdruck": "55afc728ea543cb6", - "beleg": "for stage in (\"crawl\", \"extract\", \"build-artifact\", \"calibrate\"):", - "datei": "backend/tft/cli.py" - }, - "[\"pipeline\", \"Ranglisten-Matches crawlen\"]": { - "abdruck": "d91e117ee0d050a4", - "beleg": "def crawl(set_number: int, limit: int = 200) -> int:", - "datei": "backend/tft/matches/crawl.py" - }, - "[\"pipeline\", \"Statische Daten herunterladen\"]": { - "abdruck": "b558c5c5a5f4f2d9", - "beleg": "def fetch_static(set_override: int | None = None) -> dict:", - "datei": "backend/tft/staticdata/fetch.py" - }, - "[\"pipeline\", \"Systemzustand prüfen\"]": { - "abdruck": "895ac2187188eb0a", - "beleg": "@app.get(\"/health\")\ndef health() -> dict:\n return {\"status\": \"ok\"}", - "datei": "backend/tft/api/app.py" - }, - "[\"shop\", \"Augment auswählen\"]": { - "abdruck": "1e9f76ada85ce074", - "beleg": "def pick_augment(p: PlayerState, choice: int) -> None:\n if not p.augment_offer:\n raise InvalidAction(\"no augment offer\")\n if not (0 <= choice < len(p.augment_offer)):\n raise InvalidAction(\"invalid choice\")\n p.augments.append(p.augment_offer[choice])\n p.augment_offer = []", - "datei": "backend/tft/sim/player.py" - }, - "[\"shop\", \"Item kaufen\"]": { - "abdruck": "ab0dc67b859c1205", - "beleg": "def buy(p: PlayerState, slot: int, pool: Pool, artifact: dict) -> None:", - "datei": "backend/tft/sim/player.py" - }, - "[\"shop\", \"Shop aktualisieren\"]": { - "abdruck": "191c940daa30b69b", - "beleg": "def reroll(p: PlayerState, pool: Pool, cfg: dict, rng: random.Random) -> None:\n cost = cfg[\"shop\"][\"reroll_cost\"]\n if p.gold < cost:\n raise InvalidAction(\"not enough gold\")\n p.gold -= cost\n refresh_shop(p, pool, cfg, rng)", - "datei": "backend/tft/sim/player.py" - }, - "[\"shop\", \"Shop sperren\"]": { - "abdruck": "fe80becbfaa689c5", - "beleg": "def toggle_lock(self) -> None:\n self.player.shop_locked = not self.player.shop_locked", - "datei": "backend/tft/sim/game.py" - }, - "[\"shop\", \"XP kaufen\"]": { - "abdruck": "1b2d9644e3c6c09f", - "beleg": "def buy_xp(p: PlayerState, cfg: dict) -> None:\n xp = cfg[\"xp\"]\n if p.level >= xp[\"max_level\"]:\n raise InvalidAction(\"max level\")\n if p.gold < xp[\"buy_cost\"]:\n raise InvalidAction(\"not enough gold\")\n p.gold -= xp[\"buy_cost\"]\n p.level, p.xp = economy.apply_xp(p.level, p.xp, xp[\"buy_amount\"], cfg)", - "datei": "backend/tft/sim/player.py" - }, - "[\"spiel\", \"Gegner einblenden\"]": { - "abdruck": "302223719243056a", - "beleg": "@click=\"!p.is_player && (expanded = expanded === p.name ? null : p.name)\"", - "datei": "frontend/src/components/OpponentList.vue" - }, - "[\"spiel\", \"Runde fortsetzen\"]": { - "abdruck": "df80063512e078a7", - "beleg": "def step(self) -> None:\n \"\"\"Resolve the current round and advance to the next planning phase.\"\"\"", - "datei": "backend/tft/sim/game.py" - }, - "[\"spiel\", \"Spiel starten\"]": { - "abdruck": "1fa645dc09353d68", - "beleg": "@app.post(\"/api/game\")\ndef new_game(seed: int | None = None) -> dict:\n artifact, cfg = _load_game_deps()\n game_id = uuid.uuid4().hex[:8]\n GAMES[game_id] = Game(artifact, cfg, seed=seed)\n return {\"game_id\": game_id, **state(game_id)}", - "datei": "backend/tft/api/app.py" - }, - "[\"spiel\", \"Spielaktion ausführen\"]": { - "abdruck": "e113ab7b8e4f225b", - "beleg": "@app.post(\"/api/game/{game_id}/action\")\ndef action(game_id: str, req: ActionRequest) -> dict:", - "datei": "backend/tft/api/app.py" - }, - "[\"spiel\", \"Spiele automatisch spielen\"]": { - "abdruck": "e6d88c6931086b25", - "beleg": "def run(artifact: dict, cfg: dict, policy_name: str, n: int, seed: int = 1) -> dict:", - "datei": "backend/tft/sim/autoplay.py" - }, - "[\"spiel\", \"Spielstand abrufen\"]": { - "abdruck": "7c267f889cc18e5c", - "beleg": "def state(game_id: str) -> dict:", - "datei": "backend/tft/api/app.py" - } - }, - "ohne_code": {}, - "ohne_karte": {}, - "paare": {}, - "stil": { - "[\"analyse\", \"\"]": { - "abdruck": "36a5c535e2b6e294", - "probleme": [] - }, - "[\"analyse\", \"Analysedaten generieren\"]": { - "abdruck": "6c6136aa1f731cea", - "probleme": [] - }, - "[\"analyse\", \"Endboards erfassen\"]": { - "abdruck": "46ff85afaea26861", - "probleme": [] - }, - "[\"analyse\", \"Platzierungen testen\"]": { - "abdruck": "58f4097a7aad42b2", - "probleme": [] - }, - "[\"einheit\", \"\"]": { - "abdruck": "591f6d834b06521d", - "probleme": [] - }, - "[\"einheit\", \"Einheit ausrüsten\"]": { - "abdruck": "2b91a8a929caf2ea", - "probleme": [] - }, - "[\"einheit\", \"Einheit verschieben\"]": { - "abdruck": "0fa02b3c5370a837", - "probleme": [] - }, - "[\"pipeline\", \"\"]": { - "abdruck": "4c05ea483576379e", - "probleme": [] - }, - "[\"pipeline\", \"Pipeline ausführen\"]": { - "abdruck": "62c1b0e18d38c93e", - "probleme": [] - }, - "[\"pipeline\", \"Ranglisten-Matches crawlen\"]": { - "abdruck": "cfbaf9497a9ee888", - "probleme": [] - }, - "[\"pipeline\", \"Statische Daten herunterladen\"]": { - "abdruck": "a5527bcb3a8a8e95", - "probleme": [] - }, - "[\"pipeline\", \"Systemzustand prüfen\"]": { - "abdruck": "1bf0e238f72fcf45", - "probleme": [] - }, - "[\"shop\", \"\"]": { - "abdruck": "75b47d1052ed5c4c", - "probleme": [] - }, - "[\"shop\", \"Augment auswählen\"]": { - "abdruck": "39156336d367d481", - "probleme": [] - }, - "[\"shop\", \"Item kaufen\"]": { - "abdruck": "642d23d43adc285f", - "probleme": [] - }, - "[\"shop\", \"Shop aktualisieren\"]": { - "abdruck": "9a4c846ad728fba7", - "probleme": [] - }, - "[\"shop\", \"Shop sperren\"]": { - "abdruck": "45037477893cfe1e", - "probleme": [] - }, - "[\"shop\", \"XP kaufen\"]": { - "abdruck": "f39788167c4cc160", - "probleme": [] - }, - "[\"spiel\", \"\"]": { - "abdruck": "c9853896271c5be7", - "probleme": [] - }, - "[\"spiel\", \"Gegner einblenden\"]": { - "abdruck": "63d6fda80dd3b2d4", - "probleme": [] - }, - "[\"spiel\", \"Runde fortsetzen\"]": { - "abdruck": "cba0db2ace42f096", - "probleme": [] - }, - "[\"spiel\", \"Spiel starten\"]": { - "abdruck": "06a041341108c024", - "probleme": [] - }, - "[\"spiel\", \"Spielaktion ausführen\"]": { - "abdruck": "4c72ac35204cb4db", - "probleme": [] - }, - "[\"spiel\", \"Spiele automatisch spielen\"]": { - "abdruck": "63a5feadb6e87b2f", - "probleme": [] - }, - "[\"spiel\", \"Spielstand abrufen\"]": { - "abdruck": "3b51dd57c2d1e4e3", - "probleme": [] - } - }, - "verworfen": {} -} diff --git a/daten/TFT/analyse.md b/daten/TFT/analyse.md deleted file mode 100644 index 2bd3b7b..0000000 --- a/daten/TFT/analyse.md +++ /dev/null @@ -1,61 +0,0 @@ - -Analyse ----------------------------------------- - -kern ----------------------------------------- - -Erzeugt ein trainiertes Modell aus Matchdaten und wertet dessen Vorhersagequalität aus ----------------------------------------- - -- Static-Daten sind Grundlage für alle weiteren Schritte -- Spearman-Korrelation misst Vorhersagequalität -- Holdout-Matches werden nicht zum Training genutzt -- Refresh führt alle Schritte sequenziell aus -- fetch-static lädt Community-Dragon-Daten herunter -- crawl lädt bis zu 200 neue Matches pro Lauf -- autoplay führt Spiele mit Policy aus Standard: econ -- autoplay führt 200 Spiele aus Standard -- refresh führt crawl extract build-artifact und calibrate aus ----------------------------------------- - -Analysedaten generieren - -Erstellt eine Analysedatei aus gelernten Spieldaten und statischen Daten - -- Ausgabe ist eine einzelne JSON-Datei -- Analyse enthält gelernte Statistiken pro Set -- Dateipfad wird ausgegeben - -- tft build-artifact ausführen -- artifact.json prüfen -- boards_learned_from enthält Anzahl ----------------------------------------- - -Endboards erfassen - -Extrahiert gespielte Boards aus Rohdaten der Datenbank für die Modellierung - -- Ein Aufruf pro Set -- Unbekannte IDs werden gezählt ausgegeben -- Erfolgsmeldung bei vollständiger Auflösung -- Kenntnis der Datenbankverbindung vorausgesetzt - -- tft extract ausführen -- Anzahl extrahierter Endboards prüfen -- Unbekannte IDs: Ausgabe vorhanden -- Alle IDs aufgelöst: Erfolgsmeldung vorhanden ----------------------------------------- - -Platzierungen testen - -Validierung der Prognosequalität des Modells anhand realer Platzierungen - -- Nur Holdout-Matches werden ausgewertet -- Vergleicht vorhergesagte Platzierung mit tatsächlicher Platzierung -- Ausgabe: Anzahl Holdout-Matches und Spearman-Korrelation -- Lädt aktuelles Artifact für das aktive Set - -- CLI: tft calibrate ausführen -- Ausgabe enthält holdout matches und spearman -- Spearman-Wert zwischen -1 und 1 diff --git a/daten/TFT/einheit.md b/daten/TFT/einheit.md deleted file mode 100644 index bd7c96a..0000000 --- a/daten/TFT/einheit.md +++ /dev/null @@ -1,35 +0,0 @@ - -Einheit ----------------------------------------- - -kern ----------------------------------------- - -- Einheit auf Board verkaufen ----------------------------------------- - -Einheit ausrüsten - -Weist ein ausgewähltes Item einer Einheit auf dem Board zu - -- Item ist ausgewählt -- Ziel ist eine Board-Einheit -- Item wird von der Itemleiste entfernt -- Unit zeigt das Item nach dem Ausrüsten - -- Item in Itemleiste anklicken -- LMB auf Board-Einheit -- Item auf Unitchip sichtbar ----------------------------------------- - -Einheit verschieben - -Vertauscht eine Bank-Einheit mit einer Brett-Einheit - -- Bewegt Einheit auf freien Brett-Platz -- Tauscht mit Einheit auf angeklicktem Brett-Platz - -- Board mit Einheit öffnen -- Bank mit Einheit öffnen -- LMB auf Bank-Einheit klicken -- Einheit auf Brett verschoben diff --git a/daten/TFT/pipeline.md b/daten/TFT/pipeline.md deleted file mode 100644 index 400a0fa..0000000 --- a/daten/TFT/pipeline.md +++ /dev/null @@ -1,60 +0,0 @@ - -Pipeline ----------------------------------------- - -kern ----------------------------------------- - -- autoplay mit --policy und --games ----------------------------------------- - -Pipeline ausführen - -Führt Crawl, Extraktion, Build und Kalibrierung automatisch hintereinander aus - -- Führt vier Stages sequenziell aus -- Bricht bei Fehler in einer Stage ab -- Druckt Fortschritt für jede Stage -- Gibt den Fehlerort aus - -- tft refresh aufrufen -- Console zeigt alle vier Stages -- Alle Stages ohne Fehler -- refresh schließt erfolgreich ----------------------------------------- - -Ranglisten-Matches crawlen - -Holt neue Ranglisten-Matches von der Challenger- und GM-Leiter - -- Lädt maximal 200 neue Matches pro Lauf -- Nutzt Challenger- und GM-Spieler als Ausgangspunkt -- Bezieht Spieler-IDs aus der Rangliste - -- tft crawl ausführen -- Ausgabe prüfen -- Anzahl neuer Matches ausgegeben ----------------------------------------- - -Statische Daten herunterladen - -Lädt Einheiten, Traits, Items und Augments von Community Dragon herunter - -- Lädt Daten von Community Dragon herunter -- Nutzt aktuellen Set wenn kein --set angegeben -- Speichert Daten lokal unter paths.latest_static_pointer -- Gibt Set-Nummer, Patch und Elementanzahlen aus - -- Terminal öffnen -- tft fetch-static ausführen -- Ausgabe zeigt Set-Nummer, Patch und Elementanzahlen -- tft fetch-static --set 5 ausführen -- Ausgabe zeigt Set-5-Daten ----------------------------------------- - -Systemzustand prüfen - -- Gibt Status "ok" zurück - -- GET-Health-Endpunkt aufrufen -- Status ist ok diff --git a/daten/TFT/shop.md b/daten/TFT/shop.md deleted file mode 100644 index 44f3ca4..0000000 --- a/daten/TFT/shop.md +++ /dev/null @@ -1,83 +0,0 @@ - -Shop ----------------------------------------- - -kern ----------------------------------------- - -Bietet zufällige Champions zum Kaufen, Aktualisieren und Festhalten an ----------------------------------------- - -- Kostenfarben codieren Champion-Tiers -- Shop zeigt genau 3 Karten -- Kauf reduziert Gold um Kosten -- Kauf entfernt Karte dauerhaft aus dem Angebot -- Refresh kostet reroll_cost Gold -- Refresh zeigt neue zufällige Champions -- Gesperrter Shop behält Angebot zwischen Runden -- 🔒 zeigt gesperrten, 🔓 entsperrten Shop -- Owned Champions zeigen einen Schimmer-Effekt -- Unbezahlbare Karten sind leicht abgedunkelt -- Augment-Bereich zeigt "Augment wählen" als Überschrift ----------------------------------------- - -Augment auswählen - -Spieler wählt ein Augment aus den angebotenen Optionen - -- Drei Augmente zur Auswahl -- Augment-Karten nach Tier farblich markiert -- Gewähltes Augment wird sofort aktiviert - -- Augment-Auswahl öffnen -- LMB auf Augment-Karte -- Augment ausgewählt, Auswahl verschwunden ----------------------------------------- - -Item kaufen - -Fügt ein Item aus dem Shop zum Inventar hinzu - -- Kauf entfernt Item aus dem Shop -- Gold wird um Kosten reduziert - -- Karte im Shop anklicken -- Item im Board oder auf der Bank -- Goldbetrag um Kosten verringert ----------------------------------------- - -Shop aktualisieren - -Bietet neue Champions zum Kauf an - -- Kostet Shop-Gold aus `reroll_cost` -- Shop-Karten zeigen neue Zufallschampions - -- Genug Gold für Refresh bereitstellen -- LMB auf Refresh-Button -- Shop zeigt andere Champions ----------------------------------------- - -Shop sperren - -Verhindert das Kaufen und Rerollen im Shop zwischen zwei Runden - -- 🔒 bei gesperrtem Shop -- 🔓 bei entsperrtem Shop -- Gesperrter Shop behält sein Angebot - -- Shop-Button mit LMB klicken -- Shop ist gesperrt ----------------------------------------- - -XP kaufen - -Gibt XP zum Aufleveln des Spielers - -- Kostet Gold -- Button deaktiviert wenn xp_needed null -- Button deaktiviert wenn Gold < xp_cost - -- Anzeige von Gold und xp_cost prüfen -- Klick auf XP kaufen -- Gold reduziert, XP erhöht diff --git a/daten/TFT/spiel.md b/daten/TFT/spiel.md deleted file mode 100644 index 0313f6d..0000000 --- a/daten/TFT/spiel.md +++ /dev/null @@ -1,98 +0,0 @@ - -Spiel ----------------------------------------- - -kern ----------------------------------------- - -Simuliert einen vollständigen TFT-Spielzug mit Gegnern, Shop und Kampf ----------------------------------------- - -- game_id ist 8-stelliger Hex-String -- Board enthält Einheiten mit Items -- Shop enthält Odds und Kosten -- XP zeigt Fortschritt zum Levelaufstieg -- Augment-Angebot erscheint in passenden Runden -- Kampf endet automatisch mit Zustandsänderungen bei allen Beteiligten -- Spieler HP auf 0 -- Letzte Runde vorbei -- buy_xp als Aktion -- pick_augment als Aktion -- lock als Aktion -- next als Aktion -- Augment-Auswahl zeigt gewählte Augmente -- Shop zeigt Upgrade-Hinweis für 2- und 3-Sterneinheit -- Spielstand enthält reroll_cost und xp_cost -- Spielstand enthält shop_locked und shop_odds -- Spielstand enthält xp und xp_needed -- Spielstand enthält streak -- Spielstand enthält Log der letzten 8 Einträge -- Spielstand enthält placement -- autoplay als eigene Funktion ----------------------------------------- - -Gegner einblenden - -Blickt in die Board-Aufstellung eines Gegners - -- Nur für Nicht-Spieler -- Gegner muss lebendig sein -- Gegner braucht Einheiten auf dem Board - -- LMB auf lebenden Gegner -- Scout-Bereich mit Einheiten-Icon erscheint -- Erneuter Klick blendet Scout aus ----------------------------------------- - -Runde fortsetzen - -Wechselt zur nächsten Spielphase oder löst den Kampf aus - -- Nächste Phase einleiten -- Kampf ▶ im PvP-Modus auslösen - -- Kampf-Button klicken -- Spielzustand fortgeschritten ----------------------------------------- - -Spiel starten - -Beginnt ein neues Spiel mit initialem Spielstand - -- Generiert eindeutige game_id -- Lädt statische Spieldaten -- Initialisiert Spieler und Bots -- Antwortet mit vollständigem Spielstand - -- LMB auf "Neues Spiel" -- Anfrage an Backend abwarten -- Splash-Bildschirm verschwindet, Spiel-Layout erscheint ----------------------------------------- - -Spielaktion ausführen - -Führt Aktionen wie Kaufen, Verkaufen und Bewegen im Spiel aus - -- 404 bei unbekannter Spiel-ID -- 400 bei unbekannter Aktion -- 400 bei ungültiger Aktion -- 400 bei fehlenden Parametern - -- POST an Spielaktion-Endpunkt mit action=buy und slot=0 -- 200 miterialisierter Spielstand zurück -- Aktion ungültig → 400 mit Fehlermeldung ----------------------------------------- - -Spiele automatisch spielen ----------------------------------------- - -Spielstand abrufen - -Gibt den aktuellen Spielstand als JSON zurück - -- Unbekannte game_id wirft HTTP 404 - -- GET auf ungültige game_id -- HTTP 404 mit Fehlermeldung -- GET auf gültige game_id -- HTTP 200 mit Spielstand diff --git a/daten/TftSimulator/.planung/.chat.json b/daten/TftSimulator/.planung/.chat.json new file mode 100644 index 0000000..97f7fa6 --- /dev/null +++ b/daten/TftSimulator/.planung/.chat.json @@ -0,0 +1,10 @@ +[ + { + "rolle": "person", + "text": "Ich brauche weitere funktionen: \n- Champions: kaufen, verkaufen, setzen, zurücksetzen, auf dem board verschieben, auf dem feld verschieben\n- Items: zusammensetzen, verschieben\n- Gold: bekommen, zinsen \n- Erfahrung: bekommen, kaufen\n- Runden: ablauf, pve, pvp\n- Streak: win, lose\n- Traits: anzeigen\n- Klassen: anzeigen\n- Arguments: auswählen, reroll\n- Stats: Eigenschaften, Items, Traits, Klassen, Arguments\n- Sträke: Boardstärke, Offensiv, Defensiv" + }, + { + "rolle": "ki", + "text": "Elf Karten liegen daneben; \"Arguments\" habe ich als Augments gelesen. Im Code belegt sind Kauf, Verkauf, Wechsel zwischen Bank und Board, das Craften beim Anlegen und die Augment-Wahl (backend/tft/sim/player.py, frontend/src/store.js) — neu und heute nirgends vorhanden sind Positionen auf dem Board, das Umhängen von Items, ein Augment-Reroll sowie getrennte Offensiv- und Defensivwerte. Mit \"auf dem Feld verschieben\" habe ich die Bank gemeint: stimmt das, oder meinst du zwei Arten von Board-Positionen? Die Statikdaten kennen nur Traits ohne Trennung in Klassen (backend/tft/staticdata/parse.py) — soll die Klassen-Karte trotzdem eigenständig bleiben?" + } +] diff --git a/daten/TftSimulator/.planung/.verzeichnis b/daten/TftSimulator/.planung/.verzeichnis new file mode 100644 index 0000000..8ae432b --- /dev/null +++ b/daten/TftSimulator/.planung/.verzeichnis @@ -0,0 +1 @@ +/home/arbeit/projects/tft diff --git a/daten/TftSimulator/.planung/augment.md b/daten/TftSimulator/.planung/augment.md new file mode 100644 index 0000000..5201d4b --- /dev/null +++ b/daten/TftSimulator/.planung/augment.md @@ -0,0 +1,38 @@ + +Augment +---------------------------------------- + +optional +---------------------------------------- + +Bietet dauerhafte Partie-Boni zur Auswahl an +---------------------------------------- + +- Augments kommen in drei festen Runden +- Ein gewähltes Augment gilt bis Partieende +---------------------------------------- + +Augment auswählen + +offen + +- Drei Angebote stehen zur Wahl +- Die Wahl lässt sich nicht zurücknehmen + +- Partie in einer Augment-Runde +- LMB auf ein Angebot +- Augment gilt für die Partie +---------------------------------------- + +Angebot neu würfeln + +offen + +Tauscht ein unpassendes Angebot gegen ein neues + +- Neu würfeln kostet zwei Gold +- Jedes Angebot lässt sich einmal tauschen + +- Partie in einer Augment-Runde +- LMB auf "Neu würfeln" am Angebot +- Neues Augment steht zur Wahl diff --git a/daten/TftSimulator/.planung/champion.md b/daten/TftSimulator/.planung/champion.md new file mode 100644 index 0000000..bef475c --- /dev/null +++ b/daten/TftSimulator/.planung/champion.md @@ -0,0 +1,91 @@ + +Champion +---------------------------------------- + +kern +---------------------------------------- + +Regelt, wie eine Truppe entsteht und aufgestellt wird +---------------------------------------- + +- Bank fasst neun Champions +- Board fasst so viele Champions wie die Stufe +- Drei gleiche Champions verschmelzen zur nächsten Sternstufe +---------------------------------------- + +Champion kaufen + +offen + +- Kauf kostet den Preis des Champions +- Volle Bank verhindert den Kauf +- Zu wenig Gold verhindert den Kauf + +- Gold für den Kauf besitzen +- LMB auf einen Champion im Shop +- Champion steht auf der Bank +---------------------------------------- + +Champion verkaufen + +offen + +- Erstattung richtet sich nach Preis und Sternstufe +- Items des Champions kehren in den Vorrat zurück + +- Champion auf der Bank +- LMB auf "Verkaufen" am Champion +- Champion verschwindet und Gold steigt +---------------------------------------- + +Champion aufstellen + +offen + +Bringt einen Champion in den Kampf + +- Volles Board verhindert das Aufstellen + +- Champion auf der Bank +- LMB auf den Champion +- Champion steht auf dem Board +---------------------------------------- + +Champion zurücknehmen + +offen + +Nimmt einen Champion aus dem Kampf + +- Volle Bank verhindert die Rücknahme +- Ausgewähltes Item verhindert die Rücknahme + +- Champion auf dem Board +- LMB auf den Champion +- Champion steht auf der Bank +---------------------------------------- + +Champion auf Board versetzen + +offen + +Bestimmt die Kampfposition eines Champions + +- Position bleibt über die Runde hinaus erhalten + +- Champion auf dem Board +- Champion mit LMB auf ein freies Feld ziehen +- Champion steht auf dem neuen Feld +---------------------------------------- + +Champion auf Bank versetzen + +offen + +Ordnet die Bank nach eigenem Wunsch + +- Reihenfolge der Bank ändert die Kampfkraft nicht + +- Zwei Champions auf der Bank +- Champion mit LMB auf einen freien Platz ziehen +- Champion steht auf dem neuen Platz diff --git a/daten/TftSimulator/.planung/erfahrung.md b/daten/TftSimulator/.planung/erfahrung.md new file mode 100644 index 0000000..6fff63b --- /dev/null +++ b/daten/TftSimulator/.planung/erfahrung.md @@ -0,0 +1,38 @@ + +Erfahrung +---------------------------------------- + +kern +---------------------------------------- + +Hebt die Stufe und damit die Boardgröße +---------------------------------------- + +- Höchststufe ist zehn +- Carousel gibt keine Erfahrung +---------------------------------------- + +Erfahrung erhalten + +offen + +- Jede Kampfrunde gibt zwei Erfahrung + +- Partie in einer Kampfrunde +- LMB auf "Weiter" +- Erfahrung um zwei Punkte gestiegen +---------------------------------------- + +Erfahrung kaufen + +offen + +Beschleunigt den Aufstieg gegen Gold + +- Kauf kostet vier Gold +- Kauf bringt vier Erfahrung +- Höchststufe verhindert den Kauf + +- Vier Gold besitzen +- LMB auf "XP kaufen" +- Erfahrung um vier Punkte gestiegen diff --git a/daten/TftSimulator/.planung/gold.md b/daten/TftSimulator/.planung/gold.md new file mode 100644 index 0000000..8496040 --- /dev/null +++ b/daten/TftSimulator/.planung/gold.md @@ -0,0 +1,40 @@ + +Gold +---------------------------------------- + +kern +---------------------------------------- + +Steuert, was in einer Runde bezahlbar ist +---------------------------------------- + +- Partie startet ohne Gold +---------------------------------------- + +Einkommen erhalten + +offen + +Finanziert die Käufe der nächsten Runde + +- Grundeinkommen beträgt fünf Gold +- Frühe Runden zahlen weniger +- Sieg im PvP bringt ein Gold zusätzlich + +- Goldstand merken +- LMB auf "Weiter" +- Gold um das Rundeneinkommen gestiegen +---------------------------------------- + +Zinsen erhalten + +offen + +Belohnt Sparen über mehrere Runden + +- Ein Gold je volle zehn Gold +- Zinsen enden bei fünf Gold + +- Zwanzig Gold besitzen +- LMB auf "Weiter" +- Einkommen enthält zwei Gold Zinsen diff --git a/daten/TftSimulator/.planung/item.md b/daten/TftSimulator/.planung/item.md new file mode 100644 index 0000000..7dc8f41 --- /dev/null +++ b/daten/TftSimulator/.planung/item.md @@ -0,0 +1,52 @@ + +Item +---------------------------------------- + +optional +---------------------------------------- + +Verstärkt einzelne Champions durch getragene Ausrüstung +---------------------------------------- + +- Höchstens drei Items je Champion +- Items tragen nur Champions auf dem Board +---------------------------------------- + +Item vergeben + +offen + +- Jede weitere Aktion hebt die Itemauswahl auf + +- Champion auf dem Board +- LMB auf ein Item im Vorrat +- LMB auf den Champion +- Item hängt am Champion +---------------------------------------- + +Item zusammensetzen + +offen + +Macht aus zwei Komponenten ein fertiges Item + +- Nur passende Komponenten ergeben ein fertiges Item +- Fertige Items lassen sich nicht weiter kombinieren + +- Champion mit einer Komponente auf dem Board +- LMB auf eine passende Komponente im Vorrat +- LMB auf den Champion +- Fertiges Item ersetzt beide Komponenten +---------------------------------------- + +Item umhängen + +offen + +Verschiebt Ausrüstung zwischen zwei Champions + +- Voller Zielchampion verhindert das Umhängen + +- Champion mit Item auf dem Board +- Item mit LMB auf einen anderen Champion ziehen +- Item hängt am anderen Champion diff --git a/daten/Planer/.planung/darkmode.md b/daten/TftSimulator/.planung/klasse.md similarity index 51% rename from daten/Planer/.planung/darkmode.md rename to daten/TftSimulator/.planung/klasse.md index 11c604c..0aae058 100644 --- a/daten/Planer/.planung/darkmode.md +++ b/daten/TftSimulator/.planung/klasse.md @@ -1,23 +1,21 @@ -Darkmode +Klasse ---------------------------------------- optional ---------------------------------------- -Passt die Anwendung ans Umgebungslicht an +Zeigt, welche Kampfrollen das Board abdeckt ---------------------------------------- -- Auto folgt der Systemeinstellung -- Zustand überlebt das Neuladen -- Kein Flackern beim Laden +- Zählt nur Champions auf dem Board ---------------------------------------- -Darkmode umschalten +Aktive Klassen ablesen + +offen -- Nacht-Icon: ☾ -- Tag-Icon: ☀ -- Auto-Icon: A +- Klassen erscheinen getrennt von den Traits -- LMB auf Icon in der Kopfzeile -- Modus gewechselt +- Zwei Champions derselben Klasse aufstellen +- Klassen-Bereich zeigt die Klasse als aktiv diff --git a/daten/TftSimulator/.planung/runde.md b/daten/TftSimulator/.planung/runde.md new file mode 100644 index 0000000..0ece814 --- /dev/null +++ b/daten/TftSimulator/.planung/runde.md @@ -0,0 +1,55 @@ + +Runde +---------------------------------------- + +kern +---------------------------------------- + +Taktet die Partie in Planung und Kampf +---------------------------------------- + +- Eine Partie läuft über neun Stages +- Carousel läuft ohne Zutun ab +---------------------------------------- + +Runde abschließen + +offen + +Beendet die Planung und löst die Runde aus + +- Bots ziehen zum Rundenstart +- Freie Boardplätze füllen sich von der Bank + +- Partie in einer Planungsphase +- LMB auf "Weiter" +- Nächste Runde beginnt +---------------------------------------- + +PvE-Runde bestreiten + +offen + +Bringt Beute ohne Gegenspieler + +- PvE zählt nicht für die Serie +- Beute fällt in jeder PvE-Runde an + +- Partie in einer PvE-Runde +- LMB auf "Weiter" +- Verlauf meldet die gewonnene PvE-Runde +---------------------------------------- + +PvP-Runde bestreiten + +offen + +Misst das eigene Board am Gegner + +- Niederlage kostet Lebenspunkte +- Überlebende Gegner erhöhen den Schaden +- Unentschieden kostet beide Seiten Lebenspunkte + +- Partie in einer PvP-Runde +- LMB auf "Kampf" +- Verlauf meldet den Ausgang des Kampfes diff --git a/daten/TftSimulator/.planung/staerke.md b/daten/TftSimulator/.planung/staerke.md new file mode 100644 index 0000000..c905f57 --- /dev/null +++ b/daten/TftSimulator/.planung/staerke.md @@ -0,0 +1,46 @@ + +Stärke +---------------------------------------- + +kern +---------------------------------------- + +Bewertet, wie stark das eigene Board kämpft +---------------------------------------- + +- Kampfausgang folgt der Stärke beider Boards +- Nur Champions auf dem Board zählen +---------------------------------------- + +Boardstärke ablesen + +offen + +Vergleicht die eigene Aufstellung mit den Gegnern + +- Änderungen am Board wirken sofort + +- Champion aufstellen +- Boardstärke in der Kopfzeile steigt +---------------------------------------- + +Offensivwert ablesen + +offen + +Zeigt den Schadensanteil der Aufstellung + +- Champion auf dem Board +- LMB auf die Boardstärke +- Offensivwert des Boards sichtbar +---------------------------------------- + +Defensivwert ablesen + +offen + +Zeigt die Widerstandskraft der Aufstellung + +- Champion auf dem Board +- LMB auf die Boardstärke +- Defensivwert des Boards sichtbar diff --git a/daten/TftSimulator/.planung/stats.md b/daten/TftSimulator/.planung/stats.md new file mode 100644 index 0000000..56e9938 --- /dev/null +++ b/daten/TftSimulator/.planung/stats.md @@ -0,0 +1,62 @@ + +Stats +---------------------------------------- + +optional +---------------------------------------- + +Legt die Werte hinter einem Champion offen +---------------------------------------- + +- Anzeige rechnet Sterne und Items ein +---------------------------------------- + +Stats eines Champions ansehen + +offen + +- Anzeige gilt für den gewählten Champion + +- Champion auf dem Board +- RMB auf den Champion +- Angriff und Leben des Champions sichtbar +---------------------------------------- + +Items eines Champions ansehen + +offen + +- Freie Itemplätze sind erkennbar + +- Champion mit Item auf dem Board +- RMB auf den Champion +- Getragene Items sind benannt +---------------------------------------- + +Traits eines Champions ansehen + +offen + +- Champion auf dem Board +- RMB auf den Champion +- Traits des Champions sind benannt +---------------------------------------- + +Klassen eines Champions ansehen + +offen + +- Champion auf dem Board +- RMB auf den Champion +- Klassen des Champions sind benannt +---------------------------------------- + +Gewählte Augments ansehen + +offen + +Erinnert an die Boni der laufenden Partie + +- Augment in der Partie gewählt +- LMB auf die Augmentanzeige in der Kopfzeile +- Wirkung des Augments sichtbar diff --git a/daten/TftSimulator/.planung/streak.md b/daten/TftSimulator/.planung/streak.md new file mode 100644 index 0000000..c389feb --- /dev/null +++ b/daten/TftSimulator/.planung/streak.md @@ -0,0 +1,38 @@ + +Streak +---------------------------------------- + +optional +---------------------------------------- + +Belohnt Serien aus Siegen oder Niederlagen mit Gold +---------------------------------------- + +- Nur PvP zählt für die Serie +- Ein anderer Ausgang setzt die Serie zurück +---------------------------------------- + +Siegesserie aufbauen + +offen + +- Ab zwei Siegen gibt es ein Gold +- Ab fünf Siegen gibt es zwei Gold +- Ab sechs Siegen gibt es drei Gold + +- Partie in einer PvP-Runde +- Zwei Kämpfe hintereinander gewinnen +- Serienzähler steht auf zwei +---------------------------------------- + +Niederlagenserie aufbauen + +offen + +Hält eine schwache Phase wirtschaftlich tragbar + +- Bonusgold richtet sich nach der Länge der Serie + +- Partie in einer PvP-Runde +- Zwei Kämpfe hintereinander verlieren +- Serienzähler steht auf zwei diff --git a/daten/TftSimulator/.planung/trait.md b/daten/TftSimulator/.planung/trait.md new file mode 100644 index 0000000..c3f22ea --- /dev/null +++ b/daten/TftSimulator/.planung/trait.md @@ -0,0 +1,22 @@ + +Trait +---------------------------------------- + +optional +---------------------------------------- + +Zeigt, welche Boni das eigene Board erreicht +---------------------------------------- + +- Zählt nur Champions auf dem Board +---------------------------------------- + +Aktive Traits ablesen + +offen + +- Ein Trait ist ab der ersten Schwelle aktiv +- Alle Schwellen eines Traits sind ablesbar + +- Zwei Champions desselben Traits aufstellen +- Trait-Bereich zeigt den Trait als aktiv diff --git a/daten/TftSimulator/.planung/vision.md b/daten/TftSimulator/.planung/vision.md new file mode 100644 index 0000000..046ddec --- /dev/null +++ b/daten/TftSimulator/.planung/vision.md @@ -0,0 +1,19 @@ + +Vision +---------------------------------------- + +vision +---------------------------------------- + +Das Spiel TFT im Browser nachbauen um Strategien und das Spiel zu üben. +---------------------------------------- + +Spiel simulieren + +- Kampf nur teilweise simulieren + +Boardstärke messen + +- Offensive und Devensive Werte +- Aktuelle Sufstellung bekommt einen Wert +- Jede Aktion zeigt wie sie die Boardstärke verändert diff --git a/daten/TftSimulator/.recherche.json b/daten/TftSimulator/.recherche.json new file mode 100644 index 0000000..c6d6b3a --- /dev/null +++ b/daten/TftSimulator/.recherche.json @@ -0,0 +1,45 @@ +[ + { + "id": "5b0cea41", + "titel": "Wenn ich TFT programmieren würde, welche…", + "verlauf": [ + { + "rolle": "person", + "text": "Wenn ich TFT programmieren würde, welche funktionen müsste ich erstellen?" + }, + { + "rolle": "ki", + "text": "TFT ist doppeldeutig — ich bin erst mal vom Autobattler Teamfight Tactics ausgegangen und habe die Spielregeln zusammengetragen, aber sag mir bitte, ob du stattdessen ein TFT-Display meinst, dann werfe ich das wieder weg. Falls es das Spiel ist: der aktuelle Satz läuft nur noch bis Ende August, danach kommt ein neuer mit anderen Champions und Werten — Balance-Daten gehören deshalb in austauschbare Dateien, nicht in den Code. Zwei Dinge widersprechen sich in den Quellen, nämlich die Mana-Erzeugung pro Auto-Angriff und die Frage, ob es Level 11 gibt; das steht im Auftrag markiert. Um die Funktionsliste wirklich zu schneiden, brauche ich noch: kompletter Spielablauf mit acht Spielern oder nur ein Kampfsimulator, und in welcher Sprache bzw. Engine?" + } + ], + "auftrag": "# Teamfight-Tactics-Nachbau (Arbeitsannahme)\n\nEin Autobattler nach Vorbild von Riots Teamfight Tactics. Fertig ist es, wenn eine Runde aus Kauf-, Aufstell- und Kampfphase deterministisch durchläuft und der Kampfausgang dem Original nahekommt. **Richtung noch unbestätigt** — „TFT\" könnte auch ein Grafikdisplay meinen (siehe Offen).\n\n## Festgelegt\n- Aktueller Stand: Set 17 „Space Gods\", live seit 15.04.2026, Patch 17.8 vom 28.07.2026; Set 18 „Enchanted Wilds\" ab 26.08.2026 → Champion-, Trait- und Item-Daten müssen als austauschbare Datendateien geladen werden, nicht fest verdrahtet.\n- Spielfeld pro Spieler: 4 Reihen × 7 Spalten Hexfelder = 28 Felder. Bank: 9 Slots. Einsetzbare Einheiten = Spielerlevel (Level 5 → 5 Einheiten).\n- Shop-Odds Set 17 (Level: Kosten 1/2/3/4/5 in %): 1–2: 100/0/0/0/0 · 3: 75/25/0/0/0 · 4: 55/30/15/0/0 · 5: 45/33/20/2/0 · 6: 30/40/25/5/0 · 7: 19/30/40/10/1 · 8: 17/24/32/24/3 · 9: 15/18/25/30/12 · 10: 5/10/20/40/25 · 11: 1/2/12/50/35.\n- Gemeinsamer Champion-Pool (alle Spieler ziehen aus demselben Vorrat), Kopien je Champion: Kosten 1 = 30, 2 = 25, 3 = 18, 4 = 10, 5 = 9.\n- XP: 2 XP gratis am Rundenende, 4 Gold kaufen 4 XP. Schwellen laut Wiki: Lvl 3 = 2, 4 = 6, 5 = 10, 6 = 20, 7 = 36, 8 = 60, 9 = 68, 10 = 68.\n- **Widerspruch:** Das Wiki nennt Level 10 als Maximum, die Odds-Tabelle führt eine Zeile für Level 11. Vor Implementierung an einer Set-17-Quelle prüfen.\n- Mana (Wiki, aktuell): pro Auto-Angriff 10 (Assassin/Marksman/Fighter), 7 (Caster), 5 (Tank). Tanks zusätzlich aus erlittenem Schaden: 1 % vor Mitigation + 3 % nach Mitigation, Deckel 42,5 pro Treffer. Nach einem Cast 1 Sekunde Mana-Lock. Überschuss wird bis zu einem Cast mitgenommen (50/60 + 20 → 10/60).\n- **Widerspruch:** Eine ältere Riot-Erklärung nennt 10 Mana pro Angriff für alle Einheiten und 7 % Post-Mitigation-Schaden. Vermutlich seither geändert — die Wiki-Werte sind die jüngeren.\n- Angriffsgeschwindigkeit ist bei 5,0 Angriffen/Sekunde gedeckelt (Quelle aus Patch-11.9-Ära, für Set 17 ungeprüft).\n- Items: 9 Komponenten, daraus 45 fertige Items (9×9-Matrix inkl. der 9 Doppel-Kombinationen). Maximal 3 fertige Items pro Champion. Zwei Komponenten auf demselben Champion kombinieren zwangsweise — Zwischenlagern ist nicht möglich.\n- Statische Daten: Riots Data Dragon liefert u. a. `tft-trait.json` und `tft-tactician.json`, wird aber nicht automatisch pro TFT-Patch gebaut und fehlt für einige Sets ganz; bekannte Sprite-Fehler. Für vollständige Set-Daten sind Community-Quellen nötig.\n- Referenzimplementierungen zum Abschauen der Kampflogik: Avadaa/Teamfight-Tactics-simulator (bildet die interne Kampflogik nach, aber auf Patch 10.24b eingefroren) und TFTMuZeroAgent (Set-4-Kampfsimulator, darauf aufbauend).\n\n## Offen\n- Meinst du das Spiel Teamfight Tactics oder ein TFT-Display (z. B. Grafikausgabe auf ESP32/Arduino)? Alles oben gilt nur für den ersten Fall.\n- Umfang: vollständige Partie mit 8 Spielern samt Ökonomie, Augments und PvE-Runden — oder nur ein Kampfsimulator, der zwei fertige Aufstellungen gegeneinander laufen lässt?\n- Sprache und Engine? Client-Server mit echten Gegnern oder alles lokal gegen Bots?\n- Original-Balance von Set 17 nachbilden oder eigene Champions und Traits erfinden? Das entscheidet, ob ein Daten-Importer für Set-Daten überhaupt gebraucht wird.\n- Soll der Kampf deterministisch und reproduzierbar sein (Seed, feste Tick-Rate) — z. B. für Tests oder KI-Training?\n\n## Quellen\n- https://www.esportstales.com/teamfight-tactics/champion-pool-size-and-draw-chances — Shop-Odds je Level und Pool-Größen für Set 17\n- https://wiki.leagueoflegends.com/en-us/TFT:Experience — XP-Tabelle, XP-Kauf, Einheiten-Limit\n- https://wiki.leagueoflegends.com/en-us/TFT:Mana — Mana pro Angriff nach Rolle, Tank-Formel, Mana-Lock, Overflow\n- https://comicbook.com/gaming/news/teamfight-tactics-how-mana-generation-works/ — ältere Riot-Erklärung zu Mana (widersprüchlich) und Attack-Speed-Cap\n- https://tft.ninja/guides/getting-started/the-board — 4×7 Hexfelder, 9 Bank-Slots\n- https://tft.ninja/guides/game-mechanics/items/combining — 9 Komponenten, 45 Items, Kombinationszwang\n- https://www.littlebuddybot.com/tft-shop-odds — Set 17 „Space Gods\", Patchstand 17.7 (Tabellen nur als Bilder)\n- https://esports.gg/news/teamfight-tactics/tft-patch-schedule-2026/ — Patch- und Set-Termine 2026\n- https://riot-api-libraries.readthedocs.io/en/latest/ddragon.html — Data-Dragon-Dateien für TFT und deren Lücken\n- https://github.com/Avadaa/Teamfight-Tactics-simulator — Referenz-Kampfsimulator (Patch 10.24b)\n- https://github.com/silverlight6/TFTMuZeroAgent — Set-4-Kampfsimulator als Trainingsumgebung" + }, + { + "id": "e7bc6079", + "titel": "welche TFT funktionen fehlen für eine si…", + "verlauf": [ + { + "rolle": "person", + "text": "welche TFT funktionen fehlen für eine simulation?" + }, + { + "rolle": "ki", + "text": "Ich weiß nicht, wovon du sprichst — „TFT\" kann hier mehreres heißen, und die Antworten hätten nichts miteinander zu tun.\n\nMeinst du\n\n- **Teamfight Tactics** (Riot), also einen Kampf-Simulator gegen die Spiel-Logik,\n- ein **TFT-Display** (ST7789/ILI9341 o. ä.), das du ohne Hardware simulieren willst,\n- den **Temporal Fusion Transformer** (PyTorch Forecasting) für Szenario-Rechnungen,\n- oder etwas anderes?\n\nUnd: „fehlen\" — gemessen woran? Gegen eine Bibliothek, die du schon einsetzt (welche, welche Version?), oder gegen eine API/Datenquelle, aus der du die Simulation speisen willst? Sobald ich das weiß, suche ich gezielt nach dem, was tatsächlich abgedeckt ist und was du selbst bauen musst." + } + ] + }, + { + "id": "db2f8e52", + "titel": "welche TFT funktionen fehlen für eine si…", + "verlauf": [ + { + "rolle": "person", + "text": "welche TFT funktionen fehlen für eine simulation?" + }, + { + "rolle": "ki", + "text": "TFT läuft aktuell in Set 17 „Space Gods\" (Patch 17.7). Verglichen mit den Karten fehlen vor allem die Systeme *vor* und *nach* der Planungsphase: es gibt keinen Laden, keinen geteilten Champion-Pool, keine Lebenspunkte und keine Beutequelle für Items — ohne die hängen „Champion kaufen\", „Item vergeben\" und „PvP-Runde bestreiten\" in der Luft. Zwei Zahlensätze widersprechen sich zwischen Quellen (Streak-Schwellen, Shop-Odds Level 8/9), die stehen unten unter Offen.\n\n## Festgelegt\n\n**Karte „Laden\" fehlt vollständig** — Shop zeigt 5 Champions, Reroll kostet 2 Gold, zum Rundenstart wird gratis neu gewürfelt; aufeinanderfolgende Shops wiederholen nicht gekaufte Champions nicht.\n\n**Kaufchancen je Stufe fehlen** (Set 17, 1/2/3/4/5-Kosten): L1–2 100/0/0/0/0 · L3 75/25/0/0/0 · L4 55/30/15/0/0 · L5 45/33/20/2/0 · L6 30/40/25/5/0 · L7 19/30/40/10/1 · L10 5/10/20/40/25 · L11 1/2/12/50/35.\n\n**Geteilter Champion-Pool fehlt als Karte** — 30 Kopien je 1-Kosten-Champion, 25 je 2-Kosten, 18 je 3-Kosten, 10 je 4-Kosten, 9 je 5-Kosten; alle 8 Spieler ziehen aus demselben Pool, Verkauf und Ausscheiden geben Kopien zurück, das Carousel entnimmt ebenfalls.\n\n**Funktion „Champions verschmelzen\" fehlt** — 3 gleiche Champions gleicher Sternstufe verschmelzen; Einheiten im Kampf zählen nicht als Ziel, sonst hat das Board Vorrang vor der Bank.\n\nSternskalierung als Zahl: HP 100 % / 180 % / 324 %, Angriffsschaden 100 % / 150 % / 225 % (1★/2★/3★).\n\nVerkaufserstattung konkret: 1★ voller Preis; ab 2★ ein Gold unter dem Netto-Wert, außer bei 1-Kosten-Champions (dort immer voll).\n\n**Karte „Lebenspunkte / Partieende\" fehlt** — Start mit 100 HP, keine Regeneration, 8 Spieler, Ausscheiden bei 0 HP, Partie läuft bis ein Spieler übrig ist.\n\n**Schadensformel fehlt** — Schaden = Stage-Basis + 1 pro überlebendem Gegnerchampion (Sternstufe egal). Basis nach Stage: 1 → 0, 2 → 2, 3 → 5, 4 → 8, 5 → 10, 6 → 12, 7+ → 17 (Stand Patch 17.3). PvE-, Carousel- und Augment-Runden machen 0 Schaden.\n\nUnentschieden: beide Seiten nehmen Schaden wie bei einer Niederlage, **beide Serien werden auf 0 gesetzt** (seit Patch 14.1) — die Karte „Streak\" sagt dazu nichts.\n\n**Rundenraster fehlt** — ab Stage 2 je 7 Runden: X-1/X-2/X-3 PvP, X-4 Carousel, X-5/X-6 PvP, X-7 PvE. Stage 1 hat 4 Runden, alle PvE. Augments in 2-1, 3-2, 4-2.\n\n**Carousel hat keine Funktion** — 9 Champions, jeder trägt ein Item; Auswahl in HP-Reihenfolge, die zwei niedrigsten zuerst, dann paarweise aufwärts. Das ist zugleich die zweite Itemquelle neben PvE-Beute.\n\nXP-Schwellen fehlen: 2 / 6 / 10 / 20 / 36 / 60 / 68 / 68 für Level 3…10, kumuliert 270 XP; Restüberschuss verfällt nicht; 2 XP je Runde, 4 Gold = 4 XP.\n\nEinkommensrampe konkret: 1-2 +2, 1-3 +2, 1-4 +3, 2-1 +4, ab 2-2 +5 Gold; Zins 1 Gold je volle 10, Deckel bei +5 (ab 50 Gold), berechnet auf dem Goldstand am Rundenende; PvP-Sieg +1.\n\n**Itemquelle fehlt** — 8 Basiskomponenten, zwei Komponenten ergeben ein fertiges Item (~12 g Wert), max. 3 Items je Champion; Spatula/Frying Pan ergeben Embleme. Zusätzliche Itemklassen, die die Karten nicht kennen: Radiant (~30 g), Artefakte (~18 g), Support (~18 g).\n\nGegnerwahl fehlt: bei 8 lebenden Spielern kein Wiedersehen innerhalb von 5 Runden, bei 7 innerhalb von 4; bei ungerader Zahl kämpft jemand gegen ein Geister-Board (Community-Quelle, nicht Riot).\n\n## Offen\n\nWelche Streak-Tabelle gilt? TFT Lab nennt Serie 2–4 = +1, 5 = +2, 6+ = +3; das LoL-Wiki nennt 3–4 = +1, 5 = +2, 6+ = +3 — die Karte „Streak\" sagt „ab zwei Siegen\", also die aggressivere Variante, und lässt die Niederlagenserie ganz offen (beide Quellen: symmetrisch zur Siegesserie).\n\nWelche Shop-Odds für Level 8 und 9? Esports Tales: 17/24/32/24/3 bzw. 15/18/25/30/12; MetaBot: 15/20/32/30/3 bzw. 10/17/25/33/15. Level 1–7, 10 und 11 sind zwischen beiden identisch.\n\nWas kostet ein Augment-Reroll? In keiner Quelle beziffert gefunden; belegt ist nur, dass seit Set 9 jedes der drei Angebote einzeln getauscht wird — die 2 Gold auf der Karte konnte ich nicht bestätigen.\n\nNeun Stages laut Karte, aber alle Quellen beschreiben 7 Stages × 7 Runden und danach Fortsetzung bis nur einer lebt — soll die Simulation hart bei 9 abbrechen?\n\nWie liefert das abstrakte Stärke-Modell die Zahl überlebender Gegnerchampions, die die Schadensformel braucht?\n\nWie erreicht man Level 11? Die Odds-Tabellen führen die Zeile, keine Quelle erklärt den Zugang; Höchststufe steht überall als 10.\n\nDürfen Bank-Champions Items tragen? Ein Guide sagt nein (passt zur Karte), eine offizielle Bestätigung habe ich nicht gefunden.\n\n## Quellen\n\n- https://www.esportstales.com/teamfight-tactics/champion-pool-size-and-draw-chances — Poolgrößen 30/25/18/10/9 und Shop-Odds Set 17 (Stand 16.04.2026)\n- https://metabot.gg/en/TFT/rolldown-odds — abweichende Shop-Odds Level 8/9, Stand 30.07.2026\n- https://wiki.leagueoflegends.com/en-us/TFT:Champion — Sternskalierung, Verkaufserstattung, 5 Shop-Slots, Reroll 2 Gold, Verschmelzungspriorität\n- https://tft-lab.com/en/handbook/xp — XP-Tabelle Set 17, Patch 17.7\n- https://tft-lab.com/en/handbook/gold — Einkommensrampe, Zinsstufen, Streak-Tabelle (Variante 2–4 = +1)\n- https://wiki.leagueoflegends.com/en-us/TFT:Gold — Streak-Tabelle (Variante 3–4 = +1), Zinsregel, PvP-Siegbonus\n- https://tft.ninja/guides/game-mechanics/player-damage-calculation — 100 Start-HP, Stage-Basisschaden, 1 Schaden je Überlebendem\n- https://tft-lab.com/en/handbook/rounds — Rundenraster, Augment-Runden 2-1/3-2/4-2, Carousel X-4\n- https://tft.ninja/guides/game-mechanics/stages — Rundenmuster X-1…X-7, PvE-Beute, Carousel mit Item\n- https://wiki.leagueoflegends.com/en-us/TFT:Augment — Augment-Runden, drei Angebote, Stufen Silber/Gold/Prismatisch\n- https://wiki.leagueoflegends.com/en-us/TFT:Item — 8 Komponenten, 3 Items je Champion, Radiant/Artefakt/Support/Emblem\n- https://wiki.leagueoflegends.com/en-us/TFT:Carousel — Carousel als geteilter Draft\n- https://mobalytics.gg/blog/tft/tft-guide-how-to-choose-tft-carousel/ — 9 Champions, Auswahlreihenfolge nach HP\n- https://www.dexerto.com/league-of-legends/tft-devs-outline-major-changes-to-loss-streaks-and-draws-coming-in-patch-14-1-2456985/ — Unentschieden: beide nehmen Schaden, Serien auf 0\n- https://giantslayer.tv/blogs/1349256428/explaining-tfts-hidden-systems-and-how-to-use-them-to-your-advantage/ — Matchmaking-Sperrfristen und Geister-Board (Community)" + } + ] + } +] diff --git a/daten/TftSimulator/.verzeichnis b/daten/TftSimulator/.verzeichnis new file mode 100644 index 0000000..8ae432b --- /dev/null +++ b/daten/TftSimulator/.verzeichnis @@ -0,0 +1 @@ +/home/arbeit/projects/tft diff --git a/daten/chatui.png b/daten/chatui.png new file mode 100644 index 0000000..89b3c65 Binary files /dev/null and b/daten/chatui.png differ diff --git a/daten/k1-1024.png b/daten/k1-1024.png new file mode 100644 index 0000000..4290840 Binary files /dev/null and b/daten/k1-1024.png differ diff --git a/daten/k1-1280.png b/daten/k1-1280.png new file mode 100644 index 0000000..8c9cd1d Binary files /dev/null and b/daten/k1-1280.png differ diff --git a/daten/k1-1600.png b/daten/k1-1600.png new file mode 100644 index 0000000..930f4ba Binary files /dev/null and b/daten/k1-1600.png differ diff --git a/daten/k1-390.png b/daten/k1-390.png new file mode 100644 index 0000000..4a8ab86 Binary files /dev/null and b/daten/k1-390.png differ diff --git a/daten/k1-640.png b/daten/k1-640.png new file mode 100644 index 0000000..6101774 Binary files /dev/null and b/daten/k1-640.png differ diff --git a/daten/k1-820.png b/daten/k1-820.png new file mode 100644 index 0000000..4716023 Binary files /dev/null and b/daten/k1-820.png differ diff --git a/daten/komfort.png b/daten/komfort.png new file mode 100644 index 0000000..8b8ae9f Binary files /dev/null and b/daten/komfort.png differ diff --git a/daten/offen.png b/daten/offen.png new file mode 100644 index 0000000..b1de0ed Binary files /dev/null and b/daten/offen.png differ diff --git a/frontend/chatui.png b/frontend/chatui.png new file mode 100644 index 0000000..bc2d6ac Binary files /dev/null and b/frontend/chatui.png differ diff --git a/frontend/k1-1024.png b/frontend/k1-1024.png index 4290840..0b64d1c 100644 Binary files a/frontend/k1-1024.png and b/frontend/k1-1024.png differ diff --git a/frontend/k1-1280.png b/frontend/k1-1280.png index 8c9cd1d..615c50e 100644 Binary files a/frontend/k1-1280.png and b/frontend/k1-1280.png differ diff --git a/frontend/k1-1600.png b/frontend/k1-1600.png index 930f4ba..58b7464 100644 Binary files a/frontend/k1-1600.png and b/frontend/k1-1600.png differ diff --git a/frontend/k1-390.png b/frontend/k1-390.png index 4a8ab86..e9fd876 100644 Binary files a/frontend/k1-390.png and b/frontend/k1-390.png differ diff --git a/frontend/k1-640.png b/frontend/k1-640.png index 6101774..fa45091 100644 Binary files a/frontend/k1-640.png and b/frontend/k1-640.png differ diff --git a/frontend/k1-820.png b/frontend/k1-820.png index 4716023..61677dd 100644 Binary files a/frontend/k1-820.png and b/frontend/k1-820.png differ diff --git a/frontend/komfort.png b/frontend/komfort.png index 8b8ae9f..f514164 100644 Binary files a/frontend/komfort.png and b/frontend/komfort.png differ diff --git a/frontend/offen.png b/frontend/offen.png index b1de0ed..e1963aa 100644 Binary files a/frontend/offen.png and b/frontend/offen.png differ diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 92d5a13..852f661 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,16 +1,19 @@