# _json_schema

table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: insight
json_keys: video_id, source, views
example_value: {"video_id":"Zn3dG5hJyLk","source":"Browse / Homepage","views":38}
description:
  Detector-fired insight surfaced for the Moment chapter. Shape varies by detector — see app_insight_snapshot.evidence_json for finer-grained per-detector shapes.


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: rank_change
json_keys: kind, prior_leader, new_leader, prior_value, new_value, prior_label, new_label
description: Lead shift between videos or sources for the named metric.
example_value:
  {"kind":"video_lead","prior_leader":"Kx7bQp2mLdA","new_leader":"Rj9nT4vWc0E","prior_value":11,"new_value":41,"prior_label":"How I plan a week of videos","new_label":"The camera setup I regret buying"}


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: first_external
json_keys: video_id, first_external_date, views_that_day, share_at_first
example_value: {"video_id":"Rj9nT4vWc0E","first_external_date":"2026-04-11","views_that_day":1}
description:
  First day a video received External source traffic. share_at_first (the fraction of that day's views from External) may be absent on older rows.


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: note
json_keys: kind, scope, video_ids, fields, note_kind
example_value:
  {"kind":"manual","scope":"video","video_ids":["Rj9nT4vWc0E"],"fields":null,"note_kind":"expectation"}

description:
  Hand-authored creator note loaded from pipeline/channel-notes.yaml. Optional file. Untyped notes carry no evidence_json (NULL); the key set above appears only on a tense-tagged note. note_kind is one of expectation (a forward-looking read dated at/before the moment it precedes), change-rationale (the stated reason a change was made, no causal claim), or retrospective (a past-tense look-back recorded later). An expectation may name a video_id and is then anti-retrofit-checked at build time — its date must be at or before that video's publish.


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: stage_transition
json_keys:
  video_id, old_stage, new_stage, days_in_old_stage, magnitude, views_3d_before, views_3d_after, views_rate_change_pct

example_value:
  {"video_id":"Mb6cV1wXtRu","old_stage":"peak","new_stage":"tail","days_in_old_stage":12,"magnitude":34,"views_3d_before":420,"views_3d_after":180,"views_rate_change_pct":-57.1}

description:
  Lifecycle stage transition for a video. Phase 6.4 extends the older 4-key shape with magnitude + 3-day-window evidence; older snapshots may carry only the first three keys.


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: era_start
json_keys: video_id, era_index, era_start_date, prior_era_index, fields_changed
description: Title/thumbnail era boundary for a video (Phase 6.1).
example_value:
  {"video_id":"Rj9nT4vWc0E","era_index":2,"era_start_date":"2026-03-15","prior_era_index":1,"fields_changed":["title","thumbnail"]}


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: source_quiet
json_keys: video_id, source_id, source_name, quiet_started, prior_view_share
description: A previously-active traffic source went quiet for a video (Phase 6.3).
example_value:
  {"video_id":"Rj9nT4vWc0E","source_id":3,"source_name":"External","quiet_started":"2026-04-22","prior_view_share":0.12}


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: creator_event
json_keys: kind, scope, end_date, video_ids, fields, note_kind
example_value:
  {"kind":"republish","scope":"video","end_date":null,"video_ids":["Rj9nT4vWc0E"],"fields":["title"],"note_kind":"change-rationale"}

description:
  Owner-authored timeline annotation from pipeline/creator-events.yaml. note_kind is appended only on a tense-tagged event (untyped events omit the key, staying byte-identical to pre-tagging builds) and is DISTINCT from the `kind` slug: `kind` names the beat (republish, schedule_change, …) while note_kind names its tense — expectation (forward-looking, dated at/before the moment), change-rationale (the stated reason for a change, no causal claim), or retrospective (a past-tense look-back over a window). An expectation that names a video is anti-retrofit-checked at build time.


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: multi_video_activation
json_keys: videos
description: Multiple videos surged on the same day. `videos` is an array of per-video evidence rows.
example_value:
  {"videos":[{"video_id":"Zn3dG5hJyLk","lift_x":23.4,"today_views":39},{"video_id":"Hs2yF8kNpZq","lift_x":10.5,"today_views":9}]}


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: wisdom_flip
json_keys: test_id, prior_status, new_status, belief_short
example_value:
  {"test_id":"mid_length_videos_optimal","prior_status":"inconclusive","new_status":"disagrees","belief_short":"Mid-length optimum"}

description:
  A wisdom belief test changed verdict between snapshots. belief_short is the curated short belief name (null for an id with no curated label).


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: trend
json_keys:
  metric, metric_label, mode, window_days, direction, current_avg, baseline_avg, magnitude_pct, current_n, baseline_n

example_value:
  {"metric":"channel_views","metric_label":"daily views (7-day mean)","mode":"prev","window_days":7,"direction":"rising","current_avg":240,"baseline_avg":150,"magnitude_pct":60,"current_n":7,"baseline_n":7}

description:
  Window-over-window trend in a channel-wide metric (C4) — the recent window's mean against the prior window's, computed by the trend lib's compareWindows (the same primitive the channel-window-trend detector runs). current_avg / baseline_avg are integer-quantized window means; magnitude_pct is the integer relative delta; direction is rising | falling. Observational — never a verdict.


table_name: channel_timeline_event
column_name: evidence_json
variant_key: event_type
variant_value: country_first_view
json_keys: country_code
example_value: {"country_code":"CA"}
description:
  Channel received its first view from this country on this date. (Alias of first_country_view; both event_type strings appear in older builds.)


table_name: event_channel_annotation
column_name: affected_video_ids_json
json_keys: (array, no top-level keys)
example_value: ["Rj9nT4vWc0E","Mb6cV1wXtRu"]
description:
  Array of YouTube video IDs (11-character) affected by a channel-scope annotation. NULL for channel-only events.


table_name: summary_channel
column_name: publish_gap_distribution
json_keys: (histogram object; keys are gap-in-days strings, values are counts)
example_value: {"1":31}
description:
  Histogram of publish-gap-in-days across the catalog. Keys are gap values (as strings); values are video counts.


table_name: channel_signal_daily
column_name: evidence_json
json_keys: (varies per signal type — typically per-video and per-window numbers)
description: Per-(date, signal) evidence payload. Shape varies per signal type.
example_value:
  {"recent_video_id":"Rj9nT4vWc0E","first_week_candidate_views":41,"first_week_candidate_impressions":1657,"first_week_baseline_median_views":9}


table_name: video_current_state
column_name: evidence_json
description: Per-video state snapshot used by the per-video page for current-state pills.
json_keys:
  days_since_publish, views_to_date, impressions_to_date, views_7d, impressions_7d, day7_views_to_date, late_views_to_date

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: summary_channel_regime_forecast
column_name: contributing_features_json
json_keys: (array of objects with: name, slope_per_day, current_value, ci_low, ci_high)
example_value:
  [{"name":"top1ImpressionShare7d","slope_per_day":0.01658,"current_value":0.737,"ci_low":0.00861,"ci_high":0.022815}]

description:
  Array of classifier-input features whose bootstrap slope CI did not straddle zero. `name` matches the camelCase keys on the SurfaceStateFeatures classifier input; `slope_per_day` is the OLS slope on the trailing window (units track the underlying feature); `current_value` is the most-recent feature observation; `ci_low` / `ci_high` are the 10th / 90th percentiles of the bootstrap slope distribution. Empty array when no feature passed the gate (the row also collapses to confidence='insufficient' in that case).


# _query_examples

category: channel_overview
question: What is the channel's current snapshot (subscribers, total views, video count, latest date)?
difficulty: simple
sql:
  SELECT current_subscribers, total_views, total_public_videos, latest_data_date
  FROM summary_channel
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_channel);

notes:
  Filters to the latest snapshot (V64 added snapshot_date on summary_channel; the current view is always MAX(snapshot_date)).


category: channel_overview
question: What were the channel's daily totals over the last 30 days?
difficulty: simple
notes: Filters on the reporting cutoff so the latest row isn't a partial day.
sql:
  SELECT date, total_views, total_impressions, weighted_ctr, subs_net
  FROM summary_channel_metrics_daily
  WHERE date >= date((SELECT value FROM _about WHERE key = 'reporting_cutoff'), '-30 days')
    AND date <= (SELECT value FROM _about WHERE key = 'reporting_cutoff')
  ORDER BY date;


category: channel_overview
question: What's the conversion funnel from impressions to subscribers gained over the past 30 days?
difficulty: moderate
notes: Drop-off ratios are stored 0..1 so a 5% conversion appears as 0.05.
sql:
  SELECT
    SUM(total_impressions) AS impressions,
    SUM(total_views)       AS views,
    SUM(subs_gained)       AS subs_gained,
    CAST(SUM(total_views) AS REAL) / NULLIF(SUM(total_impressions), 0) AS imp_to_view,
    CAST(SUM(subs_gained) AS REAL) / NULLIF(SUM(total_views), 0)       AS view_to_sub
  FROM summary_channel_metrics_daily
  WHERE date >= date((SELECT value FROM _about WHERE key = 'reporting_cutoff'), '-30 days');


category: video_catalog
question: What are the top 10 videos by lifetime views?
difficulty: simple
sql:
  SELECT video_id, total_views, total_watch_minutes, weighted_ctr, avg_retention_pct
  FROM summary_video
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_video)
  ORDER BY total_views DESC
  LIMIT 10;


category: video_catalog
question: What are the 10 newest videos with their day-7 view counts?
difficulty: simple
sql:
  SELECT video_id, published_at, day7_views, day7_ctr, ctr_confidence
  FROM summary_video
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_video)
  ORDER BY published_at DESC
  LIMIT 10;


category: video_catalog
question: Which videos crossed the day-1000-views milestone, and how long did it take?
difficulty: moderate
sql:
  SELECT video_id, days_to_1000_views, total_views, published_at
  FROM summary_video
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_video)
    AND days_to_1000_views IS NOT NULL
  ORDER BY days_to_1000_views ASC;

notes:
  Returns 0 on small channels that haven't hit 1000 views on any video. Larger milestones (10k, 100k) require a cumulative-sum query against video_daily.


category: traffic
question: What are the top 5 traffic sources by lifetime views?
difficulty: simple
sql:
  SELECT ts.display_name, sct.total_views, sct.total_watch_minutes, sct.weighted_ctr
  FROM summary_channel_traffic sct
  JOIN traffic_source ts ON sct.traffic_source_id = ts.id
  WHERE sct.snapshot_date = (SELECT MAX(snapshot_date) FROM summary_channel_traffic)
  ORDER BY sct.total_views DESC
  LIMIT 5;


category: traffic
question: How much watch-time-per-impression does each traffic source typically deliver?
difficulty: moderate
sql:
  SELECT
    ts.display_name,
    sct.total_views,
    sct.total_impressions,
    CAST(sct.total_watch_minutes AS REAL) / NULLIF(sct.total_impressions, 0) AS watch_min_per_imp
  FROM summary_channel_traffic sct
  JOIN traffic_source ts ON sct.traffic_source_id = ts.id
  WHERE sct.snapshot_date = (SELECT MAX(snapshot_date) FROM summary_channel_traffic)
    AND sct.total_impressions > 0
  ORDER BY watch_min_per_imp DESC;


category: traffic
question: What was the channel's source mix as a percentage of total over the last 7 days?
difficulty: moderate
sql:
  WITH window AS (
    SELECT date FROM summary_channel_metrics_daily
    WHERE date >= date((SELECT value FROM _about WHERE key = 'reporting_cutoff'), '-7 days')
      AND date <= (SELECT value FROM _about WHERE key = 'reporting_cutoff')
  ),
  totals AS (
    SELECT std.traffic_source_id, SUM(std.total_views) AS views
    FROM summary_traffic_source_daily std
    WHERE std.date IN (SELECT date FROM window)
    GROUP BY std.traffic_source_id
  )
  SELECT ts.display_name, t.views,
         CAST(t.views AS REAL) / NULLIF(SUM(t.views) OVER (), 0) AS share
  FROM totals t
  JOIN traffic_source ts ON t.traffic_source_id = ts.id
  ORDER BY t.views DESC;


category: geographic
question: What are the top 10 countries by lifetime views?
difficulty: simple
sql:
  SELECT country_code,
         SUM(views) AS total_views,
         SUM(watch_time_minutes) AS total_watch_minutes
  FROM summary_channel_country_daily
  GROUP BY country_code
  ORDER BY total_views DESC
  LIMIT 10;


category: geographic
difficulty: moderate
question:
  Which countries showed a rising share of the channel's trailing-7-day audience compared to their trailing-28-day share?

sql:
  WITH cutoff AS (SELECT value AS d FROM _about WHERE key = 'reporting_cutoff'),
  win_7 AS (
    SELECT country_code, SUM(views) AS views_7d
    FROM summary_channel_country_daily, cutoff
    WHERE date >= date(cutoff.d, '-7 days') AND date <= cutoff.d
    GROUP BY country_code
  ),
  win_28 AS (
    SELECT country_code, SUM(views) AS views_28d
    FROM summary_channel_country_daily, cutoff
    WHERE date >= date(cutoff.d, '-28 days') AND date <= cutoff.d
    GROUP BY country_code
  )
  SELECT w28.country_code,
         COALESCE(w7.views_7d, 0)   AS views_7d,
         w28.views_28d,
         CAST(COALESCE(w7.views_7d, 0) AS REAL) / NULLIF(w28.views_28d, 0) AS share_7_of_28
  FROM win_28 w28
  LEFT JOIN win_7 w7 USING (country_code)
  ORDER BY share_7_of_28 DESC NULLS LAST
  LIMIT 10;

notes:
  Country share isn't time-weighted — countries with all views in the past week show share_7_of_28 close to 1.0. The full cohort-stability scoring lives in summary_channel_country_cohort_stability (Phase 3.8).


category: events
question: Which videos had the biggest lifecycle stage transitions this week?
difficulty: moderate
sql:
  SELECT
    date,
    video_id,
    json_extract(evidence_json, '$.old_stage')  AS old_stage,
    json_extract(evidence_json, '$.new_stage')  AS new_stage,
    json_extract(evidence_json, '$.magnitude')  AS magnitude
  FROM channel_timeline_event
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM channel_timeline_event)
    AND event_type = 'stage_transition'
    AND date >= date((SELECT value FROM _about WHERE key = 'reporting_cutoff'), '-7 days')
  ORDER BY CAST(json_extract(evidence_json, '$.magnitude') AS REAL) DESC
  LIMIT 10;

notes:
  Returns 0 on weeks where no video transitioned. Older stage_transition rows may have NULL magnitude — Phase 6.4 enriched the evidence.


category: events
question: What was the first date each external source delivered traffic to a video?
difficulty: simple
sql:
  SELECT video_id, traffic_source_name, first_active_date
  FROM event_source_first_view
  ORDER BY first_active_date DESC
  LIMIT 20;


category: lifecycle
question: Week-over-week — how did the most recent publish cohort perform vs the prior week's cohort?
difficulty: advanced
sql:
  WITH cohorts AS (
    SELECT strftime('%Y-%W', published_at) AS cohort,
           COUNT(*) AS videos,
           SUM(day7_views) AS sum_day7_views,
           AVG(day7_views) AS avg_day7_views
    FROM summary_video
    WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_video)
      AND published_at IS NOT NULL
    GROUP BY cohort
  )
  SELECT cohort, videos, sum_day7_views, avg_day7_views
  FROM cohorts
  ORDER BY cohort DESC
  LIMIT 8;

notes:
  Returns 0 on early channels with < 8 publish weeks. Phase 3.5 ships a richer summary_channel_cohort table.


category: data_quality
question: How many pre-publish stub rows exist in each fact table?
difficulty: simple
sql:
  SELECT 'video_daily'   AS tbl, COUNT(*) AS stub_rows FROM video_daily   WHERE pre_publish_stub = 1
  UNION ALL
  SELECT 'traffic_daily' AS tbl, COUNT(*) AS stub_rows FROM traffic_daily WHERE pre_publish_stub = 1;

notes:
  Stub rows pad each video's record back ~7 days before publish so the dashboard's pre-publish lead-in chart works. Filter them out for all analytics — or use video_daily_clean / traffic_daily_clean.


category: data_quality
question: Which videos have NULL weighted_ctr, and what's the apparent reason?
difficulty: moderate
sql:
  SELECT video_id, total_impressions, total_views, ctr_confidence
  FROM summary_video
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_video)
    AND weighted_ctr IS NULL
  ORDER BY total_views DESC;

notes:
  A healthy build typically has no rows; NULL CTR usually indicates impressions = 0 (e.g. pre-reporting-cutoff videos).


category: data_quality
question: What share of impressions over time were unattributed to a traffic source?
difficulty: moderate
notes: A high or rising unattributed share suggests the per-source breakdown is incomplete for that date.
sql:
  SELECT
    date,
    total_impressions,
    unattributed_channel_views,
    CAST(unattributed_channel_views AS REAL) / NULLIF(total_impressions, 0) AS unattributed_share
  FROM summary_channel_metrics_daily
  WHERE total_impressions > 0
  ORDER BY date DESC
  LIMIT 30;


category: lifecycle
difficulty: advanced
question:
  Which video is the nearest peer to a given video (identified by its video id) by trajectory similarity?

sql:
  SELECT peer_1_id, peer_1_distance, shared_age_days, peers_qualified
  FROM summary_video_nearest_peers
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_video_nearest_peers)
    AND video_id = 'aB3dEfGh1jk';

notes:
  The example filters on video_id = 'aB3dEfGh1jk', an illustrative placeholder — substitute a real 11-character YouTube video id from the channel's catalog. Returns 0 when the chosen video has < ~5 post-publish rows or the catalog has < 5 peers. Table stores up to 5 peers in wide format (peer_1_id..peer_5_id with matching distance columns). Created in Phase 3.2.


category: video_catalog
question: How did a given video's daily CTR rank shift over its first 14 days (filtered by its video id)?
difficulty: moderate
sql:
  SELECT date, ctr_rank, views_rank, peer_count
  FROM summary_video_daily_rank
  WHERE video_id = 'aB3dEfGh1jk'
  ORDER BY date
  LIMIT 14;

notes:
  The example filters on video_id = 'aB3dEfGh1jk', an illustrative placeholder — substitute a real 11-character YouTube video id from the channel's catalog. Returns 0 if the chosen video has no rankable days. Table created in Phase 3.3.


category: traffic
difficulty: advanced
question:
  How has the channel's source-mix concentration shifted over the last 14 days, and what pattern does the leading-indicator label suggest?

sql:
  SELECT date, source_hhi_14d, top1_source_share_14d, hhi_change_14d, pattern_label
  FROM summary_channel_source_leading_indicator
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_channel_source_leading_indicator)
  ORDER BY date DESC
  LIMIT 14;

notes:
  Channel-grain (one row per date, not per source). `pattern_label` summarizes whether the HHI trend often precedes a subs response in this channel's history. Table created in Phase 3.7.


category: lifecycle
difficulty: advanced
question:
  Across this channel's videos, how often has a CTR jump on an older video been followed by a step-up in impressions within 7 days?

sql:
  SELECT
    ctr_jump_event_count,
    ctr_jump_followed_count,
    avd_jump_event_count,
    avd_jump_followed_count,
    videos_evaluated
  FROM summary_channel_threshold_impression_pattern
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM summary_channel_threshold_impression_pattern);

notes:
  Channel-pattern memory. The followed-rate `ctr_jump_followed_count / ctr_jump_event_count` is an observation across this channel's history at the snapshot — not a base rate. When `videos_evaluated` is small, hedge accordingly.


category: lifecycle
difficulty: advanced
question:
  On the latest snapshot, which (horizon, forecast_type) cells carry the widest band relative to the projection, and how have that cell's past forecasts actually landed?

sql:
  SELECT
    horizon_days,
    forecast_type,
    model_type,
    projected_value,
    projected_low,
    projected_high,
    ROUND((projected_high - projected_low) / NULLIF(ABS(projected_value), 0), 3)
      AS band_width_vs_value,
    historical_band_coverage,
    coverage_below_floor_days,
    confidence
  FROM summary_channel_forecast
  WHERE as_of_date = (SELECT MAX(as_of_date) FROM summary_channel_forecast)
    AND projected_value IS NOT NULL
  ORDER BY band_width_vs_value DESC;

notes:
  The band is the channel's own realized 7/14/30/90-day changes at the 10th and 90th percentiles — a wide one means this channel's own history over that stretch really is that variable, not that the model is hedging. `model_type` names how the centre was reached (`count_persistence` = the recent level held steady, `count_stable_trend` = a trend steady enough to extend, `pool_prior_rate` = too little own history, the cohort's rate published directly). `historical_band_coverage` is how often past forecasts on this cell landed inside their band, and `coverage_below_floor_days` counts a still-running streak of snapshots below half — both NULL until 5 past forecasts have resolved.


category: video_catalog
difficulty: simple
question:
  What does each lit video's audience-retention curve look like (how much of the audience is still watching across the video)?

sql:
  SELECT video_id, elapsed_ratio, audience_watch_ratio,
         relative_retention_performance
  FROM summary_video_retention_curve
  ORDER BY video_id, elapsed_ratio;

notes:
  Legitimately empty when the build had no private retention source (fixtures, local builds) and on any channel whose videos haven't crossed 100 cumulative views — a video's curve is absent until then, so a small channel shows nothing here. audience_watch_ratio is the video's own retention at that elapsed point (non-monetary); relative_retention_performance is YouTube's own ATTRIBUTED comparison band (nullable when YouTube has no peer set), not a benchmark this product invented. The curve is a single lifetime shape 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.


category: video_catalog
difficulty: moderate
question:
  What do the two decay shapes look like — how fast does a front-loaded video bank its views compared with a slow-burn one?

sql:
  SELECT curve_label, age_days, cumulative_share, daily_share,
         member_video_count, member_band
  FROM app_decay_curve_library
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM app_decay_curve_library)
    AND age_days IN (0, 1, 3, 7, 14, 27)
  ORDER BY curve_label, age_days;

notes:
  Two shapes, learned by clustering every video's first four weeks: `front_loaded` banks most of its views in the first days and then flattens, `slow_burn` keeps accruing. `cumulative_share` is the share of the four-week total banked by that age (1 at day 27 by construction); `daily_share` is the share that arrived on the day alone. Legitimately empty when fewer than two videos have a full, gap-free four-week trajectory. The rows describe CURVES only — no video and no channel is ever named; `member_band` is a floored band, never an exact channel count. Join a video to its shape through summary_video_decay_model.curve_cluster.


category: video_catalog
difficulty: moderate
question:
  What click rate is typical here, and how firmly does that typical hold — for the channel, for each traffic source, and across the shared pool?

sql:
  SELECT scope, scope_key, prior_mean, prior_strength, parent_scope, member_band
  FROM app_ctr_prior
  WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM app_ctr_prior)
  ORDER BY scope, scope_key;

notes:
  `prior_mean` is the typical click rate at that level, as a fraction (0.05 = 5%); `prior_strength` is how many impressions' worth of evidence it is worth, so a bigger number means the typical holds more firmly. `parent_scope` names the level each one was pulled toward — `channel` rows lean on `pool`, `channel_source` rows lean on `channel`. Read one video against it: (clicks + prior_alpha) / (impressions + prior_strength) is the video's click rate once a thin sample has been pulled toward what the channel typically does. The `pool` row is absent without a pool input, and carries a rate plus a floored `member_band` only — never a count, never a named channel.


