# Changelog Alle nennenswerten Aenderungen an dieser Wissensdatenbank werden hier dokumentiert. Format orientiert sich an [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), Versionierung nach [Semantic Versioning](https://semver.org/lang/de/) (`MAJOR.MINOR.PATCH`): - **MAJOR** – inkompatible Aenderung an Datenmodell/Output-Struktur oder Pipeline-Verhalten. - **MINOR** – neue Funktion/Strategie/Quelle, abwaertskompatibel. - **PATCH** – Bugfix, Doku, kleine Korrektur. Die aktuelle Version steht in der Datei `VERSION` und wird auf der GitLab-Pages-Seite („Changelog") angezeigt. ## [Unreleased] ## [2.3.0] - 2026-06-30 ### Added - **FAQ-Chunking: ein Chunk je Frage/Antwort.** Die pathOS-FAQ-Seite wird jetzt pro Q&A in einen eigenen Chunk zerlegt (`chunk: faq`, `chunk_min_chars: 0` -> auch kurze Q&A bleiben eigenstaendig), statt mehrere Q&A in einen gierigen Chunk zu packen. Externe Systeme bekommen damit jede Frage als einzeln abrufbaren Chunk (~90 Chunks). - **TAF/TAP-TSI Fachliche Dokumentation** als Quelle (Confluence-Tree, scope intern) unter dem Tool pathOS. - **Mehrere Chunk-Konfigurationen pro Ablage-Ort.** `collect_locations` sammelt jetzt je Ort eine Liste von Konfigurationen; `chunk_location` waehlt pro Dokument die erste passende (`_match_opts`). Neuer Filter **`chunk_component`** (analog `chunk_kind`): so chunken am selben Ort `intern/pathos` die **Anhang-PDFs** weiter via `chunk_kind: attachment` (headings) UND die **FAQ-Seite** via `chunk_component: faq`, ohne sich zu ueberschreiben. Bestehende Chunks ohne `chunk_component` behalten ihren Fingerprint (kein Re-Chunk-Churn). ## [2.2.0] - 2026-06-30 ### Added - **PDF-Discovery ueber die Sitemap (Strategie `pdf`).** Eine `pdf`-Quelle kann statt einer festen `.pdf`-URL eine Sitemap + Regex bekommen (`sitemap_url` + `url_pattern`). Der Connector liest die (gz-)Sitemap, filtert die passenden PDF-URLs und waehlt die neueste Version (hoechste `resource/blob/`). So kommt z.B. immer die aktuelle Handbuch-Version automatisch rein, ohne die Config bei jeder Neuveroeffentlichung anzupassen. `max_pdfs` begrenzt die Anzahl. - **pathOS-Handbuch (Webportal) als Quelle** (scope intern+extern): ueber die Sitemap mit Pattern `Handbuch-pathOS-Webportal` -> aktuell Version 1.01 (Stand 13.03.2026). ## [2.1.0] - 2026-06-29 ### Fixed - **FAQ-Extraktion (`confluence_faq`) ordnet Spalten jetzt ueber die Kopfzeile zu.** Bisher wurde Spalte 0 als Frage und ALLE weiteren Spalten zusammengeklatscht als Antwort genommen - dadurch landeten Ansprechpartner/Cluster/Thema im Antworttext und die Kopfzeile als Pseudo-FAQ. Neu: benannte Spalten (Frage, Antwort, optional Ansprechpartner/Cluster/Thema) werden korrekt erkannt, die Kopfzeile uebersprungen, Metadaten separat unter der Antwort gefuehrt und Listen/Zeilenumbrueche erhalten - so passen Ueberschrift (`### Frage`) und Inhalt je Block sauber zusammen (auch fuer das FAQ-Chunking). Faellt ohne benannte Kopfzeile auf Spalte0=Frage/Rest=Antwort zurueck. ### Added - **`exclude_pages` (Option fuer confluence_tree/page)**: einzelne Seiten-IDs aus einem Tree ausschliessen, damit sie gezielt anders aufbereitet werden koennen (z.B. als `confluence_faq` statt als generische Seite). - **Komponenten-bewusstes inkrementelles Skip**: eine `confluence_faq`-Quelle ueberspringt eine Seite nur dann, wenn bereits ein FAQ-Dokument existiert - nicht, wenn lediglich eine Seiten-Version (aus einem Tree) vorliegt. Zusammen mit `exclude_pages` wird die pathOS-FAQ (Seite 355496791) damit als Q/A aufbereitet statt als rohe Tabelle. ## [2.0.1] - 2026-06-29 ### Fixed - **`_index.json` zaehlte Chunks von gechunkten Anhang-PDFs nicht** (`chunk_kind: attachment`, z.B. pathOS): `build_index` fuehrte die Chunk-Erkennung nur fuer Voll-Dokumente aus. Anhang-Eintraege bekamen keinen `chunks`-Block und `chunks_total` war zu niedrig (Undercount). Jetzt erhalten auch gechunkte Anhaenge ihren `chunks`-Block und zaehlen in `chunks_total` sowie `by_domain[...].chunks` mit. Wirkung auf den echten Bestand: `chunks_total` 2410 -> 2604 (+194 pathOS-Anhang-Chunks). Regressionstest ergaenzt. ### Changed - TODO.md: ETL-Sichtung nach v2.0.0-Merge als offenen Punkt ergaenzt (Dateigroesse, Lauf-Check nach output/staging-Umstellung). ## [2.0.0] - 2026-06-29 ### Changed (BREAKING - Output-Struktur) - **Saubere Trennung in zwei Top-Level-Ordner.** Der bisher mit Konsumenten- und internen Artefakten gemischte `data/`-Ordner ist aufgeteilt: - **`output/`** = Konsumenten-Feed. Eine Regel: „lies aus `output/`, ignoriere alles andere". Enthaelt `processed//...` (Markdown-Feed), `chunks//...` (Chunks), `_index.json` (Katalog), `_meta.json` (Status), `run_log.jsonl` (Lauf-Historie). - **`staging/`** = intern, NICHT fuer Konsumenten. Enthaelt `pending//...` (wartet auf manuelle Sichtung) und `review_report.json` (Audit-Log letzter Lauf). - **CLI**: `--data` zeigt jetzt auf den Output-Pfad (Default `output`); neuer `--staging`-Parameter (Default `staging`). `src.main`, `src.chunk` und `src.site` unterstuetzen beide. - **`ReviewGate(output_dir, staging_dir)`**: zwei Pfade. Test-Convenience-Form `ReviewGate(base)` (ein Pfad) leitet `staging_dir = base/staging` ab. - **`.gitlab-ci.yml`**: alle Pfade angepasst; `knowledge-etl`-Artefakt enthaelt nur noch `output/processed/`. Bot pusht `output/`, `staging/` und `docs/`. - **Pfade im `_index.json`** sind weiterhin relativ zum Output-Root (`processed/...`, `chunks/...`); Anschliesser lesen sie als `output/`. - **PDF-Connector**: `keep_raw` Default `True` -> `False`. Aktiviert man es per Quelle, landet das Roh-PDF in `staging/raw//` (intern). Wegen `incremental: true` werden Roh-PDFs ohnehin nur einmal geladen, nicht pro Lauf. - **Cleanup**: 78 Roh-PDFs (~35 MB) aus dem Repo entfernt (INB, KOMBau, pathOS), explizite `keep_raw`-Zeilen aus `config/general.yaml` entfernt (Default greift). ### Changed (CI-Artefakte schlanker) - `knowledge-etl`-Artefakt: `expire_in` von 30 auf 7 Tage verkuerzt - der Bot pusht eh nach `main`, das Artefakt ist nur Fallback ohne `GIT_PUSH_TOKEN`. - `pages`-Artefakt: `expire_in: 7 days` ergaenzt (vorher unbegrenzt). Pages nutzt nur das neueste; alte hingen unnoetig herum. - **Erwartete Wirkung**: kumulativer Job-Artifact-Storage ~70-80% weniger. ### Fixed - **Roh-PDFs landeten im Konsumenten-Feed statt intern**: `set_data_dir` setzte das PDF-`raw_dir` aus dem Output-Pfad ab (`output/raw`) und ueberschrieb so den korrekten Default `staging/raw`. Bei `keep_raw: true` waeren Roh-PDFs in `output/` gewandert. `set_data_dir(data_dir, staging_dir)` trennt jetzt sauber: Roh-PDFs nach `staging/raw`, die Feed-Wurzel (`output`) dient nur dem inkrementellen Auffinden bereits verarbeiteter Dokumente (eigenes `PdfConnector.data_dir`). - **Defekter „Datei im Repo"-Link auf der Pages-Seite**: Der Pfad bekam doppelt ein Prefix (`data/output/processed/...`), da `store` den Pfad bereits mit `output/` bzw. `staging/` liefert. Prefix entfernt -> Links zeigen wieder korrekt ins Repo. - **Pfad-Prefix bei verschachteltem Layout**: `staging/`-Pfade wurden im Report/Katalog korrekt erkannt, auch wenn `staging` unter `output` liegt (Test-Convenience-Form). Erkennung prueft jetzt `staging` zuerst. ### Migration fuer Anschliesser Aktuell gibt es keinen produktiven Anschliesser. Falls ein Repo-Clone alte `data/`-Pfade referenziert, einmalig auf `output/` umstellen. Frontmatter und Inhalte sind unveraendert. ## [1.5.1] - 2026-06-29 ### Fixed - **CI-Robustheit gegen transiente Mirror-Ausfaelle**: `PIP_RETRIES=10` und `PIP_DEFAULT_TIMEOUT=90` in `.gitlab-ci.yml` `variables:` ergaenzt (gilt fuer ALLE pip-Aufrufe). Hintergrund: am 2026-06-29 12:02 UTC scheiterte der ETL-Lauf an einem HTTP-504 vom Artifactory-PyPI-Mirror beim PyYAML-Download - pip brach nach dem Default-Retry-Budget ab. Mit den neuen Werten werden solche transienten Spikes abgefangen, ohne dass der ETL-Lauf scheitert. ## [1.5.0] - 2026-06-29 ### Added - **Confluence-Anhaenge: eingebundene PDFs werden geparst** (Option A): bei `confluence_page`/`confluence_tree` werden im Seitentext eingebundene PDF-Anhaenge (`view-file`/`viewpdf`-Makros) ueber den vorhandenen PDF-Parser zu Markdown verarbeitet und als **eigene Dokumente** im selben Feed-Ordner abgelegt (Frontmatter `kind: attachment`, `parent_url` -> Elternseite, `attachment_name` mit Dateiname; scope/domain/owner werden geerbt). Inkrementell ueber die Attachment-Version, Default an (pro Quelle via `options: { attachments: false }` abschaltbar). Damit kommt das bisher verlorene Anhang-Wissen rein (z.B. `nur` „Architekturskizze" + pathOS-Schnittstellen-Doku). - **Bilder Variante A** im Markdown-Konverter: statt Bilder komplett zu verwerfen, bleibt der **alt-Text/Dateiname** als `[Bild: ...]` erhalten - gibt dem RAG Kontext ohne Binaerdaten. Datei-Embeds ohne Parsing-Pfad als `[Anhang: ...]`-Marker. - **Katalog `_index.json`** mit `attachments`-Liste pro Seite + Aggregat `attachments_total`/`by_domain.attachments`; Dokumente tragen `kind` im Index. - **Feinsteuerung Chunking**: zwei neue Optionen in `config/chunking.yaml` (auch pro Quelle ueberschreibbar): - `chunk_min_doc_chars`: Dokumente unter dieser Zeichenzahl bleiben **ganz** (kleine FAQ-/How-to-Seiten muessen nicht zwingend gechunkt werden). - `chunk_kind`: chunkt nur Dokumente mit passendem `kind` (z.B. `attachment` -> nur Anhang-PDFs chunken, Seiten der gleichen Quelle bleiben unangetastet). Bei **pathOS** eingestellt: `chunk: headings`, `chunk_kind: attachment`, `chunk_min_doc_chars: 3000` an der Tool-Tree-Quelle - damit werden die grossen Anhang-PDFs (z.B. EVU-Schnittstellen-Doku, 2,8 MB) gechunkt, die Seiten + FAQs bleiben ganz. `_CHUNKER_VERSION` 3 -> 4 (Defaults im Fingerprint -> sauberer Rebuild betroffener Quellen beim ersten Lauf). ### Fixed - **Connector-Robustheit**: `UnboundLocalError` bei nicht-inkrementellen Confluence-Quellen behoben (`entry` wird jetzt vor dem Skip-Pfad initialisiert). - **chunk_kind wirkt jetzt End-to-End**: `_doc_from_md` traegt `kind`/`parent_url`/ `attachment_name` aus dem Frontmatter mit, sodass der `chunk_kind`-Filter im Offline-Pipeline-Pfad greift (vorher blieb `kind="document"` als Klassen-Default). - **Determinismus Anhaenge**: bei reinen Tag-/Owner-Aenderungen werden auch Anhang-Dateien re-getagged (vorher driftete deren Frontmatter); `last_updated="unknown"` als letzter Fallback, wenn weder `version.when` noch `version.number` geliefert werden. ### Changed - CI-Daten-Commit-Message: `chore(data): Wissensaktualisierung (automatischer Lauf)` (vorher „naechtliche Wissensaktualisierung" - der Job laeuft stuendlich, Mo-Fr 8-17). ## [1.4.0] - 2026-06-28 ### Added - **Dedup im Review-Gate**: Dieselbe Quelle-Seite (per `page_identity`, i.d.R. Confluence-Page-ID) erzeugt je `scope`/`domaene` nur noch **ein** Dokument im Feed - auch wenn mehrere Quellen sie liefern (z.B. ein breiter `confluence_tree` UND eine dedizierte `confluence_faq`-Quelle, oder mehrere ueberlappende Trees). Bei Konkurrenz gewinnt die **spezifischere Aufbereitung** (FAQ/Q-A schlaegt rohe Seite/Tabelle), sonst die zuerst verarbeitete Quelle. Verhindert die frueheren `-.md`-Duplikate. - **`store.prune_duplicate_files`**: raeumt Alt-Duplikate (`-.md`, sofern die Basisdatei dieselbe Seite referenziert) auf; laeuft am Ende jedes Voll-ETL-Laufs. ### Changed - **Einmalige Bereinigung**: 42 vorhandene Duplikate entfernt (v.a. `nur`: 3 ueberlappende `confluence_tree`-Quellen hatten „How to:"-Seiten mehrfach abgelegt; 95 -> 54 Dateien). Verschiedene Seiten mit zufaellig gleichem Titel (andere URL) bleiben erhalten. ## [1.3.1] - 2026-06-28 ### Fixed - **pathOS „FAQ PathOS Extern" wird wieder erfasst**: Die Quelle war als `confluence_faq` konfiguriert (extrahiert Q/A nur aus Tabellen), die Seite ist aber mit Ueberschriften (`h2`) + Absaetzen aufgebaut. Dadurch landete das komplette externe FAQ leer in `pending`. Strategie auf `confluence_page` umgestellt -> der volle Inhalt kommt in den Feed. (Die interne pathOS-FAQ ist eine echte Q/A-Tabelle und bleibt `confluence_faq`.) Bekannte Restluecke (TODO): in Confluence **angehaengte** PDFs/Diagramme werden noch nicht erfasst. ## [1.3.0] - 2026-06-28 ### Added - **Lauf-Log `output/run_log.jsonl`** (append-only Historie, 1 Zeile je ETL-Lauf): Zeitstempel, verarbeitete Dokumente, Status-Counts und **Fehler je Quelle** (z.B. fehlgeschlagene Confluence-Abrufe). Gekappt auf die letzten 500 Laeufe. So ist - auch historisch - sichtbar, ob ein Lauf sauber durchlief, ohne die fluechtigen GitLab-Job-Logs zu durchsuchen. `src/main.py` sammelt Fehler je Quelle und schreibt den Eintrag ueber `store.append_run_log`. Die **Uebersichtsseite** zeigt in der Fusszeile eine kompakte Health-Zeile („N Dok verarbeitet · M Quellen mit Fehler"), die Chatbot-Anschluss-Seite listet `run_log.jsonl` in den Manifest-Dateien. ### Changed - **Einfachere Erklaerung** auf Uebersicht, Hilfe-Seite und im README: „Was ist ETL?" in drei Schritten (Sammeln → Aufbereiten → Ablegen) und die klare Botschaft, dass dieses Repo die **Single Source of Truth** ist (hier wird das Wissen gesammelt). ## [1.2.0] - 2026-06-28 ### Added - **Bestands-Katalog `output/_index.json`**: dokument-genaues Manifest ueber den gesamten freigegebenen Bestand. Pro Voll-Dokument `domain`/`tool`/`scope`, `url`, `path`, `content_hash`, `last_updated` und - falls vorhanden - die zugehoerigen `chunks` (Anzahl + Pfad), dazu Aggregate `by_domain`/`by_scope`. So sieht ein Anschliesser auf einen Blick, was pro Domaene/Tool wo liegt und welche Dokumente zusaetzlich als Chunks vorliegen (z.B. INB = Voll-Dokument **und** Chunks). Deterministisch (kein Zeitstempel) -> aendert sich nur bei echten Bestandsaenderungen, kein Git-Churn. Wird am Ende jedes ETL-Laufs (`src.main`/`src.chunk`) erzeugt. Doku auf der Chatbot-Anschluss-Seite, in README und `architecture.md`. ### Fixed - **Robustheit ETL-Lauf**: ein einzelnes defektes Dokument bricht den Lauf nicht mehr ab (per-Dokument abgefangen); Chunking ist im ETL ebenfalls gekapselt (nicht kritisch). - **Ungueltiges Redaction-Regex** in `filter_rules.json` crasht nicht mehr, sondern wird mit Notiz uebersprungen. - **Deterministische Sitemap-Auswahl**: Tiebreaker nach URL bei gleicher Trailing-ID (verhindert zufaellige Reihenfolge/Git-Churn bei gesetztem `limit`). - **Chunk-Linking sauber**: `parent_hash` eines Chunks entspricht jetzt exakt dem `content_hash` des Voll-Dokuments; Chunk-Dateinamen behalten garantiert die `.md`-Endung. - **`chunk_overlap` jetzt wirksam**: war zuvor dokumentiert, aber ohne Effekt. Ab jetzt wird bei `chunk_overlap > 0` der Tail des Vorgaenger-Chunks vorangestellt (Default 0 -> INB unveraendert). `_is_off` matcht zudem nicht mehr versehentlich die Zahl 0. ## [1.1.0] - 2026-06-28 ### Added - **Chunking fuer grosse Dokumente (Default aus, zunaechst INB)**: Zusaetzlich zur Voll-Datei koennen Dokumente entlang der Markdown-Ueberschriften in **Chunks** zerlegt werden – ein abgeleitetes, jederzeit neu erzeugbares Artefakt unter `output/chunks////`. Das Voll-Dokument in `output/processed/` bleibt unangetastet (Parent-Document-Muster). Aktivierung pro Quelle ueber `options.chunk` (`off | headings | faq | recursive`); gemeinsame Defaults in `config/chunking.yaml`, pro Quelle ueberschreibbar. Jeder Chunk traegt im Frontmatter `kind: "chunk"`, `parent_url`, `parent_hash`, `section`, `ziffer` und einen kurzen **Contextual-Retrieval**-Vorspann (`> Kontext: > `, deterministisch, ohne Embedding/LLM). Lauf offline via `python -m src.chunk --data data`; laeuft zudem am Ende jedes ETL-Laufs (`src.main`) automatisch mit. **Inkrementell:** pro Dokument wird nur neu gechunkt, wenn sich der Inhalt (`parent_hash`) ODER die wirksamen Optionen/Strategie (`chunk_fingerprint`) geaendert haben; unveraenderte Dokumente werden uebersprungen (kein Git-Churn), deaktivierte Orte und verwaiste Chunks automatisch entfernt. Neu: `src/transformers/chunker.py`, `src/chunk.py`, `config/chunking.yaml`. INB 2026 + 2027 auf `chunk: headings` gestellt. Doku in Hilfe-Seite, README und `architecture.md`. Robustheit: ueberlange Bloecke ohne Absatztrenner (z.B. OCR-„picture text", grosse Tabellen) werden hart auf `chunk_max_tokens` begrenzt; eine `_CHUNKER_VERSION` im Fingerprint erzwingt bei Logik-Aenderungen einen sauberen Rebuild. - **Inkrementelles Re-Tagging**: Jedes Dokument bekommt im Frontmatter einen `meta_fingerprint` (Hash aus `tags`/`owners`/`contact`). Aendert sich eine dieser Metadaten in `tools.yaml`/`general.yaml`, gleicht der naechste ETL-Lauf die bereits vorhandenen Dateien der betroffenen Quelle **guenstig in-place** an (ohne erneuten Download/API-Call); inhaltlich geaenderte Seiten werden weiterhin neu geladen. - **Scope-Wechsel inkl. Aufraeumen**: Aenderst du den `scope` einer Quelle, wird die Seite an die neue Ablage (`output/processed//...`) geschrieben und die alte Ablage **automatisch entfernt** (domaenen-intern, kollisionssicher, erst nach erfolgreichem Schreiben). Domain-Umbenennungen erzeugen die neue Ablage; die alte Domain bleibt bewusst stehen (siehe README) und ist manuell zu entfernen. - **Globale Metadatei** `output/_meta.json` fuer nachgelagerte Systeme: `last_run` (Zeitpunkt des letzten ETL-Laufs), `last_change` (wann sich der Bestand zuletzt inhaltlich/metadatenseitig geaendert hat), `documents`, `by_scope` und eine `content_signature`. So weiss ein RAG-/Index-Consumer, ob/seit wann sich etwas getan hat. - Issue-/MR-Template: Hinweis, dass die **Domaene final** ist (steuert den Ablagepfad, spaetere Umbenennung vermeiden). - Uebersicht: dezente Fusszeile mit „Stand: (letzte Aenderung: ...)" aus `output/_meta.json`. - Neue Domaene **`web`**: oeffentliche Schienennetz-Seiten via Sitemap (Pattern `/web/schienennetz/`, ~230 Seiten). Erster Test: Median-Quality 90. - Wissensquellen-Seite: pro Quelle ein ✏️-Link (vorbefuelltes Issue zum Anpassen/Loeschen, inkl. Direkt-Edit-Link zur Config-Datei). - Hilfe-Seite: Abschnitt „Wissen entfernen / aktualisieren" (per MR oder Schedule). - Quality-Score in jeder Listenzeile der Uebersicht sichtbar (farbiges Badge: gruen >=70, orange >=40, rot darunter); im Detail-Modal die transparente Aufschluesselung (Laenge/Woerter/Ueberschriften/Listen/Tabellen). - Platzhalter-Tools fuer alle betreuten Anwendungen ohne Quellen (erscheinen auf der Wissensquellen-Seite als „noch keine Quellen"). - Hilfe-Seite: Transparenz „Filter-Regeln" (aus der Uebersicht hierher ausgelagert). - Chatbot-Anschluss-Seite: „Aktualitaet: letzter ETL-Lauf" + Schedule (aus der Uebersicht hierher ausgelagert). ### Changed - **Vereinfachung:** `pending` und `rejected` zu einem einzigen Status `pending` zusammengefuehrt. Es gibt kein separates „rejected" mehr – alles was nicht approved ist, ist pending (mit Grund + Scope klar sichtbar im Frontmatter, auf der Pages-Seite und im Detail-Modal). Filter-Chip „rejected" entfernt; Statistik-Karte vereinfacht. - Scope im Detail-Modal bei pending-Dokumenten prominent sichtbar (eigenes Badge neben dem pending-Badge). - Uebersichtsseite entschlackt: Zielbanner ohne ETL-/Link-Zeile; Filter-Regeln und ETL-Lauf-Box ausgelagert (s.o.). - Bindestrich-Vereinheitlichung auf den Pages: En-Dash (–) durch normalen `-` ersetzt. - Sitemap-Strategie: `limit` ist jetzt **optional** – fehlt es, werden ALLE Treffer des `url_pattern` geholt (Kundeninfo ohne Limit, vorher 5000). - Uebersicht: redundanter CTA-Block „Wissen fehlt?" entfernt (Button im Menu reicht). ## [1.0.0] - 2026-06-26 Erste produktive Version: die Pipeline laeuft im CI (Schedule), committet Wissen nach `main` und veroeffentlicht die GitLab-Pages-Seite. ### Added - ETL-Grundgeruest: Extract -> Transform -> Auto-Filter -> Freigabe (Merge Request) -> `output/processed//[/]`. - Strategien: `confluence_page`, `confluence_tree`, `confluence_faq`, `crawler`, `sitemap`, `pdf`, `gitlab_md`, `file`; automatische Strategie-Erkennung pro URL. - Inkrementelles Laden: Confluence (Versions-Check) und Sitemap/PDF (bekannte URLs). - PDF-Feintuning via `pymupdf4llm` (echte Markdown-Tabellen), z.B. INB 2026/2027. - Scope-Modell `intern | extern | allgemein | mixed` (+ Source-Scope `"intern,extern"`). - `owners` (intern Verantwortliche) und `contact` (herausgebbare Kontaktadresse, Default `einfachbahn@deutschebahn.com`) im Frontmatter. - Auto-Filter (Sicherheitsnetz): Blacklist, Redaction (pro Quelle abschaltbar), Mindestlaenge; `config/approvals.yaml` zum nachtraeglichen Freigeben. - GitLab Pages (DB-UX): Uebersicht mit Filter (Scope + Domaene) und Suche, Hilfe, Chatbot-Anschluss (inkl. Gesamtbild-Skizze), Wissensquellen-Transparenz. - Changelog-Seite + Versionsanzeige in der Navigation (aus `CHANGELOG.md`/`VERSION`). - Issue-/MR-Vorlagen (Strategie pro Link), CODEOWNERS, `docs/SETUP.md`, `scm-info.yaml`, Architektur-Steering mit Diagrammen. ### Changed - CI: PyPI-Mirror (`PIP_INDEX_URL`) statt eigenem Deps-Image; ETL-Job nutzt das volle `python:3.14`-Image (enthaelt git) und den DB-Web-Proxy fuer oeffentliche Quellen. - Lint im CI laeuft mit `ruff`. ### Fixed - Confluence-Quell-URL aufloesbar (`/spaces//pages//` statt `/pages/`). - Pages-JS-SyntaxError (Zeilenumbrueche im erzeugten JavaScript) behoben.