option('limit')); $query = CreatorAiBiography::query() ->with('user:id,username,email') ->orderByDesc('updated_at') ->limit($limit); if ($this->option('failed')) { $query->whereNotNull('last_error_code'); } elseif ($this->option('needs-review')) { $query->where('needs_review', true); } else { // Default: union of all review-worthy states. $query->where(fn ($q) => $q ->where('needs_review', true) ->orWhere('status', CreatorAiBiography::STATUS_NEEDS_REVIEW) ->orWhereNotNull('last_error_code') ->orWhere('input_quality_tier', CreatorAiBiography::TIER_SPARSE) ); } if ($this->option('tier')) { $query->where('input_quality_tier', $this->option('tier')); } $records = $query->get(); if ($records->isEmpty()) { $this->info('No review-queue candidates found.'); return self::SUCCESS; } $this->line(''); $this->info("=== AI Biography Review Queue ({$records->count()} records) ==="); $this->line(''); $rows = $records->map(fn ($r) => [ $r->id, $r->user?->username ?? "user#{$r->user_id}", $r->status, $r->input_quality_tier ?? '-', $r->is_user_edited ? 'edited' : '-', $r->needs_review ? 'YES' : '-', $r->last_error_code ?? '-', $r->updated_at?->diffForHumans() ?? '-', ])->all(); $this->table( ['ID', 'Username', 'Status', 'Tier', 'User-Edited', 'NeedsReview', 'LastError', 'Updated'], $rows, ); $this->line(''); $this->line('Tip: run `php artisan ai-biography:inspect {user_id}` for full details on any record.'); $this->line(' run `php artisan ai-biography:generate {user_id} --force` to regenerate.'); $this->line(''); return self::SUCCESS; } }