Skip to content

GKP-GSC shape-mismatch refresh signal

Fifth and most-conditional of the refresh signals. Fires only when GKP exists, GT is missing, and GKP's shape disagrees with GSC's shape (Pearson correlation < 0.7) — requesting GT becomes worthwhile to break the tie.

What it is

Signal name: "shape_mismatch". Adds a flat 1.5 to gt_components (no GKP contribution — the signal exists to call GT in as a tiebreaker).

The signal is gated on three conditions that must all hold:

  1. with_gkp_data — GKP is present
  2. not with_gt_data — GT is absent
  3. len(gkp_trend_array) >= 3 — enough GKP history to correlate
  4. are_trends_close(gkp, gsc) is False — shape correlation < 0.7

How it's computed

At processing.py:KB-ANCHOR:refresh-signal-shape-mismatch. The correlation check delegates to are_trends_close(gkp_trend_array, gkp_month_array, impressions_array, month_array) which computes Pearson correlation across overlapping months and returns true if it's ≥ 0.7.

Why this choice

0.7 is the textbook "strong correlation" threshold. Below it, the two sources are telling different stories about the keyword's shape. With GT present, the conflict would resolve in the blend itself; with GT absent, the blend is effectively GKP × constant + raw GSC, and we have no way to know which source to trust.

Calling GT in is cheap relative to the value of resolving the conflict: GT will either confirm GKP (in which case GSC was misleading — maybe a bot incursion) or confirm GSC (in which case GKP was stale or wrong on this keyword). Either outcome unblocks the blend.

The flat 1.5 contribution (rather than a continuous correlation-strength score) reflects that this signal is a tiebreaker request, not an urgency claim — it just needs to be enough to put the keyword in the queue. Bigger signals (surge, divergence) drive tier assignment.

Edge cases

  • GT already present — the signal cannot fire. If GKP and GSC disagree and GT exists, the blend's normal logic (gt-gsc-correlation-gate, Sub-batch 3d) handles the disagreement.
  • GKP shape is volatile but matches GSCare_trends_close returns true; signal doesn't fire. Volatility itself isn't the issue, only shape disagreement.
  • Very short GKP history (1–2 months) — Pearson is meaningless on so few points; the len >= 3 guard prevents firing.

See also