- gsc_signal_delta.py: extract `found` local var; add first branch in verdict_hint chain so a term absent from both GSC windows yields INCONCLUSIVE (not ARTIFACT). Existing ARTIFACT / CONFIRMED-PARTIAL / PARTIAL branches unchanged (elif chain). - test_gsc_signal_delta.py: add test_absent_claim_term_inconclusive asserting found=False and "INCONCLUSIVE" in verdict_hint for a term in neither fixture. - code/CLAUDE.md: one-line surge-tuning note — verdict_hint/in_top_movers are calibrated for upward claims; for drops, inspect top_decliners directly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KuT3W81t88QQFaxY2ruWv2
1.2 KiB
1.2 KiB
seo-signal-validation — code environment notes
Helper: scripts/gsc_signal_delta.py
Deterministic L1/L4 GSC delta. Feed it two saved GSC query exports (recent, prior) as JSON or TSV (columns: query, clicks, impressions, position).
python3 scripts/gsc_signal_delta.py \
--recent recent.tsv --prior prior.tsv \
--recent-days 28 --prior-days 30 --claim-term "호텔"
Returns day-normalized site totals, top gainers/decliners, and a verdict_hint
(heuristic only — the final verdict is the skill's job, after L2/L3).
Surge-tuning note: verdict_hint and in_top_movers are calibrated for upward "surge" claims (movers ranked by click gain). For a claimed drop, inspect top_decliners directly rather than relying on the hint.
Getting the exports
mcp__dda__gsc_fetch_performance (property pinned per workspace, e.g. JHR
sc-domain:josunhotel.com) → save the query-dimension rows to a file → run the
script. GSC anonymizes ~43% of query clicks; the disclosed subset ≠ the whole.
Env / access
GOOGLE_KG_API_KEYformcp__ourseo__search_knowledge_graph(L3).- GSC/GA4 only exist for first-party properties — third-party entities skip L1.
- Never crawl/audit Marriott for JHR (sameAs only).