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 5f7fbd0c65
commit 13716b9c06
17 changed files with 487 additions and 47 deletions

View file

@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Begrenzter Prüfkreislauf (Roadmap 1d, E3 entschieden 16.09.2026).
*
* `auto_check_attempts` zählt, wie oft die automatische Prüfung mit
* Statuswirkung für diese Meldung gelaufen ist. `manual_review_required_at`
* ist gesetzt, sobald die Automatik erschöpft ist: Die Meldung bleibt in
* `review`, erscheint im Admin als „Prüfung nötig", und jede weitere Freigabe
* des Autors geht ohne KI-Lauf direkt an einen Menschen.
*
* Kosten: `press_releases` hat keine Volltext-Indizes mehr, beide Spalten sind
* `ALGORITHM=INSTANT`. hasColumn hält die Migration wiederholbar.
*/
return new class extends Migration
{
public function up(): void
{
Schema::table('press_releases', function (Blueprint $table) {
if (! Schema::hasColumn('press_releases', 'auto_check_attempts')) {
$table->unsignedTinyInteger('auto_check_attempts')->default(0)->after('classified_at');
}
if (! Schema::hasColumn('press_releases', 'manual_review_required_at')) {
$table->timestamp('manual_review_required_at')->nullable()->after('auto_check_attempts');
}
});
}
public function down(): void
{
Schema::table('press_releases', function (Blueprint $table) {
$table->dropColumn(array_filter([
Schema::hasColumn('press_releases', 'auto_check_attempts') ? 'auto_check_attempts' : null,
Schema::hasColumn('press_releases', 'manual_review_required_at') ? 'manual_review_required_at' : null,
]));
});
}
};