press-releases: begrenzter Pruefkreislauf mit Admin-Queue (Roadmap 1d.4, E3)

Automatische Pruefung je Meldung hoechstens max_automatic_attempts (3);
das letzte Rot blockt statt abzulehnen: Meldung bleibt in review, Admin
sieht sie unter "Pruefung noetig" mit allen KI-Begruendungen und
entscheidet (Freischalten / Mit Kommentar zurueck). Danach ist die
Automatik fuer diese Meldung aus - jede Freigabe geht direkt zum Menschen.

Gelb: yellow_to_manual_queue wird jetzt ausgewertet (Vorgabe false).
Kundenseite: "Zur Pruefung freigeben" mit Erklaerung der drei Schritte,
Versuchszaehler an der Ablehnung, Hinweis auf menschliche Pruefung.

Blade: inline @php(...) vor einem @php...@endphp-Block wird als Rohblock
gelesen - vier Stellen auf Blockform umgestellt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-16 14:30:26 +00:00
parent c08c9e5de0
commit 0692d892e0
17 changed files with 487 additions and 47 deletions

View file

@ -144,12 +144,12 @@ Für selbst angelegte Firmendaten trägt der Nutzer die Verantwortung. Für die
| Nr. | Arbeitspaket | Aufwand | Abhängigkeit |
|---|---|---|---|
| 1d.1 | Hilfeseite ohne kommerziellen Anteil: was eine gute Pressemitteilung ausmacht, wie geprüft wird, was sich verbessern lässt, Abschnitt zu Pressebildern | S | keine |
| 1d.2 | Textbaustein in die Ablehnungsmail, Verlinkung auf 1d.1 | S | 1d.1 |
| ~~1d.1~~ | Hilfeseite ohne kommerziellen Anteil — **gebaut 16.09.2026**: `/{edition}/gute-pressemitteilung` (DE/EN), Anlass, Aufbau, Sprache, Prüfablauf, sieben Qualitätsdimensionen offen, Pressebilder; Sitemap + Hilfe-Center | S | keine |
| ~~1d.2~~ | Textbaustein in die Ablehnungsmail — **16.09.2026**: Link auf dem Portal der Meldung, Herkunft `mail_reject`, nichts Kommerzielles (E6) | S | 1d.1 |
| 1d.3 | Abmeldemöglichkeit für Benachrichtigungen, Status in der Suppression-Logik geführt | S | Bounce-Suppression live |
| 1d.4 | Prüfwerkzeug: eingefügter Text wird bewertet, Ausgabe als benannte Stufe mit konkreten Hebeln | M | 1d.1 |
| 1d.5 | Bewertung einer bestehenden Meldung über Magic Link | S | 1d.4, 1b.2 |
| 1d.6 | Partnerbereich am Seitenende, vorerst als "BALD" ohne Namen und Logos | S | 1d.1 |
| ~~1d.4~~ | Prüfwerkzeug — **E3 entschieden 16.09.2026: kein eigenständiges Werkzeug.** Prüfung nur beim Freigeben, Ergebnis am Entwurf; „Zur Prüfung freigeben" mit Erklärung, was danach passiert; automatische Prüfung je Meldung `max_automatic_attempts` (3), danach geblockt in die Admin-Queue („Prüfung nötig"), Freischalten oder Kommentar, Automatik für die Meldung ab dann aus | M | 1d.1 |
| ~~1d.5~~ | Bewertung einer bestehenden Meldung über Magic Link — **mit 1c.2 erledigt**: der Beansprucher sieht Ablehnungsgrund, KI-Stufe und Content-Score auf der Meldungsseite | S | 1d.4, 1b.2 |
| ~~1d.6~~ | Partnerbereich am Seitenende als BALD — **16.09.2026** am Ende von 1d.1 | S | 1d.1 |
**Offenlegungsgrenze**
@ -233,7 +233,7 @@ Braucht Betreuungszeit und ist teilweise von Dritten abhängig.
|---|---|---|
| ~~E1~~ | **Entschieden 11.09.2026: 3** (drei Live-Läufe, siehe `basiswerte-block0.md` und `umsetzung-protokoll.md` Teil 3). Konfiguriert in `config/newsroom.php`. | 1a.2 |
| ~~E2~~ | **Empfehlung 01.09.2026: Rohzahlen** — kein Bodensatz, Verteilung symmetrisch, Einordnung gegen den Schnitt wäre wegen der Wachstumskurve falsch (siehe `basiswerte-block0.md`). | 1c.1 |
| E3 | Anzahl kostenloser Prüfläufe und Preis der weiteren in Credits | 1d.4 |
| ~~E3~~ | **Entschieden 16.09.2026: keine Credits.** Prüfung ist Teil der Freigabe, nicht ein Werkzeug; N automatische Läufe je Meldung (einstellbar, 3), danach Mensch, Automatik für die Meldung aus. Gelb geht weiter automatisch online, `yellow_to_manual_queue` bleibt als Schalter (Vorgabe aus). | 1d.4 |
| ~~E4~~ | **Entschieden 15.09.2026: der Magic-Link-Hinweis, am Ende der Mail, als Hinweis, nicht als Angebot.** Umgesetzt in 1b.4. Der Link auf die Infoseite (1d.2) bekommt damit keinen Platz in der Veröffentlichungsmail — ein Element pro Mail. | 1b.4, 1d.2 |
| E5 | Werden die bestehenden Ratgeberseiten konsolidiert oder ergänzt | 2.5 |
| E6 | Bleibt die Ablehnungsstrecke dauerhaft frei von kommerziellen Angeboten | 1d.1, 1d.6 |

View file

@ -1340,3 +1340,69 @@ und `ManualInvoicePdfRenderer` aus dem parallel entwickelten Projekt
nullbare Werte, eine immer-falsche Negation. Nicht angefasst.
Deploy: kein `migrate`, nur Code; `view:cache` neu. Kein Backfill nötig.
---
# Teil 6 — Block 1d: Infoseite und Prüfkreislauf (16.09.2026)
## Entscheidungen mit dem Nutzer
- **E3:** keine Credits für Prüfläufe. Die Prüfung ist Teil des Freigebens;
ein eigenständiges Werkzeug zum Textreinkopieren gibt es nicht (wäre der
Weg, das Gate auszutesten). Automatische Prüfung je Meldung
`scoring.classification.max_automatic_attempts` (Vorgabe 3); danach
geblockt in die Admin-Queue; Freischalten oder Kommentar; ab dann ist die
Automatik für diese Meldung aus.
- **Gelb** geht weiter automatisch online. Der Schalter
`yellow_to_manual_queue` war im Code nie ausgewertet (1 288 gelbe
Meldungen in sechs Monaten ohne Blick); jetzt ausgewertet, Vorgabe
`false`, im Admin sichtbar (Filter „KI: Gelb" bestand schon).
## Befund vorab
84 KI-Ablehnungen in sechs Monaten, jede Meldung genau einmal, eine
davon später veröffentlicht — heute loopt niemand. Der Zähler schützt vor
einem Verhalten, das erst mit 1d.1/1d.2 entsteht.
## 1d.1 / 1d.2 / 1d.6 (Commit c08c9e5)
Hilfeseite `/{edition}/gute-pressemitteilung` (DE/EN): Anlass, Aufbau,
Sprache, Prüfablauf mit Versuchszahl aus der Konfiguration, die sieben
Dimensionen des Content-Scores offen (Pressestil, Struktur, Lesbarkeit,
Vollständigkeit, Quellen, Überschrift, Eigenständigkeit) — Gewichtung und
Schwellen nicht (Offenlegungsgrenze), Pressebilder, Partner als BALD.
Kein Preis-, Tarif- oder Credit-Link im Seiteninhalt (Test prüft den
Prosa-Block). Sitemap, Hilfe-Center. Ablehnungsmail verlinkt die Seite auf
dem Portal der Meldung mit `src=mail_reject&pr=<id>`.
## E3 — begrenzter Prüfkreislauf
- Spalten `auto_check_attempts`, `manual_review_required_at` an
`press_releases` (INSTANT, keine Volltext-Indizes mehr).
- `submitForReview()`: zählt den Lauf; ist die Automatik erschöpft, geht
die Freigabe ohne `ClassifyPressRelease` direkt in `review` mit
Status-Log „wartet auf manuelle Entscheidung". Content-Score läuft weiter.
- `routeByClassification()`: Rot beim N-ten Lauf → `holdForManualReview()`
statt Ablehnung (bleibt `review`, Log „Automatische Prüfung erschöpft
(N von N): <Grund>", ActivityLog). Gelb → Schalter. Keine Mail an den
Autor für den Block — er sieht den Stand im Konto (offen: ob eine kurze
Mail „ein Mensch prüft" gewünscht ist).
- Admin ▸ Pressemitteilungen: Ansicht „Prüfung nötig" (Zähler rot, wenn >
0), Filteroption, Badges „Prüfung nötig" / „nur manuell" in der Liste;
Detailseite zeigt alle KI-Begründungen chronologisch und beschriftet die
Aktionen „Freischalten" / „Mit Kommentar zurück" (bestehende
publish/reject-Aktionen, Kommentar geht per Ablehnungsmail an den Autor).
- Kundenseite: Button „Zur Prüfung freigeben" (statt „einreichen", überall
vereinheitlicht), Modal erklärt in drei Schritten, was nach der Freigabe
passiert; abgelehnte Meldung zeigt „Automatische Prüfung X von N genutzt"
mit Link auf 1d.1; geblockte Meldung: „wird von einem Menschen geprüft".
- Nebenbefund Blade: ein inline `@php(...)` wird bis zum nächsten
`@php … @endphp` als Rohblock gelesen — vier Stellen auf Blockform
umgestellt, eine davon Bestand (Modal).
Tests: `ManualReviewGateTest` (5), `StaticPagesTest` (+2),
`ConversionFunnelTest` (erweitert). 1d.5 ist mit 1c.2 erledigt (der
Beansprucher sieht Ablehnungsgrund, KI-Stufe, Content-Score).
Deploy: `migrate --force` (Millisekunden), `view:cache`, `queue:restart`.
Kein Backfill — bestehende Meldungen starten mit 0 Versuchen.