c2a2162c86
When a Patreon source loses tier access, gallery-dl emits "Not allowed to view post N" warnings for every post AND yt-dlp tries to fetch HLS manifests which also 403. The ytdl error text contained "HTTP Error 403: Forbidden", which the classifier's ACCESS_DENIED_PATTERNS matched against the full combined stdout+stderr — so the run was labeled ACCESS_DENIED instead of TIER_LIMITED. Two fixes in one edit, because they're interlocked: - Compute per-item vs source-level error lines upfront. has_actual_error now reflects only source-level errors (previously the per-item exclusion was gated on skip evidence, which tier-limited runs don't produce since no content was accessed). - Strip per-item error lines from `combined` before downstream pattern matching so noise from recovered per-item failures doesn't latch onto ACCESS_DENIED / HTTP_ERROR / NOT_FOUND classifiers. Regression test: tier-gated Patreon run with yt-dlp HLS 403s → TIER_LIMITED, not ACCESS_DENIED. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>