Merge commit 'cfaf67010017eab368216aded483a64126dbcb2e' as 'bahn/wissensdatenbank'
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
# TODO / Roadmap
|
||||
|
||||
## Leitprinzipien (immer beachten)
|
||||
|
||||
- **Qualitaet vor Menge.** Lieber weniger, dafuer sauberes/freigegebenes Wissen.
|
||||
- **Einfach konfigurierbar.** Neues Wissen ueber `config/tools.yaml` /
|
||||
`config/general.yaml` ergaenzbar (Domaene/Tool + Link + Strategie + Scope),
|
||||
ohne Code zu aendern.
|
||||
- **Transparenz.** Jederzeit sichtbar, welches Wissen wo liegt und mit welchen Tags
|
||||
(GitLab Pages: Uebersicht + Wissensquellen, Frontmatter).
|
||||
|
||||
|
||||
|
||||
## Offen (Code/Inhalt)
|
||||
|
||||
### Bugs / beobachten
|
||||
- [x] **Confluence-Abruf schlug im CI fehl** (gefunden 2026-06-28 im ETL-Log): alle
|
||||
`confluence_*`-Quellen brachen mit `No scheme supplied` ab (CI-Variable `CONFLUENCE_URL`
|
||||
ohne `https://`) -> pathos/nur/mateo/infraportal/rechnungsbahnhof wurden nicht
|
||||
aktualisiert. **URL inzwischen korrigiert** - der naechste ETL-Lauf muss bestaetigen,
|
||||
dass es wieder laedt (jetzt in `output/run_log.jsonl` als `sources_failed: 0` sichtbar).
|
||||
- [ ] **ETL-Sichtung insb. wegen Dateigroesse** (naechster Check: 2026-06-30): nach dem
|
||||
Merge von `chore/data-to-output` (v2.0.0) pruefen, ob der naechste ETL-Lauf sauber
|
||||
durchlaeuft (output/staging-Trennung in CI korrekt? `run_log.jsonl` Fehler-frei?).
|
||||
Ausserdem Repo-Groesse im Auge behalten – gerade die INB-Chunks erzeugen viele
|
||||
Dateien. Ggf. alte Chunk-Generationen (`output/chunks/`) per Shallow-Clone oder
|
||||
LFS-Strategie entschaerfen, falls das Repo >500 MB waechst.
|
||||
|
||||
### Monitoring / Logging
|
||||
- [ ] **ETL-Laeufe regelmaessig pruefen** - jetzt einfach ueber `output/run_log.jsonl`
|
||||
(letzte Laeufe inkl. Fehler je Quelle) bzw. die Health-Zeile in der Pages-Fusszeile.
|
||||
- [x] **Lauf-Log umgesetzt** (`output/run_log.jsonl`, append-only, gekappt auf 500):
|
||||
Zeit, verarbeitete Dokumente, Status-Counts, Fehler je Quelle; Health-Zeile auf der
|
||||
Uebersicht; Manifest-Eintrag auf der Chatbot-Seite. (v1.3.0)
|
||||
|
||||
### Inhalt / Datenqualitaet
|
||||
- [x] **Dedup ueberlappender Quellen** (v1.4.0): gleiche Seite je scope/domaene nur ein
|
||||
Dokument (Gate-Dedup per `page_identity`, spezifischere Aufbereitung gewinnt) +
|
||||
`prune_duplicate_files`. Einmalig 42 Alt-Duplikate entfernt (v.a. `nur`).
|
||||
- [x] **pathOS „FAQ PathOS Extern" wieder erfasst** (v1.3.1): Seite ist h2/Absatz-basiert,
|
||||
nicht als Q/A-Tabelle -> Strategie von `confluence_faq` auf `confluence_page` umgestellt.
|
||||
Vorher landete das komplette externe FAQ leer in pending.
|
||||
- [x] **Confluence-Anhaenge (eingebundene PDFs) werden erfasst** (v1.5.0): bei
|
||||
`confluence_page`/`confluence_tree` werden `view-file`/`viewpdf`-Anhaenge ueber den
|
||||
PDF-Parser zu Markdown und als eigene Dokumente (`kind: attachment`, `parent_url` ->
|
||||
Seite) abgelegt. Inkrementell. Default an, per `options: { attachments: false }`
|
||||
abschaltbar. Bilder: alt-Text bleibt als `[Bild: ...]` erhalten (Variante A).
|
||||
Offen/optional: drawio-Diagramme (Text aus XML extrahieren) - aktuell nicht erfasst.
|
||||
- [x] **INB-Sectioning / Chunking** umgesetzt (v1.1.0/1.2.0): heading-basiert,
|
||||
deterministisch, inkrementell, `output/chunks/`, Katalog `output/_index.json`. Default aus,
|
||||
aktiv fuer INB. Spaeter ggf. weitere grosse Dokumente (Regelwerk).
|
||||
|
||||
### Ideen (Konzept steht, Entscheidung offen)
|
||||
- [ ] **#1 Nachtraegliches Taggen.** Regelbasiert: `config/tag_rules.yaml`
|
||||
(match: domain/url/titel/keyword -> add_tags) + Befehl `python -m src.retag`, der
|
||||
NUR die `tags:`-Zeile im Frontmatter neu schreibt (Body unveraendert -> content_hash
|
||||
stabil, kein Netz, idempotent), committet. Optional spaeter LLM/Keyword-Vorschlaege,
|
||||
die in die Regeln einfliessen. Auf Pages ggf. Tag-Filter/Tag-Wolke. Gut v.a. fuer
|
||||
allgemeines Wissen (Kundeninfos). Aufwand: mittel.
|
||||
- [ ] **#5 Intern/extern aus EINER Confluence-Seite trennen.** Regel: extern ⊆ intern
|
||||
(nur EINE Richtung). Marker fuer interne Abschnitte (Konvention zu entscheiden:
|
||||
Panel/Info-Makro vs. Textmarker `[[intern]]..[[/intern]]` vs. Ueberschrift „Nur intern").
|
||||
Quelle `scope: "intern,extern"`: intern = ganze Seite; extern = interne Bloecke
|
||||
entfernt (zu kurz -> nur intern). Sicherheitsnetz: content_filter prueft extern weiter.
|
||||
Erkennung im `md_converter` + Tests + Redakteurs-Doku. Aufwand: mittel-hoch, Leak-Risiko
|
||||
bei vergessenem Marker -> „im Zweifel raus".
|
||||
|
||||
### Bedienbarkeit
|
||||
- [ ] Helfer `scripts/add_tool.py` (interaktiv: Domaene + Link + Strategie + Scope,
|
||||
inkl. yaml-Validierung) als Zwischenschritt zur Web-App.
|
||||
- [ ] **Web-App (Option C, mittelfristig):** Flask auf DBCS, Formular ->
|
||||
GitLab-API legt MR an, mit Live-Vorschau. Pages verlinkt darauf. (Skill
|
||||
`dbcs-python-webapp`.)
|
||||
- [ ] **Issue->MR-Bot verdrahten:** Webhook-Service ODER scheduled `glab`-Job, der
|
||||
`scripts/issue_to_source.py` ausfuehrt und automatisch einen MR samt Vorschau anlegt.
|
||||
(Bausteine `scripts/issue_to_source.py` + `scripts/issue_to_mr.sh` sind da.)
|
||||
|
||||
### Quality Gates
|
||||
- [ ] **`min_quality`-Schwelle** in `filter_rules.json`: `content_filter` setzt Docs
|
||||
unter der Schwelle auf `pending` („niedrige Qualitaet"). Erst Verteilung sichten,
|
||||
dann aktiv schalten. (Score + Aufschluesselung sind jetzt auf den Pages sichtbar.)
|
||||
- [ ] **gitleaks-Baseline** (`.gitleaks.toml`) fuer False Positives in `data/`, dann
|
||||
`secret-scan` scharf schalten (aktuell `allow_failure: true`).
|
||||
|
||||
### Vereinfachungen
|
||||
- [x] **Strategie `kundeninfo` entfernt** (war redundant zu `crawler`/`sitemap`); inkl.
|
||||
`ComponentType.KUNDENINFO` + `ComponentType.DEEPLINK` (beide ungenutzt).
|
||||
- [x] **`docs/catalog.md` (src/catalog.py) abgeschafft** – Seite „Wissensquellen"
|
||||
(config.html) ersetzt es.
|
||||
- [x] **`docs/review_queue.md` (src/review_queue.py) abgeschafft** – Pages-Uebersicht
|
||||
zeigt pending/rejected inkl. Grund + Aktionslinks.
|
||||
- `--only` bleibt (vom MR-`preview`-Job genutzt).
|
||||
|
||||
### Betrieb / Skalierung
|
||||
- [ ] **CI-Timeout** fuer `knowledge-etl` im Auge behalten (inkrementell unkritisch,
|
||||
ein Timeout wird vom naechsten Lauf nachgeholt).
|
||||
- Hinweis: Korpus bleibt bewusst in Git (kein externer Speicher) – Repo = Single
|
||||
Source of Truth.
|
||||
|
||||
---
|
||||
|
||||
## Out of scope (vorerst, bewusst zurueckgestellt)
|
||||
|
||||
- Mehr externes Wissen pro Tool (eigene kund:innenfaehige Confluence-Seite).
|
||||
- Owners-Backfill fuer alte kundeninfo-/INB-Dokumente (bleiben ohne Owner).
|
||||
|
||||
---
|
||||
|
||||
## Erledigt (Kern)
|
||||
|
||||
- [x] ETL-Grundgeruest: Extract (Confluence/Web/Sitemap/PDF/GitLab/File) -> Transform
|
||||
(md_converter, tagger, content_filter) -> Review-Gate (approved/pending).
|
||||
- [x] Strategien: confluence_page/tree/faq, crawler, sitemap, pdf, **gitlab_md**, **file**.
|
||||
- [x] Strategie-Erkennung pro URL (`src/strategy_detect.py`), unbekannte URLs flaggen.
|
||||
- [x] Scope-Modell: tool-weit `intern|extern|allgemein|mixed`, source `intern,extern`
|
||||
(ganze Seite fuer beide). Pro-Seite-Trennlogik bewusst entfernt.
|
||||
- [x] Output `output/processed/<scope>/<domaene>[/<tool>]` IST der Vektor-DB-Feed
|
||||
(kein separater ingest-Export).
|
||||
- [x] Gate 2: Allowlist `config/approvals.yaml` (URL/Hash) im content_filter;
|
||||
`review_notes` erklaeren WARUM pending.
|
||||
- [x] Quality-Score (0-100) pro Dokument (`src/quality.py`), auf Pages + Hilfe erklaert.
|
||||
- [x] **INB-Feintuning**: `pymupdf4llm`-Parser (`parser: pymupdf`) -> echte
|
||||
Markdown-Tabellen; INB 2026/2027 + Regelwerk; PDF-Connector inkrementell (`max_pdfs`,
|
||||
`keep_raw`, `redact`-Option).
|
||||
- [x] **Confluence inkrementell** (`options: { incremental: true }`): Versions-Check
|
||||
pro Seite, unveraenderte Seiten werden uebersprungen (`source_version` im Frontmatter).
|
||||
- [x] GitLab Pages (DB-UX): Logo, Footer (Sebastian Reinig · V.IWF 91 · #Einfachbahn),
|
||||
Filter (extern/intern/allgemein/pending), Suche, Quality-Score sichtbar,
|
||||
Modal mit Inhalt/Quality-Aufschluesselung/Aktionslinks.
|
||||
- [x] **Smoke-Test** fuer `src.site.build()` (erzeugt index/hilfe/chatbot/config/changelog + json).
|
||||
- [x] **Hilfe-Seite** (`hilfe.html`): Strategien-Tabelle, Ablauf, pending/rejected-Gruende.
|
||||
- [x] **Chatbot-Anschluss-Seite** (`chatbot.html`): welche Pfade pro Bot-Typ, wie
|
||||
Frontmatter zu interpretieren ist, Pruefhinweis, RAG-Ablauf.
|
||||
- [x] CI: **PyPI-Mirror** (`PIP_INDEX_URL`) statt Deps-Image; test/etl/pages ohne
|
||||
Custom-Image. Test-Fix `python -m pytest`. renovate.
|
||||
- [x] CI: stuendlicher Daten-Commit (Mo-Fr 8-17) loest `pages`-Refresh aus (kein `ci.skip` mehr),
|
||||
damit die Live-Seite nach dem Schedule aktuell ist.
|
||||
- [x] Owners (1-2 Ansprechpartner) pro Tool/Quelle -> Frontmatter/Katalog/Pages.
|
||||
- [x] Issue-/MR-Templates, CODEOWNERS, `docs/SETUP.md`, scm-info.yaml,
|
||||
Architektur-Steering mit Diagrammen.
|
||||
- [x] Pages: einheitliches Sticky-Menu auf allen Seiten (Logo + Uebersicht/
|
||||
Wissensquellen/Chatbot/Hilfe + CTA), Zaehler (Dokumente, Quellen); Ziel prominent;
|
||||
Strategien gruppiert/vereinfacht; Konfig-Transparenzseite (config.html).
|
||||
- [x] Pages: **Domaenen-Filter** auf der Uebersicht (Dropdown mit Anzahl je Domaene).
|
||||
- [x] CI: MR-Vorschau ueber GitLab-Pages parallel deployments (`pages.path_prefix`),
|
||||
Produktion auf Root.
|
||||
Reference in New Issue
Block a user