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

@ -82,6 +82,8 @@ class PressRelease extends Model
'status',
'classification',
'classified_at',
'auto_check_attempts',
'manual_review_required_at',
'content_score',
'content_tier',
'scored_at',
@ -110,6 +112,8 @@ class PressRelease extends Model
'status' => PressReleaseStatus::class,
'classification' => PressReleaseClassification::class,
'classified_at' => 'datetime',
'auto_check_attempts' => 'integer',
'manual_review_required_at' => 'datetime',
'content_score' => 'integer',
'content_tier' => PressReleaseContentTier::class,
'scored_at' => 'datetime',
@ -529,6 +533,23 @@ class PressRelease extends Model
return $this->gone_at !== null;
}
/**
* Automatik erschöpft (E3): Für diese Meldung entscheidet nur noch ein
* Mensch — jede Freigabe geht ohne KI-Lauf in die Admin-Queue.
*/
public function requiresManualReview(): bool
{
return $this->manual_review_required_at !== null;
}
/**
* Wartet geblockt auf die menschliche Entscheidung.
*/
public function isAwaitingManualReview(): bool
{
return $this->status === PressReleaseStatus::Review && $this->requiresManualReview();
}
/**
* Instanz-Pendant zu scopeVisibleInArchive(): wertet die öffentliche
* Sichtbarkeit aus den bereits geladenen Attributen aus, ohne erneute