git-subtree-dir: bahn/wissensdatenbank git-subtree-split: 07a8196e5f9e55d027f90485beb95f4006387669
147 lines
8.7 KiB
Markdown
147 lines
8.7 KiB
Markdown
# 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.
|