# schema_version

created_at: 2026-04-25T00:00:00.000Z
description:
  Longitudinal storage tables (source_activation_log, channel_phase_log, summary_traffic_daily_history) so daily history survives rebuilds.


created_at: 2026-04-26T00:00:00.000Z
description:
  Owner-mode F-tier tables: summary_video_subscribed, summary_channel_country_trailing30, summary_channel_device.


created_at: 2026-04-26T00:00:01.000Z
description:
  pre_publish_stub flag on video_daily / traffic_daily — flags rows where date < published_at so summary aggregations can exclude them.


created_at: 2026-04-26T00:00:02.000Z
description:
  ctr_confidence tier (noise / low / medium / high) + unattributed_impressions on video_daily, traffic_daily and summary_video.


created_at: 2026-04-26T00:00:03.000Z
description:
  Day-3 / Day-7 cohort columns + velocity (days_to_first_*) + peak_views_day/value + late_growth_pct on summary_video.


created_at: 2026-04-26T00:00:04.000Z
description:
  imp_to_view_ratio + avd_drift_sec + source_hhi on summary_video; imp_to_view_ratio_median on summary_channel.


created_at: 2026-04-26T00:00:05.000Z
description:
  ctr_quadrant column on summary_video (winner / clicked-not-watched / watched-not-clicked / quiet / noise) with median_video_ctr + median_video_retention on summary_channel as the crosshairs.


created_at: 2026-04-26T00:00:06.000Z
description:
  Rolling 7d / 28d columns (views, watch_min, impressions, weighted_ctr) on summary_channel_daily; new summary_channel_source_share_daily long-format table.


created_at: 2026-04-26T00:00:07.000Z
description:
  source_diversity_score + top_video_share_7d + top3_video_share_7d + top_video_id_7d + videos_with_zero_views_7d + quiet_inventory_pct columns on summary_channel_daily.


created_at: 2026-04-26T00:00:08.000Z
description:
  date-only indexes on video_daily and traffic_daily so date-range scans no longer fall back to a full table scan.


created_at: 2026-04-27T00:00:00.000Z
description:
  Impression-weighted CTR formula (SUM(impressions * ctr) / SUM(impressions)) on summary_video.day3_ctr / day7_ctr and summary_traffic_daily_history.weighted_ctr — replaces the views/impressions shortcut so cohort and per-day source CTR match the canonical weighted_ctr definition.


created_at: 2026-04-27T00:00:01.000Z
description:
  pre_publish_stub filter applied to source_activation_log and summary_traffic_daily_history build SELECTs — longitudinal storage tables now exclude pre-publish stub rows so trip events on /traffic/[sourceId] and the Spine no longer reflect zero-view pre-publish dates.


created_at: 2026-04-27T00:00:02.000Z
description:
  Foreign-key constraints on junction tables (video_daily, traffic_daily, video_era, summary_video, summary_era, summary_traffic, summary_channel_traffic, summary_traffic_daily, summary_traffic_top_videos, source_activation_log, summary_traffic_daily_history, summary_channel_source_share_daily, summary_video_country, summary_video_subscribed) — orphan video_id / traffic_source_id rows now raise SQLite errors when a writer enables PRAGMA foreign_keys. The dashboard read-only client opens the DB with PRAGMA foreign_keys = ON for belt-and-suspenders enforcement.


created_at: 2026-04-27T00:00:03.000Z
description:
  Covering index idx_traffic_daily_source_date on traffic_daily(traffic_source_id, date) — homepage Browse-impression activity card now uses an index SEARCH instead of a full traffic_daily scan (~91k rows on a 200-video fixture).


created_at: 2026-04-27T00:00:04.000Z
description:
  Covering index idx_insight_snapshot_cat_date on insight_snapshot(insight_category, snapshot_date) — detectShapeChange and any future category-scoped snapshot lookup now use an index SEARCH instead of falling back to idx_snapshot_date and re-checking insight_category row by row.


created_at: 2026-04-27T00:00:05.000Z
description:
  Owner-mode tables (summary_video_country, summary_video_subscribed, summary_channel_country_trailing30, summary_channel_device) suppressed by default; pass --include-owner-tables to emit them. Stage-1 public deploys ship without these tables; the dashboard read helpers hard-assert NEXT_PUBLIC_OWNER_MODE=true as defense-in-depth. The legacy --show-channel-name flag is removed.


created_at: 2026-04-27T00:00:06.000Z
description:
  Coarsened publish_date and duration_seconds in default builds so the public DB cannot be cross-referenced to identify the channel: video.published_at and summary_video.published_at snap to YYYY-MM-01; video.duration_seconds and summary_video.duration_seconds snap to one of eight bucket lower bounds (0/60/180/360/600/1200/1800/3600). Coarsening runs as a final UPDATE pass after all derived columns (day3/day7 cohorts, days_to_first_*, peak_views_day, summary aggregates) are computed against precise values, so build-time math is unaffected. Owner-mode rebuilds with --show-precise-metadata skip the UPDATE and preserve full precision.


created_at: 2026-04-27T11:00:00.000Z
description:
  Count consistency across surfaces. summary_channel.total_public_videos now counts videos with published_at <= latest_data_date (the reporting cutoff) instead of joining through video_daily, so videos published right at/after the cutoff stop being silently dropped from the count. summary_channel.total_days_tracked now derives from (latest_data_date - first_video_date + 1) so the days span and the public-video count align by construction for daily posters. summary_channel_daily.cumulative_videos_live is recomputed from precise source-side publish dates instead of the noisy data-api channel_snapshot.video_count, and two new columns most_recent_video_id (TEXT) and days_since_last_publish (INTEGER) let the dashboard render per-date "videos live" + "Video N is X days old" without recomputing from coarsened video.published_at (CLOSE-B-51 silently broke that path).


created_at: 2026-04-27T12:00:00.000Z
description:
  Reverts V23 (CLOSE-B-51) coarsening of video.published_at and summary_video.published_at to YYYY-MM-01. The collapse to first-of-month broke the cadence detector (every channel misclassified as "schema-ambiguous"), the per-date predicates in the dashboard, and the publish-date scatter (every dot landed on a single vertical line); the privacy gain was marginal because per-video age is already exposed via days_tracked, view trajectories, and the timeline. duration_seconds bucketing remains in place — it carries genuine de-anonymization risk (a precise integer-second runtime is rare enough to be fingerprintable) without the downstream collateral. The --show-precise-metadata flag still toggles the duration bucketing for owner-mode rebuilds.


created_at: 2026-04-28T00:00:00.000Z
description:
  A-01 — Country tables default-public. The two tables (summary_video_country, summary_channel_country_trailing30) now ship in default builds, with --coarsen-country-mix on so countries below 5% share collapse to "OT" (Other). The owner-mode flag still suppresses summary_video_subscribed plus summary_channel_device. The country dimension on its own does not deanonymize an English-language channel (top countries cluster around US/IN/GB/CA on essentially every channel); the prior owner-mode gate hid the most diagnostic dimension in the dataset.


created_at: 2026-04-28T01:00:00.000Z
description:
  A-02 + A-03 — Daily country tables and country_activation_log. summary_video_country_daily (per-(video, country, date)) and summary_channel_country_daily (per-(date, country)) ship in default builds, populated from reporting_video_metric with cutoff and pre-publish guards. The daily resolution unlocks per-video country stream charts on /videos/[id] and the channel country river on /traffic; downstream slices read these tables for activation logs, audience-swap detection, and per-country sub-funnel cohorts. Long-tail rows below the 5% per-video share threshold collapse into the same "OT" bucket the lifetime tables use. A-03 layers the country_activation_log table (per-(video, country) first-active and first-meaningful >= 5 views dates) on top, plus a first_country_view channel_timeline event (one per country the channel has reached, significance 50) so the Story dispatcher can render geographic-reach milestones once A-27 wires it.


created_at: 2026-04-28T02:00:00.000Z
description:
  A-04 — Country composites on summary_video. Five derived columns (country_hhi, dominant_country_code, dominant_country_share, country_concentration_with_weak_retention, country_audience_match_score) populated by a post-summary pass over the coarsened summary_video_country rows. HHI mirrors source_hhi shape (sum of squared shares × 10000); the concentration boolean fires when one country holds >= 40% share of a video and that country watches >= 30% shorter than the video overall; the match score is the cosine similarity between this video distribution and the channel-wide well-retaining country distribution (countries weighted by views from videos retaining at or above the channel median). Pairs the country dimension with the existing source_hhi to characterize concentration on two independent axes; the geographic-concentration detector now reads the persisted boolean instead of recomputing per-insight.


created_at: 2026-04-28T03:00:00.000Z
description:
  A-05 + A-06 — Lifecycle daily classifier and stage-transition timeline. A-05 ships the new video_stage_daily table (per-(video, date), one of nine stages: pre_publish / debut / growth / peak / tail / quiet / re_emerged / zombie / dormant) populated by a deterministic JS pass over video_daily anchored on summary_video.peak_views_day. Eight new columns on summary_video persist the latest stage (lifecycle_stage), the per-stage day spans (days_in_growth, days_in_peak, days_in_tail), the time from peak to half-of-peak rolling views (tail_half_life_days), and three survives-day-N flags (survives_day_7 / 14 / 30) gated on cumulative views at day N reaching the channel-median cumulative views at the same day. A-06 layers a stage_transition channel_timeline event type on top — emitted from diff of consecutive video_stage_daily rows, filtered to meaningful transitions only (any transition INTO re_emerged / zombie / dormant, any transition OUT of quiet, plus peak -> tail) — and adds three detectors that read the persisted stages: zombie-impressions, dormant-video, and channel-level video-re-emergence. Eight columns plus the transition events let the catalog grid read current stage and trajectory health without touching video_daily; downstream slices (A-23 StageChip, A-27 story dispatcher, A-29 video timeline strip) read these directly.


created_at: 2026-04-28T04:00:00.000Z
description:
  A-08 — Channel-scope co-movement events and anomaly composite scaffolding. Two new channel_timeline event types ship on default builds: multi_video_activation (a day where three or more videos each ran at or above 2x their prior 7-day rolling mean views) and cohort_lift (an ISO-week publish cohort whose median trailing-7-day views climbed at least 30 percent over the prior week while older cohorts stayed flat within plus-or-minus 10 percent). Two new detectors (multi-video-activation, cohort-lift) emit the same patterns as Insight objects routed through the existing emerging_signal slot via evidence.shape. summary_channel_daily gains the anomaly_score_composite REAL column; the column stays NULL on default builds until A-12 ships the metric_zscore_daily table that populates it (sum of absolute z-scores across tracked metrics per date). The Opening rail container exposes the data-testid="anomaly-marker-rail" hook so the smoke gate can catch a SQL-join-key class of regression at build time even before A-12 lands.


created_at: 2026-04-28T05:00:00.000Z
description:
  A-09 — Channel temperature and country diversity. summary_channel_daily gains two new REAL columns: temperature_score (a 0..100 weighted blend of trailing CTR, AVD, sub-rate, source diversity, and library activity z-scores against the prior 90-day baseline; 50 reads as the channel's own normal, 60 as a warmer week than typical for this channel, 40 as a cooler week than typical) and country_diversity_score (Simpson form 1 - sum(share^2) over the per-date top-country shares from summary_channel_country_daily). Both columns require at least 35 days of baseline; below that they stay NULL. Adds two channel-scope detectors that share the emerging_signal slot via evidence.shape: algorithmic_thaw fires when channel-wide impressions ran at or above 2x their prior 14-day median for two or more consecutive days, and algorithmic_frost fires on the symmetric drop (impressions at or below 50 percent of the prior 14-day median for two or more days). Both maturity-gated to sprouting+. The 5th tile on the home page right-now strip renders the score, a 14-day sparkline, and a hedged qualifier sourced from EVOLUTION section 4.1 ("warmer than typical" / "your normal" / "cooler than typical") so the channel position is observation, not verdict.


created_at: 2026-04-28T06:00:00.000Z
description:
  A-10 — Sticky-traffic ratio and algorithmic dependency index. traffic_source gains an is_sticky 0/1 column (sources where the viewer chose to come back: Direct, Channel Page, Playlist, End Screen, link-clicks from off-platform, subscriber notification; everything else is algorithmic discovery). summary_video adds sticky_traffic_ratio (0..1 share of total_views from sticky sources, NULL when no traffic rows). summary_channel adds algorithmic_dependency_index (1.0 minus the channel-wide sticky share). summary_channel_daily adds two columns: per-day algorithmic_dependency_index and a trailing 28-day OLS slope of that index (units: index points per day, NULL when fewer than 14 daily values fall in the trailing window). The Audience chapter mounts a new <StickyTrafficSparkline> tile that renders the per-day index as a sparkline against a hedged qualifier; per-video pages render a small sticky-traffic chip. Both extremes (high and low ratio) are legitimate channel patterns; the value is observation, not verdict.


created_at: 2026-04-28T07:00:00.000Z
description:
  A-11 — Audience persistence and replacement, plus the emerging_audience event type. summary_channel_daily gains two REAL columns: audience_persistence_pct (share of last week's (source, country) buckets that also appeared the prior week) and audience_replacement_rate (share of last week's buckets that did not appear the prior week). Computed as a JS pass over reporting_traffic_metric on the source DB; one weekly comparison written per ISO week-ending row in summary_channel_daily, with NULL on dates that do not fall on a week boundary. A new emerging_audience event_type emits one channel_timeline row per (traffic_source_id, country_code) bucket that did not appear in the channel's first 14 days yet drew at least 50 views in the last 28 days; headline names the country, then the source. The Audience chapter mounts a two-bar gauge showing the persistence and replacement values with arrows reading the most recent two weekly comparisons; both states (high persistence vs high replacement) are legitimate channel patterns at different ages.


created_at: 2026-04-28T08:00:00.000Z
description:
  A-12 + A-13 — Z-score machinery and step-change scaffolding. A-12 ships metric_zscore_daily (date, metric, value, baseline_mean, baseline_sd, zscore, sample_size; PK on (date, metric)) holding per-(date, metric) z-scores against a prior 28-day baseline for five tracked metrics: daily_views, weighted_ctr, weighted_avd, sub_gain_rate, total_impressions. Each row reads the 7-day trailing mean as the value, prior 28-day mean and sd as the baseline; baseline window must hold at least 28 non-null values or the z-score stays NULL. summary_channel_daily.anomaly_score_composite reads SUM(ABS(zscore)) per date so the Opening rail anomaly markers fire on multi-metric outlier days. The new metric-anomaly detector reads z > 2 outliers in the trailing 7 days and routes through the existing emerging_signal slot via evidence.shape. A-13 layers six new columns on summary_channel_daily: trailing 14-day OLS slopes for top_video_share, top3_video_share, source_diversity, quiet_inventory, and channel-level country HHI, plus recent_debut_trend_14d (relative delta between recent-14-day and prior-30-day mean day1_impressions across the catalog). A-13 also adds a CUSUM step-change scan over four channel-level rolling series (views, click rate, avg watch, subs gained) emitting step_change channel_timeline events when the maximally-separating split is at least 30% relative magnitude and sits at least 7 days from either series boundary. The new recent-debut-trend detector reads summary_video and surfaces the recent-vs-prior comparison as a single channel-scope insight at growing+ maturity. Observation-only voice across all surfaces.


created_at: 2026-04-28T09:00:00.000Z
description:
  A-14 + A-15 — Engagement composite, velocity, two new detectors, plus subscriber granularity. A-14 ships engagement_weights (default likes=1, comments=5, shares=3) and three columns on summary_video: engagement_rate_composite (weighted-engagement-events / total_views; NULL when total_views = 0), engagement_velocity_24h (likes + comments + shares from the first 24 hours since publish), engagement_velocity_7d (the same sum over the first 7 days). Two new detectors: comment-outliers fires per-video when comments-per-100-views runs at least 3x the channel median (sprouting+); engagement-leads-views runs a cross-correlation between engagement spikes and view spikes per video at lag 3-7 days (growing+). Both route through emerging_signal via evidence.shape. The chip on /videos/[id] surfaces the 24h and 7d velocity values; the new <EngagementVelocityChart> renders them as a two-bar Recharts BarChart. A-15 layers subscriber granularity on top: summary_traffic gains subs_gained INTEGER (per-(video, source) total_subs_gained allocated proportionally by view share; YouTube does not break subs out by source so the value is an inference) and funnel_engaged_views INTEGER (SUM(engaged_views) from reporting_traffic_metric per (video, source)); summary_video gains days_to_third_subscriber and days_to_fifth_subscriber (extends the days_to_first_subscriber pattern, walks video_daily for the day cumulative subs_gained reaches 3 / 5). channel_timeline.event_type adds subscriber_event for milestone-only channel-wide subs (every 5th up to 100, every 10th past 100, every 25th past 500, every 100th past 1k) — replaces the prior milestone-typed subscriber rows so the Story dispatcher can target the new event type explicitly. New <SubFunnelChart> mounts on /traffic/[sourceId] rendering impressions → views → engaged → subs as a horizontal Recharts BarChart; new sub-rate-vs-view-rate detector fires when the trailing 28-day sub-rate slope and view-rate slope diverge (audience-quality-improving / volume-without-depth shapes routed through emerging_signal). Observation-only voice across both slices.


created_at: 2026-04-28T10:00:00.000Z
description:
  A-16 — Days-to-N velocity columns. summary_video gains seven INTEGER columns: days_to_10_views, days_to_100_views, days_to_500_views, days_to_1000_views (cumulative-views milestones, populated by the same per-video walk that already produces days_to_50_views), plus days_to_first_comment, days_to_first_like, days_to_first_share (day offset where the cumulative engagement count first reaches one). All seven columns hold NULL when the milestone has not landed yet, mirroring the days_to_first_subscriber convention. summary_channel gains two INTEGER columns: median_days_to_100_views and median_days_to_1000_views — channel medians across videos that have crossed each milestone, NULL when fewer than one eligible video exists. The /videos/[id] discovery-unfolded strip extends to surface the new milestones inline alongside the existing days_to_first_* values; the Catalog chapter on the home page renders a hedged channel-median callout. Pure-data slice; observation-only voice.


created_at: 2026-04-28T11:00:00.000Z
description:
  A-17 + A-18 — Cadence classifier, cadence break events, day-of-week trend (A-17), plus library Gini coefficient and Lorenz half-mass count (A-18). A-17 ships channel_cadence_daily (one row per date with a classified publishing pattern: daily, every_other_day, weekday_only, weekly_3x, weekly, irregular; conformance percentage over the trailing 28 days; days_since_break that resets on each divergence) and the cadence_break channel_timeline event emitted on each break day after the channel held the pattern for at least seven days. Two TEXT JSON columns on summary_channel: publish_gap_distribution (histogram of inter-publish gaps in days) and day_of_week_trend (per-weekday twelve-week slope of channel views). A-18 layers three new columns on summary_channel (gini_views, gini_subs, library_half_life_days — the third counts top videos sorted desc by views needed to reach half of total channel views, populated as a Lorenz half-mass count) plus two trailing 28-day rolling Gini columns on summary_channel_daily (gini_views_28d, gini_subs_28d). The Coda chapter renders a hedged "{M} of {N} videos" callout from gini_subs against the Lorenz curve; /data renders a distribution-evolution line chart of the two daily Gini series. Observation-only voice across all surfaces; both extremes (concentrated vs even) are legitimate channel patterns.


created_at: 2026-04-28T12:00:00.000Z
description:
  A-19a — Wisdom canon foundation. Two new tables: wisdom_canon (50 rows loaded from scripts/wisdom-canon.yaml — one per conventional belief, with belief_text, calculation_doc, evidence_shape in {single-ratio, correlation, delta, share-distribution, count-tier, not-applicable}, and agrees_directionality in {positive, negative, neutral}) and wisdom_test (one verdict row per (test_id, snapshot_date) with status in {agrees, disagrees, inconclusive, not_currently_testable}, an optional inconclusive_reason that classifies into thin_sample / near_threshold, evidence_json, confidence, sample_size, prior_status, status_changed_today, and the not_yet_implemented flag the runner sets while the per-test impl files are still landing). New scripts/wisdom-runner.js loads the canon yaml on every build, populates wisdom_canon idempotently, and emits 50 wisdom_test rows: every requires_owner_mode / requires_cross_channel / not_currently_testable_reason entry short-circuits to status not_currently_testable; every testable entry with a per-test file at dashboard/src/lib/wisdom/tests/<test_id>.ts dispatches and writes a real verdict; every testable entry without an implementation file gets a placeholder row with not_yet_implemented = 1. Three anchor implementations land in this slice: frequency_cannibalization (single-ratio), first_24_48h_determines_fate (correlation), title_changes_reset_algo (delta). A-19b lands the remaining 26 testable implementations across multiple sessions; the architecture cannot regress because the runner already passes all 50 entries with the placeholder fallback.


created_at: 2026-04-28T13:00:00.000Z
description:
  A-23 — AVD confidence tier columns. summary_video, summary_traffic, and video_daily each gain an avd_confidence TEXT column (one of noise / low / medium / high) derived from the row's view sample size: noise < 10, low < 30, medium < 100, high otherwise. Mirrors the V10 ctr_confidence pattern but keyed on views (the denominator AVD averages over) instead of impressions. Persisting the tier alongside the value lets every UI surface that renders an AVD value wrap it in <AvdConfidencePip> — strikethrough on noise, muted on low, full on medium / high — without recomputing the threshold per call site. Same A-23 ships StageChip + VideoMiniStack visual chrome on /videos rows + comparison-band reuse on per-video charts; those are presentation-only and do not bump the schema.


created_at: 2026-04-28T14:00:00.000Z
description:
  A-25 — Honesty surface column. summary_channel_daily gains unattributed_channel_views INTEGER, populated post-insert as MAX(0, total_views - SUM(video_daily.views WHERE pre_publish_stub = 0)) per date. The column makes the per-date snapshot drift between channel-level views and the sum of per-video reporting rows readable directly from one column instead of recomputing every render. Powers the new <HonestyPanel> on /data (six sub-sections naming reporting lag, pre-publish stub rows, click-rate confidence distribution, AVD confidence distribution, unattributed impressions, and the channel-snapshot reconciliation chart) plus a one-line <HonestyDigest> in the Coda chapter on /. The digest reads "Data flows reliably through {cutoff}; per-source attribution is at {pct}%; click-rate sample tier today: {tier}." with a link to the full panel; the third clause omits when reconciliation is sparse. Observation-only voice; the surface is reference content, not a verdict.


created_at: 2026-04-28T15:00:00.000Z
description:
  A-30 — Calc hygiene + metric_metadata + indexes. New metric_metadata table (metric_id, definition, source_tables, computation_doc, confidence_method, last_modified) populated from scripts/metric-metadata.yaml at build time; consumed by /data tile tooltips so "How is this computed?" reads from a single source. Index audit: the eight Round-3 indexes (idx_svcd_video_date, idx_svcd_country_date, idx_sccd_country_date, idx_mzd_metric_date, idx_wt_status_date, idx_wt_test_date, idx_vsd_video_date, idx_cal_country_date) all use CREATE INDEX IF NOT EXISTS for build-rebuild idempotence. Time-zone documentation: data_status gains a reporting_timezone row pointing at America/Los_Angeles (PT) so the dashboard's honesty surfaces read the timezone from one source. Schema-history consistency check (scripts/schema-history-check.js) extends the prior tail-equality assertion with three new failure modes — version skip / gap, non-monotonic order, and position-by-position mismatch with a hard-coded EXPECTED_SCHEMA_HISTORY_VERSIONS sequence — so future schema arithmetic regressions fail the build with precise diagnostics.


created_at: 2026-04-29T00:00:00.000Z
description:
  L-16 — summary_detector_activity table. New per-detector aggregation table populated by scripts/build-detector-activity.js after dashboard/scripts/generate-snapshots.ts has written the insight_snapshot history. One row per detector_name with total_fires, first_fired_date, last_fired_date, highest_significance, and the snapshot_date that carried that highest_significance. Empty at clean-build time (insight_snapshot has no rows yet); populated when refresh-public.js completes its finalize step. The /help/detectors master list page (L-17) reads this table via getDetectorActivity() to render fired vs not-yet-fired groupings.


created_at: 2026-05-02T00:00:00.000Z
description:
  Batch 01 — traffic_daily gains per-source avg_view_duration_sec REAL and avg_view_pct REAL. The source v_video_traffic view now computes views-weighted AVD and AVP from reporting_traffic_metric at the (video_id, date, traffic_source_id) grain. Analytics-only rows and pre-publish stubs keep both columns NULL. The public build path and fixture writer both carry the two new columns between watch_time_minutes and impressions.


created_at: 2026-05-02T01:00:00.000Z
description:
  Batch 02 — summary_video_source_window. Per-(video_id, age_window, traffic_source_id) acquisition-quality mart: impressions, views, watch time, impression-weighted CTR, views-weighted AVD/AVP, watch_min_per_impression, ctr_confidence, and within-window impression/view/watch-time shares. Age windows: d0/d1/d2_7/d8_13/d14_29/d30_plus. Reads from public traffic_daily (pre_publish_stub = 0). Non-impression sources (Direct, External) legitimately carry NULL impressions and weighted_ctr.


created_at: 2026-05-02T02:00:00.000Z
description:
  Batch 02 — summary_video_geo_window. Per-(video_id, age_window, country_code) geography mart with stored geo_bucket (core | expansion | other). core = top countries reaching 60% of lifetime named-country views; expansion = summary_channel_country_trailing30 countries not already core; other = everything else including OT. Reads from summary_video_country_daily joined with video for age derivation; OT rows are always geo_bucket = other. Stores views, watch time, AVD, engaged views, subs, and within-window view/watch shares.


created_at: 2026-05-02T03:00:00.000Z
description:
  Batch 02 — summary_video_launch_window. Per-(video_id, age_window) early-life rollup: views, impressions, impression-weighted CTR, views-weighted AVD/AVP, watch time, subs gained, engaged views. Same age-window set as V44/V45. Reads from public video_daily (pre_publish_stub = 0). Windows with no volume signal (no views, impressions, or watch time) are omitted. Completes the three-mart current-analysis layer that stops per-video source/geo/launch reads from re-aggregating inline.


created_at: 2026-05-02T04:00:00.000Z
description:
  Batch 03 — summary_channel_catalog_pressure_daily. Per-date catalog pressure mart: trailing-7d impression shares by video age bucket (new <=7d / midlife 8-30d / library >30d), top-1 and top-3 video impression concentration, active_videos_7d, videos_published_14d, quiet_inventory_pct copy, and launch_pressure_index (composite of new-video share, catalog size, concentration, and publish-day flag). All share fields and launch_pressure_index are NULL when the trailing-7d impression denominator is zero; does not use lifetime or post-cutoff data for historical dates.


created_at: 2026-05-02T05:00:00.000Z
description:
  Batch 03 — summary_channel_source_geo_daily. Per-(date, traffic_source_id, country_code) acquisition geography mart with stored geo_bucket = core | expansion | other. Aggregated from src.reporting_traffic_metric with blank-country filter and pre-publish guard. OT folding uses the same default-on 5% share threshold as the existing country tables, applied within each (date, traffic_source_id) group. geo_bucket is channel-level: core = countries reaching 60% of lifetime named-country views; expansion = summary_channel_country_trailing30 countries not already core. OT rows are always geo_bucket = other. Stores views-weighted AVD/AVP. Does not contain subscriber columns.


created_at: 2026-05-02T06:00:00.000Z
description:
  V49 — summary_channel_state_log. Adds the new per-date channel-state backbone table with persisted v1 classifier outputs plus raw support features (source-share, launch-pressure, country concentration, recent-upload testing evidence). The table is rebuilt deterministically on every public DB build and mirrored in fixture generation so later route-context work can read one historical state spine instead of recomputing present-tense heuristics.


created_at: 2026-05-02T07:00:00.000Z
description:
  V50 — wisdom_verdict_daily. Adds a future-safe per-date wisdom history table keyed by (date, test_id). The table stores deterministic verdict status, evidence_json, confidence, sample_size, prior_status, status_changed_today, and not_yet_implemented for every canon belief on every historical summary_channel_daily date. Historical readers and wisdom_flip emission now read from this table instead of pretending the latest wisdom_test snapshot is enough for past dates.


created_at: 2026-05-02T08:00:00.000Z
description:
  V51 — summary_channel_weekly_letter. Adds one deterministic weekly-publication row per complete ISO week with headline, dek, body_markdown, and evidence_json derived from the state log, timeline, weekly metrics, and wisdom history. Powers /weekly, /weekly/[isoWeek], and the generated RSS feed.


created_at: 2026-05-05T00:00:00.000Z
description:
  V52 — summary_video_change_window. Adds the per-(video_id, pivot_date, pivot_kind) before/after rollup table that powers the per-video Eras section on /videos/[id] and the channel-scope rollup on /changes. Pivots come from era boundaries, summary_subscriber_event_daily (V55, when present), and pipeline/channel-notes.yaml. Each row carries 14-day before/after views, impression-weighted CTR (with sample sizes), retention, AVD, and sub-gain plus a two-proportion CTR z statistic kept internal-only and a verdict in {improved, worsened, inconclusive}. The verdict downgrades to inconclusive when either side cannot fit the full 14-day window.


created_at: 2026-05-06T00:00:00.000Z
description:
  V53 — summary_channel_stage_snapshot. Adds the six-row fixed-stage table (day1 / week1 / month1 / views_1k / subs_1k / monetization) that backs the homepage stage-snapshots strip. Each build writes all six rows; unreached stages carry NULL reached_date / day_number / per-row fact columns. The strip renders only when at least three stages have been reached (DECISIONS A.3); below the threshold the consumer returns null. editorial_note ships NULL — chrome reads its plain-language stage labels from dashboard/src/lib/labels.ts.


created_at: 2026-05-06T00:01:00.000Z
description:
  V54 — intentionally unused per CONTRACTS § V54. Reserved during scoping for the proposed summary_receipt table; the /receipts surface was cut at the Phase D review gate (GATE-DECISIONS D2 / D4) and the version number stays vacant so future per-version changelog rows on /data still render in order.


created_at: 2026-05-06T00:02:00.000Z
description:
  V55 — summary_subscriber_event_daily. Lifts subscriber-loss / surge events out of the channel_timeline JSON envelope into a queryable per-(date, video_id, kind) table. Per-video rows trigger when |net_subs| trips max(2, 0.02 × current_subscribers); channel-scope rows (video_id IS NULL) trigger at max(5, 0.05 × current_subscribers). The build-time consumer is V52 compute-change-windows (which reads sub_loss pivots); render-time consumers surface only inside per-video Eras sections via V52.


created_at: 2026-05-07T00:00:00.000Z
description:
  V56 — sample-aware intelligence layer. Adds source_age_pattern_daily, video_current_state, channel_signal_daily, and dashboard_briefing_daily so the public DB stores comparative observations with denominators, confidence tiers, and noise reasons. The homepage briefing now reads ranked DB findings instead of raw one-metric swings, and /data presents the SQLite file as an analyst-ready signal layer.


created_at: 2026-05-08T00:00:00.000Z
description:
  V57 — reach-only and covered zero days. Public builds now preserve active public video-days where YouTube reported impressions but no views, plus zero-signal days when both basic and reach reports covered the date. Source-level reach-only traffic rows are also preserved so impression and CTR analysis no longer loses no-click exposure.


created_at: 2026-05-09T00:00:00.000Z
description:
  V58 — creator metadata change ledger + multi-window/multi-metric verdicts + change aggregates. New creator_change_log table sanitizes the private video_change_log + channel_change_log into a categorical change_kind enum (description rewritten / extended / shortened / cleared / restored / set; tags added / removed / replaced / reordered / cleared / set; etc.) with NULL before/after for free-text fields and pass-through for already-public scalars (category_id, language codes, license, made_for_kids, country); custom_url is NULL it out for defense-in-depth. summary_video_change_window widens to 4 windows (7/14/28/56 days) × 5 metrics (views, impressions, ctr, retention, sub_rate) with per-metric verdicts plus a primary verdict mapped per pivot_field; pivot_kind gains "metadata"; pivot_field uses NOT NULL DEFAULT "" sentinel. New summary_channel_change_window mirrors the shape at channel scope. Five aggregate tables ship: summary_change_daily / weekly / monthly / summary_field_co_change / summary_edit_view_position. summary_video gains 8 edit-intensity columns (edit_count_lifetime / first_30d / after_30d, first_edited_at, last_edited_at, first_edit_lag_days, fields_ever_edited_json, edit_intensity_class). summary_channel_daily gains 4 cadence columns (edits_30d / 90d / 365d, edit_diversity_30d). New channel_event_public table holds owner-authored creator_event entries from pipeline/creator-events.yaml; creator_event and edit_burst rows emit into channel_timeline.


created_at: 2026-05-11T00:00:00.000Z
description:
  V59 — self-description layer (_about/_table_catalog/_column_catalog/_query_examples/_json_schema + 6 views); 9 new analytical tables; 10 new detectors; coherent naming convention with 30 table renames + 3 column renames; correctness fixes (creator-event privacy + orphan guard, EvidenceExportPanel SQL, dead cols, library_half_life rename, retention clamp, pipeline orchestration parity); dropped 4 unread edit-cadence columns (edits_30d / edits_90d / edits_365d / edit_diversity_30d) from summary_channel_metrics_daily; added 9 indexes covering frequent date / source / video joins plus the decay-model quiet-date lookup.


created_at: 2026-05-12T00:00:00.000Z
description:
  V60 — Phase 2 of the forecasting reshape: new summary_channel_forecast table (one row per (as_of_date, horizon_days, forecast_type) over horizons 7/14/30/90 and types subscribers/daily_views). OLS slope/intercept on a trailing 28-day window when channel cadence classifies as high, 56 days otherwise; bootstrap bands (B=200) from a seeded Mulberry32 PRNG keyed on the input (x, y) tuples so reruns over identical input produce byte-identical bands. The daily_views series is pre-smoothed with a rolling 7-day mean to suppress day-of-week noise. Confidence tier collapses to "insufficient" on samples shorter than 14 days, on bands wider than the point estimate, and on non-negative series whose lower bound dips below zero — surfaces honestly degrade to "too volatile to project usefully" copy at those points. Reader at dashboard/src/lib/forecast/channel.ts; first consumer is the +14-day view-band line on <ForecastHeadline>.


created_at: 2026-05-12T00:00:01.000Z
description:
  V61 — Phase 10 of the forecasting reshape: new summary_channel_regime_forecast table (one row per as_of_date). Pair-bootstrap OLS slopes on the trailing 21-day window of classifier-input features in event_channel_state_change; B=200 resamples with a seeded Mulberry32 PRNG so reruns over identical input produce byte-identical bands. Features whose bootstrap slope CI does not straddle zero AND whose |slope| clears the 1e-5 floor count as "moving meaningfully"; fewer than 2 such features collapses the row to confidence=insufficient with NULL projected_state. Otherwise the writer projects each numeric feature forward at its OLS slope (bounded01 / nonNegative / integer clamps applied) and re-classifies day-by-day for up to 60 days. Bootstrap-resampled slopes drive a distribution of (transition_day, projected_state) pairs; the modal projected state and the median / 10th / 90th percentile of transition days within that mode become projected_state / expected_days / expected_days_low / _high. contributing_features_json carries the (name, slope_per_day, current_value, ci_low, ci_high) tuples for each meaningfully-moving feature so consumers can render the driven-by-X-and-Y sentence honestly. classifier_version pins the v1 classifier so future bumps to the state-classifier (in compute-channel-state-log.js) are observable downstream. Reader at dashboard/src/lib/forecast/regime.ts; first consumer is the <WatchOutCard> on the home page.


created_at: 2026-05-13T00:00:00.000Z
description:
  V62 — Phase 2 of the Forecast Coherence Pass: usable_for_projection INTEGER NOT NULL DEFAULT 0 on summary_video_decay_model. The flag is 1 when the fitted decay model is good enough to inform a channel-scope projection (R² ≥ 0.5, sample ≥ 21 days, fit age ≤ 90 days), 0 otherwise. Stricter than the per-video R² ≥ 0.7 "fire an insight" gate that already shipped in detectDecayProjection — usability is the looser "input the catalog-share computation can read" bar, sitting as a strict subset of the per-video fire gate. The catalog-shape branch of detectDecayProjection now filters by usable_for_projection = 1, so noisy R² ≈ 0.05 fits stop being counted toward catalog_decay_concentration. The per-video fire gate at R² ≥ 0.7 is unchanged. Reader at dashboard/src/lib/db/analytical.ts; first consumer is dashboard/src/lib/insights/detectors/decay-projection.ts.


created_at: 2026-05-13T01:00:00.000Z
description:
  V63 — Phase 4 of the Forecast Coherence Pass: historical_band_coverage REAL and historical_hit_rate REAL on summary_channel_forecast. After the calibration ledger materializes for the build, compute-forecast-calibration.js back-writes per-(forecast_type, horizon_days) coverage = inside-band fraction over the trailing window of up to 10 resolved entries whose inside_band is non-null; hit_rate = fraction with error_pct ≤ 20 over the trailing window of up to 10 entries whose error_pct is non-null. Both columns stay NULL until at least 5 such entries exist on the cell (small-sample floor, picked over a stricter N≥10 so cells with 6–13 historical resolutions can self-report honestly). The dashboard reader at lib/forecast/channel.ts picks them up; assessForecastUsability demotes confident → directional when historical_band_coverage is non-null AND below 0.5, applying VOICE.md's calibration honesty rule at the per-(metric, horizon) cell rather than only the channel-wide strip.


created_at: 2026-05-13T02:00:00.000Z
description:
  V64 — Phase 2 of the Backfill Pass: snapshot_date TEXT NOT NULL extended onto the primary key of every entity-grain derived table so the public DB can carry rows for every historical reporting cutoff (not just the latest). 28 tables affected: summary_channel, summary_video, summary_channel_traffic, summary_video_traffic, summary_video_country_lifetime, summary_video_trajectory_cone, summary_video_nearest_peers, summary_video_decay_model, summary_threshold_projection, summary_era, video_era, summary_traffic_top_videos_by_source, summary_channel_country_trailing30, cohort_video_traffic_age_window, cohort_video_geography_age_window, cohort_video_launch_age_window, cohort_video_change_verdict, cohort_channel_change_verdict, summary_channel_cohort, summary_channel_country_cohort_stability, summary_channel_source_leading_indicator, summary_video_launch_context, video_current_state, event_video_phase_transition, event_creator_edit, app_detector_activity, summary_field_co_change, summary_edit_view_position. Two autoincrement-id event tables get stable event_key surgery: channel_timeline_event gains event_key TEXT NOT NULL (SHA-1 of event_type|event_date|detector|video_id|headline) with PK (event_key, snapshot_date); event_creator_edit extends its natural key with snapshot_date. summary_channel_forecast and summary_channel_regime_forecast already carry as_of_date in their PK and remain unchanged. Phase 2 still writes a single snapshot per build (snapshot_date = latestDataDate); Phase 3 wires the walker. snapshot_date matches the reporting cutoff at the time of computation (YouTube reporting lag of 2–3 days means snapshot_date IS NOT calendar date).


created_at: 2026-06-12T00:00:00.000Z
description:
  V65 — Stage 3 pool tables (R17 / D2.3; relaunch/specs/stage3.md §8). Two new app-layer derived tables computed from the consent-gated pool-input extract (the ONLY pool input the build sees — corpus/corpus-extract.js emits it; the build never reads Parquet, registry, or manifest): app_pool_cell_stat ((cell_key, metric, snapshot_date) — the withholding gate's bookkeeping plus lit aggregates: gate_state, rung, floored member_band, seeded-noise cell_median/cell_p25/cell_p75, and pooled_estimate stored only where publication is un-noised; withheld rows carry NULL in every value column; exactly one row per (metric, snapshot_date) — the subject's deciding cohort cell) and app_pool_named_peer ((peer_contributor_id, snapshot_date) — the named side-by-side rows: public-dashboard-class facts for every channel currently public AND pool-consented, identical in every channel's DB). Both tables are fully re-derived every build across all walker dates (TRUNCATE + rebuild — consent purge by construction, D-10) and are EMPTY when no pool-input extract is supplied (fixture and local builds). All stamps bind to asOfDate, never now(); the only randomness is the deterministic seeded plus/minus-2-percent noise, a pure function of the extract.


# data_status

metric_type: reporting_timezone
source: America/Los_Angeles
contributor_id: contributor-001
notes:
  YouTube reporting rolls up to calendar days in PT (America/Los_Angeles), not your local timezone. A "day" in this dataset is a calendar day in PT.


# traffic_source

api_name: NO_LINK_OTHER
display_name: Direct / Unknown
category: direct
description:
  Direct visits or unknown sources. Catch-all when YouTube can't attribute the view to a specific surface.


api_name: ANNOTATION
display_name: Cards / Annotations
category: interactive
description:
  Legacy in-video annotation overlay (deprecated by YouTube — surfaces only on archival annotated videos).


# channel_timeline_event

event_key: 1c751f6357841ab8
date: 2026-06-02
event_type: audience_expansion
detector: audience_expansion
headline: Canada crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-02
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"CA","share_at_crossing":0.5,"first_view_date":"2026-06-02"}


event_key: fb18821ff218adcd
date: 2026-06-02
event_type: audience_expansion
detector: audience_expansion
headline: Norway crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-02
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"NO","share_at_crossing":0.5,"first_view_date":"2026-06-02"}


event_key: 78be511604f017a3
date: 2026-06-02
event_type: audience_expansion
detector: audience_expansion
headline: Australia crossed 5% of views on Video 3
direction: positive
video_id: 8ryAHK866uk
snapshot_date: 2026-06-02
evidence_json:
  {"scope":"video","video_id":"8ryAHK866uk","country_code":"AU","share_at_crossing":0.3333,"first_view_date":"2026-06-02"}


event_key: 79c19a3f43f3abe0
date: 2026-06-02
event_type: audience_expansion
detector: audience_expansion
headline: Norway crossed 5% of views on Video 3
direction: positive
video_id: 8ryAHK866uk
snapshot_date: 2026-06-02
evidence_json:
  {"scope":"video","video_id":"8ryAHK866uk","country_code":"NO","share_at_crossing":0.6667,"first_view_date":"2026-06-02"}


event_key: 419f6f4173ffd1f9
date: 2026-06-02
event_type: audience_expansion
detector: audience_expansion
headline: Australia crossed 5% of views on Video 1
direction: positive
video_id: ZT8HL3zFpMk
snapshot_date: 2026-06-02
evidence_json:
  {"scope":"video","video_id":"ZT8HL3zFpMk","country_code":"AU","share_at_crossing":0.5,"first_view_date":"2026-06-02"}


event_key: c2a9795020f7a89f
date: 2026-06-02
event_type: audience_expansion
detector: audience_expansion
headline: Latvia crossed 5% of views on Video 1
direction: positive
video_id: ZT8HL3zFpMk
snapshot_date: 2026-06-02
evidence_json:
  {"scope":"video","video_id":"ZT8HL3zFpMk","country_code":"LV","share_at_crossing":0.5,"first_view_date":"2026-06-02"}


event_key: ab8f147dfbecbbcc
date: 2026-06-03
event_type: audience_expansion
detector: audience_expansion
headline: Brazil crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-03
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"BR","share_at_crossing":0.3333,"first_view_date":"2026-06-03"}


event_key: 5c464d86d8403044
date: 2026-06-04
event_type: audience_expansion
detector: audience_expansion
headline: New Zealand crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-04
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"NZ","share_at_crossing":0.2,"first_view_date":"2026-06-04"}


event_key: 1ac8e677f625c49d
date: 2026-06-04
event_type: audience_expansion
detector: audience_expansion
headline: United States crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-04
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"US","share_at_crossing":0.2,"first_view_date":"2026-06-04"}


event_key: 703546ea5b124994
date: 2026-06-04
event_type: audience_expansion
detector: audience_expansion
headline: United States crossed 5% of views on Video 5
direction: positive
video_id: nLS8-gG7OoM
snapshot_date: 2026-06-04
evidence_json:
  {"scope":"video","video_id":"nLS8-gG7OoM","country_code":"US","share_at_crossing":1,"first_view_date":"2026-06-04"}


event_key: 3d8965c10d19720b
date: 2026-06-04
event_type: audience_expansion
detector: audience_expansion
headline: India crossed 5% of views on Video 4
direction: positive
video_id: yjcQSmjv318
snapshot_date: 2026-06-04
evidence_json:
  {"scope":"video","video_id":"yjcQSmjv318","country_code":"IN","share_at_crossing":1,"first_view_date":"2026-06-04"}


event_key: d138752695d9c985
date: 2026-06-05
event_type: rank_change
detector: source_lead
headline: Suggested Videos overtook YouTube Search in weekly views
detail: 12 vs 1 over the trailing 7 days
direction: notable
snapshot_date: 2026-06-05
evidence_json:
  {"kind":"source_lead","prior_leader":"5","new_leader":"7","prior_value":1,"new_value":12,"prior_label":"YouTube Search","new_label":"Suggested Videos"}


event_key: 512ce1f779ac6279
date: 2026-06-05
event_type: audience_expansion
detector: audience_expansion
headline: Australia crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-05
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"AU","share_at_crossing":0.1667,"first_view_date":"2026-06-05"}


event_key: 09c4ef5f58720ab5
date: 2026-06-05
event_type: audience_expansion
detector: audience_expansion
headline: United States crossed 5% of views on Video 6
direction: positive
video_id: UAP9-V7jorA
snapshot_date: 2026-06-05
evidence_json:
  {"scope":"video","video_id":"UAP9-V7jorA","country_code":"US","share_at_crossing":1,"first_view_date":"2026-06-05"}


event_key: 8b0a25b46a4dc676
date: 2026-06-05
event_type: audience_expansion
detector: audience_expansion
headline: Cyprus crossed 5% of views on Video 1
direction: positive
video_id: ZT8HL3zFpMk
snapshot_date: 2026-06-05
evidence_json:
  {"scope":"video","video_id":"ZT8HL3zFpMk","country_code":"CY","share_at_crossing":0.3333,"first_view_date":"2026-06-05"}


event_key: 24c112dc8b313827
date: 2026-06-05
event_type: audience_expansion
detector: audience_expansion
headline: United Kingdom crossed 5% of views on Video 5
direction: positive
video_id: nLS8-gG7OoM
snapshot_date: 2026-06-05
evidence_json:
  {"scope":"video","video_id":"nLS8-gG7OoM","country_code":"GB","share_at_crossing":0.3333,"first_view_date":"2026-06-05"}


event_key: 3bdb331973902264
date: 2026-06-06
event_type: audience_expansion
detector: audience_expansion
headline: United States crossed 5% of views on Video 3
direction: positive
video_id: 8ryAHK866uk
snapshot_date: 2026-06-06
evidence_json:
  {"scope":"video","video_id":"8ryAHK866uk","country_code":"US","share_at_crossing":0.25,"first_view_date":"2026-06-06"}


event_key: 0968b3a8d53b1f6a
date: 2026-06-06
event_type: audience_expansion
detector: audience_expansion
headline: India crossed 5% of views on Video 7
direction: positive
video_id: R-dcgx4mdi4
snapshot_date: 2026-06-06
evidence_json:
  {"scope":"video","video_id":"R-dcgx4mdi4","country_code":"IN","share_at_crossing":1,"first_view_date":"2026-06-06"}


event_key: 586e09ad961ed134
date: 2026-06-06
event_type: audience_expansion
detector: audience_expansion
headline: Netherlands crossed 5% of views on Video 5
direction: positive
video_id: nLS8-gG7OoM
snapshot_date: 2026-06-06
evidence_json:
  {"scope":"video","video_id":"nLS8-gG7OoM","country_code":"NL","share_at_crossing":0.1667,"first_view_date":"2026-06-06"}


event_key: fc348d68f0fa2afd
date: 2026-06-06
event_type: audience_expansion
detector: audience_expansion
headline: Nepal crossed 5% of views on Video 5
direction: positive
video_id: nLS8-gG7OoM
snapshot_date: 2026-06-06
evidence_json:
  {"scope":"video","video_id":"nLS8-gG7OoM","country_code":"NP","share_at_crossing":0.1667,"first_view_date":"2026-06-06"}


event_key: 41142fe4a4798771
date: 2026-06-06
event_type: stage_transition
detector: stage_transition
headline: Video 1: peak -> tail
direction: neutral
video_id: ZT8HL3zFpMk
snapshot_date: 2026-06-06
evidence_json:
  {"video_id":"ZT8HL3zFpMk","old_stage":"peak","new_stage":"tail","days_in_old_stage":2,"magnitude":128.57142857142856,"views_3d_before":0.3333333333333333,"views_3d_after":0,"views_rate_change_pct":-100}


event_key: d4d56e3e07ccffc0
date: 2026-06-07
event_type: audience_expansion
detector: audience_expansion
headline: Chile crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-07
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"CL","share_at_crossing":0.2308,"first_view_date":"2026-06-07"}


event_key: cfe11a9b0e94f0f9
date: 2026-06-07
event_type: audience_expansion
detector: audience_expansion
headline: United Arab Emirates crossed 5% of views on Video 7
direction: positive
video_id: R-dcgx4mdi4
snapshot_date: 2026-06-07
evidence_json:
  {"scope":"video","video_id":"R-dcgx4mdi4","country_code":"AE","share_at_crossing":0.5,"first_view_date":"2026-06-07"}


event_key: 66d071896523f388
date: 2026-06-07
event_type: audience_expansion
detector: audience_expansion
headline: United Arab Emirates crossed 5% of views on Video 6
direction: positive
video_id: UAP9-V7jorA
snapshot_date: 2026-06-07
evidence_json:
  {"scope":"video","video_id":"UAP9-V7jorA","country_code":"AE","share_at_crossing":0.4,"first_view_date":"2026-06-07"}


event_key: 64de9ce8dd09b477
date: 2026-06-07
event_type: audience_expansion
detector: audience_expansion
headline: Pakistan crossed 5% of views on Video 6
direction: positive
video_id: UAP9-V7jorA
snapshot_date: 2026-06-07
evidence_json:
  {"scope":"video","video_id":"UAP9-V7jorA","country_code":"PK","share_at_crossing":0.2,"first_view_date":"2026-06-07"}


event_key: d2ba88e8cf28f4a7
date: 2026-06-07
event_type: multi_video_activation
detector: multi_video_activation
headline: Three videos at once, 2026-06-07
direction: positive
snapshot_date: 2026-06-07
evidence_json:
  {"videos":[{"video_id":"UAP9-V7jorA","lift_x":4.5,"today_views":3},{"video_id":"1Hw_e3Aev3M","lift_x":3.75,"today_views":5},{"video_id":"R-dcgx4mdi4","lift_x":2,"today_views":1}],"activation_count":3}


event_key: 3d6a0003c3c356cd
date: 2026-06-08
event_type: audience_expansion
detector: audience_expansion
headline: United Kingdom crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-08
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"GB","share_at_crossing":0.0667,"first_view_date":"2026-06-08"}


event_key: 9e3f242f3ef7d377
date: 2026-06-08
event_type: audience_expansion
detector: audience_expansion
headline: Australia crossed 5% of views on Video 4
direction: positive
video_id: yjcQSmjv318
snapshot_date: 2026-06-08
evidence_json:
  {"scope":"video","video_id":"yjcQSmjv318","country_code":"AU","share_at_crossing":0.5,"first_view_date":"2026-06-08"}


event_key: 21b6956b76c53681
date: 2026-06-09
event_type: audience_expansion
detector: audience_expansion
headline: United Arab Emirates crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-09
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"AE","share_at_crossing":0.0588,"first_view_date":"2026-06-09"}


event_key: f0668994836eede7
date: 2026-06-09
event_type: audience_expansion
detector: audience_expansion
headline: Switzerland crossed 5% of views on Video 2
direction: positive
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-09
evidence_json:
  {"scope":"video","video_id":"1Hw_e3Aev3M","country_code":"CH","share_at_crossing":0.0588,"first_view_date":"2026-06-09"}


event_key: 8a3916040fa435b6
date: 2026-06-09
event_type: audience_expansion
detector: audience_expansion
headline: Mexico crossed 5% of views on Video 8
direction: positive
video_id: VIE0_D9d59U
snapshot_date: 2026-06-09
evidence_json:
  {"scope":"video","video_id":"VIE0_D9d59U","country_code":"MX","share_at_crossing":1,"first_view_date":"2026-06-09"}


event_key: faa8dfda4452770d
date: 2026-06-10
event_type: audience_expansion
detector: audience_expansion
headline: Mauritius crossed 5% of views on Video 6
direction: positive
video_id: UAP9-V7jorA
snapshot_date: 2026-06-10
evidence_json:
  {"scope":"video","video_id":"UAP9-V7jorA","country_code":"MU","share_at_crossing":0.1111,"first_view_date":"2026-06-10"}


event_key: 2d51cf402d70925e
date: 2026-06-10
event_type: audience_expansion
detector: audience_expansion
headline: Taiwan crossed 5% of views on Video 5
direction: positive
video_id: nLS8-gG7OoM
snapshot_date: 2026-06-10
evidence_json:
  {"scope":"video","video_id":"nLS8-gG7OoM","country_code":"TW","share_at_crossing":0.1111,"first_view_date":"2026-06-10"}


event_key: 921627ef297afac1
date: 2026-06-11
event_type: stage_transition
detector: stage_transition
headline: Video 2: peak -> tail
direction: neutral
video_id: 1Hw_e3Aev3M
snapshot_date: 2026-06-11
evidence_json:
  {"video_id":"1Hw_e3Aev3M","old_stage":"peak","new_stage":"tail","days_in_old_stage":7,"magnitude":200,"views_3d_before":2,"views_3d_after":0,"views_rate_change_pct":-100}


event_key: 2342d5abfb71a13c
date: 2026-06-11
event_type: cohort_lift
detector: cohort_lift
headline: Videos from week 2026-W23 are climbing
direction: positive
snapshot_date: 2026-06-11
evidence_json:
  {"week":"2026-W23","cohort_video_ids":["UAP9-V7jorA","R-dcgx4mdi4","nLS8-gG7OoM","yjcQSmjv318","ZT8HL3zFpMk","1Hw_e3Aev3M","8ryAHK866uk"],"cohort_size":7,"trailing_median_views":2,"prior_median_views":2,"lift_pct":33,"older_cohort_trailing_median":0,"older_cohort_prior_median":0}


# app_insight_snapshot

snapshot_date: 2026-05-31
insight_key: source_quality
insight_id: source_quality
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: Suggested Videos viewers watch longer than Direct / Unknown
generated_at: 2026-05-31T00:00:00Z
signal_family: traffic
contributor_id: contributor-001
body:
  Viewers from Suggested Videos watch about 3.7 min/view on this channel; viewers from Direct / Unknown watch about 0.9 min/view.

context:
  Different surfaces tend to attract different viewer intents — watch-time-per-view is one signal for how well each surface's audience is matching the content.

evidence_json:
  {"bestSource":"Suggested Videos","bestWatchPerView":3.72,"bestViews":26,"worstSource":"Direct / Unknown","worstWatchPerView":0.92,"worstViews":5,"qualityRatio":4.06}


snapshot_date: 2026-06-01
insight_key: source_quality
insight_id: source_quality
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: Watch time on Suggested Videos exceeds Direct / Unknown
generated_at: 2026-06-01T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: traffic
contributor_id: contributor-001
body:
  Per-view watch time on this channel: about 3.7 min from Suggested Videos viewers, about 0.9 min from Direct / Unknown viewers.

context:
  Different surfaces tend to attract different viewer intents — watch-time-per-view is one signal for how well each surface's audience is matching the content.

evidence_json:
  {"bestSource":"Suggested Videos","bestWatchPerView":3.72,"bestViews":26,"worstSource":"Direct / Unknown","worstWatchPerView":0.92,"worstViews":5,"qualityRatio":4.06}


snapshot_date: 2026-06-02
insight_key: emerging_signal-suggested-videos-channel-pattern
insight_id: emerging_signal-suggested-videos-channel-pattern
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: Suggested Videos active across 3 videos
evidence_json: {"source":"Suggested Videos","videoCount":3,"totalViews":5,"date":"2026-06-02","shape":"pattern"}
generated_at: 2026-06-02T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: traffic
contributor_id: contributor-001
body:
  On Jun 2, 2026, 3 videos on this channel each picked up a little Suggested Videos traffic — 5 views across all of them. Thin per video, but the spread is the signal: the surface is live for the channel.

context:
  Suggested Videos is YouTube matching these videos to viewers who watched something similar — usually where early traction shows up for newer channels. At per-video counts this thin, any one video could be noise. What's notable is the spread across videos — the surface is active for this channel at all.


snapshot_date: 2026-06-03
insight_key: source_quality
insight_id: source_quality
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: Suggested Videos and Direct / Unknown viewers watch at different lengths
generated_at: 2026-06-03T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: traffic
contributor_id: contributor-001
body:
  On this channel, Suggested Videos sends viewers who watch about 3.7 min/view; Direct / Unknown sends viewers who watch about 0.9 min/view.

context:
[cell repeats an earlier one in this file: 157 characters]

evidence_json:
[cell repeats an earlier one in this file: 165 characters]


snapshot_date: 2026-06-03
insight_key: cadence_characterization
insight_id: cadence_characterization
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Daily publishing cadence
body: A steady every-day pace: 10 public videos across 3 release dates so far.
generated_at: 2026-06-03T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: catalog_shape
contributor_id: contributor-001
context:
  Daily publishing is a legible rhythm — it doesn't guarantee traction, but it tends to give YouTube a steadier stream of signals to match to viewers.

evidence_json:
  {"shape":"cadence_characterization","pattern":"daily","medianGapDays":1,"sigmaGapDays":0,"streakDays":3,"videos":10}


snapshot_date: 2026-06-04
insight_key: cadence_characterization
insight_id: cadence_characterization
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: This channel publishes daily
body: 10 public videos across 4 distinct release dates — a near-daily cadence on this channel.
generated_at: 2026-06-04T00:00:00Z
freshness_status: UPDATED
freshness_reason: significance down 26 → 20
signal_family: catalog_shape
contributor_id: contributor-001
context:
  Daily publishing is a legible rhythm — it doesn't guarantee traction, but it tends to give YouTube a steadier stream of signals to match to viewers.

evidence_json:
  {"shape":"cadence_characterization","pattern":"daily","medianGapDays":1,"sigmaGapDays":0,"streakDays":4,"videos":10}


snapshot_date: 2026-06-05
insight_key: first_milestone-subscribers
insight_id: first_milestone-subscribers
detector_name: first_milestone
insight_category: momentum
subject_type: channel
direction: positive
certainty: signal
title: First 2 subscribers on a daily publishing pace
body: On a daily publishing cadence, this channel has earned its first 2 subscribers from 2 videos.
generated_at: 2026-06-05T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: milestone
contributor_id: contributor-001
context:
  First subscribers on a steady-cadence channel often come from viewers who saw the channel more than once before subscribing — so they tend to reflect return-visit pacing as much as any one video's depth.

evidence_json:
  {"milestone":"first_subscribers","channelSubscribers":2,"totalSubs":2,"fromChannelPage":0,"videosContributing":2}


snapshot_date: 2026-06-05
insight_key: emerging_signal-suggested-videos-channel-pattern
insight_id: emerging_signal-suggested-videos-channel-pattern
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: 3 videos picking up Suggested Videos traffic
evidence_json: {"source":"Suggested Videos","videoCount":3,"totalViews":3,"date":"2026-06-05","shape":"pattern"}
generated_at: 2026-06-05T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: traffic
contributor_id: contributor-001
body:
  3 videos on this channel drew 3 total views from Suggested Videos on Jun 5, 2026. Not a standout video — a surface reaching the catalog broadly.

context:
  Suggested Videos is YouTube matching these videos to viewers who watched something similar — usually where early traction shows up for newer channels. At per-video counts this thin, any one video could be noise. What's notable is the spread across videos — the surface is active for this channel at all.


snapshot_date: 2026-06-05
insight_key: cadence_characterization
insight_id: cadence_characterization
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Daily publishing cadence
body: A steady every-day pace: 10 public videos across 5 release dates so far.
generated_at: 2026-06-05T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: catalog_shape
contributor_id: contributor-001
context:
  Daily publishing is a legible rhythm — it doesn't guarantee traction, but it tends to give YouTube a steadier stream of signals to match to viewers.

evidence_json:
  {"shape":"cadence_characterization","pattern":"daily","medianGapDays":1,"sigmaGapDays":0,"streakDays":5,"videos":10}


snapshot_date: 2026-06-05
insight_key: seedling_growth_arc
insight_id: seedling_growth_arc
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Phase for this channel: earliest seedling
generated_at: 2026-06-05T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: momentum
contributor_id: contributor-001
body:
  This channel has 8 videos live and 6 days of data. Recent week: 3.4 views/day on average, +2 net subscribers.

context:
  Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.

evidence_json:
  {"arcPosition":"earliest seedling","videoCount":8,"daysTracked":6,"currentSubs":2,"recent7DayViews":17,"recent7DayNetSubs":2,"dailyViewsAvg":3.4,"bodyText":"This channel has 8 videos live and 6 days of data. Recent week: 3.4 views/day on average, +2 net subscribers.","contextText":"Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.","patternLabel":"Channel in earliest seedling phase"}


snapshot_date: 2026-06-06
insight_key: emerging_signal-suggested-videos-channel-pattern
insight_id: emerging_signal-suggested-videos-channel-pattern
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: 3 videos picking up Suggested Videos traffic
evidence_json: {"source":"Suggested Videos","videoCount":3,"totalViews":4,"date":"2026-06-06","shape":"pattern"}
generated_at: 2026-06-06T00:00:00Z
freshness_status: UPDATED
freshness_reason: significance down 49 → 38
signal_family: traffic
contributor_id: contributor-001
body:
  3 videos on this channel drew 4 total views from Suggested Videos on Jun 6, 2026. Not a standout video — a surface reaching the catalog broadly.

context:
  Suggested Videos is YouTube matching these videos to viewers who watched something similar — usually where early traction shows up for newer channels. At per-video counts this thin, any one video could be noise. What's notable is the spread across videos — the surface is active for this channel at all.


snapshot_date: 2026-06-06
insight_key: seedling_growth_arc
insight_id: seedling_growth_arc
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Channel in earliest seedling phase
generated_at: 2026-06-06T00:00:00Z
freshness_status: UPDATED
freshness_reason: significance down 17 → 14
signal_family: momentum
contributor_id: contributor-001
body:
  This channel has 8 videos live and 7 days of data. Recent week: 4.17 views/day on average, +2 net subscribers.

context:
  Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.

evidence_json:
  {"arcPosition":"earliest seedling","videoCount":8,"daysTracked":7,"currentSubs":2,"recent7DayViews":25,"recent7DayNetSubs":2,"dailyViewsAvg":4.17,"bodyText":"This channel has 8 videos live and 7 days of data. Recent week: 4.17 views/day on average, +2 net subscribers.","contextText":"Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.","patternLabel":"Channel in earliest seedling phase"}


snapshot_date: 2026-06-07
insight_key: first_milestone-subscribers
insight_id: first_milestone-subscribers
detector_name: first_milestone
insight_category: momentum
subject_type: channel
direction: positive
certainty: signal
title: First 2 subscribers on a daily publishing pace
body: On a daily publishing cadence, this channel has earned its first 2 subscribers from 3 videos.
generated_at: 2026-06-07T00:00:00Z
freshness_status: UPDATED
freshness_reason: underlying numbers moved
signal_family: milestone
contributor_id: contributor-001
context:
  First subscribers on a steady-cadence channel often come from viewers who saw the channel more than once before subscribing — so they tend to reflect return-visit pacing as much as any one video's depth.

evidence_json:
  {"milestone":"first_subscribers","channelSubscribers":2,"totalSubs":3,"fromChannelPage":0,"videosContributing":3}


snapshot_date: 2026-06-07
insight_key: catalog_traction
insight_id: catalog_traction
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: 1 of 8 videos have found an audience
evidence_json: {"shape":"catalog_traction","below":7,"total":8,"threshold":10,"maturityStage":"seedling"}
generated_at: 2026-06-07T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: catalog_shape
contributor_id: contributor-001
body:
  1 of this channel's 8 videos have crossed 10 views; the other 7 haven't yet. That's the shape of the catalog right now — a part that has landed and a part that's still quiet.

context:
  A working core plus a longer quiet tail is the usual shape as a catalog grows — most channels carry videos that never break out, and that's typical rather than a verdict on any single one.


snapshot_date: 2026-06-07
insight_key: seedling_growth_arc
insight_id: seedling_growth_arc
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Current phase: earliest seedling
generated_at: 2026-06-07T00:00:00Z
freshness_status: UPDATED
freshness_reason: significance up 13 → 16
signal_family: momentum
contributor_id: contributor-001
body:
  This channel has 8 videos live and 8 days of data. Recent week: 4.86 views/day on average, +3 net subscribers.

context:
  Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.

evidence_json:
  {"arcPosition":"earliest seedling","videoCount":8,"daysTracked":8,"currentSubs":2,"recent7DayViews":34,"recent7DayNetSubs":3,"dailyViewsAvg":4.86,"bodyText":"This channel has 8 videos live and 8 days of data. Recent week: 4.86 views/day on average, +3 net subscribers.","contextText":"Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.","patternLabel":"Channel in earliest seedling phase"}


snapshot_date: 2026-06-07
insight_key: shape:channel
insight_id: shape-2026-06-07
detector_name: channel_shape
insight_category: shape
subject_type: channel
direction: neutral
certainty: signal
title: Channel shape
generated_at: 2026-06-07T00:00:00Z
contributor_id: contributor-001
evidence_json:
  {"concentration":null,"traction":{"below":7,"total":8,"threshold":10},"cadence":"daily","iterationIntensity":"never"}


snapshot_date: 2026-06-08
insight_key: first_milestone-subscribers
insight_id: first_milestone-subscribers
detector_name: first_milestone
insight_category: momentum
subject_type: channel
direction: positive
certainty: signal
title: First 3 subscribers on a daily publishing pace
body: On a daily publishing cadence, this channel has earned its first 3 subscribers from 3 videos.
generated_at: 2026-06-08T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: milestone
contributor_id: contributor-001
context:
[cell repeats an earlier one in this file: 203 characters]

evidence_json:
  {"milestone":"first_subscribers","channelSubscribers":3,"totalSubs":3,"fromChannelPage":0,"videosContributing":3}


snapshot_date: 2026-06-08
insight_key: emerging_signal-suggested-videos-channel-pattern
insight_id: emerging_signal-suggested-videos-channel-pattern
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: Suggested Videos touching 4 videos this window
evidence_json: {"source":"Suggested Videos","videoCount":4,"totalViews":5,"date":"2026-06-08","shape":"pattern"}
generated_at: 2026-06-08T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: traffic
contributor_id: contributor-001
body:
  4 videos on this channel each saw some Suggested Videos views on Jun 8, 2026 — 5 views combined. Spread this wide and this thin reads as the surface waking up for the channel.

context:
[cell repeats an earlier one in this file: 303 characters]


snapshot_date: 2026-06-08
insight_key: catalog_traction
insight_id: catalog_traction
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: 9 of 10 videos still under 10 views
evidence_json: {"shape":"catalog_traction","below":9,"total":10,"threshold":10,"maturityStage":"seedling"}
generated_at: 2026-06-08T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: catalog_shape
contributor_id: contributor-001
body:
  9 of this channel's 10 videos remain under 10 views so far, while 1 have crossed it — a working core and a quieter tail.

context:
  A working core plus a longer quiet tail is the usual shape as a catalog grows — most channels carry videos that never break out, and that's typical rather than a verdict on any single one.


snapshot_date: 2026-06-08
insight_key: cadence_characterization
insight_id: cadence_characterization
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: This channel publishes daily
body: 10 public videos across 6 distinct release dates — a near-daily cadence on this channel.
generated_at: 2026-06-08T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: catalog_shape
contributor_id: contributor-001
context:
[cell repeats an earlier one in this file: 148 characters]

evidence_json:
  {"shape":"cadence_characterization","pattern":"daily","medianGapDays":1,"sigmaGapDays":0.8,"streakDays":6,"videos":10}


snapshot_date: 2026-06-08
insight_key: seedling_growth_arc
insight_id: seedling_growth_arc
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Current phase: earliest seedling
generated_at: 2026-06-08T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: momentum
contributor_id: contributor-001
body:
  This channel has 10 videos live and 9 days of data. Recent week: 5.71 views/day on average, +3 net subscribers.

context:
[cell repeats an earlier one in this file: 356 characters]

evidence_json:
  {"arcPosition":"earliest seedling","videoCount":10,"daysTracked":9,"currentSubs":3,"recent7DayViews":40,"recent7DayNetSubs":3,"dailyViewsAvg":5.71,"bodyText":"This channel has 10 videos live and 9 days of data. Recent week: 5.71 views/day on average, +3 net subscribers.","contextText":"Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.","patternLabel":"Channel in earliest seedling phase"}


snapshot_date: 2026-06-08
insight_key: shape:channel
insight_id: shape-2026-06-08
detector_name: channel_shape
insight_category: shape
subject_type: channel
direction: neutral
certainty: signal
title: Channel shape
generated_at: 2026-06-08T00:00:00Z
contributor_id: contributor-001
evidence_json:
  {"concentration":null,"traction":{"below":9,"total":10,"threshold":10},"cadence":"daily","iterationIntensity":"never"}


snapshot_date: 2026-06-09
insight_key: emerging_signal-suggested-videos-channel-pattern
insight_id: emerging_signal-suggested-videos-channel-pattern
detector_name: emerging_signal
insight_category: traffic_shift
subject_type: channel
direction: notable
certainty: signal
title: 3 videos picking up Suggested Videos traffic
evidence_json: {"source":"Suggested Videos","videoCount":3,"totalViews":7,"date":"2026-06-09","shape":"pattern"}
generated_at: 2026-06-09T00:00:00Z
freshness_status: UPDATED
freshness_reason: significance down 55 → 38
signal_family: traffic
contributor_id: contributor-001
body:
  3 videos on this channel drew 7 total views from Suggested Videos on Jun 9, 2026. Not a standout video — a surface reaching the catalog broadly.

context:
[cell repeats an earlier one in this file: 303 characters]


snapshot_date: 2026-06-09
insight_key: catalog_traction
insight_id: catalog_traction
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: 1 of 10 videos have found an audience
evidence_json: {"shape":"catalog_traction","below":9,"total":10,"threshold":10,"maturityStage":"seedling"}
generated_at: 2026-06-09T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: catalog_shape
contributor_id: contributor-001
body:
  1 of this channel's 10 videos have crossed 10 views; the other 9 haven't yet. That's the shape of the catalog right now — a part that has landed and a part that's still quiet.

context:
  A working core plus a longer quiet tail is the usual shape as a catalog grows — most channels carry videos that never break out, and that's typical rather than a verdict on any single one.


snapshot_date: 2026-06-09
insight_key: seedling_growth_arc
insight_id: seedling_growth_arc
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Phase for this channel: earliest seedling
generated_at: 2026-06-09T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: momentum
contributor_id: contributor-001
body:
  This channel has 10 videos live and 10 days of data. Recent week: 5.71 views/day on average, +2 net subscribers.

context:
[cell repeats an earlier one in this file: 356 characters]

evidence_json:
  {"arcPosition":"earliest seedling","videoCount":10,"daysTracked":10,"currentSubs":3,"recent7DayViews":40,"recent7DayNetSubs":2,"dailyViewsAvg":5.71,"bodyText":"This channel has 10 videos live and 10 days of data. Recent week: 5.71 views/day on average, +2 net subscribers.","contextText":"Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.","patternLabel":"Channel in earliest seedling phase"}


snapshot_date: 2026-06-10
insight_key: seedling_growth_arc
insight_id: seedling_growth_arc
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Channel in earliest seedling phase
generated_at: 2026-06-10T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: momentum
contributor_id: contributor-001
body:
  This channel has 10 videos live and 11 days of data. Recent week: 6.14 views/day on average, +2 net subscribers.

context:
[cell repeats an earlier one in this file: 356 characters]

evidence_json:
  {"arcPosition":"earliest seedling","videoCount":10,"daysTracked":11,"currentSubs":3,"recent7DayViews":43,"recent7DayNetSubs":2,"dailyViewsAvg":6.14,"bodyText":"This channel has 10 videos live and 11 days of data. Recent week: 6.14 views/day on average, +2 net subscribers.","contextText":"Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.","patternLabel":"Channel in earliest seedling phase"}


snapshot_date: 2026-06-10
insight_key: cadence_characterization
insight_id: cadence_characterization
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Daily publishing cadence
body: A steady every-day pace: 10 public videos across 7 release dates so far.
generated_at: 2026-06-10T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: catalog_shape
contributor_id: contributor-001
context:
[cell repeats an earlier one in this file: 148 characters]

evidence_json:
  {"shape":"cadence_characterization","pattern":"daily","medianGapDays":1,"sigmaGapDays":0.76,"streakDays":7,"videos":10}


snapshot_date: 2026-06-10
insight_key: subscriber_trendline
insight_id: subscriber_trendline
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: negative
certainty: signal
title: Subscribers ticking down in the last window
generated_at: 2026-06-10T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: momentum
contributor_id: contributor-001
body:
  Over the last 5 days, this channel averaged 0.20 subscribers/day — the prior 5-day window averaged 0.40/day. Running total: 3.

context:
  With a subscriber total this small, week-to-week differences are often mostly noise — worth watching across several windows before calling it a trend.

evidence_json:
  {"windowDays":5,"recentAvgPerDay":0.2,"priorAvgPerDay":0.4,"delta":-0.2,"currentSubs":3,"patternLabel":"Subscriber gain running lower recently — 0.2 / day vs 0.4 in the prior 5 days"}


snapshot_date: 2026-06-11
insight_key: cadence_shift
insight_id: cadence_shift
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: negative
certainty: signal
title: Slower pace over the last week
generated_at: 2026-06-11T00:00:00Z
freshness_status: NEW
freshness_reason: not present yesterday
signal_family: catalog_shape
contributor_id: contributor-001
body:
  Publishing eased off: 3 videos in the last 7 days, down from 6 in the prior 7 (based on upload dates, which may not match go-live dates).

context:
  Slower publishing windows usually let older videos carry the week — channel totals during a slowdown tend to lean on the existing catalog.

evidence_json:
  {"shape":"cadence_shift","direction":"slowdown","recentCount":3,"priorCount":6,"ratio":0.5,"absDelta":3,"usedFallback":1,"windowDays":7,"recentStart":"2026-06-05","priorStart":"2026-05-29","priorEnd":"2026-06-04"}


snapshot_date: 2026-06-11
insight_key: seedling_growth_arc
insight_id: seedling_growth_arc
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: neutral
certainty: signal
title: Phase for this channel: earliest seedling
generated_at: 2026-06-11T00:00:00Z
freshness_status: ONGOING
freshness_reason: stable
signal_family: momentum
contributor_id: contributor-001
body:
  This channel has 10 videos live and 12 days of data. Recent week: 5.57 views/day on average, +1 net subscribers.

context:
[cell repeats an earlier one in this file: 356 characters]

evidence_json:
  {"arcPosition":"earliest seedling","videoCount":10,"daysTracked":12,"currentSubs":3,"recent7DayViews":39,"recent7DayNetSubs":1,"dailyViewsAvg":5.57,"bodyText":"This channel has 10 videos live and 12 days of data. Recent week: 5.57 views/day on average, +1 net subscribers.","contextText":"Channels at this stage typically rely on the videos themselves and any external promotion the creator already does. New views often come slowly until viewers start finding the channel from related videos. Many channels see their first wider reach somewhere in their first 10–30 published videos, though there is substantial variation by topic and audience.","patternLabel":"Channel in earliest seedling phase"}


snapshot_date: 2026-06-11
insight_key: subscriber_trendline
insight_id: subscriber_trendline
detector_name: emerging_signal
insight_category: momentum
subject_type: channel
direction: negative
certainty: signal
title: Subscriber gain running lower recently
body: Last 5 days: 0.20 subscribers/day average, compared with 0.40/day in the prior 5. Channel total: 3.
generated_at: 2026-06-11T00:00:00Z
freshness_status: UPDATED
freshness_reason: significance down 4 → 3
signal_family: momentum
contributor_id: contributor-001
context:
  At this small a subscriber total, week-to-week differences can be mostly noise rather than a real change in pace — worth watching across more windows before calling it a trend.

evidence_json:
  {"windowDays":5,"recentAvgPerDay":0.2,"priorAvgPerDay":0.4,"delta":-0.2,"currentSubs":3,"patternLabel":"Subscriber gain running lower recently — 0.2 / day vs 0.4 in the prior 5 days"}


# channel_phase_log

date: 2026-06-06
phase: suggested_dominant
evidence_json:
  {"phase":"suggested_dominant","browsePct":0,"suggestedPct":61.5,"searchPct":3.8,"channelPct":3.8,"total_views":26}


# app_wisdom_canon

test_id: frequency_cannibalization
source_attribution: Common creator advice; cited across creator coaching channels.
default_thresholds_json: {"agrees_below": 0.7, "disagrees_above": 1.0, "min_pairs": 10}
category: publish_cadence
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: negative
belief_text:
  Publishing video N consumes impressions that would otherwise have gone to video N−1, slowing N−1's trajectory.

calculation_doc:
  For each video pair (N−1, N) where N−1 is still in days 1–7 of its
  lifecycle when N publishes, compare N−1's view trajectory in the 3 days
  after N's publish to N−1's trajectory in the 3 days before. Channel
  median of (views_3d_after / views_3d_before) across eligible pairs.


test_id: day_1_3_testing_window
source_attribution: VidIQ and TubeBuddy guides; widely repeated in creator literature.
default_thresholds_json: {"agrees_above": 0.6, "disagrees_below": 0.3, "min_videos": 5}
category: first_24h
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: neutral
belief_text:
  YouTube's algorithm tests a video primarily in its first 1–3 days, after which performance is largely set.

calculation_doc:
  For each video with ≥14 days tracked, what fraction of total lifetime
  views came from days 1–3? Channel median across qualifying videos.


test_id: first_24_48h_determines_fate
belief_text: A video's lifetime trajectory is largely determined by its first 24–48 hour performance.
source_attribution: Closely related to #2; cited as 'velocity matters'.
default_thresholds_json: {"agrees_r_above": 0.7, "disagrees_r_below": 0.3, "min_videos": 5}
category: first_24h
added_at: 2026-06-11
evidence_shape: correlation
agrees_directionality: neutral
calculation_doc:
  Pearson correlation of day1_views vs total_views across all videos with
  ≥30 days tracked. Same correlation for day1_ctr vs lifetime_weighted_ctr.
  Higher r = belief agrees on this channel.


test_id: subscribers_see_new_first
belief_text: Day-0 traffic is dominated by subscribed-state viewers.
source_attribution: Common assertion in creator coaching.
default_thresholds_json: {"agrees_above": 0.5, "disagrees_below": 0.2}
category: first_24h
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Per-video, what % of day-0 views came from subscribed-state viewers?
  Channel median. Reads from summary_video_subscribed (owner-mode only).


test_id: end_screens_drive_5_15
belief_text: End-screen impressions and clicks contribute 5–15% of traffic.
source_attribution: YouTube official help docs (creator-side guidance).
default_thresholds_json: {"agrees_min": 0.05, "agrees_max": 0.15}
category: engagement
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  end_screen_views / total_views channel-wide. Reads from per-source breakdown.
  Note: requires retention curve / cards data from Round 4 to test fully.


test_id: ctr_matters_more_than_retention
belief_text: High click-through-rate drives video success more than high retention.
source_attribution: MrBeast school of creator advice; widely contested.
default_thresholds_json: {"agrees_ratio_above": 1.5, "min_videos": 8}
category: engagement
added_at: 2026-06-11
evidence_shape: share-distribution
agrees_directionality: neutral
calculation_doc:
  Per video, scale CTR and retention to channel-relative units (each
  value's distance from the channel's median, divided by the channel's
  typical spread). Fit a linear regression of total views against both.
  If the magnitude of the CTR coefficient is at least 1.5× the retention
  coefficient, the data agrees that CTR dominates on this channel.


test_id: retention_matters_more_than_ctr
belief_text: High retention drives video success more than high click-through-rate.
source_attribution: Sean Cannell / Think Media school; opposite of #7.
default_thresholds_json: {"agrees_ratio_above": 1.5, "min_videos": 8}
category: engagement
added_at: 2026-06-11
evidence_shape: share-distribution
agrees_directionality: neutral
calculation_doc:
  Same regression as #7; agrees if |β_retention| > 1.5 × |β_ctr|. Note:
  can be `inconclusive` simultaneously with #7 if neither dominates.


test_id: mid_length_videos_optimal
belief_text: Videos 8–10 minutes long perform best for ad revenue and watch time.
source_attribution: Creator-economy folklore; pre-2018 mid-roll-ad threshold.
default_thresholds_json: {"agrees_bucket": 600, "min_videos_per_bucket": 3}
category: length
added_at: 2026-06-11
evidence_shape: count-tier
agrees_directionality: neutral
calculation_doc:
  Bucket videos by duration (60/180/360/600/1200/1800/3600+ sec). Median
  weighted CTR, AVD, retention pct, sub conversion per bucket. Agrees if
  600s bucket has the highest median weighted retention pct.


test_id: avp_50_keeps_pushing
belief_text: Videos with average view percentage above 50% receive sustained impression delivery.
source_attribution: TubeBuddy creator guides.
category: engagement
added_at: 2026-06-11
evidence_shape: count-tier
agrees_directionality: neutral
calculation_doc:
  Per video, compare impression delivery rate in days 8–14 against days 1–7.
  Bucket by retention tier (<30%, 30–50%, 50%+). Agrees if 50%+ bucket has
  impression-rate ratio ≥0.7 AND lower-retention buckets ≤0.4.

default_thresholds_json:
  {"agrees_high_retention_ratio_above": 0.7, "agrees_low_retention_ratio_below": 0.4, "min_videos_per_bucket": 3}


test_id: comments_outweigh_likes
belief_text: Comments are weighted more than likes by the algorithm.
source_attribution: Various creator coaching.
default_thresholds_json: {"agrees_ratio_above": 2.0, "min_videos": 8}
category: engagement
added_at: 2026-06-11
evidence_shape: correlation
agrees_directionality: neutral
calculation_doc:
  For videos with comparable view counts, regress impression-rate-after-day-7
  on (comments per view) and (likes per view) separately. Agrees if
  |β_comments| > 2 × |β_likes|.


test_id: title_changes_reset_algo
belief_text: Renaming a video resets its testing cycle.
source_attribution: Common YouTube growth-channel advice.
default_thresholds_json: {"agrees_drop_below": 0.5, "agrees_recovery_above": 1.0, "min_changes": 1}
category: era_changes
added_at: 2026-06-11
evidence_shape: delta
agrees_directionality: negative
calculation_doc:
  For videos with a title change, compare daily views/impressions/CTR for
  the 7 days before vs 7 days after the change. Agrees if median ratio
  drops below 0.5 then recovers above 1.0 within 14 days.


test_id: edits_hurt_performance
belief_text: Editing title or thumbnail post-publish kills momentum.
source_attribution: Conventional wisdom (the 'no-fiddle' rule).
default_thresholds_json: {"agrees_below": 0.5, "min_changes": 1}
category: era_changes
added_at: 2026-06-11
evidence_shape: delta
agrees_directionality: negative
calculation_doc:
  Same as #12, but agrees if post-change views stay ≤50% of pre-change
  baseline for 14+ days. Tests for sustained damage rather than reset+recovery.


test_id: posting_consistency_matters
belief_text: Channels that post on a consistent cadence outperform those that don't.
source_attribution: Universal creator-coaching advice.
default_thresholds_json: {"agrees_r_above": 0.3, "min_days": 90}
category: publish_cadence
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: neutral
calculation_doc:
  Cadence regularity score = the typical day-to-day spread of
  inter-publish gaps, divided by the mean gap (coefficient of
  variation). Lower = more consistent. Correlate against
  trailing-30-day view growth.


test_id: posting_too_rarely
belief_text: Long gaps between uploads cause the algorithm to deprioritize the channel.
source_attribution: Common creator coaching.
default_thresholds_json: {"agrees_below": 0.7, "min_gaps": 3}
category: publish_cadence
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: negative
calculation_doc:
  For gaps of ≥5 days between publishes, compare the post-gap video's
  day-1/day-3 performance against the channel's typical day-1/day-3.


test_id: day_30_evergreen
belief_text: Once 30 days post-publish, a video's daily view rate stabilizes and varies little.
source_attribution: Common analytics-tool framing.
default_thresholds_json: {"agrees_cov_below": 0.5, "min_videos": 3}
category: lifecycle
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: positive
calculation_doc:
  For videos ≥60 days old, coefficient of variation of daily views in
  days 30–60. Channel median. Agrees if median CoV ≤0.5.


test_id: first_video_predicts
belief_text: First video's day-30 performance correlates with month-3 channel trajectory.
source_attribution: TenfoldGrowth-style coaching.
default_thresholds_json: {"agrees_r_above": 0.5}
category: cohort
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Cross-channel only. Within-channel, capture first_video_day30_views and
  compare to channel month-3 cumulative views. Across cohort, Pearson
  correlation.


test_id: browse_from_subscribers
belief_text: Browse / Homepage impressions are weighted toward existing subscribers.
source_attribution: Common assertion; conflicts with documented YouTube guidance.
default_thresholds_json: {"agrees_above": 0.5}
category: sources
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Browse views / Browse impressions broken out by subscribed state. Agrees
  if subscribed-state share of Browse views ≥50%.


test_id: search_equals_evergreen
belief_text: Videos with growing Search-source share over time become long-term assets.
source_attribution: SEO-creator advice.
default_thresholds_json: {"agrees_above": 0.3, "min_videos": 5}
category: sources
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: positive
calculation_doc:
  Per video, slope of weekly Search-source view share over the video's
  lifetime. Channel-level: share of mature videos with positive slope.


test_id: channel_page_loyal
belief_text: Channel-page-driven views come from highly engaged viewers.
source_attribution: Common assertion.
default_thresholds_json: {"min_views_per_source": 100}
category: sources
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: positive
calculation_doc:
  Compare AVD, retention pct, sub conversion, comment rate of Channel Page
  traffic vs Suggested traffic. Agrees if all four are higher for Channel Page.


test_id: external_most_loyal
belief_text: Viewers from external sites have the highest engagement rates.
source_attribution: Common assertion.
default_thresholds_json: {"min_external_views": 100}
category: sources
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: positive
calculation_doc:
  AVD, retention, sub conversion of External vs all other sources. Agrees
  if External AVD ≥ p75 of cross-source AVD distribution. Sample-size flag
  triggers when External views < 100 channel-wide.


test_id: question_titles_higher_ctr
belief_text: Titles ending in ? outperform on click-through rate.
source_attribution: Title-optimization folklore.
default_thresholds_json: {"agrees_ratio_above": 1.2, "min_videos_per_bucket": 3}
category: titles
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Median weighted CTR for videos where title_is_question = 1 vs 0.
  Owner-mode (titles are coarsened in public).


test_id: numbers_in_titles
belief_text: Titles with numbers (5 Ways… / 3 Things…) perform better.
source_attribution: Listicle-era folklore.
default_thresholds_json: {"agrees_ratio_above": 1.2, "min_videos_per_bucket": 3}
category: titles
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Median weighted CTR and median total views for title_has_number = 1 vs 0.
  Agrees if both metrics ≥1.2× the non-numbered group.


test_id: hooks_in_first_15s
belief_text: The 0–15-second retention drop is the strongest single predictor of overall performance.
source_attribution: Hook-economy folklore.
default_thresholds_json: {"agrees_r_above": 0.7, "min_videos": 5}
category: engagement
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  From video retention curve, retention_15s_pct. Pearson correlation with
  total views and weighted_ctr_post_day_3. Agrees if r ≥0.7. Requires
  retention curve data (Round 4).


test_id: weekend_uploads_underperform
belief_text: Saturday and Sunday uploads get less engagement than weekday uploads.
source_attribution: Day-of-week folklore.
default_thresholds_json: {"min_weekend_videos": 3}
category: publish_cadence
added_at: 2026-06-11
evidence_shape: count-tier
agrees_directionality: negative
calculation_doc:
  Median weighted CTR, AVD, sub conversion for videos published on Sat/Sun
  vs Mon–Fri. Agrees if all three are lower on weekend uploads. Inconclusive
  with <10 weekend uploads.


test_id: optimal_publish_4pm
belief_text: Late-afternoon publishing optimizes day-0 reach.
source_attribution: Publishing-time folklore.
default_thresholds_json: {"min_hour_buckets_used": 3}
category: publish_cadence
added_at: 2026-06-11
evidence_shape: count-tier
agrees_directionality: neutral
calculation_doc:
  Median day-1 views by hour-of-publish. Identify mode. Agrees if mode
  falls in 14:00–18:00 local time. Many channels lock to one hour, making
  this inconclusive.


test_id: daily_upload_requires_backlog
belief_text: Channels publishing daily need pre-recorded inventory; those without it burn out.
source_attribution: Common creator advice.
default_thresholds_json: {}
category: cohort
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Cross-channel only. Cadence break frequency over time for channels
  classified as `daily`. Cohort-level: agrees if daily-cadence channels
  with ≥30-video pre-publish queue have lower break rates than ad-hoc.


test_id: thousand_subs_inflection
belief_text: Channels accelerate after 1,000 subscribers.
source_attribution: Monetization-threshold folklore.
default_thresholds_json: {"agrees_ratio_above": 1.5}
category: cohort
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Cross-channel only. Compare 30-day view growth rate before vs after
  1,000-sub milestone. Agrees if median post-1k growth is ≥1.5× pre-1k.


test_id: first_100_subs_hardest
belief_text: Days to first 100 subscribers is the slowest sub-acquisition leg.
source_attribution: Beginner-creator coaching.
default_thresholds_json: {"agrees_ratio_above": 2.0, "min_total_subs": 100}
category: subscribers
added_at: 2026-06-11
evidence_shape: count-tier
agrees_directionality: neutral
calculation_doc:
  Days from 1 sub to 100 subs vs days from 100 to 200, 200 to 300, etc.
  Channel-relative growth rates per sub-bucket. Agrees if days-per-sub
  in 0–100 is ≥2× days-per-sub in 100–500.


test_id: niche_grows_faster
belief_text: Channels with narrow topical focus outgrow broad-topic channels.
source_attribution: Niche-down folklore.
default_thresholds_json: {"agrees_r_below": -0.3}
category: cohort
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Cross-channel — needs topic similarity scoring (owner-mode titles) plus
  growth rate. Score channels by topical entropy of titles. Correlate
  with 30-day growth.


test_id: sub_view_ratio_quality
belief_text: Channels with more subs per view have more engaged audiences.
source_attribution: Engagement-quality folklore.
default_thresholds_json: {"agrees_r_above": 0.3}
category: cohort
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Cross-channel: Pearson correlation between (current_subscribers / total_views)
  and (sub conversion rate, comment rate, AVD). Agrees if all three ≥0.3.


test_id: algo_dependence_drops
belief_text: Older channels become less dependent on algorithmic recommendations.
source_attribution: Maturation-creator folklore.
default_thresholds_json: {"agrees_r_below": -0.4}
category: cohort
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  algorithmic_dependency_index (1 − sticky_traffic_ratio) vs channel age.
  Cross-channel cohort-level negative correlation at r ≤−0.4.


test_id: channel_page_share_decreases
belief_text: As library grows, Channel Page share of views falls.
source_attribution: Library-growth folklore.
default_thresholds_json: {"agrees_r_below": -0.5, "min_days": 60}
category: sources
added_at: 2026-06-11
evidence_shape: delta
agrees_directionality: neutral
calculation_doc:
  Per channel, Pearson correlation between days_since_first_video and
  trailing-7d Channel Page view share. Agrees if r ≤−0.5.


test_id: comment_rate_truest_signal
belief_text: Comments-per-view tracks audience resonance better than likes-per-view.
source_attribution: Engagement-depth folklore.
default_thresholds_json: {"min_videos": 5}
category: engagement
added_at: 2026-06-11
evidence_shape: correlation
agrees_directionality: neutral
calculation_doc:
  For each engagement metric, Pearson correlation with sub conversion rate
  at the video level. Agrees if comments/v has the highest correlation.


test_id: watch_session_length_matters
belief_text: YouTube ranks by session length, not per-video metrics.
source_attribution: Session-watch folklore (post-2018 algorithm framing).
default_thresholds_json: {}
category: engagement
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Cross-channel; requires session inference. Approximation: total channel
  watch minutes per active viewer per day. Marked low_confidence due to
  proxy nature.


test_id: end_screen_ctr_correlates_quality
belief_text: Videos with high end-screen click-through have higher overall retention.
source_attribution: End-screen optimization folklore.
default_thresholds_json: {"agrees_r_above": 0.4, "min_videos": 5}
category: engagement
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Per video, end-screen view share of total views vs lifetime weighted
  retention. Agrees if r ≥0.4. Requires Round 4 cards/end-screen data.


test_id: ctr_retention_together
belief_text: Neither click-rate nor retention alone matters; the product (or geometric mean) does.
source_attribution: Combined-quality folklore.
default_thresholds_json: {"min_videos": 8}
category: engagement
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  Define combined = sqrt(ctr_z × retention_z) per video. Regress total
  views on combined vs on CTR and retention separately. Agrees if combined-
  only regression has higher R² than either-alone.


test_id: algorithm_tests_then_scales
belief_text: Distribution happens in two phases — test (low impressions, narrow audience) then scale.
source_attribution: Two-phase-algorithm folklore.
default_thresholds_json: {"agrees_above": 0.5, "min_slope_change_x": 3.0, "min_videos": 5}
category: first_24h
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: neutral
calculation_doc:
  Per video, fit a piecewise function to the impression-by-day curve.
  Identify the 'elbow' where slope changes most. Agrees if ≥50% of
  mature videos show a detectable elbow within days 3–14.


test_id: browse_more_durable_suggested
belief_text: Browse pickups are more durable than Suggested-driven impressions.
source_attribution: Pickup-pattern folklore.
default_thresholds_json: {"agrees_ratio_above": 1.5}
category: sources
added_at: 2026-06-11
evidence_shape: not-applicable
agrees_directionality: neutral
calculation_doc:
  For videos with Browse-source rank-1 day, compare Browse impression
  decay rate to Suggested decay rate over the next 14 days. Cross-channel
  cohort baseline ideal. Agrees if Browse decay half-life > 1.5× Suggested.


test_id: ratios_stabilize_30_videos
belief_text: Once a channel has 30+ videos, key ratios (CTR, AVD, sub conversion) settle.
source_attribution: Maturation folklore.
default_thresholds_json: {"agrees_cov_drop": 0.3, "min_videos": 30}
category: cohort
added_at: 2026-06-11
evidence_shape: single-ratio
agrees_directionality: positive
calculation_doc:
  Coefficient of variation of weekly weighted CTR and AVD across the
  channel's history. Compare CoV in weeks 1–10 vs weeks 11+. Agrees if
  both CoVs drop by ≥30% after the 30-video mark.


test_id: new_uploads_steal_impressions
belief_text: A new publish steals impression budget from the rest of the catalog.
source_attribution: Catalog-cannibalization folklore.
default_thresholds_json: {"agrees_drop_above": 0.15, "min_publishes": 5}
category: publish_cadence
added_at: 2026-06-11
evidence_shape: delta
agrees_directionality: negative
calculation_doc:
  When video N publishes, change in non-N videos' impression share over
  the next 3 days. Agrees if median impression-share-of-others drops
  ≥15% in the post-publish window.


# app_wisdom_test

test_id: avp_50_keeps_pushing
snapshot_date: 2026-06-11
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
prior_status: inconclusive
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":8,"low_median":null,"mid_median":null,"high_median":0.066,"threshold_high_above":0.7,"threshold_low_below":0.4}


test_id: browse_from_subscribers
snapshot_date: 2026-06-11
status: not_currently_testable
confidence: low
prior_status: not_currently_testable
evidence_json:
  {"missing_data":"owner-mode-only data (subscribed-state, search queries, etc.)","unblock_action":"the channel owner connects private analytics"}


test_id: ctr_retention_together
snapshot_date: 2026-06-11
status: not_currently_testable
confidence: low
prior_status: not_currently_testable
evidence_json:
  {"missing_data":"Awaiting Round 4 retention-curve-derived precision.","unblock_action":"Future round"}


test_id: edits_hurt_performance
snapshot_date: 2026-06-11
status: agrees
confidence: high
prior_status: agrees
evidence_json:
  {"median_post_change_ratio":0,"eligible_changes":6,"threshold_agrees_below":0.5,"threshold_disagrees_above":1}


test_id: end_screen_ctr_correlates_quality
snapshot_date: 2026-06-11
status: not_currently_testable
confidence: low
prior_status: not_currently_testable
evidence_json:
  {"missing_data":"Awaiting Round 4 cards/end-screen data ingestion.","unblock_action":"Future round"}


test_id: hour_1_velocity_predicts
snapshot_date: 2026-06-11
status: not_currently_testable
confidence: low
prior_status: not_currently_testable
evidence_json:
  {"missing_data":"YouTube Reporting API does not expose hourly granularity.","unblock_action":"Future round"}


test_id: mid_length_videos_optimal
snapshot_date: 2026-06-11
status: agrees
confidence: medium
prior_status: agrees
evidence_json:
  {"threshold_agrees_bucket":600,"min_per_bucket":3,"60s_count":0,"60s_median_retention_pct":null,"180s_count":0,"180s_median_retention_pct":null,"360s_count":2,"360s_median_retention_pct":null,"600s_count":3,"600s_median_retention_pct":30.246,"1200s_count":2,"1200s_median_retention_pct":null,"1800s_count":1,"1800s_median_retention_pct":null,"3600s+_count":0,"3600s+_median_retention_pct":null,"best_bucket_seconds":600,"best_bucket_median_retention_pct":30.246}


test_id: new_uploads_steal_impressions
snapshot_date: 2026-06-11
status: disagrees
confidence: medium
prior_status: disagrees
evidence_json:
  {"median_after_over_before_ratio":1.468,"median_drop_fraction":-0.468,"eligible_publishes":6,"threshold_drop_above":0.15}


test_id: sub_growth_breakouts
snapshot_date: 2026-06-11
status: inconclusive
inconclusive_reason: near_threshold
confidence: medium
prior_status: inconclusive
evidence_json:
  {"gini_subs_gained":0.667,"total_subs_gained":3,"eligible_videos":9,"threshold_agrees_above":0.7,"threshold_disagrees_below":0.3}


test_id: title_changes_reset_algo
snapshot_date: 2026-06-11
status: inconclusive
inconclusive_reason: near_threshold
confidence: high
prior_status: inconclusive
evidence_json:
  {"median_post_change_ratio":0,"median_recovery_ratio":0,"eligible_changes":6,"threshold_drop_below":0.5,"threshold_recovery_above":1}


# metric_metadata

metric_id: temperature_score
source_tables: summary_channel_metrics_daily.temperature_score
confidence_method: NULL when fewer than 35 baseline days exist.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  A 0–100 weighted blend of trailing channel performance vs the channel's prior-90-day baseline; 50 reads as the channel's own normal.

computation_doc:
  Per-day weighted blend of trailing CTR, AVD, sub-rate, source diversity, and library-activity z-scores against the prior 90-day baseline. Below 35 days of baseline the column stays NULL. 50 reads as "your normal", 60 as a warmer week than typical for this channel, 40 as a cooler week than typical. Both extremes are legitimate — the value is observation, not verdict.


metric_id: country_diversity_score
definition: Simpson diversity index of the channel's top-country shares per date.
source_tables: summary_channel_metrics_daily.country_diversity_score
confidence_method: NULL when fewer than 35 baseline days exist.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Simpson form 1 - sum(share^2) over the per-date top-country shares from summary_channel_country_daily. 0 reads as "all views from one country"; 1 reads as "spread evenly across all countries". Computed daily; NULL on dates with fewer than 35 days of baseline.


metric_id: algorithmic_dependency_index
confidence_method: NULL when no traffic rows exist for the channel.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Channel-wide share of views from algorithmic discovery sources (Browse, Suggested, Search) versus sticky sources (Direct, Channel Page, Playlist, End Screen, link-clicks, subscriber notifications).

source_tables:
  summary_channel.algorithmic_dependency_index, summary_channel_metrics_daily.algorithmic_dependency_index

computation_doc:
  1.0 minus the channel-wide sticky-traffic ratio. Sticky sources are those where the viewer chose to come back: Direct, Channel Page, Playlist, End Screen, link-clicks from off-platform, subscriber notification. Algorithmic sources are everything else (Browse, Suggested, Search, advertising, hashtags, shorts feed). 1.0 = every view came from algorithmic discovery; 0.0 = every view came from a sticky source.


metric_id: sticky_traffic_ratio
definition: Per-video share of total views from sticky (non-algorithmic) traffic sources.
source_tables: summary_video.sticky_traffic_ratio
confidence_method: NULL when no traffic rows exist for the video.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  SUM(traffic.views WHERE is_sticky=1) / total_views, on a per-video basis. NULL when the video has no traffic rows. Both extremes are legitimate channel patterns; the value is observation, not verdict.


metric_id: audience_persistence_pct
definition: Share of last week's (source, country) audience buckets that also appeared the prior week.
source_tables: summary_channel_metrics_daily.audience_persistence_pct
confidence_method: NULL on dates that are not ISO week-ending.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Computed as a weekly comparison: |intersection of last-week and prior-week (source, country) buckets| / |last-week buckets|. Written only on ISO week-ending dates; NULL on every other date. High persistence reads as "the same audience returned"; low persistence reads as "a different audience showed up."


metric_id: audience_replacement_rate
definition: Share of last week's (source, country) audience buckets that did NOT appear the prior week.
source_tables: summary_channel_metrics_daily.audience_replacement_rate
confidence_method: NULL on dates that are not ISO week-ending.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Complement of audience_persistence_pct over the same weekly window. High replacement reads as "fresh discovery"; low replacement reads as "the same audience returned." Both states are legitimate channel patterns at different ages.


metric_id: anomaly_score_composite
definition: Sum of absolute z-scores across tracked daily metrics; one row per date.
source_tables: summary_channel_metrics_daily.anomaly_score_composite, app_metric_zscore_daily
confidence_method: NULL until each input metric clears its 28-day baseline floor.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  SUM(ABS(zscore)) per date across the five tracked metrics in app_metric_zscore_daily (daily_views, weighted_ctr, weighted_avd, sub_gain_rate, total_impressions). Each input z-score is computed against a prior 28-day baseline; baseline window must hold at least 28 non-null values or the input z-score stays NULL. The composite is observation-only — not a "risk score" or "danger meter."


metric_id: engagement_rate_composite
definition: Weighted engagement events per total view, with comments and shares weighted higher than likes.
source_tables: summary_video.engagement_rate_composite, engagement_weights
confidence_method: NULL when total_views = 0.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  (likes × likes_weight + comments × comments_weight + shares × shares_weight) / total_views. Default weights: likes=1, comments=5, shares=3 (per the engagement_weights table). NULL when total_views = 0.


metric_id: engagement_velocity_24h
definition: Total engagement events (likes + comments + shares) in the first 24 hours after publish.
source_tables: summary_video.engagement_velocity_24h
confidence_method: NULL until the publish day has been reported.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  SUM(likes + comments + shares) from video_daily rows where the date matches the publish day. Since YouTube reporting rolls up to UTC days, "first 24 hours" approximates to "the publish day" — a video published at 22:00 UTC will show only the 2 hours before midnight here.


metric_id: engagement_velocity_7d
definition: Total engagement events (likes + comments + shares) in the first 7 days after publish.
source_tables: summary_video.engagement_velocity_7d
confidence_method: NULL until day 6 has been reported.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  SUM(likes + comments + shares) from video_daily rows in days 0-6 after publish (inclusive of publish day). NULL until day 6 has been reported.


metric_id: gini_views
definition: Library-wide Gini coefficient across video view totals; 0 = even, 1 = concentrated on one video.
source_tables: summary_channel.gini_views, summary_channel_metrics_daily.gini_views_28d
confidence_method: NULL when fewer than two videos hold positive views.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Standard Gini coefficient computed across summary_video.total_views for public videos. NULL when fewer than two videos hold a positive value (the formula is undefined). 0 reads as "views spread evenly across the catalog"; 1 reads as "one video carries everything." A higher Gini is common for channels with one or two breakout videos and is observation, not verdict.


metric_id: gini_subs
source_tables: summary_channel.gini_subs
confidence_method: NULL when fewer than two videos hold positive subs.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Library-wide Gini coefficient across video subscriber-gain totals; 0 = even, 1 = concentrated on one video.

computation_doc:
  Standard Gini coefficient computed across summary_video.total_subs_gained for public videos. Same shape as gini_views but for subs gained. NULL when fewer than two videos hold a positive value.


metric_id: library_half_mass_video_count
definition: Smallest top-N video count whose total views sum to at least half of channel total views.
source_tables: summary_channel.library_half_mass_video_count
confidence_method: NULL when no public video has positive views.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Lorenz half-mass count: sort summary_video desc by total_views, walk the cumulative sum, return the count at which the running total first reaches >= 50% of channel total.


metric_id: avd_confidence
source_tables: summary_video.avd_confidence, summary_video_traffic.avd_confidence, video_daily.avd_confidence
confidence_method: This column IS the confidence tier; UI surfaces the noise tier with strikethrough rendering.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Sample-size confidence tier for the row's average view duration; one of noise / low / medium / high.

computation_doc:
  Derived from the row's view sample size — the denominator AVD averages over. Noise tier when views < 10 (one or two viewers' watch time, statistically meaningless); low when views < 30; medium when views < 100; high otherwise. Mirrors the V10 ctr_confidence pattern but keyed on views instead of impressions.


metric_id: ctr_confidence
definition: Sample-size confidence tier for the row's click-through rate; one of noise / low / medium / high.
source_tables: summary_video.ctr_confidence, traffic_daily.ctr_confidence, video_daily.ctr_confidence
confidence_method: This column IS the confidence tier; UI surfaces the noise tier with strikethrough rendering.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Derived from the row's impressions sample size. Noise tier when impressions < 50; low when < 250; medium when < 1000; high otherwise. The thresholds are calibrated so that a noise-tier CTR is statistically meaningless (one or two clicks against a tiny denominator).


metric_id: ctr_quadrant
confidence_method: noise quadrant is the inclusion-failure bucket.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Per-video position relative to the channel's CTR and retention medians; one of winner / clicked-not-watched / watched-not-clicked / quiet / noise.

source_tables:
  summary_video.ctr_quadrant, summary_channel.median_video_ctr, summary_channel.median_video_retention

computation_doc:
  Compares the video's weighted_ctr and avg_retention_pct to the channel-internal medians. Winner = above median on both axes; quiet = below median on both. The noise bucket short-circuits inclusion when ctr_confidence = noise OR total_views < 30 (sample too thin to read either axis honestly).


metric_id: unattributed_channel_views
definition: Per-date drift between the channel-level views snapshot and the sum of per-video views.
source_tables: summary_channel_metrics_daily.unattributed_channel_views
confidence_method: Reconciliation chart shows a sparse fallback below 14 days of history.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  MAX(0, summary_channel_snapshot_daily.total_views - SUM(video_daily.views WHERE pre_publish_stub = 0)) per date. Reads >0 when the channel-snapshot total exceeds the sum of attributed per-video reporting (e.g. deleted videos, late attribution). Floored at zero so reporting overcounts (per-video sum exceeds channel snapshot — also possible during transient lag) don't render as negative drift.


metric_id: country_hhi
definition: Sum-of-squared-shares across the video's per-country views, scaled by 10000.
source_tables: summary_video.country_hhi
confidence_method: NULL when no country-attributed views exist.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Standard Herfindahl-Hirschman index over the coarsened summary_video_country_lifetime rows for the video. NULL when the video has zero country-attributed views. Mirrors source_hhi shape; pairs the country dimension with traffic-source concentration on two independent axes.


metric_id: dominant_country_share
definition: Per-video share (0..1) of total views from the top-by-share country.
source_tables: summary_video.dominant_country_share, summary_video.dominant_country_code
confidence_method: NULL when no country-attributed views exist.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  The single highest country's share of the video's total views, with the country code in the sibling dominant_country_code column. Computed on the coarsened summary_video_country_lifetime distribution (countries below 5% per-video share are bucketed into "OT" / Other).


metric_id: country_audience_match_score
source_tables: summary_video.country_audience_match_score
confidence_method: NULL when no well-retaining channel distribution can be built.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Cosine similarity between this video's country distribution and the channel-wide well-retaining country distribution.

computation_doc:
  The channel-wide well-retaining distribution is built by weighting each country by views from videos that retain at or above the channel median. The score is the cosine similarity (0..1) between this video's country shares and that distribution. 1.0 = the video's audience mirrors the channel's well-retaining countries exactly; 0.0 = no overlap.


metric_id: country_concentration_with_weak_retention
source_tables: summary_video.country_concentration_with_weak_retention
confidence_method: NULL when avg_avd_sec is unavailable.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  1 when one country holds >= 40% of a video's views AND that country watches >= 30% shorter than the video overall.

computation_doc:
  Boolean flag (0/1, NULL when avg_avd_sec is unavailable). Catches the pattern where a single country dominates the audience but retains less than the video as a whole — observation, not verdict. Both extremes (concentration with strong retention, dispersion with weak retention) are legitimate channel patterns.


metric_id: lifecycle_stage
source_tables: summary_video.lifecycle_stage, summary_video_stage_daily.stage
confidence_method: pre_publish stage means the video has no reported days yet.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Most recent lifecycle stage classification for the video; one of pre_publish / debut / growth / peak / tail / quiet / re_emerged / zombie / dormant.

computation_doc:
  Classified by a deterministic JS pass over video_daily anchored on summary_video.peak_views_day. Reads from summary_video_stage_daily for the latest date the video has reporting for. The stages partition a video's lifetime into recognizable shapes.


metric_id: tail_half_life_days
definition: Days from peak views day to the day rolling views fell to half of peak.
source_tables: summary_video.tail_half_life_days
confidence_method: NULL until the video has decayed to half-peak.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  From the video's peak_views_day, walks forward until the trailing-7-day rolling views falls to <= 50% of peak_views_value. The day count is written here. NULL when the video hasn't yet decayed to half-peak (or hasn't peaked at all).


metric_id: source_hhi
definition: Sum-of-squared-shares across the video's per-source views, scaled by 10000.
source_tables: summary_video.source_hhi
confidence_method: NULL when no traffic rows exist.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Standard Herfindahl-Hirschman index over the per-(video, source) shares from summary_video_traffic. NULL when no traffic rows exist. Pairs with country_hhi to characterize concentration on two independent axes.


metric_id: imp_to_view_ratio
definition: Total impressions per view; ratio of how many shown thumbnails it took to earn one view.
source_tables: summary_video.imp_to_view_ratio, summary_channel.imp_to_view_ratio_median
confidence_method: NULL when total_views = 0.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  total_impressions / total_views. NULL when total_views = 0. The channel-wide median is on summary_channel.imp_to_view_ratio_median for the per-video comparison.


metric_id: avd_drift_sec
source_tables: summary_video.avd_drift_sec
confidence_method: NULL when either window lacks reported days.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Delta between the video's last-7-days average view duration and its first-3-days average view duration, in seconds.

computation_doc:
  last_7d_avd_sec - first_3d_avd_sec. Positive = the audience is watching longer than early viewers did; negative = retention has fallen since publish. NULL when either window can't be measured.


metric_id: late_growth_pct
definition: Share of total views accumulated after day 30 from publish.
source_tables: summary_video.late_growth_pct
confidence_method: NULL when video is younger than 30 days.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  SUM(video_daily.views WHERE day_offset >= 30) / total_views. NULL when total_views = 0 or the video is younger than 30 days. High late-growth reads as "evergreen"; low late-growth reads as "all the views came in the first month." Both are legitimate.


metric_id: pre_publish_stub
source_tables: video_daily.pre_publish_stub, traffic_daily.pre_publish_stub
confidence_method: This column IS the data-quality flag.
last_modified: 2026-04-28T15:00:00.000Z
definition:
  Flag (0/1) on every per-video reporting row indicating whether the row sits before the video's published_at.

computation_doc:
  Set to 1 when the row's date is earlier than SUBSTR(published_at, 1, 10). Every summary_* CTE that aggregates over per-video reporting must include WHERE pre_publish_stub = 0 so the seven-row stub artifact (NULL impressions, 0 views) doesn't poison aggregations. The flag itself stays in the DB for downstream provenance.


metric_id: temperature_score_baseline
definition: Reference value for the channel temperature; always 50.
source_tables: summary_channel_metrics_daily.temperature_score
confidence_method: Always 50; not data-driven.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  Temperature is calibrated so 50 reads as "your normal" — the prior-90-day baseline midpoint. Drift in either direction is informational, not a verdict. Use 50 as the visual reference line on temperature surfaces, not zero.


metric_id: reporting_timezone
definition: The timezone YouTube reporting uses for per-day rollups.
source_tables: data_status.notes (metric_type = 'reporting_timezone')
confidence_method: Stable per YouTube's API contract.
last_modified: 2026-04-28T15:00:00.000Z
computation_doc:
  All dates in the public DB are calendar days in YouTube's reporting timezone (America/Los_Angeles, PT), not the visitor's local timezone. A "day" here is a calendar day in PT — a video published at 22:00 PT on Apr 27 will accumulate that day's reporting under the date 2026-04-27, even for viewers in UTC+12.


# event_channel_state_change

date: 2026-06-01
surface_state: incumbent_anchored
reason_code: v1.top_video_anchor
classifier_version: v1
recent_video_id: ZT8HL3zFpMk
first_week_ctr_confidence: noise
reason_text:
  One video is being shown to roughly half the audience this week — most of the catalog's reach is anchored to that one title.


date: 2026-06-03
surface_state: crowded_launch
reason_code: v1.new_uploads_dominate
classifier_version: v1
top_video_id: 8ryAHK866uk
recent_video_id: nLS8-gG7OoM
first_week_ctr_confidence: noise
reason_text:
  A recent upload is being shown to more than half the audience while several older videos are still active — the catalog is competing with itself.


# video_current_state

date: 2026-06-01
video_id: 1Hw_e3Aev3M
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-01
evidence_json:
  {"days_since_publish":0,"views_to_date":0,"impressions_to_date":2,"views_7d":0,"impressions_7d":2,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-06-01
video_id: 8ryAHK866uk
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
primary_traffic_source: YouTube Search
snapshot_date: 2026-06-01
evidence_json:
  {"days_since_publish":0,"views_to_date":0,"impressions_to_date":4,"views_7d":0,"impressions_7d":4,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-06-02
video_id: 1Hw_e3Aev3M
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-02
evidence_json:
  {"days_since_publish":1,"views_to_date":2,"impressions_to_date":223,"views_7d":2,"impressions_7d":223,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-02
video_id: 8ryAHK866uk
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
primary_traffic_source: Playlist Page
snapshot_date: 2026-06-02
evidence_json:
  {"days_since_publish":1,"views_to_date":3,"impressions_to_date":21,"views_7d":3,"impressions_7d":21,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-02
video_id: ZT8HL3zFpMk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-02
evidence_json:
  {"days_since_publish":1,"views_to_date":2,"impressions_to_date":50,"views_7d":2,"impressions_7d":50,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-02
video_id: yjcQSmjv318
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
primary_traffic_source: YouTube Search
snapshot_date: 2026-06-02
evidence_json:
  {"days_since_publish":0,"views_to_date":0,"impressions_to_date":1,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-06-03
video_id: 1Hw_e3Aev3M
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-03
evidence_json:
  {"days_since_publish":2,"views_to_date":3,"impressions_to_date":407,"views_7d":3,"impressions_7d":407,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-03
video_id: 8ryAHK866uk
current_state: no_read
state_reason: Views and impressions are too thin to compare this video honestly.
confidence_tier: noise
noise_reason: below_minimum_sample
lifecycle_stage: debut
primary_traffic_source: Playlist Page
snapshot_date: 2026-06-03
evidence_json:
  {"days_since_publish":2,"views_to_date":3,"impressions_to_date":35,"views_7d":3,"impressions_7d":35,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-03
video_id: ZT8HL3zFpMk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-03
evidence_json:
  {"days_since_publish":2,"views_to_date":2,"impressions_to_date":65,"views_7d":2,"impressions_7d":65,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-03
video_id: yjcQSmjv318
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-03
evidence_json:
  {"days_since_publish":1,"views_to_date":0,"impressions_to_date":26,"views_7d":0,"impressions_7d":26,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-06-04
video_id: 1Hw_e3Aev3M
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-04
evidence_json:
  {"days_since_publish":3,"views_to_date":5,"impressions_to_date":664,"views_7d":5,"impressions_7d":664,"day7_views_to_date":5,"late_views_to_date":0}


date: 2026-06-04
video_id: 8ryAHK866uk
current_state: no_read
state_reason: Views and impressions are too thin to compare this video honestly.
confidence_tier: noise
noise_reason: below_minimum_sample
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-06-04
evidence_json:
  {"days_since_publish":3,"views_to_date":3,"impressions_to_date":41,"views_7d":3,"impressions_7d":41,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-04
video_id: UAP9-V7jorA
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
snapshot_date: 2026-06-04
evidence_json:
  {"days_since_publish":0,"views_to_date":0,"impressions_to_date":0,"views_7d":0,"impressions_7d":0,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-06-04
video_id: ZT8HL3zFpMk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-04
evidence_json:
  {"days_since_publish":3,"views_to_date":2,"impressions_to_date":73,"views_7d":2,"impressions_7d":73,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-04
video_id: nLS8-gG7OoM
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Direct / Unknown
snapshot_date: 2026-06-04
evidence_json:
  {"days_since_publish":1,"views_to_date":1,"impressions_to_date":92,"views_7d":1,"impressions_7d":92,"day7_views_to_date":1,"late_views_to_date":0}


date: 2026-06-04
video_id: yjcQSmjv318
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-04
evidence_json:
  {"days_since_publish":2,"views_to_date":1,"impressions_to_date":54,"views_7d":1,"impressions_7d":54,"day7_views_to_date":1,"late_views_to_date":0}


date: 2026-06-05
video_id: 1Hw_e3Aev3M
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-05
evidence_json:
  {"days_since_publish":4,"views_to_date":6,"impressions_to_date":772,"views_7d":6,"impressions_7d":772,"day7_views_to_date":6,"late_views_to_date":0}


date: 2026-06-05
video_id: 8ryAHK866uk
current_state: no_read
state_reason: Views and impressions are too thin to compare this video honestly.
confidence_tier: noise
noise_reason: below_minimum_sample
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-06-05
evidence_json:
  {"days_since_publish":4,"views_to_date":3,"impressions_to_date":44,"views_7d":3,"impressions_7d":44,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-05
video_id: UAP9-V7jorA
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-05
evidence_json:
  {"days_since_publish":1,"views_to_date":1,"impressions_to_date":71,"views_7d":1,"impressions_7d":71,"day7_views_to_date":1,"late_views_to_date":0}


date: 2026-06-05
video_id: ZT8HL3zFpMk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-05
evidence_json:
  {"days_since_publish":4,"views_to_date":3,"impressions_to_date":78,"views_7d":3,"impressions_7d":78,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-05
video_id: nLS8-gG7OoM
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Direct / Unknown
snapshot_date: 2026-06-05
evidence_json:
  {"days_since_publish":2,"views_to_date":3,"impressions_to_date":160,"views_7d":3,"impressions_7d":160,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-05
video_id: yjcQSmjv318
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-05
evidence_json:
  {"days_since_publish":3,"views_to_date":1,"impressions_to_date":63,"views_7d":1,"impressions_7d":63,"day7_views_to_date":1,"late_views_to_date":0}


date: 2026-06-06
video_id: 1Hw_e3Aev3M
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-06
evidence_json:
  {"days_since_publish":5,"views_to_date":8,"impressions_to_date":842,"views_7d":8,"impressions_7d":842,"day7_views_to_date":8,"late_views_to_date":0}


date: 2026-06-06
video_id: 8ryAHK866uk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: growth
primary_traffic_source: Playlist Page
snapshot_date: 2026-06-06
evidence_json:
  {"days_since_publish":5,"views_to_date":4,"impressions_to_date":50,"views_7d":4,"impressions_7d":50,"day7_views_to_date":4,"late_views_to_date":0}


date: 2026-06-06
video_id: R-dcgx4mdi4
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-06
evidence_json:
  {"days_since_publish":1,"views_to_date":1,"impressions_to_date":26,"views_7d":1,"impressions_7d":26,"day7_views_to_date":1,"late_views_to_date":0}


date: 2026-06-06
video_id: UAP9-V7jorA
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-06
evidence_json:
  {"days_since_publish":2,"views_to_date":2,"impressions_to_date":111,"views_7d":2,"impressions_7d":111,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-06
video_id: ZT8HL3zFpMk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-06
evidence_json:
  {"days_since_publish":5,"views_to_date":3,"impressions_to_date":79,"views_7d":3,"impressions_7d":79,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-06
video_id: nLS8-gG7OoM
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-06
evidence_json:
  {"days_since_publish":3,"views_to_date":6,"impressions_to_date":274,"views_7d":6,"impressions_7d":274,"day7_views_to_date":6,"late_views_to_date":0}


date: 2026-06-06
video_id: yjcQSmjv318
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-06
evidence_json:
  {"days_since_publish":4,"views_to_date":1,"impressions_to_date":73,"views_7d":1,"impressions_7d":73,"day7_views_to_date":1,"late_views_to_date":0}


date: 2026-06-07
video_id: 1Hw_e3Aev3M
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-07
evidence_json:
  {"days_since_publish":6,"views_to_date":13,"impressions_to_date":933,"views_7d":13,"impressions_7d":933,"day7_views_to_date":13,"late_views_to_date":0}


date: 2026-06-07
video_id: 8ryAHK866uk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Playlist Page
snapshot_date: 2026-06-07
evidence_json:
  {"days_since_publish":6,"views_to_date":4,"impressions_to_date":56,"views_7d":4,"impressions_7d":56,"day7_views_to_date":4,"late_views_to_date":0}


date: 2026-06-07
video_id: R-dcgx4mdi4
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-07
evidence_json:
  {"days_since_publish":2,"views_to_date":2,"impressions_to_date":66,"views_7d":2,"impressions_7d":66,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-07
video_id: UAP9-V7jorA
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-07
evidence_json:
  {"days_since_publish":3,"views_to_date":5,"impressions_to_date":171,"views_7d":5,"impressions_7d":171,"day7_views_to_date":5,"late_views_to_date":0}


date: 2026-06-07
video_id: ZT8HL3zFpMk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-07
evidence_json:
  {"days_since_publish":6,"views_to_date":3,"impressions_to_date":83,"views_7d":3,"impressions_7d":83,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-07
video_id: nLS8-gG7OoM
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-07
evidence_json:
  {"days_since_publish":4,"views_to_date":6,"impressions_to_date":364,"views_7d":6,"impressions_7d":364,"day7_views_to_date":6,"late_views_to_date":0}


date: 2026-06-07
video_id: yjcQSmjv318
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-07
evidence_json:
  {"days_since_publish":5,"views_to_date":1,"impressions_to_date":85,"views_7d":1,"impressions_7d":85,"day7_views_to_date":1,"late_views_to_date":0}


date: 2026-06-08
video_id: 1Hw_e3Aev3M
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-08
evidence_json:
  {"days_since_publish":7,"views_to_date":15,"impressions_to_date":1035,"views_7d":15,"impressions_7d":1033,"day7_views_to_date":15,"late_views_to_date":0}


date: 2026-06-08
video_id: 8ryAHK866uk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-08
evidence_json:
  {"days_since_publish":7,"views_to_date":5,"impressions_to_date":65,"views_7d":5,"impressions_7d":61,"day7_views_to_date":5,"late_views_to_date":0}


date: 2026-06-08
video_id: R-dcgx4mdi4
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-08
evidence_json:
  {"days_since_publish":3,"views_to_date":2,"impressions_to_date":93,"views_7d":2,"impressions_7d":93,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-08
video_id: UAP9-V7jorA
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-08
evidence_json:
  {"days_since_publish":4,"views_to_date":5,"impressions_to_date":207,"views_7d":5,"impressions_7d":207,"day7_views_to_date":5,"late_views_to_date":0}


date: 2026-06-08
video_id: ZT8HL3zFpMk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-08
evidence_json:
  {"days_since_publish":7,"views_to_date":3,"impressions_to_date":84,"views_7d":3,"impressions_7d":82,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-08
video_id: nLS8-gG7OoM
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-08
evidence_json:
  {"days_since_publish":5,"views_to_date":8,"impressions_to_date":461,"views_7d":8,"impressions_7d":461,"day7_views_to_date":8,"late_views_to_date":0}


date: 2026-06-08
video_id: yjcQSmjv318
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-08
evidence_json:
  {"days_since_publish":6,"views_to_date":2,"impressions_to_date":107,"views_7d":2,"impressions_7d":107,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-09
video_id: 1Hw_e3Aev3M
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":8,"views_to_date":19,"impressions_to_date":1111,"views_7d":17,"impressions_7d":888,"day7_views_to_date":15,"late_views_to_date":4}


date: 2026-06-09
video_id: 8ryAHK866uk
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":8,"views_to_date":5,"impressions_to_date":69,"views_7d":2,"impressions_7d":48,"day7_views_to_date":5,"late_views_to_date":0}


date: 2026-06-09
video_id: R-dcgx4mdi4
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":4,"views_to_date":2,"impressions_to_date":106,"views_7d":2,"impressions_7d":106,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-09
video_id: UAP9-V7jorA
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":5,"views_to_date":6,"impressions_to_date":254,"views_7d":6,"impressions_7d":254,"day7_views_to_date":6,"late_views_to_date":0}


date: 2026-06-09
video_id: VIE0_D9d59U
current_state: too_new
state_reason: The upload is still inside the first two days and below the read floor.
confidence_tier: noise
noise_reason: launch_window_incomplete
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":1,"views_to_date":2,"impressions_to_date":21,"views_7d":2,"impressions_7d":21,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-09
video_id: ZT8HL3zFpMk
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":8,"views_to_date":3,"impressions_to_date":87,"views_7d":1,"impressions_7d":37,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-09
video_id: nLS8-gG7OoM
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":6,"views_to_date":8,"impressions_to_date":521,"views_7d":8,"impressions_7d":521,"day7_views_to_date":8,"late_views_to_date":0}


date: 2026-06-09
video_id: yjcQSmjv318
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-09
evidence_json:
  {"days_since_publish":7,"views_to_date":2,"impressions_to_date":114,"views_7d":2,"impressions_7d":113,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-10
video_id: 1Hw_e3Aev3M
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":9,"views_to_date":19,"impressions_to_date":1111,"views_7d":16,"impressions_7d":704,"day7_views_to_date":15,"late_views_to_date":4}


date: 2026-06-10
video_id: 8ryAHK866uk
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":9,"views_to_date":5,"impressions_to_date":69,"views_7d":2,"impressions_7d":34,"day7_views_to_date":5,"late_views_to_date":0}


date: 2026-06-10
video_id: R-dcgx4mdi4
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":5,"views_to_date":2,"impressions_to_date":113,"views_7d":2,"impressions_7d":113,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-10
video_id: UAP9-V7jorA
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":6,"views_to_date":9,"impressions_to_date":306,"views_7d":9,"impressions_7d":306,"day7_views_to_date":9,"late_views_to_date":0}


date: 2026-06-10
video_id: VIE0_D9d59U
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":2,"views_to_date":2,"impressions_to_date":56,"views_7d":2,"impressions_7d":56,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-10
video_id: ZT8HL3zFpMk
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":9,"views_to_date":3,"impressions_to_date":87,"views_7d":1,"impressions_7d":22,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-10
video_id: nLS8-gG7OoM
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: growth
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":7,"views_to_date":9,"impressions_to_date":591,"views_7d":9,"impressions_7d":590,"day7_views_to_date":9,"late_views_to_date":0}


date: 2026-06-10
video_id: yjcQSmjv318
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-10
evidence_json:
  {"days_since_publish":8,"views_to_date":2,"impressions_to_date":127,"views_7d":2,"impressions_7d":101,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-11
video_id: 1Hw_e3Aev3M
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: strong
lifecycle_stage: tail
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":10,"views_to_date":19,"impressions_to_date":1112,"views_7d":14,"impressions_7d":448,"day7_views_to_date":15,"late_views_to_date":4}


date: 2026-06-11
video_id: 8ryAHK866uk
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":10,"views_to_date":5,"impressions_to_date":69,"views_7d":2,"impressions_7d":28,"day7_views_to_date":5,"late_views_to_date":0}


date: 2026-06-11
video_id: R-dcgx4mdi4
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":6,"views_to_date":2,"impressions_to_date":116,"views_7d":2,"impressions_7d":116,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-11
video_id: UAP9-V7jorA
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":7,"views_to_date":9,"impressions_to_date":350,"views_7d":9,"impressions_7d":350,"day7_views_to_date":9,"late_views_to_date":0}


date: 2026-06-11
video_id: VIE0_D9d59U
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":3,"views_to_date":2,"impressions_to_date":69,"views_7d":2,"impressions_7d":69,"day7_views_to_date":2,"late_views_to_date":0}


date: 2026-06-11
video_id: ZT8HL3zFpMk
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":10,"views_to_date":3,"impressions_to_date":89,"views_7d":1,"impressions_7d":16,"day7_views_to_date":3,"late_views_to_date":0}


date: 2026-06-11
video_id: fKgHrInewT4
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: directional
lifecycle_stage: debut
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":1,"views_to_date":0,"impressions_to_date":78,"views_7d":0,"impressions_7d":78,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-06-11
video_id: nLS8-gG7OoM
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: readable
lifecycle_stage: tail
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":8,"views_to_date":9,"impressions_to_date":638,"views_7d":8,"impressions_7d":546,"day7_views_to_date":9,"late_views_to_date":0}


date: 2026-06-11
video_id: yjcQSmjv318
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-06-11
evidence_json:
  {"days_since_publish":9,"views_to_date":2,"impressions_to_date":132,"views_7d":1,"impressions_7d":78,"day7_views_to_date":2,"late_views_to_date":0}


# channel_signal_daily

signal_date: 2026-06-01
signal_id: launch-read-floor-2026-06-01
signal_type: launch_read_floor
subject_type: video
subject_id: ZT8HL3zFpMk
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"ZT8HL3zFpMk","first_week_candidate_views":0,"first_week_candidate_impressions":2,"first_week_baseline_median_views":null}


signal_date: 2026-06-02
signal_id: launch-read-floor-2026-06-02
signal_type: launch_read_floor
subject_type: video
subject_id: yjcQSmjv318
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"yjcQSmjv318","first_week_candidate_views":0,"first_week_candidate_impressions":1,"first_week_baseline_median_views":0}


signal_date: 2026-06-03
signal_id: launch-read-floor-2026-06-03
signal_type: launch_read_floor
subject_type: video
subject_id: nLS8-gG7OoM
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"nLS8-gG7OoM","first_week_candidate_views":0,"first_week_candidate_impressions":1,"first_week_baseline_median_views":0}


signal_date: 2026-06-04
signal_id: launch-read-floor-2026-06-04
signal_type: launch_read_floor
subject_type: video
subject_id: UAP9-V7jorA
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"UAP9-V7jorA","first_week_candidate_views":0,"first_week_candidate_impressions":0,"first_week_baseline_median_views":0}


signal_date: 2026-06-05
signal_id: launch-read-floor-2026-06-05
signal_type: launch_read_floor
subject_type: video
subject_id: R-dcgx4mdi4
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"R-dcgx4mdi4","first_week_candidate_views":0,"first_week_candidate_impressions":0,"first_week_baseline_median_views":0}


signal_date: 2026-06-06
signal_id: launch-read-floor-2026-06-06
signal_type: launch_read_floor
subject_type: video
subject_id: R-dcgx4mdi4
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"R-dcgx4mdi4","first_week_candidate_views":1,"first_week_candidate_impressions":26,"first_week_baseline_median_views":2}


signal_date: 2026-06-07
signal_id: catalog-concentration-2026-06-07
signal_type: catalog_concentration
subject_type: video
subject_id: 1Hw_e3Aev3M
metric_family: video_share
window: trailing_7d
confidence_tier: readable
direction: concentrated
evidence_json:
  {"top_video_id":"1Hw_e3Aev3M","top_video_share_7d":0.3824,"top3_video_share_7d":0.7059,"views_7d":34}


signal_date: 2026-06-08
signal_id: launch-read-floor-2026-06-08
signal_type: launch_read_floor
subject_type: video
subject_id: VIE0_D9d59U
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"VIE0_D9d59U","first_week_candidate_views":0,"first_week_candidate_impressions":0,"first_week_baseline_median_views":0}


signal_date: 2026-06-09
signal_id: launch-read-floor-2026-06-09
signal_type: launch_read_floor
subject_type: video
subject_id: VIE0_D9d59U
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"VIE0_D9d59U","first_week_candidate_views":2,"first_week_candidate_impressions":21,"first_week_baseline_median_views":1}


signal_date: 2026-06-10
signal_id: catalog-concentration-2026-06-10
signal_type: catalog_concentration
subject_type: video
subject_id: 1Hw_e3Aev3M
metric_family: video_share
window: trailing_7d
confidence_tier: readable
direction: concentrated
evidence_json:
  {"top_video_id":"1Hw_e3Aev3M","top_video_share_7d":0.3721,"top3_video_share_7d":0.7907,"views_7d":43}


signal_date: 2026-06-10
signal_id: launch-read-floor-2026-06-10
signal_type: launch_read_floor
subject_type: video
subject_id: fKgHrInewT4
metric_family: launch
window: first_week_to_date
confidence_tier: noise
noise_reason: impressions_below_ctr_floor
direction: too_thin
evidence_json:
  {"recent_video_id":"fKgHrInewT4","first_week_candidate_views":0,"first_week_candidate_impressions":0,"first_week_baseline_median_views":0}


signal_date: 2026-06-11
signal_id: catalog-concentration-2026-06-11
signal_type: catalog_concentration
subject_type: video
subject_id: 1Hw_e3Aev3M
metric_family: video_share
window: trailing_7d
confidence_tier: readable
direction: concentrated
evidence_json:
  {"top_video_id":"1Hw_e3Aev3M","top_video_share_7d":0.359,"top3_video_share_7d":0.7949,"views_7d":39}


# app_wisdom_verdict_daily

date: 2026-06-01
test_id: avp_50_keeps_pushing
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":0,"low_median":null,"mid_median":null,"high_median":null,"threshold_high_above":0.7,"threshold_low_below":0.4}


date: 2026-06-02
test_id: avp_50_keeps_pushing
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
prior_status: inconclusive
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":3,"low_median":null,"mid_median":null,"high_median":0,"threshold_high_above":0.7,"threshold_low_below":0.4}


date: 2026-06-03
test_id: sub_growth_breakouts
status: agrees
confidence: medium
prior_status: inconclusive
evidence_json:
  {"gini_subs_gained":0.8,"total_subs_gained":1,"eligible_videos":5,"threshold_agrees_above":0.7,"threshold_disagrees_below":0.3}


date: 2026-06-04
test_id: avp_50_keeps_pushing
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
prior_status: inconclusive
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":5,"low_median":null,"mid_median":null,"high_median":0,"threshold_high_above":0.7,"threshold_low_below":0.4}


date: 2026-06-04
test_id: sub_growth_breakouts
status: inconclusive
inconclusive_reason: near_threshold
confidence: medium
prior_status: agrees
evidence_json:
  {"gini_subs_gained":0.667,"total_subs_gained":2,"eligible_videos":6,"threshold_agrees_above":0.7,"threshold_disagrees_below":0.3}


date: 2026-06-05
test_id: avp_50_keeps_pushing
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
prior_status: inconclusive
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":6,"low_median":null,"mid_median":null,"high_median":0,"threshold_high_above":0.7,"threshold_low_below":0.4}


date: 2026-06-05
test_id: sub_growth_breakouts
status: agrees
confidence: medium
prior_status: inconclusive
evidence_json:
  {"gini_subs_gained":0.714,"total_subs_gained":2,"eligible_videos":7,"threshold_agrees_above":0.7,"threshold_disagrees_below":0.3}


date: 2026-06-06
test_id: mid_length_videos_optimal
status: agrees
confidence: medium
prior_status: inconclusive
evidence_json:
  {"threshold_agrees_bucket":600,"min_per_bucket":3,"60s_count":0,"60s_median_retention_pct":null,"180s_count":0,"180s_median_retention_pct":null,"360s_count":1,"360s_median_retention_pct":null,"600s_count":3,"600s_median_retention_pct":32.304,"1200s_count":2,"1200s_median_retention_pct":null,"1800s_count":1,"1800s_median_retention_pct":null,"3600s+_count":0,"3600s+_median_retention_pct":null,"best_bucket_seconds":600,"best_bucket_median_retention_pct":32.304}


date: 2026-06-06
test_id: avp_50_keeps_pushing
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
prior_status: inconclusive
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":7,"low_median":null,"mid_median":null,"high_median":0,"threshold_high_above":0.7,"threshold_low_below":0.4}


date: 2026-06-06
test_id: title_changes_reset_algo
status: inconclusive
inconclusive_reason: near_threshold
confidence: high
prior_status: inconclusive
evidence_json:
  {"median_post_change_ratio":0.333,"median_recovery_ratio":0,"eligible_changes":2,"threshold_drop_below":0.5,"threshold_recovery_above":1}


date: 2026-06-06
test_id: edits_hurt_performance
status: disagrees
confidence: high
prior_status: inconclusive
evidence_json:
  {"median_post_change_ratio":2.333,"eligible_changes":2,"threshold_agrees_below":0.5,"threshold_disagrees_above":1}


date: 2026-06-07
test_id: mid_length_videos_optimal
status: agrees
confidence: medium
prior_status: agrees
evidence_json:
  {"threshold_agrees_bucket":600,"min_per_bucket":3,"60s_count":0,"60s_median_retention_pct":null,"180s_count":0,"180s_median_retention_pct":null,"360s_count":1,"360s_median_retention_pct":null,"600s_count":3,"600s_median_retention_pct":40.012,"1200s_count":2,"1200s_median_retention_pct":null,"1800s_count":1,"1800s_median_retention_pct":null,"3600s+_count":0,"3600s+_median_retention_pct":null,"best_bucket_seconds":600,"best_bucket_median_retention_pct":40.012}


date: 2026-06-07
test_id: title_changes_reset_algo
status: disagrees
confidence: high
prior_status: inconclusive
evidence_json:
  {"median_post_change_ratio":1.167,"median_recovery_ratio":0,"eligible_changes":2,"threshold_drop_below":0.5,"threshold_recovery_above":1}


date: 2026-06-07
test_id: edits_hurt_performance
status: disagrees
confidence: high
prior_status: disagrees
evidence_json:
  {"median_post_change_ratio":4.083,"eligible_changes":2,"threshold_agrees_below":0.5,"threshold_disagrees_above":1}


date: 2026-06-07
test_id: sub_growth_breakouts
status: inconclusive
inconclusive_reason: near_threshold
confidence: medium
prior_status: agrees
evidence_json:
  {"gini_subs_gained":0.571,"total_subs_gained":3,"eligible_videos":7,"threshold_agrees_above":0.7,"threshold_disagrees_below":0.3}


date: 2026-06-08
test_id: mid_length_videos_optimal
status: agrees
confidence: medium
prior_status: agrees
evidence_json:
  {"threshold_agrees_bucket":600,"min_per_bucket":3,"60s_count":0,"60s_median_retention_pct":null,"180s_count":0,"180s_median_retention_pct":null,"360s_count":1,"360s_median_retention_pct":null,"600s_count":3,"600s_median_retention_pct":39.204,"1200s_count":2,"1200s_median_retention_pct":null,"1800s_count":1,"1800s_median_retention_pct":null,"3600s+_count":0,"3600s+_median_retention_pct":null,"best_bucket_seconds":600,"best_bucket_median_retention_pct":39.204}


date: 2026-06-08
test_id: title_changes_reset_algo
status: disagrees
confidence: high
prior_status: disagrees
evidence_json:
  {"median_post_change_ratio":1.5,"median_recovery_ratio":0,"eligible_changes":2,"threshold_drop_below":0.5,"threshold_recovery_above":1}


date: 2026-06-08
test_id: edits_hurt_performance
status: disagrees
confidence: high
prior_status: disagrees
evidence_json:
  {"median_post_change_ratio":3.5,"eligible_changes":2,"threshold_agrees_below":0.5,"threshold_disagrees_above":1}


date: 2026-06-08
test_id: sub_growth_breakouts
status: inconclusive
inconclusive_reason: near_threshold
confidence: medium
prior_status: inconclusive
evidence_json:
  {"gini_subs_gained":0.625,"total_subs_gained":3,"eligible_videos":8,"threshold_agrees_above":0.7,"threshold_disagrees_below":0.3}


date: 2026-06-08
test_id: new_uploads_steal_impressions
status: disagrees
confidence: medium
prior_status: inconclusive
evidence_json:
  {"median_after_over_before_ratio":1.468,"median_drop_fraction":-0.468,"eligible_publishes":5,"threshold_drop_above":0.15}


date: 2026-06-09
test_id: mid_length_videos_optimal
status: agrees
confidence: medium
prior_status: agrees
evidence_json:
  {"threshold_agrees_bucket":600,"min_per_bucket":3,"60s_count":0,"60s_median_retention_pct":null,"180s_count":0,"180s_median_retention_pct":null,"360s_count":2,"360s_median_retention_pct":null,"600s_count":3,"600s_median_retention_pct":36.599,"1200s_count":2,"1200s_median_retention_pct":null,"1800s_count":1,"1800s_median_retention_pct":null,"3600s+_count":0,"3600s+_median_retention_pct":null,"best_bucket_seconds":600,"best_bucket_median_retention_pct":36.599}


date: 2026-06-09
test_id: avp_50_keeps_pushing
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
prior_status: inconclusive
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":8,"low_median":null,"mid_median":null,"high_median":0,"threshold_high_above":0.7,"threshold_low_below":0.4}


date: 2026-06-09
test_id: title_changes_reset_algo
status: inconclusive
inconclusive_reason: near_threshold
confidence: high
prior_status: disagrees
evidence_json:
  {"median_post_change_ratio":0.667,"median_recovery_ratio":0,"eligible_changes":4,"threshold_drop_below":0.5,"threshold_recovery_above":1}


date: 2026-06-09
test_id: edits_hurt_performance
status: disagrees
confidence: high
prior_status: disagrees
evidence_json:
  {"median_post_change_ratio":1.167,"eligible_changes":4,"threshold_agrees_below":0.5,"threshold_disagrees_above":1}


date: 2026-06-10
test_id: avp_50_keeps_pushing
status: inconclusive
inconclusive_reason: thin_sample
confidence: low
prior_status: inconclusive
evidence_json:
  {"low_count":0,"mid_count":0,"high_count":8,"low_median":null,"mid_median":null,"high_median":0.037,"threshold_high_above":0.7,"threshold_low_below":0.4}


# app_channel_weekly_letter

iso_week: 2026-W23
week_start: 2026-06-01
week_end: 2026-06-07
headline: Channel shifted to crowded launch this week
dek: The channel ended the week in a crowded launch state.
body_markdown:
  This week recorded 34 views and 2 hours of watch time. Subscribers changed by +3. 7 videos were published.

  State transitions observed this week — 2026-06-01: shifted to incumbent anchored; 2026-06-03: shifted to crowded launch.

  - Belief verdict changed (inconclusive → disagrees): "Editing title or thumbnail post-publish kills momentum."
  - Belief verdict changed (inconclusive → agrees): "Videos 8–10 minutes long perform best for ad revenue and watch time."
  - Belief verdict changed (inconclusive → disagrees): "Renaming a video resets its testing cycle."

evidence_json:
  {"metrics":{"week_views":34,"week_watch_minutes":90.43798333333334,"week_subs_net":3,"week_impressions":1758,"videos_published":7,"prior_week_views":null},"state_close":{"surface_state":"crowded_launch","reason_code":"v1.new_uploads_dominate","reason_text":"A recent upload is being shown to more than half the audience while several older videos are still active — the catalog is competing with itself."},"state_transitions":[{"date":"2026-06-01","next_state":"incumbent_anchored","reason_code":"v1.top_video_anchor"},{"date":"2026-06-03","next_state":"crowded_launch","reason_code":"v1.new_uploads_dominate"}],"timeline_highlights":[],"wisdom_flips":[{"test_id":"sub_growth_breakouts","belief_text":"Most subscribers come from a few breakout videos, not from many videos contributing equally.","prior_status":"inconclusive","new_status":"agrees","flip_date":"2026-06-03"},{"test_id":"sub_growth_breakouts","belief_text":"Most subscribers come from a few breakout videos, not from many videos contributing equally.","prior_status":"agrees","new_status":"inconclusive","flip_date":"2026-06-04"},{"test_id":"sub_growth_breakouts","belief_text":"Most subscribers come from a few breakout videos, not from many videos contributing equally.","prior_status":"inconclusive","new_status":"agrees","flip_date":"2026-06-05"},{"test_id":"edits_hurt_performance","belief_text":"Editing title or thumbnail post-publish kills momentum.","prior_status":"inconclusive","new_status":"disagrees","flip_date":"2026-06-06"},{"test_id":"mid_length_videos_optimal","belief_text":"Videos 8–10 minutes long perform best for ad revenue and watch time.","prior_status":"inconclusive","new_status":"agrees","flip_date":"2026-06-06"},{"test_id":"sub_growth_breakouts","belief_text":"Most subscribers come from a few breakout videos, not from many videos contributing equally.","prior_status":"agrees","new_status":"inconclusive","flip_date":"2026-06-07"},{"test_id":"title_changes_reset_algo","belief_text":"Renaming a video resets its testing cycle.","prior_status":"inconclusive","new_status":"disagrees","flip_date":"2026-06-07"}]}


# _about

key: description
value:
  One real YouTube channel's full analytics, openly published. Real video titles and real YouTube video IDs are preserved; durations bucketed, country mix below 5% bucketed as 'OT'.


key: canonical_entry_tables
value:
  video,summary_video,summary_channel_metrics_daily,summary_channel,channel_timeline_event,traffic_daily,traffic_source


key: pre_publish_stub_rule
value:
  Always filter WHERE pre_publish_stub = 0 on video_daily / traffic_daily, or use the _clean views shipped in this DB.


# _table_catalog

table_name: _about
layer: metadata
grain: (key)
related_to: _table_catalog, _column_catalog, _query_examples, _json_schema, schema_version
description:
  Single-row product orientation. One key/value pair per fact the
  reader needs before querying: product name, schema version, build
  timestamp, reporting cutoff, voice rules, aggregate object counts,
  and the time-machine playhead range (`playhead_range_start` /
  `playhead_range_end`). `compute_version` is the SHA-1 of every
  `compute-*.js` source file — it flips when detector or compute
  logic changes between two deploys, signalling that the historical
  snapshots were re-derived under updated code. A new consumer
  should `SELECT * FROM _about;` before anything else.

caveats:
  `build_timestamp` drifts on every rebuild; the fingerprint script
  normalizes it so semantic equality still works.
  `playhead_range_*` reflect the snapshot_date span of every
  snapshot-extended table — they're the canonical lookup for what
  dates the time-machine UI can scrub through.


table_name: _table_catalog
layer: metadata
grain: (table_name)
related_to: _column_catalog, _query_examples, _about
description:
  Index of every table and view in the public DB. Carries the layer,
  grain, row count, prose description, and relationship pointers
  (upstream_of / related_to). Renamed tables carry their old name in
  `deprecated_alias`.


table_name: _column_catalog
layer: metadata
grain: (table_name, column_name)
related_to: _table_catalog, _json_schema
description:
  One row per column in every table and view. Carries type, unit,
  plain-language definition, nullability reason, enum values, and
  a pointer to a paired confidence column where applicable.


table_name: _json_schema
layer: metadata
grain: (table_name, column_name, variant_value)
related_to: _column_catalog
description:
  Shape documentation for columns that store JSON text. Lists keys
  present, a worked example, and a description. Variant-aware so
  polymorphic columns (e.g. `evidence_json` shape per detector)
  can carry one row per variant.


table_name: _query_examples
layer: metadata
grain: (id)
related_to: _table_catalog, _column_catalog
description:
  Golden-path SQL examples. Each row is a (question, SQL) pair that
  illustrates a common analytical task end-to-end. Categorised and
  difficulty-tagged so a new consumer can scan, lift, and adapt.


table_name: video
layer: raw
grain: (video_id)
upstream_of: summary_video, video_daily, video_era, summary_video_country_lifetime, traffic_daily
description:
  One row per public video on the channel. Carries publish date, duration (bucketed for anonymity), era, language, and the real 11-char YouTube video ID (preserved in this owner build). The real video title is preserved here too; display labels come from this table.

caveats:
  Owner (de-anon) build: real titles and real 11-char YouTube IDs are preserved. Durations are still coarsened to bucket lower bounds (60, 180, 360, 600, 1200, 1800, 3600 seconds) for anonymity. Private / deleted videos are excluded upstream.


table_name: video_daily
layer: raw
grain: (video_id, date)
upstream_of: summary_video, summary_channel_metrics_daily, video_daily_clean
related_to: traffic_daily, summary_video, summary_video_traffic
description:
  Per-(video, day) metrics from the YouTube Analytics + Reporting
  APIs: views, watch time, impressions, click rate, average view
  duration, average view percentage, subscribers gained/lost,
  likes, comments, shares.

caveats:
  `pre_publish_stub = 1` rows exist for the seven days before a
  video's publish_date and carry NULL impressions / 0 views.
  Filter `WHERE pre_publish_stub = 0` or use `video_daily_clean`.
  YouTube reporting lags 2-3 days — see `_about.reporting_cutoff`.


table_name: video_era
layer: raw
grain: (video_id, field, era_index, snapshot_date)
related_to: summary_era, event_creator_edit
description:
  Title/thumbnail eras per video. Each row marks the start of an
  era with the (often-hashed) configuration string. Used by the
  `era` detector to compare CTR / retention before vs. after a
  swap. `field` distinguishes title vs thumbnail eras; era_index
  is monotonic within a (video, field) sequence.

caveats:
  `snapshot_date` is on the PK for V64 PK-shape consistency with
  every other Backfill-Pass-extended table, but era rows are
  written at SETUP time (one snapshot, the build's
  `latestDataDate`). Time-machine reads honor as-of era membership
  via the start_date / end_date columns: a reader filtering
  `start_date <= asOfDate AND (end_date IS NULL OR end_date >
  asOfDate)` gets the era set active on `asOfDate`. Join restriction:
  a future query that joins `video_era` ON `snapshot_date` against
  another snapshot-extended table will return ZERO rows for any
  asOfDate other than `MAX(snapshot_date)` because only one snapshot
  is ever populated. The start_date/end_date filter is the only
  correct as-of read pattern; never join on snapshot_date here.
  Backfill Pass Phase 9 (F-4) reviewed the trade-off: a tiny
  `writeVideoEraWalker` step would re-INSERT ~100 era rows on every
  walker iteration (~33 × 100 = 3300 redundant rows for a ~33-day
  channel) without changing what any current reader returns. The
  decision (2026-05-14): keep video_era SETUP-populated and pin the
  constraint here so future joins don't silently lose rows.


table_name: traffic_daily
layer: raw
grain: (video_id, traffic_source_id, date)
upstream_of: summary_video_traffic, summary_traffic_source_daily, traffic_daily_clean
related_to: video_daily, traffic_source
description:
  Per-(video, source, day) view and click-rate share. The core
  long table for "where do views come from over time" questions.

caveats:
  Same `pre_publish_stub` trap as video_daily — filter or use
  `traffic_daily_clean`. Per-source CTR can be `noise` tier for
  small impression samples; see `ctr_confidence`.


table_name: traffic_source
layer: raw
grain: (traffic_source_id)
related_to: traffic_daily, summary_traffic_source_daily, summary_video_traffic
description:
  Lookup table mapping YouTube's numeric traffic_source_id to a
  stable display name and human-readable description (e.g.
  "Browse features", "External", "Suggested videos").


table_name: summary_channel
layer: derived
grain: (snapshot_date)
upstream_of: app_dashboard_briefing_daily
related_to: summary_channel_metrics_daily, summary_channel_snapshot_daily, summary_video
description:
  Single-row channel-wide lifetime summary: video count, total
  views, total watch hours, subscriber count, channel-internal
  medians (CTR, retention, impression-to-view ratio), library
  half-mass video count, maturity stage, funnel pcts.


table_name: summary_channel_metrics_daily
layer: derived
grain: (date)
upstream_of: app_dashboard_briefing_daily, event_channel_state_change
related_to: summary_channel, summary_channel_snapshot_daily, summary_channel_source_share_daily
deprecated_alias: summary_channel_daily
description:
  Channel-wide daily aggregates: views, impressions, weighted CTR,
  subscriber net change, plus rolling 7d / 28d windows, source-mix
  diversity, top-video share, quiet-inventory share, and per-stage
  video counts.

caveats:
  Latest date may lag `_about.reporting_cutoff` by 1 day. Filter
  `date <= (SELECT value FROM _about WHERE key = 'reporting_cutoff')`
  for safe queries.


table_name: summary_channel_snapshot_daily
layer: derived
grain: (date)
related_to: summary_channel_metrics_daily, summary_channel
deprecated_alias: channel_daily
description:
  Daily snapshot of subscriber count and lifetime view count from
  the YouTube Data API. The "official" channel counter. Compare to
  `summary_channel_metrics_daily.subs_net_change` for analytics-vs-data
  reconciliation.


table_name: summary_channel_traffic
layer: derived
grain: (traffic_source_id, snapshot_date)
related_to: traffic_source, summary_video_traffic, summary_traffic_source_daily
description:
  Lifetime per-source channel-wide rollup: views, watch hours,
  average view percentage, subscribers gained, weighted CTR. Used
  to compare source contribution at the channel level.


table_name: summary_channel_country_daily
layer: derived
grain: (country, date)
related_to: summary_channel_country_trailing30, summary_video_country_lifetime
description:
  Per-(country, day) channel-wide views, watch time, and
  subscribers gained. Long format for stacked-area charts and
  geographic drift detection.


table_name: summary_channel_country_trailing30
layer: derived
grain: (country, snapshot_date)
related_to: summary_channel_country_daily
description:
  Per-country trailing-30-day channel-wide rollup: views, watch
  hours, share of total. Snapshot of "where the recent audience
  lives" without re-aggregating the daily table on every read.


table_name: summary_channel_catalog_pressure_daily
layer: derived
grain: (date)
related_to: summary_channel_metrics_daily, summary_video
description:
  Daily catalog-shape signals: count of videos receiving views,
  Gini-style concentration metrics, and pressure indicators
  describing how evenly attention is distributed across the
  catalog.


table_name: summary_channel_source_geo_daily
layer: derived
grain: (date, traffic_source_id, country)
related_to: summary_channel_country_daily, summary_traffic_source_daily
description:
  Joint (source × country) channel-wide daily view counts.
  Supports questions like "what share of External traffic comes
  from US vs CA?" without joining three tables at query time.


table_name: summary_channel_source_share_daily
layer: derived
grain: (date, traffic_source_id)
related_to: summary_channel_metrics_daily, summary_traffic_source_daily
description:
  Long-format trailing-7-day per-source view share. Used by
  stacked-area charts and source-mix-shift detectors so they
  don't re-roll the 7d window per query.


table_name: summary_channel_stage_snapshot
layer: derived
grain: (stage_name)
related_to: summary_channel, channel_phase_log
description:
  Six rows — one per fixed channel-maturity stage (seedling →
  established). Each row carries the reached date, day number,
  and per-row stage facts. Stages still ahead are NULL.


table_name: summary_video
layer: derived
grain: (video_id, snapshot_date)
related_to: video, video_daily, summary_era, summary_video_country_lifetime
description:
  One row per public video. Lifetime aggregates plus derived
  metrics: velocity (days-to-first-1k, etc.), decay phase, CTR /
  retention quadrant, lifecycle classification, edit-intensity
  class, source HHI. Many columns require minimum sample sizes;
  rows below the gate are NULL.

upstream_of:
  summary_video_trajectory_cone, summary_video_nearest_peers, summary_video_decay_model, summary_video_launch_context, summary_video_daily_rank

caveats:
  CTR values carry a `ctr_confidence` tier (noise/low/medium/high).
  Never display CTR without its tier — small samples are noisy.
  `ctr_quadrant` is NULL for `noise`-tier videos.


table_name: summary_video_country_lifetime
layer: derived
grain: (video_id, country, snapshot_date)
related_to: summary_video_country_daily, summary_video
deprecated_alias: summary_video_country
description:
  Per-(video, country) lifetime views, watch hours, retention,
  and subscribers gained. Used by the geographic-concentration
  detector to flag per-video country dominance.


table_name: summary_video_country_daily
layer: derived
grain: (video_id, country, date)
related_to: summary_video_country_lifetime, traffic_daily
description:
  Per-(video, country, day) view counts. Daily-resolution analog
  to `summary_video_country_lifetime`. Long table; filter
  aggressively.


table_name: summary_video_traffic
layer: derived
grain: (video_id, traffic_source_id, snapshot_date)
related_to: traffic_daily, summary_video, traffic_source
deprecated_alias: summary_traffic
description:
  Per-(video, source) lifetime view share, CTR, retention. Source
  HHI on `summary_video` derives from this table. `share_of_video_views`
  is the per-video proportion attributable to that source.


table_name: summary_video_stage_daily
layer: derived
grain: (video_id, date)
related_to: summary_video, video_daily
deprecated_alias: video_stage_daily
description:
  Per-(video, day) lifecycle-stage classification (e.g. ramp,
  plateau, decay) based on the video's own velocity curve. Used
  by the `lifecycle-phase` detector.


table_name: summary_traffic_source_daily
layer: derived
grain: (traffic_source_id, date)
related_to: traffic_daily, summary_traffic_source_daily_history
deprecated_alias: summary_traffic_daily
description:
  Channel-wide per-source daily aggregates: views, watch hours,
  average view percentage, weighted CTR, subscribers gained.
  Drives source-mix-over-time charts.


table_name: summary_traffic_source_daily_history
layer: derived
grain: (traffic_source_id, date)
related_to: summary_traffic_source_daily, traffic_daily
deprecated_alias: summary_traffic_daily_history
description:
  Longitudinal store of `summary_traffic_source_daily`, kept across
  rebuilds so detectors needing historical context can read it
  without re-aggregating raw traffic_daily on every read.


table_name: summary_traffic_top_videos_by_source
layer: derived
grain: (traffic_source_id, rank, snapshot_date)
related_to: traffic_source, traffic_daily, summary_video_traffic
deprecated_alias: summary_traffic_top_videos
description:
  Top videos per traffic source by lifetime views. Used by the
  `/traffic/[sourceId]` detail page to render a leaderboard
  without scanning `traffic_daily` per render.


table_name: cohort_video_geography_age_window
layer: derived
grain: (video_id, country, age_window, snapshot_date)
related_to: summary_video_country_lifetime, summary_video_country_daily
deprecated_alias: summary_video_geo_window
description:
  Per-(video, country, age-window) view counts. Buckets the first
  N days after publish, the next N, etc., so cross-video comparison
  is age-normalised. Used for "does this video's country mix
  typically settle at day 28?" questions.


table_name: cohort_video_launch_age_window
layer: derived
grain: (video_id, age_window, snapshot_date)
related_to: summary_video, video_daily
deprecated_alias: summary_video_launch_window
description:
  Per-(video, age-window) launch-context metrics: views, CTR,
  retention bucketed by days since publish. Drives the cohort-lift
  detector and the per-video launch comparison chart.


table_name: cohort_video_traffic_age_window
layer: derived
grain: (video_id, traffic_source_id, age_window, snapshot_date)
related_to: traffic_daily, summary_video_traffic
deprecated_alias: summary_video_source_window
description:
  Per-(video, source, age-window) view counts. "How quickly does
  Browse vs Suggested ramp up on this video?" Used by source-mix
  age-curve detectors.


table_name: cohort_video_change_verdict
layer: derived
grain: (video_id, pivot_date, pivot_kind, snapshot_date)
related_to: event_creator_edit, summary_subscriber_event_daily, video_era
deprecated_alias: summary_video_change_window
description:
  Before/after rollup per video pivot (era boundary, subscriber-loss
  event, or hand-authored note). Each row carries metric snapshots
  on both sides of the pivot so the `change-window` detector can
  score whether the swap moved the needle.


table_name: cohort_channel_change_verdict
layer: derived
grain: (pivot_date, pivot_kind, snapshot_date)
related_to: event_creator_edit, event_channel_annotation
deprecated_alias: summary_channel_change_window
description:
  Channel-scope mirror of `cohort_video_change_verdict`. Reads
  from `event_creator_edit` (channel-scope rows) and
  `event_channel_annotation` to score channel-wide pivots.


table_name: summary_creator_edits_daily
layer: derived
grain: (date)
related_to: event_creator_edit, summary_creator_edits_weekly
deprecated_alias: summary_change_daily
description:
  Daily count of creator edits across all videos plus field-level
  breakdowns (title, thumbnail, description, tags). Includes an
  `is_burst_day` flag for days with unusually high edit activity.


table_name: summary_creator_edits_weekly
layer: derived
grain: (week_start_date)
related_to: summary_creator_edits_daily, event_creator_edit
deprecated_alias: summary_change_weekly
description:
  Weekly rollup of creator edits with field-level breakdowns.
  Mirrors `summary_creator_edits_daily` at a coarser grain for
  chart use.


table_name: summary_creator_edits_monthly
layer: derived
grain: (month_start_date)
related_to: summary_creator_edits_daily, summary_creator_edits_weekly
deprecated_alias: summary_change_monthly
description:
  Monthly rollup of creator edits. Coarsest of the three edit
  cadence tables; used for long-trend visualisation.


table_name: summary_field_co_change
layer: derived
grain: (field_a, field_b, snapshot_date)
related_to: event_creator_edit, summary_creator_edits_daily
description:
  Pairwise co-occurrence of edit field combinations: how often
  title + thumbnail are swapped together, etc. Drives the
  co-change heatmap on the changes page.


table_name: summary_edit_view_position
layer: derived
grain: (video_id, changed_at, snapshot_date)
related_to: event_creator_edit, summary_video
description:
  Per-edit context: cumulative view percentage and lifecycle phase
  at the moment the edit happened. Lets the dashboard render
  "edited when this video had received 23% of its lifetime views"
  annotations.


table_name: channel_timeline_event
layer: event
grain: (event_key, snapshot_date)
upstream_of: v_event_ledger
deprecated_alias: channel_timeline
description:
  Unified event ledger: publish, milestone, insight, stat_snapshot,
  rank_change, first_external, note, subscriber_loss_event,
  stage_transition, era_start, audience_expansion, source_quiet,
  creator_event. Drives the Story page.

related_to:
  event_creator_edit, event_channel_annotation, event_country_first_view, event_source_first_view, event_channel_state_change

caveats:
  `evidence_json` is polymorphic — shape varies by `event_type`.
  See `_json_schema` for per-event-type key lists.


table_name: event_creator_edit
layer: event
grain: (scope, video_id, channel_id, field, changed_at, change_kind, snapshot_date)
related_to: cohort_video_change_verdict, cohort_channel_change_verdict, summary_edit_view_position
deprecated_alias: creator_change_log
description:
  One row per field-level edit detected by diffing successive
  YouTube Data API snapshots. Sanitised from the private
  video_change_log + channel_change_log. Powers the changes page
  and feeds `summary_creator_edits_*` rollups.


table_name: event_channel_annotation
layer: event
grain: (event_id)
related_to: channel_timeline_event
deprecated_alias: channel_event_public
description:
  Owner-authored timeline annotations from
  `pipeline/creator-events.yaml`. Durable record kept alongside
  `channel_timeline_event` so the source survives a rebuild.


table_name: event_country_first_view
layer: event
grain: (country)
related_to: summary_channel_country_daily, channel_timeline_event
deprecated_alias: country_activation_log
description:
  One row per country marking the date the channel received its
  first view from there. Feeds the geographic-emergence detector.


table_name: event_source_first_view
layer: event
grain: (video_id, traffic_source_id)
related_to: traffic_daily, summary_video_traffic
deprecated_alias: source_activation_log
description:
  First date each (video, traffic source) recorded any views.
  Computed from `MIN(date)` over `traffic_daily` where views > 0.
  Drives the source-activation-order detector.


table_name: event_channel_state_change
layer: event
grain: (date, state_kind)
related_to: summary_channel_metrics_daily, channel_timeline_event
deprecated_alias: summary_channel_state_log
description:
  Channel-wide state transitions (CUSUM step-change detections).
  Marks dates when channel-wide metrics shifted regime.


table_name: summary_subscriber_event_daily
layer: event
grain: (date, video_id, kind)
related_to: video_daily, summary_channel_metrics_daily, channel_timeline_event
description:
  Per-(date, video, kind) subscriber-loss and surge events. Lifts
  these out of the `channel_timeline_event.evidence_json`
  envelope into a queryable table for cross-reference.


table_name: summary_era
layer: derived
grain: (video_id, era_index, snapshot_date)
related_to: video_era, event_creator_edit
description:
  One row per (video, era) with weighted CTR, total impressions,
  average retention, and view share. Drives the `era` A/B detector
  and the changes page's era table.


table_name: channel_phase_log
layer: derived
grain: (phase_name, phase_start_date)
related_to: summary_channel_stage_snapshot, summary_channel
description:
  Log of channel-wide maturity-phase transitions. One row per
  phase entered (seedling → sprouting → growing → established)
  with the date and triggering threshold.


table_name: channel_cadence_daily
layer: derived
grain: (date)
related_to: summary_channel_metrics_daily, channel_timeline_event
description:
  Per-day publish-cadence state: rolling average gap between
  publishes, classifier output (steady, cadence_break, etc.),
  and per-day-of-week trend evidence.


table_name: channel_signal_daily
layer: derived
grain: (date, signal_name)
related_to: summary_channel_metrics_daily
description:
  Long-format per-(date, signal) feed of channel-wide signal
  values that don't fit the wide `summary_channel_metrics_daily`
  schema. Used by detectors that need a generic time-series
  backend.


table_name: source_age_pattern_daily
layer: derived
grain: (traffic_source_id, days_since_publish)
related_to: summary_video_traffic, cohort_video_traffic_age_window
description:
  Per-source age-curve template: median view share at each
  `days_since_publish`. Reference points for asking whether a
  specific video's source mix is precocious vs. typical.


table_name: video_current_state
layer: derived
grain: (date, video_id, snapshot_date)
related_to: summary_video, summary_video_stage_daily
description:
  Per-video snapshot of the most recent lifecycle / decay state
  flags. Read by the per-video page for "where this video is
  right now" pills.


table_name: app_insight_snapshot
layer: app_internal
grain: (snapshot_date, insight_key)
upstream_of: app_detector_activity
related_to: app_detector_activity
deprecated_alias: insight_snapshot
description:
  Daily snapshot of insight engine output. Each row is one
  `insight_key` ranked for a given `snapshot_date`. Backs the
  Moment chapter on the dashboard and the detector activity
  rollup.

caveats:
  `generated_at` is normalized away by the fingerprint script —
  it drifts on every rebuild without changing the insight content.


table_name: app_dashboard_briefing_daily
layer: app_internal
grain: (date)
related_to: summary_channel_metrics_daily, summary_channel
deprecated_alias: dashboard_briefing_daily
description:
  One row per day with the dashboard's "today vs yesterday"
  briefing copy precomputed. Read by the homepage so server
  components don't run prose generators per request.


table_name: app_metric_zscore_daily
layer: app_internal
grain: (metric_name, date)
related_to: summary_channel_metrics_daily
deprecated_alias: metric_zscore_daily
description:
  Per-(metric, day) z-score relative to the channel's recent
  history. Used by the metric-anomaly detector and HonestyPanel
  "is today unusual?" annotations.


table_name: app_wisdom_canon
layer: app_internal
grain: (test_id)
related_to: app_wisdom_test, app_wisdom_verdict_daily
deprecated_alias: wisdom_canon
description:
  Canonical list of YouTube growth beliefs the channel tests.
  Hand-authored. Each `test_id` carries the prose statement,
  the metric it bears on, and the test methodology.


table_name: app_wisdom_test
layer: app_internal
grain: (test_id, snapshot_date)
related_to: app_wisdom_canon, app_wisdom_verdict_daily
deprecated_alias: wisdom_test
description:
  Latest verdict per wisdom test. Status is one of `agrees`,
  `disagrees`, `inconclusive`, `not_currently_testable`. Use
  `not_yet_implemented` flag (not status) to distinguish
  actively-tested rows from stubs.


table_name: app_wisdom_verdict_daily
layer: app_internal
grain: (test_id, snapshot_date)
related_to: app_wisdom_test, app_wisdom_canon
deprecated_alias: wisdom_verdict_daily
description:
  Verdict history per wisdom test. Lets the dashboard render
  "this belief disagreed for three weeks then flipped" timelines.


table_name: app_detector_activity
layer: app_internal
grain: (detector_name, snapshot_date)
related_to: app_insight_snapshot
deprecated_alias: summary_detector_activity
description:
  Per-detector activity rollup over `app_insight_snapshot`:
  total_fires, first/last fired date, highest significance score
  and date. Powers the /help/detectors master list page.


table_name: app_channel_weekly_letter
layer: app_internal
grain: (week_start_date)
related_to: summary_channel_metrics_daily
deprecated_alias: summary_channel_weekly_letter
description:
  Precomputed weekly letter copy for the "letter to a creator"
  rendering on the dashboard. Generated from rolled-up channel
  state at week boundaries.


table_name: owner_read_daily
layer: app_internal
grain: (snapshot_date)
related_to: app_insight_snapshot, summary_channel_metrics_daily, summary_channel_forecast
description:
  One consolidated "today's read" row per `snapshot_date` — the
  synthesis the home/digest surfaces lead with. NOT a new raw
  metric: it consolidates signals that already exist (the day's
  ranked insights from `app_insight_snapshot`, the trailing-7d
  channel rollup vs the prior window, the forecast usability tier)
  into one row a reader can dispatch on without re-assembling them.
  Each row carries the views/subs/impressions trend tags + their
  7d windows, the top-mover video and its share, source-mix
  direction, active/quiet catalog split, the day's lead insight
  (key + signal_family + significance), and a sample-of-one
  `thin_read` honesty flag for days too quiet to read as anything
  but quiet. Populated by `dashboard/scripts/generate-snapshots.ts`
  inside its per-snapshot-date loop (empty at clean-build time, like
  `app_insight_snapshot`). Backfill-pattern-bound: PK ends in
  `snapshot_date`, `computed_at` binds to the snapshot date.


table_name: app_pool_cell_stat
layer: app_internal
grain: (cell_key, metric, snapshot_date)
related_to: app_pool_named_peer, summary_channel_metrics_daily
description:
  Stage-3 shared-pool aggregate slot, per snapshot: this channel's
  deciding cohort cell for each pool metric (views_28d, subs_28d,
  uploads_28d, video_day7_views) — exactly one row per
  (metric, snapshot_date). `gate_state` says whether the cell's
  aggregate may be shown (`lit`) or stays silent (`withheld`); a
  withheld row carries NULL in every value column. Lit rows carry the
  cell's median (and p25/p75 at the `quartile` rung), a floored
  member-count band, and — only where publication is exact — a
  partial-pooling estimate for this channel. Values near the privacy
  floor (or any cell holding a non-public pool member) carry small
  deterministic noise by design.

caveats:
  Empty when the build ran without a pool-input extract (fixtures,
  local builds, channels not in the shared pool) — emptiness is the
  honest state, not an error. Exact member counts are never stored;
  `member_band` is the floored band. `cell_p25`/`cell_p75` are NULL
  below the quartile rung; `pooled_estimate` is NULL wherever the
  stored aggregates carry noise. Fully re-derived every build, so a
  channel that leaves the pool vanishes from every snapshot on the
  next build. Cumulative-style monotonicity does NOT apply to this
  table.


table_name: app_pool_named_peer
layer: app_internal
grain: (peer_contributor_id, snapshot_date)
related_to: app_pool_cell_stat
description:
  The open pool's named side-by-side rows, per snapshot: one row per
  channel that is currently BOTH public and pool-consented (this
  channel included when eligible). Carries only public-dashboard-class
  facts — lifetime totals (views, subscribers), video count, trailing
  28-day views and uploads, and the channel's own median day-7 views —
  plus the peer's handle and display title. The same row set appears
  in every channel's DB; it is a pure function of the sweep-global
  pool extract.

caveats:
  Empty when the build ran without a pool-input extract. Peer
  lifetime totals can legitimately DECREASE across snapshot_date
  (deleted/privated videos, unsubscribes) and the peer set changes
  with consent — never assume monotonicity. `views_28d` is NULL when
  the trailing window isn't fully covered by the pool's analytics
  history (including the most recent dates, reporting lag);
  `video_day7_views_median` is NULL until a peer has ≥3 videos old
  enough for a day-7 reading. Current consent governs the whole
  history: rewinding shows the channels consented TODAY.


table_name: data_status
layer: metadata
grain: (metric_type)
related_to: _about, schema_version
description:
  One row per data domain (views, impressions, traffic_sources,
  channel_snapshots, reporting_timezone) with available_from /
  available_to date range and a human note. Read by the
  HonestyPanel "what data is in this view?" annotations.


table_name: metric_metadata
layer: metadata
grain: (metric_id)
related_to: _column_catalog, _about
description:
  Semantic-metric definitions: each row carries a metric_id (e.g.
  `ctr_confidence`, `reporting_timezone`), plain-language
  definition, source tables, computation doc, and the confidence
  method. Surfaced via /data tile tooltips.

caveats:
  Coexists with `_column_catalog`. Many metric_ids span multiple
  tables (`source_tables` is a comma list) and some
  (`reporting_timezone`, `pre_publish_stub`) are concepts rather
  than columns.


table_name: schema_version
layer: metadata
grain: (version)
related_to: _about
description:
  Append-only log of schema versions with `applied_at` timestamps
  and a short note per version. The latest row's version number
  matches `_about.schema_version`.


table_name: engagement_weights
layer: metadata
grain: (weight_name)
related_to: summary_video
description:
  Configurable weights table used by composite scores. Carries
  `updated_at` which is fingerprint-normalized.


table_name: summary_video_trajectory_cone
layer: derived
grain: (video_id, age_days, snapshot_date)
upstream_of: summary_video_nearest_peers
related_to: summary_video, video_daily
description:
  Per-(video, age_days) percentile-band trajectory cone
  (p10/p25/median/p75/p90 + mean + peer_count) over the channel's
  OTHER videos at the same age. Doubles as a forward-looking
  forecast band — rows exist for ages the subject has not yet
  reached, populated with the cone older peers traced at that
  age. Percentile columns are NULL when peer_count < 5.


table_name: summary_video_nearest_peers
layer: derived
grain: (video_id, snapshot_date)
related_to: summary_video, summary_video_trajectory_cone
description:
  Top-5 nearest peers per video by trajectory similarity (cosine
  distance over the cumulative-views vector during the first 30
  post-publish days). Peers are flat columns peer_1_id … peer_5_id
  with matching peer_K_distance scores; trailing slots are NULL
  when fewer than 5 candidates qualify. Mirrors the live
  findNearestPeer() constants in dashboard/src/lib/trajectory-similarity.ts.


table_name: summary_video_daily_rank
layer: derived
grain: (video_id, date)
related_to: video_daily, summary_video
description:
  Per-(video, day) channel-internal rank by daily views. Lets
  cross-video comparison queries answer "was this video the
  channel's #1 driver on that date?" without re-aggregating.


table_name: event_video_phase_transition
layer: event
grain: (video_id, event_date, snapshot_date)
related_to: summary_video_stage_daily, channel_timeline_event
description:
  One row per detected lifecycle-phase transition (consecutive
  days where stage[d] != stage[d-1] in summary_video_stage_daily).
  Carries from_phase / to_phase, days_in_from_phase, trailing-3d
  view rates before / after, and a magnitude score
  (abs(views_rate_change_pct) * (1 + days_in_from_phase / 7))
  so detectors can rank transitions by impact. Feeds the existing
  `stage_transition` channel_timeline_event type via Phase 6.4.


table_name: summary_channel_cohort
layer: derived
grain: (cohort_week, snapshot_date)
related_to: summary_video, video, video_daily
description:
  Per-ISO-week cohort rollup of videos published that week.
  Carries mean day-1/day-7/day-30 views, mean click rate and
  retention, median days-to-100-views, and 7/14/30-day survival
  shares. `vs_baseline_pct` compares the cohort's mean day-30
  views to the rolling mean of the prior 8 cohorts; coarse
  `cohort_label` tier marks ≥ +20% as `outperforming` and
  ≤ -20% as `underperforming`. NULL `cohort_label` means the
  baseline is not yet available (fewer than one prior cohort).


table_name: summary_video_decay_model
layer: derived
grain: (video_id, snapshot_date)
related_to: summary_video, video_daily
description:
  Per-video decay model parameters: exponential / power-law fit
  coefficients, fit quality, and projected forward views over
  the next 30 / 90 days. Drives the `decay-projection` detector.


table_name: summary_threshold_projection
layer: derived
grain: (threshold_type, threshold_value, snapshot_date)
related_to: summary_channel, summary_channel_metrics_daily
description:
  Forward-looking projection of when the channel typically reaches
  the next round threshold (subscribers / cumulative views / video
  count) at the trailing-window pace. `projected_date_low` /
  `projected_date_high` come from a bootstrap-resampled rate band,
  so the surface honestly widens when the recent pace is noisy.
  Date columns stay NULL on the `confidence='insufficient'` branch.
  Projections assume recent pace and cadence hold; they are
  arithmetic on the past N days, not predictions.


table_name: summary_channel_forecast
layer: derived
grain: (as_of_date, horizon_days, forecast_type)
description:
  Horizon-banded channel-level forecast. One row per
  (horizon, forecast_type) at the latest reporting cutoff: horizons
  7 / 14 / 30 / 90 days, types `subscribers` (cumulative count) and
  `daily_views` (rolling 7-day mean of per-day views). Model fit
  is ordinary least squares on a trailing 28-day window when the
  channel cadence classifies as high, 56 days otherwise; bands come
  from a B=200 bootstrap resample with a seeded PRNG so reruns over
  identical input produce byte-identical bands. `projected_value`
  and the two `_low`/`_high` columns are NULL on the
  `confidence='insufficient'` branch — that branch fires below 14
  days of sample, on bands wider than the point estimate, and on
  non-negative series whose bands dip below zero. Projection
  assumes recent direction and discovery mix hold; arithmetic on
  the past N days, not a prediction.

  Post-build, the auto-tune pass (compute-forecast-autotune.js)
  UPDATEs each row's predicted_low / predicted_high to apply a
  widen-only multiplier (band_widen_k_low / band_widen_k_high)
  when the trailing window of resolved entries on the same
  (forecast_type, horizon_days) cell suggests the raw bootstrap
  band under-covered. The raw bootstrap band is reconstructible
  as `projected_value ± (predicted_high - projected_value) / band_widen_k_high`
  when the k columns are non-null. coverage_below_floor_days
  counts a trailing chronic-miss streak the dashboard uses to
  demote cells whose widening still can't close the gap.

related_to:
  summary_channel, summary_channel_metrics_daily, summary_threshold_projection, forecast_calibration_log


table_name: summary_channel_regime_forecast
layer: derived
grain: (as_of_date)
related_to: event_channel_state_change, summary_channel, summary_channel_metrics_daily
description:
  Joint-trajectory regime-transition forecast — one row per
  as_of_date carrying the channel's currently-classified surface
  state, the projected next state, and the expected transition
  window with uncertainty bands. Built by projecting each
  classifier-input feature in event_channel_state_change forward at
  its trailing 21-day OLS slope and re-classifying day-by-day for
  up to 60 days. Pair-bootstrap (B=200, seeded Mulberry32) widens
  the band: each feature's slope CI is computed, features whose CI
  straddles zero or whose |slope| sits below the noise floor are
  dropped, and the joint distribution of projected (transition_day,
  projected_state) tuples drives the modal projection.
  `projected_state` and the three `expected_days*` columns go NULL
  on the `confidence='insufficient'` branch (fewer than two
  meaningfully-moving features, bootstrap-transition rate under
  50%, or modal-state agreement under 60%).
  `contributing_features_json` is the (name, slope_per_day,
  current_value, ci_low, ci_high) payload for each feature driving
  the projection. `classifier_version` pins the v1 state classifier
  so future bumps in compute-channel-state-log.js are observable
  downstream. Projection assumes recent direction and discovery mix
  hold; arithmetic on the past 21 days, not a prediction.


table_name: summary_channel_threshold_impression_pattern
layer: derived
grain: (snapshot_date)
related_to: summary_video, video_daily, summary_channel
description:
  Channel-pattern memory for the "does a click-rate or watch-duration
  jump on one of this channel's older videos tend to be followed by
  a step-up in YouTube's impressions to that video?" question.
  Walks every video on the channel and, for each leading-edge CTR
  or AVD jump observed at age >= 14 days (mirror of the thresholds
  in `late-life-ctr-jump.ts` / `late-life-avd-jump.ts`), checks
  whether the next 7 days of impressions averaged at least 20%
  above the prior 7 days. Aggregates counts to channel-grain at
  this snapshot. The followed-rate (`*_followed_count / *_event_count`)
  is a sample-of-one observation, not a base rate — when
  `videos_evaluated` is small, the per-video card should hedge.


table_name: summary_channel_narrative_arc
layer: derived
grain: (arc_id, snapshot_date)
related_to: summary_channel_metrics_daily, channel_timeline_event
description:
  Macro-structure of the channel's life as a small set of contiguous
  multi-week windows ("arcs" / movements) that the /story scroll
  choreographs against — pacing and motion shift at arc boundaries.
  Each arc carries a coherent shape derived from the channel's OWN
  signals: weighted timeline-event density, day-over-day view-rate
  change, and lifecycle-stage churn, smoothed and z-scored against the
  window's own baseline (no absolute thresholds — sample-of-one), then
  segmented by change-point detection.

  This is INTERPRETIVE, OBSERVATIONAL SEGMENTATION, not a ranking. No
  arc is a "best era", a climax, or a winner; a quiet stretch is a
  first-class movement, equal in weight to a busy one — only the shape
  differs. The neutral `arc_kind` / `view_trend_label` / `dominant_motion`
  enums carry no value judgement and `headline` is hedged. The thin-
  timeline guardrails (min arc 7 days, max arcs min(5, floor(span/10)),
  a genuinely flat signal collapsing to ONE steady arc) mean a quiet
  channel honestly gets fewer arcs — never padded drama. Context metrics
  only (`event_density`); no per-arc subscriber/view totals that could
  read as a scoreboard.


table_name: forecast_calibration_log
layer: event
grain: (forecast_made_on, horizon_days, forecast_type)
related_to: summary_channel_forecast, summary_channel, summary_channel_metrics_daily
description:
  Append-only credibility ledger for the channel-forecast layer.
  One row per past projection from summary_channel_forecast: the
  original published value + band, plus the observed actual value
  once the build's reporting cutoff catches up to target_date.
  Source of truth lives at public/data/forecast-calibration-log.json
  (git-tracked, survives revert + rebuild); this table is a build-
  derived view of the latest 180 days of that file. `inside_band` is
  the load-bearing credibility signal — past forecasts whose actual
  fell inside [predicted_low, predicted_high]. `error_pct` and
  `inside_band` stay NULL while target_date is still in the future,
  and also when the original forecast was 'insufficient' (no
  number to compare against — an honest gap, not a hidden one).


table_name: forecast_decay_history
layer: event
grain: (snapshot_date, video_id)
related_to: summary_video_decay_model, video, summary_video
description:
  Append-only per-(snapshot_date, video_id) snapshots of
  summary_video_decay_model. Captures the build's fit so consumers
  can compute deltas across builds — e.g., "this video's projected
  quiet date moved 14 days further out in the past week." Source
  of truth lives at public/data/forecast-decay-log.json (git-
  tracked, survives revert + rebuild); this table is a build-
  derived view of the latest 180 days of that file. Today's fit
  still lives in summary_video_decay_model; this ledger only
  accumulates history. `predicted_quiet_date` is NULL on the same
  rows where summary_video_decay_model leaves it NULL (model did
  not project a sub-5 day inside its 5-year horizon).


table_name: summary_channel_source_leading_indicator
layer: derived
grain: (date, snapshot_date)
related_to: summary_traffic_source_daily, summary_channel_metrics_daily
description:
  Per-source leading-indicator score: how reliably this source's
  daily movement predicts the next-week channel-wide trend.


table_name: summary_channel_country_cohort_stability
layer: derived
grain: (date, country_code, snapshot_date)
related_to: summary_channel_country_daily, summary_channel_country_trailing30
description:
  Per-country cohort stability: how much the country's relative
  share has drifted over rolling windows. Quiet countries with
  stable share differ from quiet countries fading out; this row
  distinguishes them.


table_name: summary_video_launch_context
layer: derived
grain: (video_id, snapshot_date)
related_to: summary_video, summary_channel_metrics_daily
description:
  Per-video launch-context snapshot: channel-wide state at publish
  (subscriber count, recent average daily views, publish gap,
  last era swap). Drives the `launch-context-underperformance`
  detector.


table_name: video_daily_clean
layer: derived
grain: (video_id, date)
related_to: video_daily
description:
  Stub-clean view over `video_daily` — `WHERE pre_publish_stub = 0`.
  Use this instead of `video_daily` directly unless you need the
  pre-publish stub rows for some specific reason.


table_name: traffic_daily_clean
layer: derived
grain: (video_id, traffic_source_id, date)
related_to: traffic_daily
description:
  Stub-clean view over `traffic_daily` — `WHERE pre_publish_stub = 0`.
  Use this instead of `traffic_daily` directly unless you need
  pre-publish stub rows.


table_name: v_latest_channel_state
layer: derived
grain: ()
related_to: summary_channel_metrics_daily, summary_channel_snapshot_daily, summary_channel
description:
  Single-row view of the most recent `summary_channel_metrics_daily`
  row joined with `summary_channel_snapshot_daily` for the same
  date. The "what's the state right now?" entry point.


table_name: v_video_state
layer: derived
grain: (video_id)
related_to: video, summary_video, video_current_state
description:
  Per-video state convenience view joining `video`, `summary_video`,
  and `video_current_state`. Replaces three separate lookups for
  the per-video page.


table_name: v_traffic_daily_labeled
layer: derived
grain: (video_id, traffic_source_id, date)
related_to: traffic_daily_clean, traffic_source
description:
  `traffic_daily_clean` joined to `traffic_source` so the source
  display name appears alongside the numeric source_id.


table_name: v_event_ledger
layer: derived
grain: (date, event_type, subject_id)
description:
  Unified event view spanning `channel_timeline_event` plus the
  typed event_* tables (`event_creator_edit`,
  `event_channel_annotation`, etc.). One canonical UNION ALL
  so cross-event-type queries don't have to list every table.

related_to:
  channel_timeline_event, event_creator_edit, event_channel_annotation, event_country_first_view, event_source_first_view, event_channel_state_change


