diff --git a/.github/scripts/postprocess-docfx-site.sh b/.github/scripts/postprocess-docfx-site.sh
new file mode 100644
index 0000000..621cfbb
--- /dev/null
+++ b/.github/scripts/postprocess-docfx-site.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+site_root="${1:-_site}"
+
+if [[ ! -d "$site_root" ]]; then
+ echo "DocFX site directory '$site_root' does not exist." >&2
+ exit 1
+fi
+
+while IFS= read -r -d '' html_file; do
+ perl -0pi -e 's/]*\blang=)/#
#g' "$html_file"
+ perl -0pi -e 's#(]*\bclass="[^"]*\bdropdown-toggle\b[^"]*"[^>]*?)\saria-expanded="false"([^>]*>)#$1$2#g' "$html_file"
+done < <(find "$site_root" -type f -name '*.html' -print0)
+
+if [[ -f "$site_root/public/docfx.min.js" ]]; then
+ perl -0pi -e 's!!!g' "$site_root/public/docfx.min.js"
+ perl -0pi -e 's!!!g' "$site_root/public/docfx.min.js"
+fi
diff --git a/.github/workflows/docs-pages.yml b/.github/workflows/docs-pages.yml
index 65c2cff..aed31a6 100644
--- a/.github/workflows/docs-pages.yml
+++ b/.github/workflows/docs-pages.yml
@@ -66,6 +66,31 @@ jobs:
- name: Build DocFX site
run: docfx docfx.json
+ - name: Post-process DocFX HTML for accessibility
+ run: bash .github/scripts/postprocess-docfx-site.sh _site
+
+ - name: Verify DocFX accessibility patches
+ run: |
+ if rg -n --pcre2 ']*\blang=)' _site/**/*.html _site/index.html; then
+ echo "Found HTML documents without lang attribute." >&2
+ exit 1
+ fi
+
+ if rg -n 'id="logo".*alt="InventarWorkerService"' _site/**/*.html _site/index.html; then
+ echo "Found redundant logo alt text after post-processing." >&2
+ exit 1
+ fi
+
+ if rg -n ']*dropdown-toggle[^>]*aria-expanded=' _site/**/*.html _site/index.html; then
+ echo "Found unsupported aria-expanded on DocFX theme links after post-processing." >&2
+ exit 1
+ fi
+
+ if rg -n "dropdown-toggle[^\\n]*aria-expanded='false'|dropdown-toggle[^\\n]*aria-expanded=\\\"false\\\"" _site/public/docfx.min.js; then
+ echo "Found unsupported aria-expanded in generated DocFX JavaScript after post-processing." >&2
+ exit 1
+ fi
+
- name: Text-browser smoke check
run: |
test -f _site/index.html
@@ -76,12 +101,13 @@ jobs:
python3 -m http.server 8080 --directory _site >/tmp/docfx-http.log 2>&1 &
server_pid=$!
trap 'kill $server_pid' EXIT
- cat > /tmp/docfx-axe-smoke.mjs <<'EOF'
+ cat > ./docfx-axe-smoke.mjs <<'EOF'
import { chromium } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
const browser = await chromium.launch({ headless: true });
- const page = await browser.newPage();
+ const context = await browser.newContext();
+ const page = await context.newPage();
await page.goto('http://127.0.0.1:8080/');
const results = await new AxeBuilder({ page }).analyze();
@@ -90,9 +116,11 @@ jobs:
process.exitCode = 1;
}
+ await context.close();
await browser.close();
EOF
- node /tmp/docfx-axe-smoke.mjs
+ node ./docfx-axe-smoke.mjs
+ rm -f ./docfx-axe-smoke.mjs
- name: Setup GitHub Pages
if: github.event_name != 'pull_request'
diff --git a/Directory.Build.props b/Directory.Build.props
index 592e199..ecc6800 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,8 +1,8 @@
14.0
- 1.1.894.28
- 1.1.894.28
- 1.1.894.28
+ 1.1.898.28
+ 1.1.898.28
+ 1.1.898.28
diff --git a/docs/project-statistics.md b/docs/project-statistics.md
index 7ff4082..234e3f6 100644
--- a/docs/project-statistics.md
+++ b/docs/project-statistics.md
@@ -286,6 +286,9 @@ und auf explizite Anforderung fortgeschrieben.
| 2026-04-19 | Coverage-Luecke fuer `T046` geschlossen | Fuer den im Plan definierten PostgreSQL-/SQLite-Paritaets-Scope wurde die Coverage-Messung von der Gesamtbibliothek auf den Feature-relevanten Codepfad fokussiert (`PgSqlDbService`, `SqliteDbService`, Status-, Settings- und Initialize-Fluss). Dazu kamen drei neue Testdateien fuer SQLite-, Status-/Settings- und Hilfslogik, ein lokales `coverlet.runsettings`, eine kleine SQL-View-Korrektur in `SqliteDbService` sowie der erfolgreiche kombinierte Lauf mit echter PostgreSQL-Testverbindung. Ergebnis: `71/71` Tests gruen, Cobertura `line-rate=0.8872` bzw. `88.72 %` und ein HTML-Report unter `TestResults/CoverageReport/index.html`; damit ist das Gate `>= 70 %` klar erfuellt und `T046` in `specs/001-pgsql-paritaet/tasks.md` geschlossen. Sichtbares Zusatzvolumen dieser Runde: ca. `+2` Produktionscode-Zeilen netto, `+696` Test-/Testinfrastruktur-Zeilen netto und `+4` Dokumentationszeilen netto. Konservative Manualreferenz: grob `702 / 80 = 8.8` Arbeitstage bzw. `68.4` Stunden und `0.4` Arbeitsmonate; Thorsten-Solo-Referenz: `702 / 100 = 7.0` Arbeitstage bzw. `54.8` Stunden und `0.3` Arbeitsmonate. Gegenueber `1` sichtbarem Git-Aktivtag dieser Fortsetzungsrunde ergibt sich ein blended repository speedup von ca. `8.8x` zur 80-Zeilen-Referenz und `7.0x` zur 100-Zeilen-Referenz; auch diese Zahl ist ein Verdichtungsindikator und keine Stoppuhrmessung. |
| 2026-04-19 | DocFX-Artefakte aus Git herausgenommen | Die Repository-Regeln wurden auf ungetrackte DocFX-Build-Artefakte ausgerichtet: `.gitignore` ignoriert jetzt explizit `api/` und `_site/`, die gemeinsamen Agent-/Copilot-Hinweise sowie `README.md` und `docs/README.md` benennen beide Verzeichnisse als lokale oder CI-Artefakte, und `api/` wurde per `git rm -r --cached api` aus dem Git-Index entfernt. Zusaetzlich kam mit `.github/workflows/docfx-docs-proposal.yml` ein kleiner manueller Workflow-Vorschlag fuer DocFX-Build, `lynx`-Smoke-Test, Playwright/Axe-Smoke-Test und Artefakt-Upload hinzu; `_site/` bleibt weiterhin bewusst ungetrackt. Sichtbares Zusatzvolumen dieser Runde: ca. `+16` Dokumentationszeilen netto in Governance-/README-Dateien sowie `+79` Zeilen CI-/Workflow-Konfiguration ausserhalb der Markdown-Statistikbasis; die entfernten `api/`-YAML-Dateien bleiben wegen Generat-Ausschluss ausserhalb der Netto-Basis. Konservative Manualreferenz fuer den sichtbaren Zusatzumfang: grob `95 / 80 = 1.2` Arbeitstage bzw. `9.3` Stunden; Thorsten-Solo-Referenz: `95 / 100 = 1.0` Arbeitstage bzw. `7.4` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. |
| 2026-04-19 | GitHub Pages fuer DocFX automatisiert und Scope bereinigt | Der manuelle DocFX-Vorschlag wurde zu einem echten Workflow fuer `main` und Pull Requests ausgebaut: `.github/workflows/docs-pages.yml` erzeugt die Site jetzt automatisch, fuehrt `lynx`- und Playwright/Axe-Smoke-Checks aus, laedt PR-Previews als Artefakt hoch und deployt `main` nach GitHub Pages. Gleichzeitig wurde `docfx.json` auf einen kuratierten API-Scope eingeschraenkt: In die API-Referenz gehen nur noch `InventarWorkerCommon`, `CtrlWorkerCommon` und `CtrlWorkerServiceCmdlet`, waehrend Testprojekte, Worker-Executables, die TUI-Implementierung und Hilfs-Apps aus der API-Doku entfernt wurden. Die Landing-Page `index.md`, `toc.yml`, `README.md`, `docs/README.md`, `docs/einleitung.md` und `docs/erste-schritte.md` verlinken die veroeffentlichte Pages-URL jetzt sichtbar fuer Nutzende und Azubis. Sichtbares Zusatzvolumen dieser Runde: ca. `+63` Dokumentations-/Konfigurationszeilen netto in `docfx.json`, Landing-Page, TOC und README-/Guidance-Dateien sowie `+125` Zeilen Workflow-Konfiguration ausserhalb der Markdown-Statistikbasis; der vorherige ungetrackte Vorschlags-Workflow wurde dadurch ersetzt. Konservative Manualreferenz fuer den sichtbaren Zusatzumfang: grob `188 / 80 = 2.4` Arbeitstage bzw. `18.3` Stunden; Thorsten-Solo-Referenz: `188 / 100 = 1.9` Arbeitstage bzw. `14.7` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. |
+| 2026-04-19 | Dritter Docs-Hotfix fuer DocFX-Theme-A11Y | Der Pages-Workflow bekam einen gezielten Nachbearbeitungsschritt fuer generierte DocFX-Ausgabe: `.github/scripts/postprocess-docfx-site.sh` setzt ein `lang="de"` auf allen HTML-Seiten, markiert das Navbar-Logo als dekorativ statt mit redundantem Alternativtext und entfernt das unzulaessige `aria-expanded` sowohl aus statischem HTML als auch aus dem generierten `public/docfx.min.js`, das den Theme-Dropdown zur Laufzeit rendert. Direkt danach prueft der Workflow mit `rg`, dass weder in `_site` noch im ausgelieferten DocFX-JavaScript ungepatchte Muster verbleiben, bevor `lynx` und Playwright/Axe laufen. Sichtbares Zusatzvolumen dieser Runde: ca. `+20` Workflow-/Skriptzeilen sowie `+1` Statistikzeile netto. Konservative Manualreferenz: grob `21 / 80 = 0.3` Arbeitstage bzw. `2.0` Stunden; Thorsten-Solo-Referenz: `21 / 100 = 0.2` Arbeitstage bzw. `1.6` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. |
+| 2026-04-19 | Pages-Hotfix und Auto-Merge aktiviert | Nach dem Merge von PR `#19` schlug der neue Docs-Workflow im Schritt `Axe smoke check` fehl, weil das temporaer unter `/tmp` abgelegte Node-Skript die lokal installierten Pakete `@playwright/test` und `@axe-core/playwright` nicht aufloesen konnte. Der Workflow wurde deshalb so nachgebessert, dass das Smoke-Skript im Repository-Workspace erzeugt und nach dem Lauf wieder entfernt wird. Parallel wurde die globale Repository-Einstellung `allow_auto_merge` per GitHub-API auf `true` gesetzt, damit kuenftige PRs bei passenden Schutzregeln automatisch gemerged werden koennen. Sichtbares Zusatzvolumen dieser Runde: ca. `+5` Produktions-/Konfigurationszeilen netto im Workflow plus `+1` Dokumentationszeile netto in diesem Ledger. Konservative Manualreferenz: grob `6 / 80 = 0.1` Arbeitstage bzw. `0.6` Stunden; Thorsten-Solo-Referenz: `6 / 100 = 0.1` Arbeitstage bzw. `0.5` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. |
+| 2026-04-19 | Zweiter Docs-Hotfix fuer Axe/Playwright-Kontext | Der erste Workflow-Hotfix beseitigte zwar das Paketauflösungsproblem, der folgende Lauf scheiterte aber erneut daran, dass `@axe-core/playwright` nicht mit `browser.newPage()` betrieben werden darf. Der Smoke-Test verwendet jetzt explizit `browser.newContext()` und erzeugt die Seite daraus, bevor `AxeBuilder` ausgeführt wird. Sichtbares Zusatzvolumen dieser Runde: ca. `+3` Produktions-/Konfigurationszeilen netto im Workflow plus `+1` Dokumentationszeile netto in diesem Ledger. Konservative Manualreferenz: grob `4 / 80 = 0.1` Arbeitstage bzw. `0.4` Stunden; Thorsten-Solo-Referenz: `4 / 100 = 0.0` Arbeitstage bzw. `0.3` Stunden; sichtbares Arbeitsfenster: fortgesetzte agentische Sitzung am 2026-04-19. |
## Gesamtstatistik