# video_current_state

date: 2026-08-20
video_id: I1q3BptLCgw
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":349,"views_to_date":1,"impressions_to_date":13,"views_7d":1,"impressions_7d":10,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-20
video_id: J1DRxnCkqn8
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":229,"views_to_date":0,"impressions_to_date":2,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-20
video_id: NWEQu5AbbTA
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-08-24
evidence_json:
  {"days_since_publish":277,"views_to_date":0,"impressions_to_date":7,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-20
video_id: QwG-FnKnj24
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
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":165,"views_to_date":4,"impressions_to_date":14,"views_7d":3,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":4}


date: 2026-08-20
video_id: T3hgpGPRpbs
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":28,"views_to_date":16,"impressions_to_date":84,"views_7d":8,"impressions_7d":41,"day7_views_to_date":6,"late_views_to_date":10}


date: 2026-08-20
video_id: TKohCSznxrk
current_state: concentrated_driver
state_reason: This video carries a large share of the trailing 7-day views.
confidence_tier: strong
lifecycle_stage: growth
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":0,"views_to_date":141,"impressions_to_date":32,"views_7d":141,"impressions_7d":32,"day7_views_to_date":141,"late_views_to_date":0}


date: 2026-08-20
video_id: ZwxN2abo968
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":38,"views_to_date":23,"impressions_to_date":171,"views_7d":5,"impressions_7d":45,"day7_views_to_date":0,"late_views_to_date":23}


date: 2026-08-20
video_id: bTJBHEOpjrk
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-08-24
evidence_json:
  {"days_since_publish":238,"views_to_date":0,"impressions_to_date":12,"views_7d":0,"impressions_7d":8,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-20
video_id: eDFGecvOc7Y
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":39,"views_to_date":18,"impressions_to_date":90,"views_7d":11,"impressions_7d":49,"day7_views_to_date":0,"late_views_to_date":18}


date: 2026-08-20
video_id: eWrspE2ClyA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":375,"views_to_date":8,"impressions_to_date":76,"views_7d":4,"impressions_7d":28,"day7_views_to_date":0,"late_views_to_date":8}


date: 2026-08-20
video_id: jQSjxxhmSzQ
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-08-24
evidence_json:
  {"days_since_publish":139,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":3,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-20
video_id: jfaqWCprW-o
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":292,"views_to_date":0,"impressions_to_date":28,"views_7d":0,"impressions_7d":25,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-20
video_id: jxEqU9b5LKE
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":12,"views_to_date":64,"impressions_to_date":478,"views_7d":36,"impressions_7d":233,"day7_views_to_date":36,"late_views_to_date":28}


date: 2026-08-20
video_id: liucihkVToc
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":309,"views_to_date":1,"impressions_to_date":9,"views_7d":1,"impressions_7d":3,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-20
video_id: ncaoiG0yGaI
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":386,"views_to_date":1,"impressions_to_date":7,"views_7d":1,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-20
video_id: oOzRaFvCJ_o
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":10,"views_to_date":99,"impressions_to_date":283,"views_7d":59,"impressions_7d":176,"day7_views_to_date":56,"late_views_to_date":43}


date: 2026-08-20
video_id: sDzMu0VDOEw
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-08-24
evidence_json:
  {"days_since_publish":43,"views_to_date":0,"impressions_to_date":47,"views_7d":0,"impressions_7d":32,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-20
video_id: xXXcW1fxJ9k
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":43,"views_to_date":3,"impressions_to_date":77,"views_7d":2,"impressions_7d":41,"day7_views_to_date":0,"late_views_to_date":3}


date: 2026-08-21
video_id: 29PyUYx3VxQ
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: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":140,"views_to_date":0,"impressions_to_date":7,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: 3ytlpPOoji8
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":472,"views_to_date":12,"impressions_to_date":42,"views_7d":1,"impressions_7d":10,"day7_views_to_date":0,"late_views_to_date":12}


date: 2026-08-21
video_id: 5X51Cavu8mc
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":22,"views_to_date":9,"impressions_to_date":100,"views_7d":2,"impressions_7d":20,"day7_views_to_date":7,"late_views_to_date":2}


date: 2026-08-21
video_id: 5ehNg_ILwns
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: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":385,"views_to_date":2,"impressions_to_date":9,"views_7d":2,"impressions_7d":9,"day7_views_to_date":0,"late_views_to_date":2}


date: 2026-08-21
video_id: A6AEuxCwbXc
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Browse / Homepage
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":41,"views_to_date":1,"impressions_to_date":71,"views_7d":0,"impressions_7d":18,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-21
video_id: BSlGfx2OELA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":387,"views_to_date":19,"impressions_to_date":71,"views_7d":2,"impressions_7d":24,"day7_views_to_date":0,"late_views_to_date":19}


date: 2026-08-21
video_id: CYdtcftR2rI
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: tail
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":15,"views_to_date":118,"impressions_to_date":1545,"views_7d":58,"impressions_7d":530,"day7_views_to_date":55,"late_views_to_date":63}


date: 2026-08-21
video_id: DAp-hvb6FhA
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":332,"views_to_date":1,"impressions_to_date":9,"views_7d":1,"impressions_7d":2,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-21
video_id: DzY_U8wJrZM
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":44,"views_to_date":0,"impressions_to_date":57,"views_7d":0,"impressions_7d":42,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: I1q3BptLCgw
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":350,"views_to_date":1,"impressions_to_date":19,"views_7d":1,"impressions_7d":16,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-21
video_id: J1DRxnCkqn8
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":230,"views_to_date":0,"impressions_to_date":2,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: NWEQu5AbbTA
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-08-24
evidence_json:
  {"days_since_publish":278,"views_to_date":0,"impressions_to_date":7,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: QwG-FnKnj24
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
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":166,"views_to_date":4,"impressions_to_date":14,"views_7d":3,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":4}


date: 2026-08-21
video_id: T3hgpGPRpbs
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":29,"views_to_date":16,"impressions_to_date":99,"views_7d":8,"impressions_7d":56,"day7_views_to_date":6,"late_views_to_date":10}


date: 2026-08-21
video_id: TKohCSznxrk
current_state: concentrated_driver
state_reason: This video carries a large share of the trailing 7-day views.
confidence_tier: strong
lifecycle_stage: growth
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":1,"views_to_date":164,"impressions_to_date":47,"views_7d":164,"impressions_7d":47,"day7_views_to_date":164,"late_views_to_date":0}


date: 2026-08-21
video_id: ZwxN2abo968
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":39,"views_to_date":23,"impressions_to_date":189,"views_7d":5,"impressions_7d":62,"day7_views_to_date":0,"late_views_to_date":23}


date: 2026-08-21
video_id: bTJBHEOpjrk
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-08-24
evidence_json:
  {"days_since_publish":239,"views_to_date":0,"impressions_to_date":12,"views_7d":0,"impressions_7d":8,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: e4RKmb24lEY
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":0,"views_to_date":89,"impressions_to_date":19,"views_7d":89,"impressions_7d":19,"day7_views_to_date":89,"late_views_to_date":0}


date: 2026-08-21
video_id: eDFGecvOc7Y
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":40,"views_to_date":18,"impressions_to_date":107,"views_7d":10,"impressions_7d":66,"day7_views_to_date":0,"late_views_to_date":18}


date: 2026-08-21
video_id: eWrspE2ClyA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":376,"views_to_date":8,"impressions_to_date":81,"views_7d":3,"impressions_7d":31,"day7_views_to_date":0,"late_views_to_date":8}


date: 2026-08-21
video_id: jQSjxxhmSzQ
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-08-24
evidence_json:
  {"days_since_publish":140,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":3,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: jfaqWCprW-o
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":293,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":31,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: jxEqU9b5LKE
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":13,"views_to_date":70,"impressions_to_date":506,"views_7d":36,"impressions_7d":242,"day7_views_to_date":36,"late_views_to_date":34}


date: 2026-08-21
video_id: liucihkVToc
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":310,"views_to_date":1,"impressions_to_date":10,"views_7d":1,"impressions_7d":4,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-21
video_id: ncaoiG0yGaI
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":387,"views_to_date":1,"impressions_to_date":7,"views_7d":1,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-21
video_id: oOzRaFvCJ_o
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":11,"views_to_date":103,"impressions_to_date":309,"views_7d":62,"impressions_7d":201,"day7_views_to_date":56,"late_views_to_date":47}


date: 2026-08-21
video_id: sDzMu0VDOEw
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":44,"views_to_date":0,"impressions_to_date":60,"views_7d":0,"impressions_7d":45,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-21
video_id: xXXcW1fxJ9k
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":44,"views_to_date":3,"impressions_to_date":86,"views_7d":2,"impressions_7d":47,"day7_views_to_date":0,"late_views_to_date":3}


date: 2026-08-22
video_id: 29PyUYx3VxQ
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: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":141,"views_to_date":0,"impressions_to_date":7,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: 3ytlpPOoji8
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":473,"views_to_date":12,"impressions_to_date":43,"views_7d":1,"impressions_7d":10,"day7_views_to_date":0,"late_views_to_date":12}


date: 2026-08-22
video_id: 5X51Cavu8mc
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":23,"views_to_date":9,"impressions_to_date":100,"views_7d":2,"impressions_7d":15,"day7_views_to_date":7,"late_views_to_date":2}


date: 2026-08-22
video_id: 5ehNg_ILwns
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: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":386,"views_to_date":2,"impressions_to_date":9,"views_7d":2,"impressions_7d":9,"day7_views_to_date":0,"late_views_to_date":2}


date: 2026-08-22
video_id: A6AEuxCwbXc
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Browse / Homepage
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":42,"views_to_date":1,"impressions_to_date":71,"views_7d":0,"impressions_7d":18,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-22
video_id: BSlGfx2OELA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":388,"views_to_date":19,"impressions_to_date":76,"views_7d":2,"impressions_7d":28,"day7_views_to_date":0,"late_views_to_date":19}


date: 2026-08-22
video_id: CYdtcftR2rI
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: tail
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":16,"views_to_date":122,"impressions_to_date":1594,"views_7d":60,"impressions_7d":523,"day7_views_to_date":55,"late_views_to_date":67}


date: 2026-08-22
video_id: DAp-hvb6FhA
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":333,"views_to_date":1,"impressions_to_date":10,"views_7d":1,"impressions_7d":3,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-22
video_id: DzY_U8wJrZM
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":45,"views_to_date":0,"impressions_to_date":57,"views_7d":0,"impressions_7d":42,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: I1q3BptLCgw
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":351,"views_to_date":1,"impressions_to_date":19,"views_7d":1,"impressions_7d":16,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-22
video_id: J1DRxnCkqn8
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":231,"views_to_date":0,"impressions_to_date":2,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: NWEQu5AbbTA
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-08-24
evidence_json:
  {"days_since_publish":279,"views_to_date":0,"impressions_to_date":7,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: QwG-FnKnj24
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
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":167,"views_to_date":4,"impressions_to_date":14,"views_7d":3,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":4}


date: 2026-08-22
video_id: T3hgpGPRpbs
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":30,"views_to_date":16,"impressions_to_date":101,"views_7d":8,"impressions_7d":58,"day7_views_to_date":6,"late_views_to_date":10}


date: 2026-08-22
video_id: TKohCSznxrk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: strong
lifecycle_stage: growth
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":2,"views_to_date":168,"impressions_to_date":48,"views_7d":168,"impressions_7d":48,"day7_views_to_date":168,"late_views_to_date":0}


date: 2026-08-22
video_id: ZwxN2abo968
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":40,"views_to_date":23,"impressions_to_date":189,"views_7d":5,"impressions_7d":61,"day7_views_to_date":0,"late_views_to_date":23}


date: 2026-08-22
video_id: bTJBHEOpjrk
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-08-24
evidence_json:
  {"days_since_publish":240,"views_to_date":0,"impressions_to_date":13,"views_7d":0,"impressions_7d":9,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: e4RKmb24lEY
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":1,"views_to_date":107,"impressions_to_date":19,"views_7d":107,"impressions_7d":19,"day7_views_to_date":107,"late_views_to_date":0}


date: 2026-08-22
video_id: eDFGecvOc7Y
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":41,"views_to_date":18,"impressions_to_date":110,"views_7d":9,"impressions_7d":62,"day7_views_to_date":0,"late_views_to_date":18}


date: 2026-08-22
video_id: eWrspE2ClyA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":377,"views_to_date":8,"impressions_to_date":82,"views_7d":3,"impressions_7d":31,"day7_views_to_date":0,"late_views_to_date":8}


date: 2026-08-22
video_id: jQSjxxhmSzQ
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-08-24
evidence_json:
  {"days_since_publish":141,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":3,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: jfaqWCprW-o
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":294,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":31,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: jxEqU9b5LKE
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":14,"views_to_date":78,"impressions_to_date":551,"views_7d":42,"impressions_7d":253,"day7_views_to_date":36,"late_views_to_date":42}


date: 2026-08-22
video_id: liucihkVToc
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":311,"views_to_date":1,"impressions_to_date":11,"views_7d":1,"impressions_7d":5,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-22
video_id: ncaoiG0yGaI
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":388,"views_to_date":1,"impressions_to_date":7,"views_7d":1,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-22
video_id: oOzRaFvCJ_o
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":12,"views_to_date":132,"impressions_to_date":365,"views_7d":90,"impressions_7d":253,"day7_views_to_date":56,"late_views_to_date":76}


date: 2026-08-22
video_id: sDzMu0VDOEw
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":45,"views_to_date":0,"impressions_to_date":60,"views_7d":0,"impressions_7d":45,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-22
video_id: xXXcW1fxJ9k
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":45,"views_to_date":3,"impressions_to_date":87,"views_7d":2,"impressions_7d":46,"day7_views_to_date":0,"late_views_to_date":3}


date: 2026-08-23
video_id: 29PyUYx3VxQ
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: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":142,"views_to_date":0,"impressions_to_date":7,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: 3ytlpPOoji8
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":474,"views_to_date":12,"impressions_to_date":44,"views_7d":0,"impressions_7d":4,"day7_views_to_date":0,"late_views_to_date":12}


date: 2026-08-23
video_id: 5X51Cavu8mc
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":24,"views_to_date":9,"impressions_to_date":101,"views_7d":2,"impressions_7d":16,"day7_views_to_date":7,"late_views_to_date":2}


date: 2026-08-23
video_id: 5ehNg_ILwns
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: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":387,"views_to_date":2,"impressions_to_date":9,"views_7d":2,"impressions_7d":9,"day7_views_to_date":0,"late_views_to_date":2}


date: 2026-08-23
video_id: A6AEuxCwbXc
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Browse / Homepage
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":43,"views_to_date":1,"impressions_to_date":72,"views_7d":0,"impressions_7d":19,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-23
video_id: BSlGfx2OELA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":389,"views_to_date":19,"impressions_to_date":81,"views_7d":2,"impressions_7d":30,"day7_views_to_date":0,"late_views_to_date":19}


date: 2026-08-23
video_id: CYdtcftR2rI
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: tail
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":17,"views_to_date":128,"impressions_to_date":1636,"views_7d":53,"impressions_7d":492,"day7_views_to_date":55,"late_views_to_date":73}


date: 2026-08-23
video_id: DAp-hvb6FhA
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":334,"views_to_date":1,"impressions_to_date":10,"views_7d":1,"impressions_7d":2,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-23
video_id: DzY_U8wJrZM
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":46,"views_to_date":0,"impressions_to_date":57,"views_7d":0,"impressions_7d":42,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: I1q3BptLCgw
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":352,"views_to_date":1,"impressions_to_date":19,"views_7d":1,"impressions_7d":15,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-23
video_id: J1DRxnCkqn8
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":232,"views_to_date":0,"impressions_to_date":2,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: NWEQu5AbbTA
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-08-24
evidence_json:
  {"days_since_publish":280,"views_to_date":0,"impressions_to_date":7,"views_7d":0,"impressions_7d":1,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: QwG-FnKnj24
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
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":168,"views_to_date":4,"impressions_to_date":14,"views_7d":3,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":4}


date: 2026-08-23
video_id: T3hgpGPRpbs
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":31,"views_to_date":16,"impressions_to_date":101,"views_7d":8,"impressions_7d":55,"day7_views_to_date":6,"late_views_to_date":10}


date: 2026-08-23
video_id: TKohCSznxrk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: strong
lifecycle_stage: growth
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":3,"views_to_date":168,"impressions_to_date":48,"views_7d":168,"impressions_7d":48,"day7_views_to_date":168,"late_views_to_date":0}


date: 2026-08-23
video_id: ZwxN2abo968
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":41,"views_to_date":23,"impressions_to_date":190,"views_7d":5,"impressions_7d":61,"day7_views_to_date":0,"late_views_to_date":23}


date: 2026-08-23
video_id: bTJBHEOpjrk
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-08-24
evidence_json:
  {"days_since_publish":241,"views_to_date":0,"impressions_to_date":13,"views_7d":0,"impressions_7d":9,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: e4RKmb24lEY
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":2,"views_to_date":108,"impressions_to_date":20,"views_7d":108,"impressions_7d":20,"day7_views_to_date":108,"late_views_to_date":0}


date: 2026-08-23
video_id: eDFGecvOc7Y
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":42,"views_to_date":18,"impressions_to_date":112,"views_7d":8,"impressions_7d":64,"day7_views_to_date":0,"late_views_to_date":18}


date: 2026-08-23
video_id: eWrspE2ClyA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":378,"views_to_date":8,"impressions_to_date":82,"views_7d":3,"impressions_7d":31,"day7_views_to_date":0,"late_views_to_date":8}


date: 2026-08-23
video_id: jQSjxxhmSzQ
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-08-24
evidence_json:
  {"days_since_publish":142,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":3,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: jfaqWCprW-o
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":295,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":31,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: jxEqU9b5LKE
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: readable
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":15,"views_to_date":82,"impressions_to_date":575,"views_7d":36,"impressions_7d":258,"day7_views_to_date":36,"late_views_to_date":46}


date: 2026-08-23
video_id: liucihkVToc
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":312,"views_to_date":1,"impressions_to_date":11,"views_7d":1,"impressions_7d":5,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-23
video_id: ncaoiG0yGaI
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":389,"views_to_date":1,"impressions_to_date":7,"views_7d":1,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-23
video_id: oOzRaFvCJ_o
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":13,"views_to_date":141,"impressions_to_date":381,"views_7d":87,"impressions_7d":252,"day7_views_to_date":56,"late_views_to_date":85}


date: 2026-08-23
video_id: sDzMu0VDOEw
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":46,"views_to_date":0,"impressions_to_date":60,"views_7d":0,"impressions_7d":44,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-23
video_id: xXXcW1fxJ9k
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":46,"views_to_date":3,"impressions_to_date":87,"views_7d":2,"impressions_7d":46,"day7_views_to_date":0,"late_views_to_date":3}


date: 2026-08-24
video_id: 29PyUYx3VxQ
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: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":143,"views_to_date":0,"impressions_to_date":8,"views_7d":0,"impressions_7d":2,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: 3ytlpPOoji8
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":475,"views_to_date":12,"impressions_to_date":44,"views_7d":0,"impressions_7d":4,"day7_views_to_date":0,"late_views_to_date":12}


date: 2026-08-24
video_id: 5X51Cavu8mc
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":25,"views_to_date":9,"impressions_to_date":110,"views_7d":2,"impressions_7d":25,"day7_views_to_date":7,"late_views_to_date":2}


date: 2026-08-24
video_id: 5ehNg_ILwns
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: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":388,"views_to_date":2,"impressions_to_date":9,"views_7d":2,"impressions_7d":9,"day7_views_to_date":0,"late_views_to_date":2}


date: 2026-08-24
video_id: A6AEuxCwbXc
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Browse / Homepage
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":44,"views_to_date":1,"impressions_to_date":82,"views_7d":0,"impressions_7d":29,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-24
video_id: BSlGfx2OELA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":390,"views_to_date":20,"impressions_to_date":85,"views_7d":3,"impressions_7d":32,"day7_views_to_date":0,"late_views_to_date":20}


date: 2026-08-24
video_id: CYdtcftR2rI
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: tail
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":18,"views_to_date":139,"impressions_to_date":1711,"views_7d":59,"impressions_7d":509,"day7_views_to_date":55,"late_views_to_date":84}


date: 2026-08-24
video_id: DAp-hvb6FhA
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":335,"views_to_date":1,"impressions_to_date":11,"views_7d":0,"impressions_7d":3,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-24
video_id: DzY_U8wJrZM
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":47,"views_to_date":0,"impressions_to_date":57,"views_7d":0,"impressions_7d":41,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: I1q3BptLCgw
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":353,"views_to_date":1,"impressions_to_date":19,"views_7d":1,"impressions_7d":15,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-24
video_id: J1DRxnCkqn8
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":233,"views_to_date":0,"impressions_to_date":3,"views_7d":0,"impressions_7d":2,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: NWEQu5AbbTA
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-08-24
evidence_json:
  {"days_since_publish":281,"views_to_date":0,"impressions_to_date":8,"views_7d":0,"impressions_7d":2,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: QwG-FnKnj24
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
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":169,"views_to_date":9,"impressions_to_date":23,"views_7d":7,"impressions_7d":16,"day7_views_to_date":0,"late_views_to_date":9}


date: 2026-08-24
video_id: T3hgpGPRpbs
current_state: active
state_reason: Recent views are a visible share of this video's total views.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":32,"views_to_date":16,"impressions_to_date":102,"views_7d":8,"impressions_7d":56,"day7_views_to_date":6,"late_views_to_date":10}


date: 2026-08-24
video_id: TKohCSznxrk
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: strong
lifecycle_stage: growth
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":4,"views_to_date":168,"impressions_to_date":49,"views_7d":168,"impressions_7d":49,"day7_views_to_date":168,"late_views_to_date":0}


date: 2026-08-24
video_id: ZwxN2abo968
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":42,"views_to_date":23,"impressions_to_date":193,"views_7d":5,"impressions_7d":60,"day7_views_to_date":0,"late_views_to_date":23}


date: 2026-08-24
video_id: bTJBHEOpjrk
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-08-24
evidence_json:
  {"days_since_publish":242,"views_to_date":0,"impressions_to_date":15,"views_7d":0,"impressions_7d":11,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: e4RKmb24lEY
current_state: launching
state_reason: This video is still inside its first-week launch window.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":3,"views_to_date":113,"impressions_to_date":23,"views_7d":113,"impressions_7d":23,"day7_views_to_date":113,"late_views_to_date":0}


date: 2026-08-24
video_id: eDFGecvOc7Y
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":43,"views_to_date":18,"impressions_to_date":113,"views_7d":3,"impressions_7d":64,"day7_views_to_date":0,"late_views_to_date":18}


date: 2026-08-24
video_id: eWrspE2ClyA
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: tail
primary_traffic_source: YouTube Search
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":379,"views_to_date":8,"impressions_to_date":82,"views_7d":3,"impressions_7d":19,"day7_views_to_date":0,"late_views_to_date":8}


date: 2026-08-24
video_id: jQSjxxhmSzQ
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-08-24
evidence_json:
  {"days_since_publish":143,"views_to_date":0,"impressions_to_date":36,"views_7d":0,"impressions_7d":5,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: jfaqWCprW-o
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: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":296,"views_to_date":0,"impressions_to_date":34,"views_7d":0,"impressions_7d":31,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: jxEqU9b5LKE
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":16,"views_to_date":102,"impressions_to_date":645,"views_7d":54,"impressions_7d":313,"day7_views_to_date":36,"late_views_to_date":66}


date: 2026-08-24
video_id: liucihkVToc
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":313,"views_to_date":1,"impressions_to_date":14,"views_7d":1,"impressions_7d":8,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-24
video_id: ncaoiG0yGaI
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: quiet
primary_traffic_source: Channel Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":390,"views_to_date":1,"impressions_to_date":7,"views_7d":1,"impressions_7d":7,"day7_views_to_date":0,"late_views_to_date":1}


date: 2026-08-24
video_id: oOzRaFvCJ_o
current_state: late_pickup
state_reason: A meaningful share of this video's views arrived after day 7.
confidence_tier: strong
lifecycle_stage: peak
primary_traffic_source: Suggested Videos
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":14,"views_to_date":156,"impressions_to_date":442,"views_7d":100,"impressions_7d":300,"day7_views_to_date":56,"late_views_to_date":100}


date: 2026-08-24
video_id: sDzMu0VDOEw
current_state: quiet
state_reason: This video had no views in the trailing 7-day window.
confidence_tier: directional
lifecycle_stage: peak
primary_traffic_source: Playlist Page
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":47,"views_to_date":0,"impressions_to_date":60,"views_7d":0,"impressions_7d":43,"day7_views_to_date":0,"late_views_to_date":0}


date: 2026-08-24
video_id: xXXcW1fxJ9k
current_state: steady_tail
state_reason: This video is still receiving some catalog-tail activity.
confidence_tier: directional
lifecycle_stage: quiet
primary_traffic_source: Shorts Feed
snapshot_date: 2026-08-24
evidence_json:
  {"days_since_publish":47,"views_to_date":3,"impressions_to_date":89,"views_7d":2,"impressions_7d":47,"day7_views_to_date":0,"late_views_to_date":3}


# channel_signal_daily

signal_date: 2026-07-26
signal_id: launch-read-floor-2026-07-26
signal_type: launch_read_floor
subject_type: video
subject_id: T3hgpGPRpbs
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":"T3hgpGPRpbs","first_week_candidate_views":5,"first_week_candidate_impressions":7,"first_week_baseline_median_views":0}


signal_date: 2026-07-27
signal_id: launch-read-floor-2026-07-27
signal_type: launch_read_floor
subject_type: video
subject_id: T3hgpGPRpbs
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":"T3hgpGPRpbs","first_week_candidate_views":5,"first_week_candidate_impressions":9,"first_week_baseline_median_views":0}


signal_date: 2026-07-28
signal_id: launch-read-floor-2026-07-28
signal_type: launch_read_floor
subject_type: video
subject_id: T3hgpGPRpbs
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":"T3hgpGPRpbs","first_week_candidate_views":5,"first_week_candidate_impressions":15,"first_week_baseline_median_views":0}


signal_date: 2026-07-29
signal_id: launch-read-floor-2026-07-29
signal_type: launch_read_floor
subject_type: video
subject_id: T3hgpGPRpbs
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":"T3hgpGPRpbs","first_week_candidate_views":5,"first_week_candidate_impressions":16,"first_week_baseline_median_views":0}


signal_date: 2026-07-30
signal_id: launch-read-floor-2026-07-30
signal_type: launch_read_floor
subject_type: video
subject_id: 5X51Cavu8mc
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":"5X51Cavu8mc","first_week_candidate_views":5,"first_week_candidate_impressions":24,"first_week_baseline_median_views":0}


signal_date: 2026-07-31
signal_id: launch-read-floor-2026-07-31
signal_type: launch_read_floor
subject_type: video
subject_id: 5X51Cavu8mc
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":"5X51Cavu8mc","first_week_candidate_views":5,"first_week_candidate_impressions":34,"first_week_baseline_median_views":0}


signal_date: 2026-08-02
signal_id: catalog-concentration-2026-08-02
signal_type: catalog_concentration
subject_type: video
subject_id: BSlGfx2OELA
metric_family: video_share
window: trailing_7d
confidence_tier: readable
direction: concentrated
evidence_json:
  {"top_video_id":"BSlGfx2OELA","top_video_share_7d":0.4118,"top3_video_share_7d":0.7353,"views_7d":34}


signal_date: 2026-08-02
signal_id: launch-read-floor-2026-08-02
signal_type: launch_read_floor
subject_type: video
subject_id: 5X51Cavu8mc
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":"5X51Cavu8mc","first_week_candidate_views":5,"first_week_candidate_impressions":36,"first_week_baseline_median_views":0}


signal_date: 2026-08-03
signal_id: catalog-concentration-2026-08-03
signal_type: catalog_concentration
subject_type: video
subject_id: BSlGfx2OELA
metric_family: video_share
window: trailing_7d
confidence_tier: readable
direction: concentrated
evidence_json:
  {"top_video_id":"BSlGfx2OELA","top_video_share_7d":0.3684,"top3_video_share_7d":0.6842,"views_7d":38}


signal_date: 2026-08-03
signal_id: launch-read-floor-2026-08-03
signal_type: launch_read_floor
subject_type: video
subject_id: 5X51Cavu8mc
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":"5X51Cavu8mc","first_week_candidate_views":6,"first_week_candidate_impressions":48,"first_week_baseline_median_views":0}


signal_date: 2026-08-05
signal_id: catalog-concentration-2026-08-05
signal_type: catalog_concentration
subject_type: video
subject_id: BSlGfx2OELA
metric_family: video_share
window: trailing_7d
confidence_tier: readable
direction: concentrated
evidence_json:
  {"top_video_id":"BSlGfx2OELA","top_video_share_7d":0.3611,"top3_video_share_7d":0.7222,"views_7d":36}


signal_date: 2026-08-05
signal_id: launch-read-floor-2026-08-05
signal_type: launch_read_floor
subject_type: video
subject_id: 5X51Cavu8mc
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":"5X51Cavu8mc","first_week_candidate_views":6,"first_week_candidate_impressions":49,"first_week_baseline_median_views":0}


signal_date: 2026-08-06
signal_id: catalog-concentration-2026-08-06
signal_type: catalog_concentration
subject_type: video
subject_id: BSlGfx2OELA
metric_family: video_share
window: trailing_7d
confidence_tier: readable
direction: concentrated
evidence_json:
  {"top_video_id":"BSlGfx2OELA","top_video_share_7d":0.3714,"top3_video_share_7d":0.6857,"views_7d":35}


signal_date: 2026-08-06
signal_id: launch-read-floor-2026-08-06
signal_type: launch_read_floor
subject_type: video
subject_id: CYdtcftR2rI
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":"CYdtcftR2rI","first_week_candidate_views":5,"first_week_candidate_impressions":41,"first_week_baseline_median_views":0}


signal_date: 2026-08-07
signal_id: launch-baseline-2026-08-07
signal_type: launch_vs_baseline
subject_type: video
subject_id: CYdtcftR2rI
metric_family: launch
window: first_week_to_date
confidence_tier: directional
direction: up
evidence_json:
  {"recent_video_id":"CYdtcftR2rI","first_week_candidate_views":10,"first_week_candidate_impressions":120,"first_week_baseline_median_views":0}


signal_date: 2026-08-08
signal_id: launch-read-floor-2026-08-08
signal_type: launch_read_floor
subject_type: video
subject_id: jxEqU9b5LKE
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":"jxEqU9b5LKE","first_week_candidate_views":3,"first_week_candidate_impressions":15,"first_week_baseline_median_views":0}


signal_date: 2026-08-09
signal_id: launch-baseline-2026-08-09
signal_type: launch_vs_baseline
subject_type: video
subject_id: jxEqU9b5LKE
metric_family: launch
window: first_week_to_date
confidence_tier: directional
direction: up
evidence_json:
  {"recent_video_id":"jxEqU9b5LKE","first_week_candidate_views":6,"first_week_candidate_impressions":138,"first_week_baseline_median_views":0}


signal_date: 2026-08-10
signal_id: launch-baseline-2026-08-10
signal_type: launch_vs_baseline
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: launch
window: first_week_to_date
confidence_tier: directional
direction: up
evidence_json:
  {"recent_video_id":"oOzRaFvCJ_o","first_week_candidate_views":12,"first_week_candidate_impressions":9,"first_week_baseline_median_views":0}


signal_date: 2026-08-11
signal_id: catalog-concentration-2026-08-11
signal_type: catalog_concentration
subject_type: video
subject_id: CYdtcftR2rI
metric_family: video_share
window: trailing_7d
confidence_tier: strong
direction: concentrated
evidence_json:
  {"top_video_id":"CYdtcftR2rI","top_video_share_7d":0.3719,"top3_video_share_7d":0.8843,"views_7d":121}


signal_date: 2026-08-11
signal_id: launch-baseline-2026-08-11
signal_type: launch_vs_baseline
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: launch
window: first_week_to_date
confidence_tier: readable
direction: up
evidence_json:
  {"recent_video_id":"oOzRaFvCJ_o","first_week_candidate_views":38,"first_week_candidate_impressions":72,"first_week_baseline_median_views":0}


signal_date: 2026-08-12
signal_id: catalog-concentration-2026-08-12
signal_type: catalog_concentration
subject_type: video
subject_id: CYdtcftR2rI
metric_family: video_share
window: trailing_7d
confidence_tier: strong
direction: concentrated
evidence_json:
  {"top_video_id":"CYdtcftR2rI","top_video_share_7d":0.3769,"top3_video_share_7d":0.8846,"views_7d":130}


signal_date: 2026-08-12
signal_id: launch-baseline-2026-08-12
signal_type: launch_vs_baseline
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: launch
window: first_week_to_date
confidence_tier: readable
direction: up
evidence_json:
  {"recent_video_id":"oOzRaFvCJ_o","first_week_candidate_views":40,"first_week_candidate_impressions":95,"first_week_baseline_median_views":0}


signal_date: 2026-08-13
signal_id: catalog-concentration-2026-08-13
signal_type: catalog_concentration
subject_type: video
subject_id: CYdtcftR2rI
metric_family: video_share
window: trailing_7d
confidence_tier: strong
direction: concentrated
evidence_json:
  {"top_video_id":"CYdtcftR2rI","top_video_share_7d":0.3759,"top3_video_share_7d":0.8872,"views_7d":133}


signal_date: 2026-08-13
signal_id: launch-baseline-2026-08-13
signal_type: launch_vs_baseline
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: launch
window: first_week_to_date
confidence_tier: readable
direction: up
evidence_json:
  {"recent_video_id":"oOzRaFvCJ_o","first_week_candidate_views":40,"first_week_candidate_impressions":107,"first_week_baseline_median_views":0}


signal_date: 2026-08-14
signal_id: catalog-concentration-2026-08-14
signal_type: catalog_concentration
subject_type: video
subject_id: CYdtcftR2rI
metric_family: video_share
window: trailing_7d
confidence_tier: strong
direction: concentrated
evidence_json:
  {"top_video_id":"CYdtcftR2rI","top_video_share_7d":0.3571,"top3_video_share_7d":0.8929,"views_7d":140}


signal_date: 2026-08-14
signal_id: launch-baseline-2026-08-14
signal_type: launch_vs_baseline
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: launch
window: first_week_to_date
confidence_tier: readable
direction: up
evidence_json:
  {"recent_video_id":"oOzRaFvCJ_o","first_week_candidate_views":41,"first_week_candidate_impressions":108,"first_week_baseline_median_views":0}


signal_date: 2026-08-15
signal_id: launch-baseline-2026-08-15
signal_type: launch_vs_baseline
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: launch
window: first_week_to_date
confidence_tier: readable
direction: up
evidence_json:
  {"recent_video_id":"oOzRaFvCJ_o","first_week_candidate_views":42,"first_week_candidate_impressions":112,"first_week_baseline_median_views":0}


signal_date: 2026-08-16
signal_id: launch-baseline-2026-08-16
signal_type: launch_vs_baseline
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: launch
window: first_week_to_date
confidence_tier: readable
direction: up
evidence_json:
  {"recent_video_id":"oOzRaFvCJ_o","first_week_candidate_views":54,"first_week_candidate_impressions":129,"first_week_baseline_median_views":0}


signal_date: 2026-08-18
signal_id: catalog-concentration-2026-08-18
signal_type: catalog_concentration
subject_type: video
subject_id: CYdtcftR2rI
metric_family: video_share
window: trailing_7d
confidence_tier: strong
direction: concentrated
evidence_json:
  {"top_video_id":"CYdtcftR2rI","top_video_share_7d":0.3677,"top3_video_share_7d":0.8194,"views_7d":155}


signal_date: 2026-08-19
signal_id: video-late-pickup-CYdtcftR2rI-2026-08-19
signal_type: video_late_pickup
subject_type: video
subject_id: CYdtcftR2rI
metric_family: lifecycle
window: after_day_7
confidence_tier: strong
direction: late_pickup
evidence_json:
  {"video_id":"CYdtcftR2rI","late_views_to_date":49,"day7_views_to_date":55,"total_views_to_date":104}


signal_date: 2026-08-20
signal_id: catalog-concentration-2026-08-20
signal_type: catalog_concentration
subject_type: video
subject_id: TKohCSznxrk
metric_family: video_share
window: trailing_7d
confidence_tier: strong
direction: concentrated
evidence_json:
  {"top_video_id":"TKohCSznxrk","top_video_share_7d":0.4135,"top3_video_share_7d":0.7625,"views_7d":341}


signal_date: 2026-08-20
signal_id: video-late-pickup-CYdtcftR2rI-2026-08-20
signal_type: video_late_pickup
subject_type: video
subject_id: CYdtcftR2rI
metric_family: lifecycle
window: after_day_7
confidence_tier: strong
direction: late_pickup
evidence_json:
  {"video_id":"CYdtcftR2rI","late_views_to_date":60,"day7_views_to_date":55,"total_views_to_date":115}


signal_date: 2026-08-20
signal_id: launch-baseline-2026-08-20
signal_type: launch_vs_baseline
subject_type: video
subject_id: TKohCSznxrk
metric_family: launch
window: first_week_to_date
confidence_tier: strong
direction: up
evidence_json:
  {"recent_video_id":"TKohCSznxrk","first_week_candidate_views":141,"first_week_candidate_impressions":32,"first_week_baseline_median_views":0}


signal_date: 2026-08-21
signal_id: catalog-concentration-2026-08-21
signal_type: catalog_concentration
subject_type: video
subject_id: TKohCSznxrk
metric_family: video_share
window: trailing_7d
confidence_tier: strong
direction: concentrated
evidence_json:
  {"top_video_id":"TKohCSznxrk","top_video_share_7d":0.3636,"top3_video_share_7d":0.6984,"views_7d":451}


signal_date: 2026-08-21
signal_id: video-late-pickup-CYdtcftR2rI-2026-08-21
signal_type: video_late_pickup
subject_type: video
subject_id: CYdtcftR2rI
metric_family: lifecycle
window: after_day_7
confidence_tier: strong
direction: late_pickup
evidence_json:
  {"video_id":"CYdtcftR2rI","late_views_to_date":63,"day7_views_to_date":55,"total_views_to_date":118}


signal_date: 2026-08-21
signal_id: launch-baseline-2026-08-21
signal_type: launch_vs_baseline
subject_type: video
subject_id: e4RKmb24lEY
metric_family: launch
window: first_week_to_date
confidence_tier: readable
direction: up
evidence_json:
  {"recent_video_id":"e4RKmb24lEY","first_week_candidate_views":89,"first_week_candidate_impressions":19,"first_week_baseline_median_views":0}


signal_date: 2026-08-22
signal_id: video-late-pickup-oOzRaFvCJ_o-2026-08-22
signal_type: video_late_pickup
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: lifecycle
window: after_day_7
confidence_tier: strong
direction: late_pickup
evidence_json:
  {"video_id":"oOzRaFvCJ_o","late_views_to_date":76,"day7_views_to_date":56,"total_views_to_date":132}


signal_date: 2026-08-22
signal_id: launch-baseline-2026-08-22
signal_type: launch_vs_baseline
subject_type: video
subject_id: e4RKmb24lEY
metric_family: launch
window: first_week_to_date
confidence_tier: strong
direction: up
evidence_json:
  {"recent_video_id":"e4RKmb24lEY","first_week_candidate_views":107,"first_week_candidate_impressions":19,"first_week_baseline_median_views":0}


signal_date: 2026-08-23
signal_id: video-late-pickup-oOzRaFvCJ_o-2026-08-23
signal_type: video_late_pickup
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: lifecycle
window: after_day_7
confidence_tier: strong
direction: late_pickup
evidence_json:
  {"video_id":"oOzRaFvCJ_o","late_views_to_date":85,"day7_views_to_date":56,"total_views_to_date":141}


signal_date: 2026-08-23
signal_id: launch-baseline-2026-08-23
signal_type: launch_vs_baseline
subject_type: video
subject_id: e4RKmb24lEY
metric_family: launch
window: first_week_to_date
confidence_tier: strong
direction: up
evidence_json:
  {"recent_video_id":"e4RKmb24lEY","first_week_candidate_views":108,"first_week_candidate_impressions":20,"first_week_baseline_median_views":0}


signal_date: 2026-08-24
signal_id: video-late-pickup-oOzRaFvCJ_o-2026-08-24
signal_type: video_late_pickup
subject_type: video
subject_id: oOzRaFvCJ_o
metric_family: lifecycle
window: after_day_7
confidence_tier: strong
direction: late_pickup
evidence_json:
  {"video_id":"oOzRaFvCJ_o","late_views_to_date":100,"day7_views_to_date":56,"total_views_to_date":156}


signal_date: 2026-08-24
signal_id: launch-baseline-2026-08-24
signal_type: launch_vs_baseline
subject_type: video
subject_id: e4RKmb24lEY
metric_family: launch
window: first_week_to_date
confidence_tier: strong
direction: up
evidence_json:
  {"recent_video_id":"e4RKmb24lEY","first_week_candidate_views":113,"first_week_candidate_impressions":23,"first_week_baseline_median_views":0}


# summary_channel_regime_forecast

as_of_date: 2026-08-24
current_state: compounding
projected_state: suggested_run
classifier_version: v2
confidence: low
contributing_features_json:
  [{"name":"dailyImpressions","slope_per_day":5.754545,"current_value":260,"ci_low":1.937655,"ci_high":10.379152},{"name":"activeVideos7d","slope_per_day":0.371429,"current_value":28,"ci_low":0.239314,"ci_high":0.478738},{"name":"launchPressureIndex","slope_per_day":-0.031354,"current_value":0.0454,"ci_low":-0.050389,"ci_high":-0.012301},{"name":"newVideoImpressionShare7d","slope_per_day":-0.024944,"current_value":0.0417,"ci_low":-0.043941,"ci_high":-0.01089},{"name":"suggestedShare7d","slope_per_day":0.019988,"current_value":0.2989,"ci_low":0.007339,"ci_high":0.034815},{"name":"searchShare7d","slope_per_day":-0.019622,"current_value":0.0282,"ci_low":-0.021347,"ci_high":-0.01782},{"name":"topCountryShare7d","slope_per_day":-0.014071,"current_value":0.68985,"ci_low":-0.017245,"ci_high":-0.009981},{"name":"maxSourceShare7d","slope_per_day":0.006208,"current_value":0.4248,"ci_low":0.001101,"ci_high":0.01359}]


# _about

key: description
value:
  Sibling artifact to ytpool-public.db. Same channel data; app-internal narrative tables removed; per-row interpretive labels (ctr_quadrant, lifecycle_stage, verdict_*) and narrative-prose columns (timeline headlines, state-change reason_text, annotation bodies) stripped. Forecast tables (summary_threshold_projection, summary_channel_forecast, summary_channel_regime_forecast, summary_video_decay_model, summary_video_trajectory_cone, summary_video_nearest_peers, forecast_calibration_log, forecast_decay_history) kept intact. Designed for LLM consumers that should reason from data rather than parrot stored conclusions.


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.


key: voice_rule
value:
  Forecasts state their assumption and uncertainty band. Banned forecast verbs: "you will", "you'll", "will reach", "will cross" (without "at current pace"), "is going to", "on track to win", "expected to surpass", "is set to". Required hedges: "projects", "tracks toward", "at current pace", "if X holds", "arithmetic on the past N days". Never produce a point estimate without bands. Never give advice; reformulate as observation.


# _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 snapshot-date span (`playhead_range_start` /
  `playhead_range_end`) that every snapshot-extended table carries.
  `compute_version` is the SHA-1 of the build's `compute-*.js`
  source files only — it flips when logic in those modules changes
  between two deploys, signalling that derived tables were
  re-derived under updated code. Six sibling build modules that
  also shape derived rows are deliberately named outside that hash
  (write-pool-tables, pool-video-cohort, pool-channel-cohort,
  video-forecast-pool-prior, owner-tables, lifetime-seed), so an
  unchanged `compute_version` does not by itself prove every build
  module was unchanged. 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 — the canonical bounds for an as-of
  point-lookup (readers bind to the latest
  `snapshot_date <= asOfDate`).


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, exact duration in seconds, 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, real 11-char YouTube IDs, and exact durations are preserved (the anon-era duration bucketing was removed at flc/D2). 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`.
  Live and on-demand viewing of the same video on the same day were
  recorded as one collapsed row before the live_or_on_demand
  dimension landed in the ingest (per-channel migration date; rows
  ingested before it carry no split). Daily totals sourced from the
  Reporting feed for those earlier days can undercount live-stream
  viewing; days ingested after the migration sum both splits fully.


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`). As-of reads honor 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`.
  Same live/on-demand collapse window as video_daily: per-source
  daily rows ingested before the live_or_on_demand dimension landed
  can undercount live-stream viewing for channels that live stream.


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_retention_curve
layer: derived
grain: (video_id, elapsed_ratio)
related_to: summary_video, video
description:
  The audience-retention curve per video: one point per (video, elapsed-time
  ratio) showing how much of the audience was still watching at that fraction
  of the video. `audience_watch_ratio` is this video's own retention at that
  point; `relative_retention_performance` is YouTube's own attributed
  comparison band against similar videos (nullable when YouTube has no peer
  set). Both metrics are non-monetary. A curve is stored only for a video that
  has reached 100 cumulative views — below that the curve is absent by design
  (too few views to be meaningful) — so a small channel shows nothing here. The shape YouTube returns is a
  single lifetime curve that never changes per snapshot, so it is stored ONCE
  (no snapshot dimension); the dashboard re-derives on which as-of dates a
  video's curve was lit from `summary_video.total_views` at that date.

caveats:
  Empty when the build had no private retention source (fixtures, local
  builds) and on any channel whose videos haven't reached 100 cumulative
  views — emptiness is the honest empty state, not an error. NOT
  snapshot-extended (no snapshot_date column): the curve is a single lifetime
  shape stored once, so it is intentionally absent from the snapshot-coverage
  and snapshot-monotonicity gates. `relative_retention_performance` is
  YouTube's attributed band, not a benchmark this product invented.


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_decay_curve_library
layer: app_internal
grain: (cluster_id, age_days, snapshot_date)
related_to: summary_video_decay_model, app_video_forecast_prior
description:
  The two decay shapes a catalogue actually carries, learned from the data
  rather than assumed. Every per-video projection used to lean on one global
  assumption — "views fade log-linearly" — which biases a front-loaded video
  and a slow-burn video in opposite directions. This table holds both curves:
  `front_loaded` banks most of its views in the first days and then flattens,
  `slow_burn` keeps accruing across the four weeks. One row per (shape, age)
  carrying that shape's cumulative share of its four-week total and the share
  that arrived on the day alone, plus how many videos were grouped into it.
  Learned by k-medoids with k = 2 over normalized cumulative-share vectors;
  each video's own match is stamped on
  summary_video_decay_model.curve_cluster / curve_cluster_distance.

caveats:
  A CURVE, never an identity: no video_id and no contributor_id is stored
  anywhere in this table, because a shape drawn from another pooled channel's
  catalogue would otherwise name that channel's video by reference. What ships
  is the normalized shape, a member VIDEO count, and `member_band` — the same
  floored channel band every other pool surface uses, never an exact count.
  Built from the pool when a pool input is supplied and from this channel's own
  catalogue when it is not, so it fills in from the smallest real input. A
  video needs a full, gap-free four-week trajectory with at least one view in
  it to be part of the learning set, and two such videos have to exist before
  two shapes can be separated at all — below that the table is simply empty.
  Fully re-derived at every reporting cutoff; read the latest with
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM app_decay_curve_library).
  The clustering is deterministic (no randomness of any kind), so the same data
  always yields the same two curves.


table_name: app_ctr_prior
layer: app_internal
grain: (scope, scope_key, snapshot_date)
related_to: summary_video, summary_video_traffic, app_pool_cell_stat
description:
  What a click rate is compared against, at three levels. A CTR measured over
  five impressions and a CTR measured over fifty thousand are not the same
  kind of number, and until this table existed the dashboard handled that by
  hiding the thin one behind a tier label. Now each level publishes a typical
  click rate and how firmly that typical holds, and any (clicks, impressions)
  pair can be read against the nearest one: a video with a handful of
  impressions reads close to what its channel typically does, and the range
  shown around it stays wide until the impressions arrive to narrow it.
  Three scopes: `pool` — the typical rate across the OTHER channels in the
  shared pool, never including this channel's own number; `channel` — this
  channel's own typical rate, pulled toward the pool where one exists;
  `channel_source` — the same per traffic source, with `scope_key` holding the
  traffic_source_id, pulled toward the channel. Browse and Search click
  differently, so a per-source read leans on the surface it is actually on.
  `prior_mean` is the typical rate (a fraction 0..1); `prior_strength` is how
  many impressions' worth of evidence that typical is worth, so a channel
  whose videos all click alike carries a firmer typical than one whose videos
  scatter. `prior_alpha` / `prior_beta` split that strength across clicks and
  non-clicks.

caveats:
  IDENTITY WALL on the `pool` row: it carries a rate, a strength and
  `member_band` — the same floored channel band every other pool surface uses
  — and nothing else. `unit_count`, `observed_impressions` and
  `observed_clicks` are NULL on it by construction, because a leave-one-out
  impression total would be another member's own number on a small pool. No
  channel is ever named. The `pool` row is absent entirely on builds without a
  pool input (fixtures, non-pooled channels) — an honest absence, never an
  error. There is NO sample-size gate: a level is written whenever it has one
  impression to speak from, and a thin level says so through a low
  `prior_strength`, not by disappearing. `prior_strength` is clamped to
  [1, 5000] so a level where every unit agrees exactly cannot swallow a
  genuinely different video whole. Fully re-derived at every reporting cutoff;
  read the latest with WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM
  app_ctr_prior). Deterministic — no randomness anywhere, REALs quantized to
  6 decimals for cross-architecture byte-stability.


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.
  Plus one non-domain row, reporting_cutoff, whose available_to is
  the single date the dashboard charts through and whose source
  names the branch that resolved it.


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. Values are CUMULATIVE views by that
  age — each peer's running total of video_daily.views through the
  age, not the single day's count. 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. A band draws from two peers up; between 2 and 4 peers the
  outer edges are the observed min/max rather than interpolated
  tails. Percentile columns are NULL when peer_count < 2 (one
  peer is not a distribution).


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
  similarity constants in dashboard/src/lib/forecast/similarity.ts
  (getTopSimilarVideo / getSimilarVideos).


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, forecast_calibration_log, summary_channel_forecast
description:
  Forward-looking projection of when the channel reaches the next
  round threshold (subscribers / cumulative views / video count).
  The pace starts from the trailing-window fit and, when the channel
  is pooled and a real ≥2-member cohort rung is lit, is EB-shrunk
  toward the shared pool's family prior for the threshold type —
  `rate_per_day` is always the rate the projection actually used.
  `projected_date_low` /
  `projected_date_high` are conformal crossing-date bands: the
  quantiles of the pace model's own past walk-forward prediction
  residuals, solved in closed form for the crossing time — the
  surface honestly widens when the model's own track record is
  noisy. The fitted dates stay published on the
  `confidence='insufficient'` tier (the dashboard then shows the
  date range only, never a single-date claim — the wide band
  carries the roughness); the date columns are NULL only when the
  pace is not positive or the crossing solves beyond the ~10-year
  horizon, where there is genuinely nothing honest to project at
  the current pace.

  Every published row also enters the calibration ledger
  (forecast_calibration_log) as a days-to-crossing prediction and is
  scored against the actual crossing. Post-build, the calibration
  writer back-writes historical_crossing_coverage — the trailing
  inside-band fraction of those resolved crossings (overdue-uncrossed
  counts as a miss, never a silent denominator exit), NULL until 5
  have resolved on the cell. That fraction is what the dashboard's
  demotion reads. The published dates themselves are the conformal
  dates, unmodified: the widen-only auto-tune that used to stretch
  them was retired.

  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).

  The forecast is treated as what it is — a COUNT. The projected
  value is the channel's recent LEVEL, measured with recency
  weighting (a day a week ago counts half as much as today, over
  28 days) and with days far outside the channel's own normal range
  dropped from that level: one viral day is an event, not a new
  baseline. A trend is added on top only when the series really does
  follow one line (the same steadiness test the "at the current
  pace" copy uses elsewhere), and the whole thing is capped so a
  projection can never claim the channel is already running above
  its own best week in the last eight.

  The band is built from what has actually happened to this channel
  over exactly this horizon: the 10th and 90th percentiles of its
  own realized 7 / 14 / 30 / 90-day changes, measured on the
  calendar so a gap in the data can never pass a 116-day change off
  as thirty days. It is measured at each horizon rather than
  rescaled from one pooled set, and it always reaches at least as
  far as "nothing more happens" would. A viral day the projection
  deliberately does not chase shows up here, in how far the upper
  edge reaches. When a horizon has too few realized changes to
  quantile, the band borrows the nearest horizon that does, then
  falls back to a negative-binomial fit on the channel's per-day
  counts. Everything is deterministic and RNG-free, so reruns over
  identical input produce byte-identical bands.

  Thin data widens the band; it never blanks the row. A channel with
  fewer than three usable day-over-day changes publishes the pooled
  cohort's rate directly (when it is pooled), and a channel whose
  analytics spine is starved falls back to the daily subscriber /
  view snapshots. The `confidence='insufficient'` tier (below 14
  days of usable history, or a band wider than the projection
  itself) is a LABEL, not a withhold: the dashboard renders the band
  only, no point claim, and published values clamp at 0.
  `projected_value` and the two `_low`/`_high` columns are NULL only
  for a forecast type with no observation anywhere — `model_type`
  then reads `no_observation`. Otherwise `model_type` names the
  method the centre used (`count_persistence`,
  `count_stable_trend`, `pool_prior_rate`, `cold_persistence`,
  optionally suffixed `_eb` when a pooled prior shrank the rate).

  Post-build, the calibration writer back-writes this cell's track
  record: historical_band_coverage, historical_hit_rate, and
  coverage_below_floor_days — a still-running streak of snapshots
  whose coverage sat below half, which the dashboard uses to demote
  a chronically-wrong cell to a directional reading. Projection
  assumes recent direction and discovery mix hold; arithmetic on the
  channel's own past, not a prediction.

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 v2 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)
description:
  Append-only credibility ledger for BOTH forecast layers. Arc rows
  (`subscribers` / `daily_views`) carry one past projection from
  summary_channel_forecast — the original published value + band,
  plus the observed actual once the build's reporting cutoff
  catches up to target_date. Milestone rows (`milestone_*`) carry
  one past crossing-date projection from
  summary_threshold_projection, measured in DAYS-TO-CROSSING:
  horizon_days holds the threshold value, predicted_* the projected
  days-out, and actual_value the days until the metric's cumulative
  series actually crossed. 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] — and misses never silently exit
  the denominator: a sufficient-history forecast with no usable
  band scores 0 when the outcome arrives, and an overdue milestone
  (late edge passed, no crossing yet) scores 0 immediately while
  its actual_value stays open. `error_pct` and `inside_band` stay
  NULL while the outcome is open, and also when the model declined
  to forecast at all in its warm-up window (no claim to score — an
  honest gap, not a hidden one).

related_to:
  summary_channel_forecast, summary_threshold_projection, summary_channel, summary_channel_metrics_daily


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: forecast_video_calibration_log
layer: event
grain: (forecast_made_on, video_id, metric_type)
related_to: summary_video_decay_model, summary_video_trajectory_cone, video, video_daily
description:
  Append-only credibility ledger for the per-video forecast layer —
  the video-grain mirror of forecast_calibration_log. TWO metric_type
  families share the grain and never pool. views_day_30/60/90 rows
  evaluate the decay model's POINT projections
  (summary_video_decay_model.predicted_views_day_N — a daily
  view-rate), resolved against the rolling 7-day mean of the video's
  per-day views ending at age N; their `hit` is within-±20%.
  cone_band_age_30/60/90 rows evaluate the trajectory cone's peer
  BAND of cumulative views by age N
  (summary_video_trajectory_cone p10..p90 — accumulated totals),
  resolved against the video's own realized cumulative views by that
  age; their `hit` is inside-[p10, p90]. Source of truth lives at
  public/data/forecast-video-calibration-log.json (git-tracked,
  survives revert + rebuild); this table is a build-derived view of
  the latest 180 days of that file. `actual_value`, `error_pct`, and
  `hit` stay NULL while target_date (= published_at + N days) is
  still in the future. Video-detail reads each family as its own
  channel-wide track-record statement
  (dashboard/src/lib/forecast/video-calibration.ts).


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


# _column_catalog

table_name: channel_phase_log
column_name: evidence_json
type: TEXT
unit: json
definition: JSON-encoded payload. See `_json_schema` for shape.
example_value:
  {"phase":"suggested_dominant","browsePct":6.2,"suggestedPct":80.2,"searchPct":0,"channelPct":4.9,"total_views":81}


table_name: channel_signal_daily
column_name: evidence_json
type: TEXT
unit: json
definition: JSON-encoded payload. See `_json_schema` for shape.
example_value:
  {"recent_video_id":"b2Nc8VtY4pQ","first_week_candidate_views":41,"first_week_candidate_impressions":1657,"first_week_baseline_median_views":9}


table_name: channel_timeline_event
column_name: event_key
type: TEXT
unit: text
example_value: a1b2c3d4e5f60718
definition:
  Stable 16-hex-char SHA-1 prefix of event_type|date|detector|video_id|headline. The same logical event keeps the same event_key across snapshot rebuilds. Identity in the table is (event_key, snapshot_date).


table_name: channel_timeline_event
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-05-11
definition:
  Reporting cutoff this row was computed against. Single value per cold build (V64) — the build computes the latest view and readers resolve it with WHERE snapshot_date = MAX(...). See docs/backfill-pattern.md.


table_name: channel_timeline_event
column_name: event_type
type: TEXT
unit: enum
example_value: step_change
definition:
  Discriminator for the event row. Drives `evidence_json` shape — see `_json_schema` for per-type keys.

enum_values:
  publish,milestone,insight,stat_snapshot,rank_change,first_external,note,subscriber_loss_event,stage_transition,era_start,audience_expansion,source_quiet,creator_event,cadence_break,edit_burst,multi_video_activation,cohort_lift,emerging_audience,wisdom_flip,country_first_view


table_name: channel_timeline_event
column_name: evidence_json
type: TEXT
unit: json
definition: Structured evidence payload. Shape varies by `event_type` — see `_json_schema`.
nullable_reason: Some event types carry no structured evidence.
example_value:
  {"metric":"subs_gained_rolling","metric_label":"subscribers gained (7-day mean)","split_date":"2026-04-18","before_mean":0.6524,"after_mean":0.1364,"magnitude_pct":-79}


table_name: channel_timeline_event
column_name: significance
type: INTEGER
unit: score_dimensionless
nullable_reason: Not every event_type has a significance score.
example_value: 59
definition:
  Magnitude × confidence × recency score. Higher values indicate the event was more notable for the channel.


table_name: data_status
column_name: metric_type
type: TEXT
unit: text
example_value: views
definition:
  Domain key (e.g. `views`, `impressions_ctr`, `traffic_sources`, `channel_snapshots`, `reporting_timezone`, `reporting_cutoff`). The `reporting_cutoff` row is not a data domain: it carries the single date the dashboard charts through, in `available_to`, with the branch that resolved it in `source` — `analytics` (the channel's reporting extent), `snapshot-quiet` (extended across later days the channel's lifetime view count shows carried no views), or `snapshot-day0` (no view series exists yet, so the snapshot spine is the record).


table_name: data_status
column_name: available_to
type: TEXT
unit: iso_date
nullable_reason: Non-date-bound rows leave both date fields NULL.
example_value: 2026-05-09
definition:
  Latest date with data for this metric_type. On the `reporting_cutoff` row it is the date the dashboard charts through, which can sit later than the `impressions_ctr` window on a channel whose reports stopped while its snapshot spine kept arriving.


table_name: data_status
column_name: source
type: TEXT
unit: text
example_value: reporting+analytics
definition:
  Source description (e.g. `reporting+analytics`, `data-api`). For the `reporting_timezone` row, holds the IANA timezone string.


table_name: event_creator_edit
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-05-11
definition:
  Reporting cutoff this row was computed against. Single value per cold build (V64) — the build computes the latest view and readers resolve it with WHERE snapshot_date = MAX(...).


table_name: metric_metadata
column_name: computation_doc
type: TEXT
unit: text
definition: Human-facing display text or categorical label.
example_value:
  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 "


table_name: summary_channel
column_name: library_half_mass_video_count
type: INTEGER
unit: count
example_value: 2
deprecated_alias: library_half_life_days
definition:
  How many videos, ordered by lifetime views descending, account for half of total channel views. A lower value typically indicates concentration in a small number of videos.


table_name: summary_channel
column_name: funnel_impressions_total
type: INTEGER
unit: count
nullable_reason: NULL only when summary_video has no rows.
example_value: 5482910
definition:
  Lifetime channel impressions, summed across summary_video.total_impressions. Provides the top of the channel-wide funnel (impressions → clicks → views → subscribers) on a single row.


table_name: summary_channel
column_name: funnel_clicks_total
type: INTEGER
unit: count
nullable_reason: NULL when no video has both impressions and a weighted CTR.
example_value: 124318
definition:
  Lifetime clicks across the catalog, derived from SUM(total_impressions × weighted_ctr) over summary_video. Computed from impression-weighted per-video CTRs rather than the unweighted summary_channel.avg_ctr (which would understate clicks on channels with a few high-impression videos).


table_name: summary_channel
column_name: funnel_subs_total
type: INTEGER
unit: count
example_value: 3142
definition:
  Lifetime subscribers gained, mirroring summary_channel.total_subs_gained on a dedicated funnel surface so the impressions → clicks → subs chain reads as one shape.


table_name: summary_channel
column_name: funnel_impression_to_sub_pct
type: REAL
unit: pct_0_to_100
nullable_reason: NULL when funnel_impressions_total is 0.
example_value: 0.057
definition:
  Share of lifetime impressions that ended in a subscriber, expressed as a percentage (0..100). Typically a small fraction of a percent. Useful as a channel-internal comparison over rebuilds; not a benchmark.


table_name: summary_channel_metrics_daily
column_name: source_diversity_score
type: REAL
unit: score_dimensionless
definition:
  Effective number of traffic sources (exp of entropy). Higher values indicate more diverse source mix.


table_name: summary_channel_metrics_daily
column_name: anomaly_score_composite
type: REAL
unit: score_dimensionless
nullable_reason: NULL on dates with no metric rows yet (fewer than 35 days of history).
example_value: 2.4286
definition:
  How far the day sat outside its own recent norm, summed across the five tracked daily metrics. Each metric contributes the magnitude of its `app_metric_zscore_daily.surprise` — a rank percentile bounded to [-1, 1] by construction — so the total runs 0..5 and no single metric can supply more than 1.0 of it. Observation only: a high value says the day was unlike the four weeks before it, never that anything is wrong.


table_name: summary_channel_metrics_daily
column_name: videos_in_debut
type: INTEGER
unit: count
example_value: 1
definition:
  Public videos in their 'debut' lifecycle stage on this date (days_since_publish 0..2). Sourced from summary_video_stage_daily; stage names mirror lifecycle-classifier.js.

nullable_reason:
  NULL on dates where the stage classifier produced no rows (distinct from 0, which means "no videos in this stage on this date").


table_name: summary_channel_metrics_daily
column_name: videos_in_growth
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 3
definition:
  Public videos in their 'growth' lifecycle stage on this date (early lifetime, views rising vs prior day).


table_name: summary_channel_metrics_daily
column_name: videos_in_tail
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 12
definition:
  Public videos classified as 'tail' on this date — the catch-all post-peak stage when none of the other stages apply.


table_name: summary_channel_metrics_daily
column_name: videos_in_re_emerged
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 0
definition:
  Public videos whose prior stage was 'quiet' and whose views ≥3 on this date — a typically rare re-activation signal.


table_name: summary_channel_metrics_daily
column_name: videos_in_zombie
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 2
definition:
  Public videos with trailing-7-day impressions ≥50 and views ≤1 on this date — typically a stuck pattern where the algorithm keeps showing the video but nobody is clicking.


table_name: summary_channel_metrics_daily
column_name: videos_in_dormant
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 5
definition:
  Public videos with zero trailing-14-day impressions on this date (after day 14) — typically the algorithm has stopped showing the video at all.


table_name: summary_channel_snapshot_daily
column_name: catalog_total_views
type: INTEGER
unit: count
example_value: 0
definition:
  Catalog-sum cumulative views as-of this date — the running sum of attributed per-video reporting (SUM(video_daily.views) where pre_publish_stub=0 and date on or before this row's date). Same aggregation as summary_channel.total_views; its final point equals the lifetime catalog total. Distinct from total_views, which is YouTube's channel-reported figure and can diverge via deleted videos or late attribution.


table_name: summary_channel_traffic
column_name: subs_per_1k_views
type: REAL
unit: score_dimensionless
nullable_reason: NULL when the source had zero attributed views.
example_value: 4.21
definition:
  Subscribers gained per 1000 views attributed to this traffic source. Aggregated from summary_video_traffic.subs_gained (itself a proportional allocation of total_subs_gained by view share — YouTube does not break out subscribers gained by source in the public reporting feed), so this value is typically a modeled share rather than a measured count. Often useful for comparing the relative subscriber-conversion lift across sources.


table_name: summary_era
column_name: thumb_ref
type: TEXT
unit: text
definition:
  Content-addressed ref (hash) of the stored image bytes that were live during this thumbnail era, carried verbatim from video_era. The change-story render resolves it to the real old-vs-new packaging. NULL for title eras and any thumbnail era whose bytes were never captured (history before byte capture began).

nullable_reason:
  NULL for title-field eras and any thumbnail era with no captured bytes (pre-capture history or an unfetched image).


table_name: summary_video
column_name: weighted_ctr
type: REAL
unit: share_0_to_1
confidence_column: ctr_confidence
example_value: 0.0215
definition:
  Click rate weighted by impressions, stored 0..1. Often noisy on small samples — paired with `ctr_confidence`.


table_name: summary_video
column_name: ctr_confidence
type: TEXT
unit: enum
enum_values: noise,low,medium,high
example_value: medium
definition:
  Sample-size confidence tier for `weighted_ctr`. UI typically mutes or strikes through CTR values when this is `noise`.


table_name: summary_video
column_name: imp_to_view_ratio
type: REAL
unit: share_0_to_1
example_value: 33
definition:
  Lifetime impressions divided by views, stored 0..1. Often interpreted as "how many impressions per view this video typically needed."


table_name: summary_video
column_name: source_hhi
type: REAL
unit: score_dimensionless
example_value: 4128.0599999999995
definition:
  Herfindahl-Hirschman index of source mix (0..10000). Higher values indicate more concentration in a single source.


table_name: summary_video_country_lifetime
column_name: subs_per_1k_views
type: REAL
unit: score_dimensionless
nullable_reason: NULL when total_views is 0 for this (video, country) row.
example_value: 2.715
definition:
  Subscribers gained per 1000 views for this (video, country) pair. Computed at INSERT time as `subs_gained * 1000 / total_views`. Unlike the per-source aggregate on summary_channel_traffic this is a measured value (the source reporting feed exposes subscribers_gained by country), so it typically reflects actual conversion lift rather than a modeled share.


table_name: summary_video_retention_curve
column_name: elapsed_ratio
type: REAL
unit: share_0_to_1
example_value: 0.25
definition:
  Position along the video as a fraction of its full length (0 = the very start, 1 = the end) — the x-axis of the retention curve. YouTube's `elapsedVideoTimeRatio` dimension.


table_name: summary_video_retention_curve
column_name: audience_watch_ratio
type: REAL
unit: score_dimensionless
example_value: 0.82
definition:
  Share of the audience still watching at this point of the video — this video's own retention (YouTube's non-monetary `audienceWatchRatio`). Around 1.0 at the start; usually declines toward the end and can briefly exceed 1.0 where viewers rewatch a segment.


table_name: summary_video_retention_curve
column_name: relative_retention_performance
type: REAL
unit: score_dimensionless
nullable_reason: NULL when YouTube has no comparable-video set for this point.
example_value: 0.91
definition:
  YouTube's own attributed comparison of this video's retention at this point against similar videos (the non-monetary `relativeRetentionPerformance` band). An attributed benchmark, not one this product invented.


table_name: traffic_daily
column_name: pre_publish_stub
type: INTEGER
unit: enum
enum_values: 0,1
example_value: 0
definition:
  When 1, the row predates the video publish date and carries NULL/0 values; filter on pre_publish_stub = 0 or use `traffic_daily_clean`.


table_name: traffic_source
column_name: category
type: TEXT
unit: text
example_value: direct
definition:
  High-level grouping (e.g. "browse", "search", "external", "subscriber"). Drives source-mix visualisations.


table_name: v_event_ledger
column_name: source_table
type: TEXT
unit: enum
example_value: channel_timeline_event
definition:
  Which event_* table this row was drawn from. Use to disambiguate when joining back to the source for richer columns.

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


table_name: v_event_ledger
column_name: event_type
type: TEXT
unit: text
example_value: step_change
definition:
  Event-type discriminator. From channel_timeline_event.event_type when source_table = channel_timeline_event; otherwise a synthetic per-source-table label.


table_name: video_current_state
column_name: evidence_json
type: TEXT
unit: json
definition: JSON-encoded payload. See `_json_schema` for shape.
example_value:
  {"days_since_publish":0,"views_to_date":9,"impressions_to_date":208,"views_7d":9,"impressions_7d":208,"day7_views_to_date":9,"late_views_to_date":0}


table_name: video_daily
column_name: avg_view_pct
type: REAL
unit: pct_0_to_100
example_value: 18.333389830508473
definition:
  Average view percentage (avg_view_seconds / duration_seconds), stored 0..100. Clamped at build time.


table_name: video_daily
column_name: pre_publish_stub
type: INTEGER
unit: enum
enum_values: 0,1
example_value: 0
definition:
  When 1, the row predates the video publish date and carries NULL/0 values; filter on pre_publish_stub = 0 or use `video_daily_clean`.


table_name: video_era
column_name: thumb_ref
type: TEXT
unit: text
definition:
  Content-addressed ref (hash) of the stored image bytes that were live during this thumbnail era, correlated from the change ledger at build time. The change-story render resolves it to the real old-vs-new packaging. NULL for title eras and any thumbnail era whose bytes were never captured (history before byte capture began).

nullable_reason:
  NULL for title-field eras and any thumbnail era with no captured bytes (pre-capture history or an unfetched image).


table_name: _about
column_name: value
type: TEXT
unit: text
example_value: ytpool / Open Channel Stats
definition:
  Free-text value for the matching key. Typically short — multi-line voice rules and licence strings are the longest entries.


table_name: _table_catalog
column_name: table_name
type: TEXT
unit: text
example_value: summary_video
definition:
  Name of a real table or view in the public DB. The Phase 10.2 drift guard enforces a 1:1 correspondence with `sqlite_master`.


table_name: _table_catalog
column_name: layer
type: TEXT
unit: enum
enum_values: fact, summary, cohort, event, application, metadata, catalog, reference, view
example_value: summary
definition:
  Architectural layer this table sits in. `fact` rows describe raw events; `summary_*` and `cohort_*` precompute aggregates; `event_*` is a discrete event ledger; `app_*` powers the dashboard; `metadata` and `catalog` describe the DB itself.


table_name: _table_catalog
column_name: grain
type: TEXT
unit: text
example_value: (video_id)
definition:
  The primary-key tuple shorthand (`(video_id)`, `(video_id, date)`, etc.). Identifies what one row represents.


table_name: _table_catalog
column_name: row_count
type: INTEGER
unit: count
example_value: 31
definition:
  Row count at build time. Snapshot only — useful for sanity-checking but expected to change on every refresh.


table_name: _table_catalog
column_name: description
type: TEXT
unit: text
example_value: Per-video lifetime aggregates.
definition:
  Human-readable summary of what the table holds, how it's computed, and when a reader should query it.


table_name: _table_catalog
column_name: query_first
type: INTEGER
unit: enum
enum_values: 0, 1
example_value: 1
definition:
  0/1 flag — 1 when a new reader should typically read this table early (broad orientation), 0 for narrow specialty tables.


table_name: _table_catalog
column_name: caveats
type: TEXT
unit: text
example_value: Filter `pre_publish_stub = 0` for analytics; otherwise pre-publish stub rows distort impressions.
definition:
  Free-text caveats — sampling gates, partial-day cutoffs, units, known artifacts a query author often needs to know.


table_name: _column_catalog
column_name: unit
type: TEXT
unit: enum
example_value: share_0_to_1
definition:
  Semantic unit. Drives display formatting and tells a reader whether a value is `0..1`, `0..100`, seconds, minutes, etc.

enum_values:
  count, pct_0_to_100, share_0_to_1, seconds, minutes, hours, days, iso_date, iso_datetime, iso_week, enum, json, text, video_id, country_code, score_dimensionless


table_name: _column_catalog
column_name: definition
type: TEXT
unit: text
example_value: Total lifetime views across all dates.
definition:
  Short human description of what the column holds — typically hedged ("often", "usually") when describing typical interpretation rather than a hard guarantee.


table_name: _column_catalog
column_name: nullable_reason
type: TEXT
unit: text
example_value: NULL when impressions = 0 for the date.
definition:
  Free-text explanation of when the column can legitimately be NULL. Useful to distinguish "missing data" from "structurally absent".


table_name: _column_catalog
column_name: confidence_column
type: TEXT
unit: text
example_value: ctr_confidence
definition:
  Optional pointer to a sibling column that quantifies the confidence of this column's value (e.g. CTR's `ctr_confidence` tier).


table_name: _column_catalog
column_name: example_value
type: TEXT
unit: text
example_value: 294
definition:
  One sample value pulled from the live DB at build time, truncated to ~200 chars. Useful as a sanity check on type and range.


table_name: _json_schema
column_name: variant_key
type: TEXT
unit: text
example_value: event_type
definition:
  Sibling column whose value selects the JSON shape (e.g. `event_type` on `channel_timeline_event`). Null when the column carries a single shape.


table_name: _query_examples
column_name: category
type: TEXT
unit: enum
enum_values: channel_overview, video_catalog, traffic, geographic, events, lifecycle, wisdom, data_quality
example_value: channel_overview
definition:
  Topical grouping (channel_overview, video_catalog, traffic, geographic, events, lifecycle, wisdom, data_quality). Used by sibling SCHEMA.md to organize examples.


table_name: _query_examples
column_name: sql
type: TEXT
unit: text
definition:
  Executable SQL string. The Phase 10.3 CI guard runs each row against the live DB and asserts it parses, executes, and returns >= expected_min_rows.

example_value:
  SELECT current_subscribers, total_views, total_public_videos, latest_data_date FROM summary_channel;


table_name: _query_examples
column_name: expected_min_rows
type: INTEGER
unit: count
enum_values: 0, 1
example_value: 1
definition:
  Minimum row count the query is expected to return on a healthy build. Values are 0 (legitimately empty on quiet days / small catalogs) or 1 (always expect at least one row).


table_name: event_video_phase_transition
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-05-11
definition:
  Reporting cutoff this row was computed against. V64 / Backfill Pass Phase 2 — single value per build today; Phase 3 lets multiple snapshot dates coexist.


table_name: event_video_phase_transition
column_name: event_date
type: TEXT
unit: iso_date
example_value: 2026-04-12
definition:
  Calendar date in PT (America/Los_Angeles) when the video crossed from one lifecycle phase to another.


table_name: event_video_phase_transition
column_name: days_in_from_phase
type: INTEGER
unit: days
nullable_reason: NULL on the first transition for videos with no measured prior-phase duration.
example_value: 3
definition:
  How long the video typically held the prior phase before transitioning. Useful for distinguishing fast pivots from slow drifts.


table_name: event_video_phase_transition
column_name: magnitude
type: REAL
unit: score_dimensionless
example_value: 77.9220779220779
definition:
  Combined magnitude score capturing how unusual the transition was for this channel. Sorts the largest pivots to the top.


table_name: summary_channel_cohort
column_name: baseline_avg_day30_views
type: REAL
unit: count
nullable_reason: NULL on early cohorts where no comparable baseline exists.
definition:
  Channel-internal baseline for day-30 views, computed across earlier cohorts. Useful as a comparison point for vs_baseline_pct.


table_name: summary_channel_cohort
column_name: vs_baseline_pct
type: REAL
unit: pct_0_to_100
nullable_reason: NULL when baseline_avg_day30_views is NULL or zero.
definition:
  Percent change between avg_day30_views and baseline_avg_day30_views. Positive = cohort outperformed channel baseline.


table_name: summary_channel_cohort
column_name: cohort_label
type: TEXT
unit: enum
enum_values: outperformed, on_pace, underperformed, mixed, insufficient_baseline
definition:
  Short categorical summary of how the cohort typically performed against baseline. Used for narrative chapters.


table_name: summary_channel_country_cohort_stability
column_name: avd_vs_baseline_sec
type: REAL
unit: seconds
example_value: 104.233333333333
definition:
  Difference between this country's AVD and the channel's baseline AVD on the same date. Useful for spotting weak-retention emergences.


table_name: summary_channel_country_cohort_stability
column_name: persistence_score_7d
type: REAL
unit: score_dimensionless
example_value: 1.0
definition:
  Share of the trailing 7 days on which this country was present in the audience. Closer to 1.0 typically reflects a stable cohort; closer to 0.0 reflects a one-day flash.


table_name: summary_channel_source_leading_indicator
column_name: source_hhi_14d
type: REAL
unit: score_dimensionless
example_value: 0.768014831961591
definition:
  Trailing-14-day Herfindahl-Hirschman index over traffic-source view share. 1.0 means a single source; 0.0 means evenly distributed.


table_name: summary_channel_source_leading_indicator
column_name: sticky_share_14d
type: REAL
unit: share_0_to_1
example_value: 0.0324074074074074
definition:
  Share of trailing-14-day views from sources classified as 'sticky' (subscriptions, browse, search). Stored 0..1.


table_name: summary_channel_source_leading_indicator
column_name: net_subs_next_7d
type: INTEGER
unit: count
nullable_reason: NULL when the 7-day forward window is beyond the reporting cutoff.
example_value: 4
definition:
  Net subscribers gained in the 7 days AFTER this date. Future-looking column — usually NULL near the cutoff.


table_name: summary_channel_source_leading_indicator
column_name: pearson_r_hhi_vs_subs
type: REAL
unit: score_dimensionless
nullable_reason: NULL when sample size is below the gate.
example_value: -0.297893540451509
definition:
  Rolling Pearson correlation between recent HHI movement and forward-window subs change. Useful as a leading-indicator strength hint.


table_name: summary_channel_source_leading_indicator
column_name: pattern_label
type: TEXT
unit: enum
definition: Short categorical summary of what the concentration shift typically precedes for this channel.
example_value: mixed
enum_values:
  mixed, concentrating_with_subs_rising, concentrating_with_subs_falling, diversifying_with_subs_rising, diversifying_with_subs_falling, unknown


table_name: summary_video_daily_rank
column_name: peer_count
type: INTEGER
unit: count
example_value: 23
definition:
  Number of videos in the peer set for this (video, date). Useful as a sample-size gate before reading the rank columns.


table_name: summary_video_decay_model
column_name: predicted_quiet_date
type: TEXT
unit: iso_date
nullable_reason: NULL when the model can't project a quiet date (typically plateau fits or insufficient sample).
definition:
  Earliest projected calendar date the video is expected to enter the 'quiet' lifecycle phase. Forecast, not measured.


table_name: summary_video_decay_model
column_name: goodness_of_fit_r2
type: REAL
unit: score_dimensionless
example_value: 0.334134404304709
definition:
  Coefficient of determination (R²) of the fit. Closer to 1.0 is a tighter fit; small samples can produce misleading high R².


table_name: summary_video_decay_model
column_name: usable_for_projection
type: INTEGER
unit: enum
enum_values: 0,1
example_value: 1
definition:
  1 when a projection exists for this video (the predicted day-30/60/90 columns are populated), 0 when it does not. V62 defined it as a fixed quality bar (R² ≥ 0.5, sample ≥ 21 days, fit age ≤ 90 days); V77 retired that bar — it was true on 3 of 87 live videos — and moved the quality signal to the continuous `shrink_weight`. The flag is kept and kept populated so readers written against the older meaning keep returning rows; read `shrink_weight` to judge how much of a projection is the video's own.


table_name: summary_video_decay_model
column_name: shrink_weight
type: REAL
unit: share_0_to_1
nullable_reason: NULL on a pre-V77 database, where the column did not exist.
example_value: 0.31
definition:
  How much of this video's projection is BORROWED rather than its own, on a 0–1 scale. The decay fit is a three-level hierarchy — the video's own daily views, shrunk toward the channel's curve, shrunk toward the cross-channel pool curve — and this is the empirical-Bayes weight on the level above: 0 means the projection comes entirely from the video's own data, 1 means it is entirely the channel/pool curve, which is what a day-1 video with no history of its own gets. Values at or below 0.5 mean the projection is more the video's own than borrowed.


table_name: summary_video_decay_model
column_name: curve_cluster
type: TEXT
unit: enum
enum_values: front_loaded,slow_burn
example_value: front_loaded
definition:
  Which of the two learned decay shapes in `app_decay_curve_library` this video's trajectory most resembles: `front_loaded` (most of its views banked in the first days, then flat) or `slow_burn` (views keep accruing for weeks).

nullable_reason:
  NULL when the video has no usable shape yet — fewer than four consecutive known days from publish, or no views at all to normalize by.


table_name: summary_video_decay_model
column_name: curve_cluster_distance
type: REAL
unit: score_dimensionless
nullable_reason: NULL whenever `curve_cluster` is NULL.
example_value: 0.042
definition:
  How far this video's normalized trajectory sits from that cluster's medoid curve — the mean per-age absolute gap between the two cumulative-share vectors. Smaller is a closer match; 0 means the video IS the medoid.


table_name: summary_video_decay_model
column_name: quiet_date_uncertainty_days
type: REAL
unit: days
example_value: 6.4
definition:
  The plus-or-minus on `predicted_quiet_date`, in days. The quiet date is where the fitted curve crosses below 5 views a day, so how precisely that date is known follows directly from how precisely the slope is known: this is the same crossing re-solved at both edges of the slope's 95% band, halved. A value of 3 means the projection is "around this date, give or take three days"; a value of 40 means the date itself is barely more than a guess. The slope band comes from Theil-Sen's distribution-free pairwise-slope order statistics (V81 replaced the old least-squares fit, which one mid-life traffic spike could drag off by half), widened for however much of the projection is borrowed from the channel curve rather than fit from the video's own daily views.

nullable_reason:
  NULL on every row with no `predicted_quiet_date`, and also when the shallow edge of the slope band is flat or rising — the curve may then never cross below 5 views a day, so the late edge of the date band is unbounded and no finite plus-or-minus is honest.


table_name: app_decay_curve_library
column_name: cluster_id
type: INTEGER
unit: enum
enum_values: 0,1
example_value: 0
definition:
  Which of the two learned decay shapes this row describes. 0 is always the front-loaded curve, 1 the slow-burn one.


table_name: app_decay_curve_library
column_name: age_days
type: INTEGER
unit: days
example_value: 7
definition:
  Days since publish, 0–27. The curve is described over a video's first four weeks — the window where the two shapes actually diverge.


table_name: app_decay_curve_library
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-08-01
definition:
  Reporting cutoff the library was learned at (YYYY-MM-DD). Read the latest with WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM app_decay_curve_library).


table_name: app_decay_curve_library
column_name: curve_label
type: TEXT
unit: enum
enum_values: front_loaded,slow_burn
example_value: slow_burn
definition:
  The shape in words. `front_loaded` banks most of its views in the first days and then flattens; `slow_burn` keeps accruing over the four weeks. The label is assigned by which cluster's medoid has banked more of its total by day 7.


table_name: app_decay_curve_library
column_name: cumulative_share
type: REAL
unit: share_0_to_1
example_value: 0.61
definition:
  Share of the medoid video's four-week view total that had accrued by this age, 0–1 and never decreasing. At age 27 it is 1 by construction.


table_name: app_decay_curve_library
column_name: daily_share
type: REAL
unit: share_0_to_1
example_value: 0.03
definition:
  The share of the four-week total that arrived on this day alone — the day-over-day increment of cumulative_share.


table_name: app_decay_curve_library
column_name: member_band
type: TEXT
unit: enum
nullable_reason: NULL when the library was learned from a single channel's own catalogue (no pool input supplied).
enum_values: 2-4,5-9,10-24,25-49,50-99,100plus
example_value: 2-4
definition:
  The floored band for how many distinct channels contributed videos to this shape — never an exact count. The same band vocabulary every other pool surface uses.


table_name: app_decay_curve_library
column_name: computed_at
type: TEXT
unit: iso_date
example_value: 2026-08-01
definition:
  The reporting cutoff this row was computed for. Equals snapshot_date — the build never stamps wall-clock time.


table_name: summary_threshold_projection
column_name: rate_per_day
type: REAL
unit: score_dimensionless
confidence_column: confidence
example_value: 0.21
definition:
  Per-day pace the projection actually used. Starts from the trailing-lookback-window mean rate and, when the channel is pooled and a real ≥2-member cohort rung is lit, is EB-shrunk toward the shared pool's family prior for the threshold type (subs / views / uploads rate) — so `projected_date = snapshot_date + needed / rate_per_day` stays a reader-checkable identity in both worlds. Units track threshold_type (subs/day, views/day, videos/day). Zero or negative when the channel has been flat or losing ground.


table_name: summary_threshold_projection
column_name: projected_date
type: TEXT
unit: iso_date
confidence_column: confidence
example_value: 2026-07-04
definition:
  Calendar date the threshold projects to cross at the trailing pace. Arithmetic on recent data, not a prediction; the projection assumes recent cadence and discovery mix hold. Kept on the 'insufficient' tier (the dashboard then shows a range, never a single-date claim).

nullable_reason:
  NULL when the pace is not positive, or when the solved crossing sits beyond the ~10-year projection horizon — nothing honest to project at the current pace.


table_name: summary_threshold_projection
column_name: projected_date_low
type: TEXT
unit: iso_date
confidence_column: confidence
example_value: 2026-06-22
definition:
  Earlier end of the crossing-date band — the date the threshold crosses if the value tracks the optimistic edge of the conformal residual band (the model's own walk-forward prediction spread). Published exactly as constructed; nothing widens it after the fact. Kept on the 'insufficient' tier — the wide band IS the roughness signal.

nullable_reason:
  NULL when the pace is not positive, or when the solved crossing sits beyond the ~10-year projection horizon — nothing honest to project at the current pace.


table_name: summary_threshold_projection
column_name: projected_date_high
type: TEXT
unit: iso_date
confidence_column: confidence
example_value: 2026-07-16
definition:
  Later end of the crossing-date band — the date the threshold crosses if the value tracks the pessimistic edge of the conformal residual band. Published exactly as constructed; nothing widens it after the fact. Kept on the 'insufficient' tier — the wide band IS the roughness signal.

nullable_reason:
  NULL when the pace is not positive, or when the solved crossing sits beyond the ~10-year projection horizon — nothing honest to project at the current pace.


table_name: summary_threshold_projection
column_name: lookback_days
type: INTEGER
unit: days
example_value: 7
definition:
  Trailing-window length used for the rate computation. Tighter on high-cadence channels (7d) and wider on sparse ones (28d).


table_name: summary_threshold_projection
column_name: confidence
type: TEXT
unit: enum
enum_values: high, medium, low, insufficient
example_value: medium
definition:
  Confidence tier derived from the usable history length (the finite points of the cumulative series behind the residual walk) and the relative width of the crossing-date band in days. Recomputed on the widened band when the auto-tune pass fires, so a heavily-widened cell drops tiers honestly. On 'insufficient' and 'low' the dashboard shows the range only, never a single-date claim — the fitted dates stay published and the band width carries the confidence.


table_name: summary_threshold_projection
column_name: historical_crossing_coverage
type: REAL
unit: share_0_to_1
nullable_reason: NULL when fewer than 5 scoreable entries exist on this (threshold_type, threshold_value) cell.
example_value: 0.8
definition:
  Fraction of this cell's past crossing-date bands that contained the actual crossing, over the most-recent window (up to 10) of scoreable forecast_calibration_log milestone entries — including overdue entries whose band's late edge passed with no crossing yet (those count as misses, never a silent denominator exit). The dashboard demotes the cell's rendering to a directional band when this falls below 0.5.


table_name: summary_channel_narrative_arc
column_name: arc_id
type: TEXT
unit: text
example_value: arc_01
definition:
  Stable arc identifier within a snapshot (`arc_NN`, ordered by start date). Part of the primary key with snapshot_date.


table_name: summary_channel_narrative_arc
column_name: arc_kind
type: TEXT
unit: enum
enum_values: opening, building, steady, shifting, quiet, current
example_value: opening
definition:
  Neutral descriptor of the arc's shape — never value-laden (no "peak"/"climax"/"decline"). A quiet arc is equal to a busy one; only the shape differs.


table_name: summary_channel_narrative_arc
column_name: span_days
type: INTEGER
unit: days
example_value: 14
definition:
  Length of the arc window in days (end − start + 1). Never below the 7-day floor that keeps a thin timeline from fragmenting into fake arcs.


table_name: summary_channel_narrative_arc
column_name: event_density
type: REAL
unit: score_dimensionless
example_value: 0.5
definition:
  Weighted timeline-events per day across the arc window — context for the arc's texture, not a ranking. Higher-significance events count for more; this is a sample-of-one observation, never a base rate.


table_name: summary_channel_narrative_arc
column_name: view_trend_label
type: TEXT
unit: enum
enum_values: rising, flat, easing, mixed
example_value: rising
definition:
  Hedged window-over-window direction of the channel's 7-day view rate across the arc — observational, never causal. `mixed` marks a noisy window with no clear direction.


table_name: summary_channel_narrative_arc
column_name: dominant_motion
type: TEXT
unit: enum
enum_values: arrival, expansion, plateau, turn, open
example_value: arrival
definition:
  The macro-shape the /story scroll choreographs for this arc. Neutral motion vocabulary, not a performance verdict.


table_name: summary_channel_narrative_arc
column_name: is_open
type: INTEGER
unit: enum
enum_values: 0, 1
example_value: 0
definition:
  1 for the current / unfinished arc that contains the snapshot date (the "not yet recorded" frame); 0 for closed arcs.


table_name: summary_channel_narrative_arc
column_name: headline
type: TEXT
unit: text
example_value: The opening stretch
definition:
  Hedged, observational label for the arc (e.g. "A steadier stretch"). No drama, no superlatives, no causal claims, no advice.


table_name: summary_channel_narrative_arc
column_name: computed_at
type: TEXT
unit: iso_datetime
example_value: 2026-05-28T00:00:00Z
definition:
  Build-time ISO timestamp the arc set was computed at, bound to the snapshot date (midnight UTC) so back-to-back builds stay byte-identical.


table_name: summary_channel_narrative_arc
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-05-28
definition:
  Reporting cutoff this arc set was computed for. Part of the primary key; as-of readers bind to the latest `snapshot_date` at or before their asOfDate (a `WHERE snapshot_date = MAX(...)` point-lookup) so no future arc leaks into an as-of view.


table_name: summary_channel_forecast
column_name: as_of_date
type: TEXT
unit: iso_date
example_value: 2026-05-12
definition:
  Reporting cutoff the forecast was computed against — same as summary_channel.latest_data_date at build time. Pairs with horizon_days to anchor the projection in calendar time.


table_name: summary_channel_forecast
column_name: horizon_days
type: INTEGER
unit: days
example_value: 14
definition:
  Days from as_of_date the projection lands at. One row per (horizon, forecast_type); horizons 7 / 14 / 30 / 90.


table_name: summary_channel_forecast
column_name: forecast_type
type: TEXT
unit: enum
enum_values: subscribers, daily_views
example_value: subscribers
definition:
  Which channel-wide quantity the row projects. `subscribers` fits OLS directly on the cumulative subscriber count; `daily_views` fits OLS on the rolling 7-day mean of per-day views.


table_name: summary_channel_forecast
column_name: projected_value
type: REAL
unit: score_dimensionless
nullable_reason: NULL only when nothing was fittable at all — fewer than 2 usable points, or an all-NULL series.
confidence_column: confidence
example_value: 14.0
definition:
  Point estimate the trailing-window linear trend projects to at as_of_date + horizon_days — units track forecast_type (subscriber count for `subscribers`, daily views for `daily_views`). Arithmetic on the past N days, not a prediction; assumes recent direction and discovery mix hold. Kept on the 'insufficient' tier (the dashboard then shows the band only, never this point); clamped at 0 — both series are non-negative counts.


table_name: summary_channel_forecast
column_name: projected_low
type: REAL
unit: score_dimensionless
nullable_reason: NULL only when nothing was fittable at all — fewer than 2 usable points, or an all-NULL series.
confidence_column: confidence
example_value: 11.5
definition:
  Lower edge of the band — the projected value plus the 10th-percentile of the channel's own realized changes over this exact horizon, recentred so the band describes spread around the projection rather than repeating its drift, and widened to at least what the 'nothing more happens' baseline would have reached. Measured at this horizon, not rescaled from another one. Kept on the 'insufficient' tier — the wide band IS the roughness signal; floors at 0 (both series are non-negative counts).


table_name: summary_channel_forecast
column_name: projected_high
type: REAL
unit: score_dimensionless
nullable_reason: NULL only when nothing was fittable at all — fewer than 2 usable points, or an all-NULL series.
confidence_column: confidence
example_value: 17.2
definition:
  Upper edge of the band — the projected value plus the 90th-percentile of the channel's own realized changes over this exact horizon, recentred so the band describes spread around the projection rather than repeating its drift. A viral day the projection deliberately does not chase shows up HERE, in how far the upper edge reaches. Kept on the 'insufficient' tier — the wide band IS the roughness signal.


table_name: summary_channel_forecast
column_name: model_type
type: TEXT
unit: enum
enum_values: linear_trend
example_value: linear_trend
definition:
  Model family that produced the row. `linear_trend` is the only family in v1; future bumps can layer log-linear or seasonal models alongside without breaking readers.


table_name: summary_channel_forecast
column_name: lookback_days
type: INTEGER
unit: days
example_value: 28
definition:
  Trailing-window length used for the OLS fit. 28 days when the channel's classify_cadence reports high cadence; 56 days otherwise.


table_name: summary_channel_forecast
column_name: sample_size_days
type: INTEGER
unit: days
example_value: 28
definition:
  Number of (x, y) points the OLS fit actually had to work with after slicing to the lookback and computing the rolling 7-day mean (for the daily_views row). Below 14 the row collapses to 'insufficient'.


table_name: summary_channel_forecast
column_name: confidence
type: TEXT
unit: enum
enum_values: high, medium, low, insufficient
example_value: medium
definition:
  Confidence tier derived from sample size and the conformal band's width relative to the point estimate. `insufficient` also fires when the band straddles zero on a non-negative series. The fitted value/band stay published on 'insufficient' — the dashboard renders the band only (no point claim), so the band width carries the confidence.


table_name: summary_channel_forecast
column_name: historical_band_coverage
type: REAL
unit: share_0_to_1
example_value: 0.0
definition:
  Per-(forecast_type, horizon_days) inside-band fraction over the trailing window of up to 10 past forecasts on this cell whose inside_band has been resolved. Computed by compute-forecast-calibration.js after the ledger materializes, then back-written into the row for the current as_of_date. NULL when fewer than 5 such entries exist (small-sample floor); consumers read NULL as "no historical signal yet, no downgrade fires." When non-null and < 0.5, assessForecastUsability demotes the cell's confident tier to directional — the calibration-honesty rule applied per cell.

nullable_reason:
  Fewer than 5 resolved band-checked entries on this (forecast_type, horizon_days) cell, or no calibration ledger materialized for the build.


table_name: summary_channel_forecast
column_name: historical_hit_rate
type: REAL
unit: share_0_to_1
example_value: 0.0
definition:
  Per-(forecast_type, horizon_days) fraction of past forecasts on this cell whose point estimate landed within ±20% of the observed value, over the trailing window of up to 10 entries whose error_pct has been resolved. NULL when fewer than 5 such entries exist. Reserved for a future consumer; written deterministically alongside historical_band_coverage so the surface can be wired without a schema re-bump.

nullable_reason:
  Fewer than 5 resolved entries with a non-null error_pct on this (forecast_type, horizon_days) cell, or no calibration ledger materialized for the build.


table_name: summary_channel_forecast
column_name: coverage_below_floor_days
type: INTEGER
unit: count
nullable_reason: as_of_date had no matching summary_channel_forecast row to autotune (defensive).
example_value: 0
definition:
  Number of consecutive trailing snapshots (ending at as_of_date) where historical_band_coverage on this cell was non-null and below 0.5. Resets to 0 the first time the streak is interrupted by a non-null coverage at or above 0.5. The dashboard's usability reader demotes a cell to directional once this exceeds the chronic-miss threshold (operator-locked at 30 days), making the surface fall back gracefully on cells where band widening can't close the gap. Coverage is recorded for the latest snapshot; on older snapshots the streak reads 0 — the demotion threshold applies to the current view.


table_name: summary_channel_regime_forecast
column_name: as_of_date
type: TEXT
unit: iso_date
example_value: 2026-05-10
definition:
  Reporting cutoff the forecast was computed against — same as summary_channel.latest_data_date at build time. One row per build.


table_name: summary_channel_regime_forecast
column_name: current_state
type: TEXT
unit: enum
example_value: crowded_launch
definition:
  The v2 surface-state label classifying the channel as of as_of_date. Mirrors the latest row in event_channel_state_change so consumers can read both surfaces consistently without joining tables.

enum_values:
  dormant, seeding, cold_testing, warm_testing, suggested_run, search_tail, mixed_expansion, crowded_launch, compounding, incumbent_anchored, cooling, external_spike, solo_launch


table_name: summary_channel_regime_forecast
column_name: projected_state
type: TEXT
unit: enum
confidence_column: confidence
example_value: incumbent_anchored
definition:
  The modal surface-state label the joint trajectory points to inside the 60-day projection horizon. Modal across bootstrap resamples — the most common projected state among samples that transitioned. NULL when too few features are moving meaningfully or bootstrap agreement is too thin to surface a state honestly.

nullable_reason:
  NULL when confidence is 'insufficient' — no clear trajectory toward a transition in the next 60 days.

enum_values:
  dormant, seeding, cold_testing, warm_testing, suggested_run, search_tail, mixed_expansion, crowded_launch, compounding, incumbent_anchored, cooling, external_spike, solo_launch


table_name: summary_channel_regime_forecast
column_name: expected_days
type: INTEGER
unit: days
nullable_reason: NULL when confidence is 'insufficient'.
confidence_column: confidence
example_value: 20
definition:
  Median number of days until the projected transition, taken across bootstrap resamples that converged on the modal projected_state. Arithmetic on the trailing 21-day window's feature slopes, not a prediction; assumes recent direction and discovery mix hold.


table_name: summary_channel_regime_forecast
column_name: expected_days_low
type: INTEGER
unit: days
nullable_reason: NULL when confidence is 'insufficient'.
confidence_column: confidence
example_value: 12
definition:
  10th-percentile end of the bootstrap band of transition days within the modal projected_state — the optimistic edge of "when could the transition land."


table_name: summary_channel_regime_forecast
column_name: expected_days_high
type: INTEGER
unit: days
nullable_reason: NULL when confidence is 'insufficient'.
confidence_column: confidence
example_value: 38
definition:
  90th-percentile end of the bootstrap band of transition days within the modal projected_state — the conservative edge of "when could the transition land."


table_name: summary_channel_regime_forecast
column_name: contributing_features_json
type: TEXT
unit: json
definition:
  JSON array of (name, slope_per_day, current_value, ci_low, ci_high) tuples for each classifier-input feature whose bootstrap slope confidence interval does not straddle zero. Empty array `[]` when no feature passes the gate. Names mirror the SurfaceStateFeatures camelCase keys (e.g. `top1ImpressionShare7d`, `searchShare7d`) so a consumer can render "driven by X and Y" without joining schema-side metadata.

example_value:
  [{"name":"top1ImpressionShare7d","slope_per_day":0.01658,"current_value":0.737,"ci_low":0.00861,"ci_high":0.022815}]


table_name: summary_channel_regime_forecast
column_name: lookback_days
type: INTEGER
unit: days
example_value: 21
definition:
  Trailing window length the writer used to fit feature slopes. v1 ships with a fixed 21-day window — long enough to detect month-scale drift on the rolling-7d / rolling-28d classifier inputs, short enough that the projection responds to recent direction shifts.


table_name: summary_channel_regime_forecast
column_name: sample_size_days
type: INTEGER
unit: days
example_value: 21
definition:
  Number of rows the writer actually had inside the lookback window. Below 14 the row collapses to 'insufficient' before any arithmetic runs.


table_name: summary_channel_regime_forecast
column_name: classifier_version
type: TEXT
unit: enum
enum_values: v1
example_value: v1
definition:
  The v-prefixed version string of the surface-state classifier the writer applied. Pins compute-channel-state-log.js's CLASSIFIER_VERSION so future bumps in classifier branch order or thresholds are observable downstream — old rows keep their original classifier_version.


table_name: summary_channel_regime_forecast
column_name: confidence
type: TEXT
unit: enum
enum_values: high, medium, low, insufficient
example_value: low
definition:
  Confidence tier. `insufficient` fires when fewer than 2 features are moving meaningfully, when fewer than 50% of bootstrap resamples produced any transition inside the 60-day horizon, or when modal-state agreement among transitioning resamples is below 60%. Otherwise tier derives from the bootstrap band width relative to expected_days — `high` at <=20%, `medium` at 20-50%, `low` above 50%.


table_name: forecast_calibration_log
column_name: as_of_date
type: TEXT
unit: iso_date
example_value: 2026-05-12
definition:
  Reporting cutoff of the build that materialized this row. Every row in a single build carries the same as_of_date so queries that group by build are straightforward.


table_name: forecast_calibration_log
column_name: forecast_made_on
type: TEXT
unit: iso_date
example_value: 2026-04-28
definition:
  Reporting cutoff on which the original forecast was computed and published. On arc rows it pairs with horizon_days to recover the target_date = forecast_made_on + horizon_days that the row evaluates; on milestone rows it is the day the crossing countdown starts from.


table_name: forecast_calibration_log
column_name: horizon_days
type: INTEGER
unit: days
example_value: 14
definition:
  On arc rows (`subscribers` / `daily_views`) the days ahead the forecast aimed at, mirroring summary_channel_forecast.horizon_days (7 / 14 / 30 / 90). On milestone rows (`milestone_*`) it carries the THRESHOLD VALUE instead (10 subscribers, 5000 views, …) — the within-type discriminator that keeps the shared (forecast_made_on, horizon_days, forecast_type) key unique with no schema change.


table_name: forecast_calibration_log
column_name: forecast_type
type: TEXT
unit: enum
enum_values: subscribers, daily_views, milestone_subscribers, milestone_cumulative_views, milestone_video_count
example_value: subscribers
definition:
  Which projection the row evaluates. `subscribers` is the cumulative subscriber count and `daily_views` the rolling 7-day mean of per-day views (the arc's fixed horizons); the `milestone_*` values are the crossing-date projections from summary_threshold_projection, measured in days-to-crossing.


table_name: forecast_calibration_log
column_name: predicted_value
type: REAL
unit: score_dimensionless
example_value: 13.5
definition:
  Point estimate the original forecast published. On arc rows the projected value at target_date, in the forecast_type's own unit (subscriber count / daily views). On milestone rows the projected DAYS-OUT to the crossing — the whole-day distance from forecast_made_on to the published projected_date. An 'insufficient'-tier forecast now publishes its fitted values too, so its entry carries real numbers and is scored like any other.

nullable_reason:
  NULL when the original forecast published nothing — a genuinely-empty fit (fewer than 2 usable points / an all-NULL series) on arc rows, a non-positive pace (no crossing date) on milestone rows; calibration then carries no number to compare against.


table_name: forecast_calibration_log
column_name: predicted_low
type: REAL
unit: score_dimensionless
example_value: 11.0
definition:
  Lower edge of the published uncertainty band, in the same unit as predicted_value — the 10th-percentile conformal edge on arc rows; the early-date days-out on milestone rows.

nullable_reason:
  NULL when the original forecast published nothing (genuinely-empty fit / non-positive pace — see predicted_value).


table_name: forecast_calibration_log
column_name: predicted_high
type: REAL
unit: score_dimensionless
example_value: 16.0
definition:
  Upper edge of the published uncertainty band, in the same unit as predicted_value — the 90th-percentile conformal edge on arc rows; the late-date days-out on milestone rows.

nullable_reason:
  NULL when the original forecast published nothing (genuinely-empty fit / non-positive pace — see predicted_value).


table_name: forecast_calibration_log
column_name: actual_value
type: REAL
unit: score_dimensionless
example_value: 13.0
definition:
  The observed outcome. On arc rows the value at target_date (subscriber count / rolling 7-day mean of daily views), filled once the build's latest_data_date reaches target_date. On milestone rows the ACTUAL DAYS from forecast_made_on to the first recorded date the metric's cumulative series crossed the threshold, filled once the crossing lands.

nullable_reason:
  NULL while the outcome is still open — target_date in the future on arc rows; the threshold not yet crossed on milestone rows (an overdue milestone may already carry inside_band = 0 while this stays NULL).


table_name: forecast_calibration_log
column_name: error_pct
type: REAL
unit: pct_0_to_100
nullable_reason: NULL when actual_value is missing OR predicted_value was NULL (insufficient row).
example_value: 3.85
definition:
  Absolute percentage error — |actual_value - predicted_value| / |predicted_value| * 100. Reported to two decimals so calibration dashboards can sort honestly without false precision.


table_name: forecast_calibration_log
column_name: inside_band
type: INTEGER
unit: enum
enum_values: 0, 1
example_value: 1
definition:
  1 when actual_value fell inside [predicted_low, predicted_high], 0 otherwise. The single most-honest credibility signal — past inside-band rate is what calibration footers surface to readers. Misses are never silently dropped from the denominator — a forecast the model made with enough history but no usable band scores 0 when the outcome arrives, and an overdue milestone (the band's late edge passed with no crossing) scores 0 immediately, before actual_value is known.

nullable_reason:
  NULL when the outcome is still open with no verdict yet, or when the model declined to forecast at all (warm-up window — no claim to score).


table_name: forecast_decay_history
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-05-12
definition:
  Reporting cutoff of the build that captured this row. Mirrors summary_channel.latest_data_date for the build.


table_name: forecast_decay_history
column_name: model_type
type: TEXT
unit: enum
nullable_reason: NULL when the underlying fit was missing — preserved as a placeholder row.
enum_values: exponential, log_linear, rising, flat
confidence_column: goodness_of_fit_r2
example_value: exponential
definition:
  Decay-shape classification for this snapshot's fit. Mirrors summary_video_decay_model.model_type at the time of the snapshot.


table_name: forecast_decay_history
column_name: decay_rate_per_day
type: REAL
unit: score_dimensionless
nullable_reason: NULL when the fit failed (fewer than 14 post-day-3 rows or zero variance in age).
confidence_column: goodness_of_fit_r2
example_value: -0.04
definition:
  OLS slope for log(views + 1) over post-day-3 daily rows, in log-per-day units. Negative when the video is fading, positive when it is climbing. Snapshot of summary_video_decay_model.decay_rate_per_day at snapshot_date.


table_name: forecast_decay_history
column_name: half_life_days
type: INTEGER
unit: days
confidence_column: goodness_of_fit_r2
example_value: 17
definition:
  Days for projected views to halve at this snapshot's decay rate. Mirrors summary_video_decay_model.half_life_days at snapshot_date.

nullable_reason:
  NULL when model_type is not 'exponential' — half-life is only meaningful for the falling-exponential branch.


table_name: forecast_decay_history
column_name: predicted_quiet_date
type: TEXT
unit: iso_date
confidence_column: goodness_of_fit_r2
example_value: 2026-06-15
definition:
  First calendar date the fitted curve falls below five views per day at this snapshot. Comparing across two snapshot_date rows lets a consumer name how far the projected quiet date has moved between builds.

nullable_reason:
  NULL when the model does not project a sub-5 day inside its 5-year horizon, OR when the underlying fit was missing.


table_name: forecast_decay_history
column_name: goodness_of_fit_r2
type: REAL
unit: share_0_to_1
nullable_reason: NULL when the fit failed.
example_value: 0.84
definition:
  Coefficient of determination on this snapshot's fit. Higher means the curve explains more of the per-day view variance and the projection deserves more weight.


table_name: forecast_decay_history
column_name: fit_age_days
type: INTEGER
unit: days
nullable_reason: NULL when the fit failed.
example_value: 14
definition:
  Video age at which the snapshot's fit was computed. Pairs with snapshot_date so a consumer can recover (publish_date, age) without joining video.


table_name: forecast_video_calibration_log
column_name: forecast_made_on
type: TEXT
unit: iso_date
example_value: 2026-04-28
definition:
  Reporting cutoff (snapshot_date) on which the forecast behind this row was computed (the decay fit in summary_video_decay_model, or the cone band in summary_video_trajectory_cone). Only the EARLIEST genuine forward forecast per (video, metric_type) outcome is logged.


table_name: forecast_video_calibration_log
column_name: video_id
type: TEXT
unit: video_id
example_value: 5X51Cavu8mc
definition:
  Per-video identifier; foreign key onto video. Identifies the video whose decay projection this row evaluates.


table_name: forecast_video_calibration_log
column_name: metric_type
type: TEXT
unit: enum
enum_values: views_day_30, views_day_60, views_day_90
example_value: views_day_30
definition:
  Which forecast family and horizon this row evaluates. views_day_30/60/90 are the decay model's predicted daily view-rate at video age 30/60/90 days (summary_video_decay_model.predicted_views_day_N). cone_band_age_30/60/90 are the trajectory cone's peer band of cumulative views by that age (summary_video_trajectory_cone) — a band claim, scored inside-[p10, p90], never pooled with the decay rows.


table_name: forecast_video_calibration_log
column_name: target_date
type: TEXT
unit: iso_date
nullable_reason: NULL when the video's publish date was unavailable when the entry was appended.
example_value: 2026-05-28
definition:
  Calendar date the video reaches the evaluated age — published_at + N days for metric_type views_day_N. The entry resolves once a build's reporting cutoff reaches this date.


table_name: forecast_video_calibration_log
column_name: predicted_value
type: INTEGER
unit: count
nullable_reason: NULL when the underlying fit produced no day-N projection.
example_value: 120
definition:
  The recorded prediction. Decay rows (views_day_*) carry the model's point-estimate daily view-rate at the evaluated age; cone rows (cone_band_age_*) carry the peer median (p50) of cumulative views by that age — the band edges ride in the side-cart JSON.


table_name: forecast_video_calibration_log
column_name: actual_value
type: INTEGER
unit: count
example_value: 108
definition:
  The observed value, in each family's own unit. Decay rows resolve the daily view-rate at the evaluated age (the rolling 7-day mean of video_daily.views ending at days_since_publish = N); cone rows resolve the video's realized CUMULATIVE views by that age (the same present-rows running sum the cone applies to every peer). Filled in once the build's reporting cutoff reaches target_date.

nullable_reason:
  NULL while target_date is still in the future, or when the trailing 7-day daily window was incomplete.


table_name: forecast_video_calibration_log
column_name: error_pct
type: REAL
unit: pct_0_to_100
nullable_reason: NULL while unresolved OR when predicted_value was NULL (no number to compare against).
example_value: 10.00
definition:
  Absolute percentage error — |actual_value - predicted_value| / |predicted_value| * 100. Reported to two decimals so the receipt sorts honestly without false precision.


table_name: forecast_video_calibration_log
column_name: hit
type: INTEGER
unit: enum
nullable_reason: NULL while unresolved OR when predicted_value was NULL.
enum_values: 0, 1
example_value: 1
definition:
  The load-bearing credibility signal, answered per family. Decay rows - 1 when the actual landed within ±20% of the prediction (error_pct / 100 <= 0.20), else 0. Cone rows - 1 when the realized cumulative views landed inside the recorded [p10, p90] band, else 0. Each reader scopes to its own metric_type family; the two questions never pool into one number.


table_name: forecast_video_calibration_log
column_name: resolved_on
type: TEXT
unit: iso_date
definition: Reporting cutoff of the build that resolved this entry (filled actual_value / error_pct / hit).
example_value: 2026-05-29
nullable_reason:
  NULL while the entry is still unresolved (target_date in the future or the daily window incomplete).


table_name: summary_video_launch_context
column_name: channel_day7_median_at_publish
type: REAL
unit: count
nullable_reason: NULL on the first video where there are no priors.
definition:
  Channel's median day-7 views across earlier videos at this point in time. Useful as a baseline for video_day7_views.


table_name: summary_video_launch_context
column_name: prior_video_id
type: TEXT
unit: video_id
nullable_reason: NULL on the first video.
example_value: 29PyUYx3VxQ
definition:
  Real YouTube video ID (11-char) of the prior published video on this channel. Useful for chaining context across launches.


table_name: summary_video_launch_context
column_name: video_day7_views
type: INTEGER
unit: count
nullable_reason: NULL on videos that haven't reached day 7.
example_value: 22
definition:
  This video's day-7 views. Sourced from summary_video.day7_views; mirrored here for self-contained launch-context queries.


table_name: summary_video_launch_context
column_name: context_label
type: TEXT
unit: enum
definition: Short categorical summary of the launch context the video debuted into.
example_value: launched_in_typical
enum_values:
  launched_in_typical, launched_in_weak_phase, launched_in_strong_phase, launched_in_crowded, launched_in_drought, insufficient_history


table_name: summary_video_nearest_peers
column_name: shared_age_days
type: INTEGER
unit: days
example_value: 15
definition:
  Number of overlapping days_since_publish on which the video and its peer set both have data. Sample-size gate for the similarity score.


table_name: summary_video_nearest_peers
column_name: peers_qualified
type: INTEGER
unit: count
example_value: 17
definition:
  Number of peer candidates that met the minimum sample gate. Reads as 0–5; lower values mean fewer peer columns are populated.


table_name: summary_video_trajectory_cone
column_name: views_p10
type: REAL
unit: count
nullable_reason: NULL when fewer than two peers reached this age (one peer is not a distribution).
example_value: 0.0
definition:
  Peer 10th percentile of cumulative views by this age_days (each peer's running total of daily views through the age). Reading below this is uncommon in the peer set. From 2-4 peers this edge is the observed minimum rather than an interpolated tail.


table_name: summary_video_trajectory_cone
column_name: views_p90
type: REAL
unit: count
nullable_reason: NULL when fewer than two peers reached this age.
example_value: 11.0
definition:
  Peer 90th percentile of cumulative views by this age_days. Reading above this is uncommon. From 2-4 peers this edge is the observed maximum rather than an interpolated tail.


table_name: summary_video_trajectory_cone
column_name: views_mean
type: REAL
unit: count
nullable_reason: NULL when the peer sample at this age is too small.
example_value: 4.76666666666667
definition:
  Peer mean of cumulative views by this age_days. Often pulled up by long-tail outliers compared to views_p50.


table_name: summary_video_trajectory_cone
column_name: peer_count
type: INTEGER
unit: count
example_value: 30
definition:
  Number of peer videos that contributed to the percentile band at this age. Useful as a confidence gate.


table_name: v_latest_channel_state
column_name: videos_in_debut
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 0
definition:
  Public videos in their 'debut' lifecycle stage on this date (days_since_publish 0..2). Mirrored from summary_channel_metrics_daily.


table_name: v_latest_channel_state
column_name: videos_in_growth
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 3
definition:
  Public videos in their 'growth' lifecycle stage on this date. Mirrored from summary_channel_metrics_daily.


table_name: v_latest_channel_state
column_name: videos_in_peak
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 2
definition:
  Public videos in their 'peak' lifecycle stage on this date. Mirrored from summary_channel_metrics_daily.


table_name: v_latest_channel_state
column_name: videos_in_tail
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 5
definition:
  Public videos in their 'tail' lifecycle stage on this date. Mirrored from summary_channel_metrics_daily.


table_name: v_latest_channel_state
column_name: videos_in_quiet
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 3
definition:
  Public videos in the 'quiet' lifecycle stage on this date — receiving few or zero recent views. Mirrored from summary_channel_metrics_daily.


table_name: v_latest_channel_state
column_name: videos_in_re_emerged
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 0
definition:
  Public videos in the 're_emerged' lifecycle stage on this date — previously quiet videos with a renewed view burst. Mirrored from summary_channel_metrics_daily.


table_name: v_latest_channel_state
column_name: videos_in_zombie
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 2
definition:
  Public videos in the 'zombie' lifecycle stage on this date — long-tail videos still receiving sporadic views. Mirrored from summary_channel_metrics_daily.


table_name: v_latest_channel_state
column_name: videos_in_dormant
type: INTEGER
unit: count
nullable_reason: NULL on dates where the stage classifier produced no rows.
example_value: 0
definition:
  Public videos in the 'dormant' lifecycle stage on this date. Mirrored from summary_channel_metrics_daily.


table_name: summary_channel_threshold_impression_pattern
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-05-13
definition:
  Reporting cutoff this row was computed against. One row per snapshot_date — the channel-pattern is a snapshot, not a time series.


table_name: summary_channel_threshold_impression_pattern
column_name: ctr_jump_event_count
type: INTEGER
unit: count
example_value: 6
definition:
  Number of distinct leading-edge click-rate jump events seen across the channel's videos up to this snapshot — using the same per-video threshold (>= 2 percentage-point lift on a trailing-7d weighted CTR vs the prior 7d, at age >= 14d, with at least 200 impressions in each window) as the `late-life-ctr-jump` detector. Sustained windows count once at the day they first trigger.


table_name: summary_channel_threshold_impression_pattern
column_name: ctr_jump_followed_count
type: INTEGER
unit: count
example_value: 4
definition:
  Of the `ctr_jump_event_count` events, the number where mean impressions per day across the next 7 days came in at least 20% above the prior 7 days. Observation about what happened — not a causal claim.


table_name: summary_channel_threshold_impression_pattern
column_name: avd_jump_event_count
type: INTEGER
unit: count
example_value: 3
definition:
  Number of distinct leading-edge average-view-duration jump events seen across the channel's videos up to this snapshot — mirror of `ctr_jump_event_count` on the AVD axis, using the same threshold as the `late-life-avd-jump` detector (>= 15% relative lift on a trailing-7d weighted AVD vs the prior 7d, at age >= 14d, with at least 30 views in each window).


table_name: summary_channel_threshold_impression_pattern
column_name: avd_jump_followed_count
type: INTEGER
unit: count
example_value: 1
definition:
  Of the `avd_jump_event_count` events, the number where mean impressions per day across the next 7 days came in at least 20% above the prior 7 days. Observation about what happened — not a causal claim.


table_name: summary_channel_threshold_impression_pattern
column_name: ctr_min_pp_delta
type: REAL
unit: pct_0_to_100
example_value: 2
definition:
  Minimum percentage-point lift (recent-7d weighted CTR minus prior-7d weighted CTR, both in percentage points) required to register a CTR jump event. Mirrors the per-video detector's `MIN_PP_JUMP`.


table_name: summary_channel_threshold_impression_pattern
column_name: avd_min_rel_delta
type: REAL
unit: share_0_to_1
example_value: 0.15
definition:
  Minimum relative lift (recent-7d weighted AVD divided by prior-7d weighted AVD minus 1) required to register an AVD jump event. Mirrors the per-video detector's `MIN_REL_JUMP`.


table_name: summary_channel_threshold_impression_pattern
column_name: followup_window_days
type: INTEGER
unit: days
example_value: 7
definition:
  Number of days after a jump that is evaluated for the impression follow-up. Held constant at 7 so the per-video card and channel-pattern row share the same definition of "after".


table_name: summary_channel_threshold_impression_pattern
column_name: followup_impression_lift_threshold
type: REAL
unit: share_0_to_1
example_value: 0.2
definition:
  Minimum relative lift in mean impressions-per-day across the follow-up window (vs the prior 7 days) for the follow-up to count as "impressions stepped up". Stored as a share — 0.20 means +20%.


table_name: summary_channel_threshold_impression_pattern
column_name: videos_evaluated
type: INTEGER
unit: count
example_value: 18
definition:
  Number of videos on the channel that had enough daily history (>= 2 windows + 1 follow-up window past the 14-day age gate) to be walked for jump events at this snapshot. When this is small, the followed-rate is a sample-of-one observation and the per-video card should hedge accordingly.


table_name: summary_channel_threshold_impression_pattern
column_name: computed_at
type: TEXT
unit: iso_datetime
example_value: 2026-05-13T00:00:00Z
definition:
  Build-time ISO timestamp the pattern row was computed at. Defaults to the snapshot_date at midnight UTC for byte-deterministic builds.


table_name: app_ctr_prior
column_name: scope
type: TEXT
unit: enum
enum_values: pool,channel,channel_source
example_value: channel
definition:
  Which level of the comparison this row describes. `pool` is the typical click rate across the OTHER channels in the shared pool; `channel` is this channel's own typical, pulled toward the pool where one exists; `channel_source` is the same per traffic source, pulled toward the channel.


table_name: app_ctr_prior
column_name: scope_key
type: TEXT
unit: text
example_value: *
definition:
  Which member of the scope. The traffic_source_id (as text) on a `channel_source` row; the literal `*` on the `pool` and `channel` rows, which have only one member each.


table_name: app_ctr_prior
column_name: snapshot_date
type: TEXT
unit: iso_date
example_value: 2026-08-01
definition:
  The reporting cutoff this row was derived at. Read the latest with WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM app_ctr_prior).


table_name: app_ctr_prior
column_name: prior_mean
type: REAL
unit: share_0_to_1
example_value: 0.048
definition:
  The typical click rate at this level, as a fraction — 0.05 is 5% of the people who saw a thumbnail clicking it. A video's own rate is read against this: a video with few impressions sits close to it, a video with many impressions moves away from it on its own evidence.


table_name: app_ctr_prior
column_name: prior_strength
type: REAL
unit: count
example_value: 1840.2
definition:
  How many impressions' worth of evidence the typical is worth. A channel whose videos all click at a similar rate carries a firmer typical (a bigger number) than one whose videos scatter. Clamped to 1..5000.


table_name: app_ctr_prior
column_name: prior_alpha
type: REAL
unit: count
example_value: 88.3
definition:
  The clicks half of `prior_strength` (prior_mean × prior_strength). Add it to a video's clicks to read that video against this level.


table_name: app_ctr_prior
column_name: unit_count
type: INTEGER
unit: count
definition: How many videos of this channel went into the level.
example_value: 42
nullable_reason:
  Always NULL on the `pool` row. That row is built by leaving this channel out and reading the others, so a count there would be a count of other channels — the identity wall keeps it to the floored `member_band` instead.


table_name: app_ctr_prior
column_name: observed_impressions
type: INTEGER
unit: count
definition: Total impressions behind the level, across this channel's own videos.
example_value: 184203
nullable_reason:
  Always NULL on the `pool` row — a leave-one-out impression total would be another member's own number on a small pool.


table_name: app_ctr_prior
column_name: observed_clicks
type: REAL
unit: count
nullable_reason: Always NULL on the `pool` row, for the same reason `observed_impressions` is.
example_value: 8841.7
definition:
  Total clicks behind the level. A REAL rather than an integer because it comes from impression-weighted rates.


table_name: app_ctr_prior
column_name: parent_scope
type: TEXT
unit: enum
nullable_reason: NULL on the `pool` row (nothing above it) and on a `channel` row built without a pool input.
enum_values: pool,channel
example_value: channel
definition:
  Which level this one was pulled toward. `channel` rows lean on `pool`; `channel_source` rows lean on `channel`.


table_name: app_ctr_prior
column_name: member_band
type: TEXT
unit: enum
nullable_reason: NULL on the `channel` and `channel_source` rows, which describe this channel alone.
enum_values: 1,2-4,5-9,10-24,25-99,100plus
example_value: 2-4
definition:
  The floored size band of the pool this typical came from — the same band every other pool surface carries. Never an exact channel count.


table_name: app_ctr_prior
column_name: computed_at
type: TEXT
unit: iso_date
example_value: 2026-08-01
definition:
  The date the row was derived for. Always equals snapshot_date — the build stamps the reporting cutoff, never the wall clock, so a rebuild reproduces the row exactly.


