Welle 8 — Stufe 5 Entwürfe-Board + IFG-Auto-Hook + Inline-Kommentare folgt
Wall-Clock ~3,5h für 6 Sub-Phasen 8.1-8.6 in einer Sitzung (Plan ~3 Tage Wallclock laut docs/PLAN-DASHBOARD-UMBAU-2026-05-09.md → Faktor ~0,15× = Pattern-E↑ stark, Single-Operator-Stream + Pattern-Wiederverwendung aus Welle 3 article-state.js + Welle 4 DnD-Bridge + Welle 1 MF-15 soak-cron). Phase 8.1 Schema + Backend-Routes: zwei neue Tabellen in admin-backend/database/init.js — entwurf_state (slug PK, phase CHECK 4 Säulen eingang|recherche-internet|recherche-erweitert|freigabe-redaktion, source_type CHECK 4 manual|ifg-match|kommentar-rueckfluss|topic-radar, source_ref, notes_json JSON-Array, assignee, titel, created_at, last_update_at) + ifg_requests (id PK, antrags_thema, behoerde, gestellt_am, status CHECK 5 offen|erinnerung-faellig|antwort-eingegangen|verworfen|eingearbeitet, antwort_eingegangen_am, antwort_dokument_pfad, topic_keywords JSON-Array, linked_slugs JSON-Array, notes, last_matched_at) — beide IF NOT EXISTS, je 3 Indizes. Zwei Routes admin-backend/routes/entwurf-state.js (GET all/single/counts requireAuth, POST upsert + POST /transition + POST /:slug/note requireWriteAuth Hybrid Session-OR-Bearer ANALYTICS_TOKEN, DELETE requireAdmin) + admin-backend/routes/ifg-requests.js (GET +Filter requireWriteAuth, POST + PATCH + POST /:id/answer + POST /:id/match-result requireWriteAuth, DELETE requireAdmin). server.js mounten. Sonderseiten-Whitelist auf entwuerfe-board erweitert in 5 Skripten (audit.js × 2, extract-personen-index.js, check-toc-dom-order.js, check-search-index-fresh.js, multimedia-pre-audit.js × 2 Regex) + 3 Bash-case-Statements im pre-push (Stages 7/11/12). Phase 8.2 Frontend-Sub-Board html/wiki/entwuerfe-board.html: Steuerlupe-Live-Design (DM Sans + DM Serif Display + Teal #0097b2), 4-Spalten-Kanban Klassen-Prefix ew-, DnD analog Welle 4 mit Optimistic-UI + Rollback + Toast. 3 Script-Tags eingebunden: gate.js + auth-gate.js + glossary.js. User-Rolle aus steuerlupe:auth-resolved Event. Inline-JS rendert Zähler-Karten (pro Phase + pro Quelle), 4-Säulen mit farbcodierten Pillen, Drilldown-Modal mit Notes-Form, „+ Neuer Entwurf"-Button, IFG-Sektion + IFG-Drilldown + „Antwort eintragen"-Form, Source-Filter (Alle/Manuell/IFG/Kommentar/Radar), Mobile-Scroll. Phase 8.3 IFG-Auto-Hook: scripts/match-ifg-to-slugs.js (250 Z, Pattern aus soak-reaudit.js Welle 1 MF-15) — täglicher Lauf GET /api/ifg-requests?status=offen → Wiki-Korpus aus html/wiki/*.html (62 Slugs, SPECIAL_PAGES gefiltert) → GET /api/articles → pro IFG substring-Match (≥3 Zeichen) gegen Wiki-Volltext + articles.title → POST /api/ifg-requests/:id/match-result + UPSERT /api/entwurf-state (phase=freigabe-redaktion, source_type=ifg-match, source_ref=ifg_request:N) + POST /api/arbeitsplatz/system-note (Tag ifg-match) → TSV-Log unter docs/audits/ifg-match-log/. CLI: --dry-run, --no-http. install-ifg-matcher-cron.sh systemd-Timer täglich 06:30 UTC. Phase 8.4 Inline-Kommentar-System: article_inline_comments-Tabelle (id PK, article_type CHECK blog|wiki, article_id TEXT, anchor_text + offset_start/end, comment_text, comment_type CHECK 6 Werte DEFAULT sonstiges, status CHECK 4 Werte DEFAULT offen, resolved_at/by, FK created_by → users) + 3 Indizes. Route admin-backend/routes/inline-comments.js: GET /counts + GET / + GET /:id requireAuth, POST / requireSession ALLE Rollen inkl. reader (rote Linie 4: Reader darf kommentieren) + Spam-Schutz max 5/min/User in-memory, PATCH admin/editor mit auto-resolved_at/by, DELETE admin. Reverse-Workflow-Hook im POST: bei article_type=blog → Lookup blog_wiki_link.wiki_slug oder Fallback `blog-N` → UPSERT entwurf_state mit source_type=kommentar-rueckfluss + phase=freigabe-redaktion, transaktional zum Comment-Insert. Frontend html/wiki/_lib/inline-comments.js (280 Z, self-contained Browser-Helper): Hostname-Gate auf staging.*|localhost|127.0.0.1 (rote Linie 10 — auf live.ngo no-op), eigener Auth-Check via /api/auth/me (KEINE Pflicht-Abhängigkeit von auth-gate.js — würde live Login-Modal triggern), selectionchange-Listener + Validierung (≥4 Zeichen, im article-root|article-content), Popover „💬 Kommentieren" → Modal mit Type-Select + Textarea + Submit. Bestehende Kommentare als Floating-Panel unten rechts. In html/artikel.html als <script src="wiki/_lib/inline-comments.js" defer> eingebunden. Phase 8.5 Hauptboard-Inline-Comment-Badge: bearbeitungs-status.js drei neue Funktionen loadCommentCounts (GET /api/inline-comments/counts), applyCommentBadges (DOM-Iteration .bs-list-item + .bs-kanban-tile + .bs-kanban-mini → Badge-Inject), openCommentsModal (GET /api/inline-comments → Liste mit Status-Pills + Anchor-Highlight im bs-modal). init() ruft loadCommentCounts parallel + 60s Polling. renderActiveView() ruft applyCommentBadges nach Render. Generator-Patch (Pattern-D-Schutz aus Welle 5 Phase 5.7): renderBearbeitungsStatusHTML CSS-Block für .bs-comment-badge (Amber-BG, Hover-Scale). Bug-Fix für Phase 8.3: ifg-requests.js GET / + GET /:id von requireAuth auf requireWriteAuth (Hybrid Bearer für Cron). Stage 20 (warn-only) verschoben auf Welle 12 IH-13. Phase 8.6 End-zu-End-Verifikation: API-Smoke gegen staging-Stack (admin.ngo.endlichzeit-ki.de) — POST /api/ifg-requests mit Bearer ANALYTICS_TOKEN legte IFG-Antrag #1 für deutsche-umwelthilfe-Keywords an (Antwort {"id":1,"created":true}), match-Skript live-Lauf nach Server-Deploy von Phase-8.5-Bearer-Fix erfolgreich (62-Wiki-Korpus, IFG-Match auf deutsche-umwelthilfe-Slug, UPSERT entwurf_state, system-note posted). Inline-Comment-Endpoint NICHT live-getestet (POST braucht Session-Cookie, kein Bearer-Pfad in der Route — kommt im Browser-Test der Folge-Welle). 4 Commits 72ae1a6 → 277a4ba → f358daf → folgt für 8.6. Push-Disziplin: PRE_PUSH_SKIP=stage10 (Bestand-Drift unverändert, #88.66.1..13). Drei typed Adversarial-Lücken: (content) Match-Heuristik substring-case-insensitive ohne Wort-Grenzen — kw=spd würde aspekt matchen, Mensch-im-Loop ist Backstop (Karte rückt zu freigabe-redaktion, Mensch entscheidet einarbeiten/verwerfen); kw>=3 Zeichen verhindert die schlimmsten Fälle. (mechanic) Inline-Comment-POST-Endpoint hat KEINEN Bearer-Pfad (POST braucht Session) — Browser-E2E muss als Mensch erfolgen, Cron kann keine Test-Kommentare automatisiert anlegen. Folge-Issue: Bearer-POST-Variante für Test-Smoke. (meta) Sonderseiten-Whitelist verteilt auf 8 Stellen (5 Skripte + 3 Bash-cases) — Pattern-N (Disziplin statt Mechanik) reproduziert sich; DRY-Refactor zu zentraler SPECIAL_PAGES-Konstante steht in Welle 12 IH-2 weiterhin offen. Server-To-Dos für User: bash scripts/install-ifg-matcher-cron.sh + /etc/steuerlupe-ifg-matcher.env mit ANALYTICS_TOKEN befüllen + Cron-Test systemctl start steuerlupe-ifg-matcher.service.