commit e28f06b689347c543bf04d24fd63f641fd61390e
parent 61d1f38de62a5fbe45590b345d610196d583f7ce
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Sun, 20 Sep 2026 03:20:04 -0400
flow: a filtered channel is not 10 % covered, and "video dirs" is no longer one
`totals.videos` stopped counting settled stubs, but two surfaces still read it
as though it did. The Playlist station divided it by the RAW listing, so a
channel that filters out 90 % of its uploads showed 10 % coverage forever — the
missing 90 % being exactly the videos the operator asked us not to fetch. And
Diagnostics called the number "video dirs", which is the one thing it is now
not a count of.
The denominator is the listing minus what the filter settled (null stays null —
no stored playlist means unknown, not zero), and the "filtered out" siding moves
from the download station to the playlist one, because a siding belongs to the
station whose gap it explains and this gap is between the listing and
totals.videos. Nothing is hidden; it is just no longer drawn as a shortfall.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
2 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/common/views/pipeline/channelFlow.ts b/common/views/pipeline/channelFlow.ts
@@ -287,13 +287,26 @@ export function computeChannelFlow(
const digestEnginesTotal =
snapshot.digestEngines != null ? digestCountOf(snapshot) : null;
+ // The listing, minus what the download filter settled. Null (no stored
+ // playlist) stays null — "unknown", not zero.
+ const listedAfterFilter =
+ playlistCount == null
+ ? null
+ : Math.max(0, playlistCount - buckets.skippedByTitleFilter.length);
+
const stationById: Record<FlowStationId, FlowStation> = {
playlist: {
id: "playlist",
+ // THE DENOMINATOR EXCLUDES WHAT THE FILTER SETTLED. `totals.videos` no
+ // longer counts settled stubs, so dividing it by the raw listing made a
+ // filtered channel read 10 % covered forever — the 90 % being videos the
+ // operator asked us not to fetch. The listing itself is unchanged and the
+ // settled count is drawn as a siding under this station, so nothing is
+ // hidden; it is just not counted as a shortfall.
label: "Playlist",
through: totals.videos,
- denominator: playlistCount,
- coverage: ratio(totals.videos, playlistCount),
+ denominator: listedAfterFilter,
+ coverage: ratio(totals.videos, listedAfterFilter),
running: stages.playlist.running,
tone: stages.playlist.tone,
stage: "playlist",
@@ -372,7 +385,18 @@ export function computeChannelFlow(
// under "to download", "1,631 blocked" under "to digest". Same rule for every
// gap, so nothing is homeless and nothing is counted twice.
const sidingsOf: Record<FlowStationId, Siding[]> = {
- playlist: [],
+ // The filtered-out siding hangs HERE, not under download: it explains a gap
+ // between the listing and `totals.videos`, which is this station's gap. The
+ // rule for every siding is that it belongs to the destination station of
+ // the gap it explains.
+ playlist: [
+ ...siding(
+ "filtered out",
+ buckets.skippedByTitleFilter.length,
+ "diagnostics",
+ "Declined by this channel's download filter and settled — they are in the listing and will not be downloaded. Change the filter to bring them back.",
+ ),
+ ],
download: [
...siding(
"never fetched",
@@ -389,12 +413,7 @@ export function computeChannelFlow(
"diagnostics",
"Declined as currently live or upcoming; retried on a later sync.",
),
- ...siding(
- "filtered out",
- buckets.skippedByTitleFilter.length,
- "diagnostics",
- "Declined by this channel's download filter and settled. Change the filter to bring them back.",
- ),
+
...siding(
"need cookies",
buckets.needsCookies.length,
diff --git a/editor/app/channels/[slug]/components/stages/DiagnosticsStage.tsx b/editor/app/channels/[slug]/components/stages/DiagnosticsStage.tsx
@@ -201,7 +201,10 @@ export function DiagnosticsStage({
<div>
<h3 className="text-base font-semibold">Channel health</h3>
<p className="text-sm text-muted-foreground">
- {totals.videos} video dirs · {totals.transcribed} transcribed ·{" "}
+ {/* NOT "video dirs" any more: totals.videos excludes the stubs the
+ download filter settled, so the label has to stop naming the
+ thing it is no longer a count of. */}
+ {totals.videos} videos in scope · {totals.transcribed} transcribed ·{" "}
{totals.downloaded} downloaded
{total > 0 ? ` · ${total} abnormal` : ""}
</p>