Archilyzer · Source

archilyzer

Archilyzer
git clone https://archilyzer.pages.dev/source/archilyzer.git
Log | Files | Refs | README | LICENSE

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:
Mcommon/views/pipeline/channelFlow.ts | 37++++++++++++++++++++++++++++---------
Meditor/app/channels/[slug]/components/stages/DiagnosticsStage.tsx | 5++++-
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>