## REQUEST CHANGES ### Blocker 1. **Symlink-/Überschreibungsgrenze für Prototype-Output fehlt** **`scripts/health/health_dashboard_v5.py:50-54,74-82`** - `Path.resolve()` folgt einem vorhandenen Symlink und akzeptiert dessen Ziel, sofern es unter `/tmp` liegt. - Anschließend ersetzt `os.replace(temporary, output)` eine bereits vorhandene Zieldatei ohne Ablehnung. - Reproduzierter synthetischer Negativtest: Ein angeforderter Output-Symlink auf eine andere `/tmp`-Datei wurde zum Opferpfad aufgelöst und diese Datei tatsächlich überschrieben: - `resolved_to_victim=True` - `victim_overwritten=True` - `alias_still_symlink=True` - Erforderlich: privates, besitzgeprüftes `0700`-Arbeitsverzeichnis; keine Symlinks; Ziel muss nicht existieren; FD-/`dir_fd`-basierte Operationen mit `O_NOFOLLOW|O_EXCL`; Veröffentlichung ohne Replace eines bestehenden Ziels. Dazu adversarielle Symlink-, Existing-output- und Parent-swap-Tests. 2. **DB-Markerprüfung und tatsächlicher DB-Read sind TOCTOU-getrennt** **`scripts/health/health_dashboard_v5.py:30-47,65-70`** - Der synthetische Marker wird über eine read-only SQLite-Verbindung geprüft, diese wird geschlossen, danach öffnet `connect(db)` denselben Pfad erneut. - Zwischen Prüfung und Nutzung kann der `/tmp`-Pfad bzw. ein Parent-Verzeichnis ausgetauscht werden. Damit ist nicht garantiert, dass `build_bundle()` dieselbe geprüfte Datei liest. - Erforderlich: Markerprüfung und Bundle-Erzeugung über dieselbe offen gehaltene, read-only Verbindung bzw. denselben validierten Datei-Inode; zusätzlich private Root-, Ownership-, Regular-file- und No-follow-Grenzen sowie deterministischer Swap-Negativtest. ### Bestätigte Gates - ECharts exakt auf **6.1.0** gepinnt; `package-lock.json` enthält Integritäten für ECharts/ZRender/tslib. - Vendored Asset stimmt bytegleich mit `node_modules/echarts/dist/echarts.min.js` überein; SHA-256: `b66b25aeb4df84e33199dc21694014d336d222cbd9deb0e5a7c14bd6aa0d0fd0` - Lizenzdatei stimmt bytegleich mit dem npm-ECharts-`LICENSE` überein; Apache-2.0 und Subcomponent-Hinweise vorhanden. - `npm audit`: **0 Vulnerabilities**. - Lokale Asset-Allowlist vorhanden; Prototype-JS enthält keinen CDN/HTTP-, `fetch`, XHR, WebSocket, Beacon oder Browser-Storage-Zugriff. - CSP bleibt bei `connect-src 'none'`, ohne `unsafe-inline`/`unsafe-eval`. - CLI-Flag ist standardmäßig aus; Default-v5 lädt ECharts nicht. - Aktueller fokussierter Sprint-6A-Testlauf: **9 passed**. - `systemd-analyze verify`: erfolgreich. - `git diff --check`: erfolgreich. - Keine Secret-/Credential-Muster im Text-Diff und in sicheren untracked Textdateien gefunden. - Keine Änderungen unter `deploy/` oder am v4-Generator; `HEAD` entspricht `origin/main` (`0/0`), somit kein Sprint-6A-Commit oder Deployment erkennbar. - Keine Produktionsdaten, DBs, Reports oder Secrets geöffnet. Alle dynamischen Proben liefen ausschließlich in temporären synthetischen Verzeichnissen. **Dateien durch den Review erstellt/geändert:** keine.