{"run_id":"2e517903","url":"https://sfchronicle.com","started_at":"2026-03-31T16:46:51.026704+00:00","overall":"FAIL","fail_count":5,"pass_count":21,"cmp":"Unknown / Not detected","analysis_mode":"gdpr","error_count":0,"warn_count":16,"entries":[{"ts":"2026-03-31T16:46:51.026704+00:00","elapsed":0.0,"level":"STEP","session":"MAIN","msg":"Run 2e517903 started","detail":{"url":"https://sfchronicle.com"}},{"ts":"2026-03-31T16:46:51.026905+00:00","elapsed":0.0,"level":"INFO","session":"MAIN","msg":"Detecting probe server location","detail":null},{"ts":"2026-03-31T16:46:51.316919+00:00","elapsed":0.29,"level":"INFO","session":"MAIN","msg":"Probe location","detail":{"ip":"208.77.244.106","city":"Amsterdam","region":"North Holland","country":"The Netherlands","country_code":"NL","org":"Railway","latitude":52.37403,"longitude":4.88969}},{"ts":"2026-03-31T16:46:51.317353+00:00","elapsed":0.29,"level":"STEP","session":"MAIN","msg":"Starting analysis of https://sfchronicle.com","detail":{"mode":"GDPR"}},{"ts":"2026-03-31T16:46:52.194958+00:00","elapsed":1.17,"level":"INFO","session":"MAIN","msg":"Chromium launched","detail":{"headless":true}},{"ts":"2026-03-31T16:46:52.274056+00:00","elapsed":1.25,"level":"INFO","session":"PREFLIGHT","msg":"Navigating to https://sfchronicle.com","detail":null},{"ts":"2026-03-31T16:47:00.707310+00:00","elapsed":9.68,"level":"WARN","session":"PREFLIGHT","msg":"Network did not reach idle state — proceeding after load event. Normal for sites with persistent connections (websockets, polling).","detail":null},{"ts":"2026-03-31T16:47:00.754916+00:00","elapsed":9.73,"level":"STEP","session":"A","msg":"Session A start (accept path)","detail":null},{"ts":"2026-03-31T16:47:00.926599+00:00","elapsed":9.9,"level":"INFO","session":"A","msg":"Navigating to https://sfchronicle.com","detail":null},{"ts":"2026-03-31T16:47:09.408228+00:00","elapsed":18.38,"level":"WARN","session":"A","msg":"Network did not reach idle state — proceeding after load event. Normal for sites with persistent connections (websockets, polling).","detail":null},{"ts":"2026-03-31T16:47:11.408428+00:00","elapsed":20.38,"level":"INFO","session":"A","msg":"Capturing pre-consent state","detail":null},{"ts":"2026-03-31T16:47:11.573249+00:00","elapsed":20.55,"level":"INFO","session":"A","msg":"Pre-consent state captured","detail":{"pre_consent_cookies":6,"pre_consent_ad_cookies":0,"pre_consent_tracking_storage":0,"pre_consent_tracker_globals":[],"pre_consent_unblocked_scripts":0,"pre_consent_capture_error":null}},{"ts":"2026-03-31T16:48:21.787310+00:00","elapsed":90.76,"level":"INFO","session":"A","msg":"Banner: NOT FOUND","detail":null},{"ts":"2026-03-31T16:48:21.787477+00:00","elapsed":90.76,"level":"WARN","session":"A","msg":"No consent banner detected before Accept All — CMP may not have loaded, or banner was auto-dismissed by a prior cookie.","detail":null},{"ts":"2026-03-31T16:48:23.305664+00:00","elapsed":92.28,"level":"INFO","session":"A","msg":"Accept All interaction","detail":{"cmp":"Unknown","button_text":"","clicked":false,"in_iframe":false,"error":"Accept All button not found"}},{"ts":"2026-03-31T16:48:23.305858+00:00","elapsed":92.28,"level":"WARN","session":"A","msg":"Accept interaction issue: Accept All button not found","detail":null},{"ts":"2026-03-31T16:48:25.307352+00:00","elapsed":94.28,"level":"INFO","session":"A","msg":"Capturing post-accept baseline state","detail":null},{"ts":"2026-03-31T16:48:25.486739+00:00","elapsed":94.46,"level":"INFO","session":"A","msg":"Baseline captured","detail":{"baseline_cookies":6,"baseline_ad_cookies":0,"baseline_tracking_storage":0,"baseline_tracker_globals":[],"baseline_unblocked_scripts":0,"baseline_capture_error":null}},{"ts":"2026-03-31T16:48:26.670897+00:00","elapsed":95.64,"level":"INFO","session":"A","msg":"Context closed, HAR saved","detail":null},{"ts":"2026-03-31T16:48:26.671201+00:00","elapsed":95.65,"level":"STEP","session":"A","msg":"Session A complete","detail":{"pre_consent_cookies":6,"pre_consent_ad_cookies":0,"pre_consent_tracking_storage":0,"pre_consent_tracker_globals":[],"pre_consent_unblocked_scripts":0,"pre_consent_capture_error":null,"baseline_cookies":6,"baseline_ad_cookies":0,"baseline_tracking_storage":0,"baseline_tracker_globals":[],"baseline_unblocked_scripts":0,"baseline_capture_error":null}},{"ts":"2026-03-31T16:48:26.671285+00:00","elapsed":95.65,"level":"STEP","session":"B","msg":"Session B start (reject path)","detail":null},{"ts":"2026-03-31T16:48:26.775438+00:00","elapsed":95.75,"level":"INFO","session":"B","msg":"Navigating to https://sfchronicle.com","detail":null},{"ts":"2026-03-31T16:48:35.230936+00:00","elapsed":104.2,"level":"WARN","session":"B","msg":"Network did not reach idle state — proceeding after load event. Normal for sites with persistent connections (websockets, polling).","detail":null},{"ts":"2026-03-31T16:48:37.231729+00:00","elapsed":106.21,"level":"INFO","session":"B","msg":"Capturing pre-consent state","detail":null},{"ts":"2026-03-31T16:48:37.459939+00:00","elapsed":106.43,"level":"INFO","session":"B","msg":"Pre-consent B captured","detail":{"pre_consent_B_cookies":6,"pre_consent_B_ad_cookies":0,"pre_consent_B_tracking_storage":0,"pre_consent_B_tracker_globals":[],"pre_consent_B_unblocked_scripts":0,"pre_consent_B_capture_error":null}},{"ts":"2026-03-31T16:49:47.672612+00:00","elapsed":176.65,"level":"INFO","session":"B","msg":"Banner: NOT FOUND","detail":null},{"ts":"2026-03-31T16:49:47.672729+00:00","elapsed":176.65,"level":"WARN","session":"B","msg":"No consent banner detected in Session B — Reject All will likely fail. Post-reject checks will be unreliable.","detail":null},{"ts":"2026-03-31T16:50:01.217897+00:00","elapsed":190.19,"level":"INFO","session":"B","msg":"Click symmetry measured","detail":{"accept_clicks":0,"reject_clicks":0}},{"ts":"2026-03-31T16:50:03.278940+00:00","elapsed":192.25,"level":"INFO","session":"B","msg":"Reject All interaction","detail":{"cmp":"Unknown","button_text":"","clicked":false,"clicks_required":0,"required_manage_panel":true,"panel_navigated":false,"panel_new_frames":0,"panel_wait_s":0.0,"error":"No reject button and no manage/preferences button found on layer 1. CMP may not have loaded, or uses an unrecognised button label."}},{"ts":"2026-03-31T16:50:03.279313+00:00","elapsed":192.25,"level":"WARN","session":"B","msg":"Reject interaction issue: No reject button and no manage/preferences button found on layer 1. CMP may not have loaded, or uses an unrecognised button label.","detail":null},{"ts":"2026-03-31T16:50:03.279350+00:00","elapsed":192.25,"level":"WARN","session":"B","msg":"Reject All was NOT successfully clicked — post-reject state captures an unmodified consent state, not a rejection.","detail":null},{"ts":"2026-03-31T16:50:05.318469+00:00","elapsed":194.29,"level":"INFO","session":"B","msg":"Site accessible after reject: False","detail":null},{"ts":"2026-03-31T16:50:05.319062+00:00","elapsed":194.29,"level":"INFO","session":"B","msg":"Capturing post-reject state","detail":null},{"ts":"2026-03-31T16:50:05.558618+00:00","elapsed":194.53,"level":"INFO","session":"B","msg":"Post-reject captured","detail":{"post_reject_cookies":6,"post_reject_ad_cookies":0,"post_reject_tracking_storage":0,"post_reject_tracker_globals":[],"post_reject_unblocked_scripts":0,"post_reject_capture_error":null}},{"ts":"2026-03-31T16:50:10.884639+00:00","elapsed":199.86,"level":"INFO","session":"B","msg":"Persistent widget check","detail":{"found":false,"text":"","in_iframe":false}},{"ts":"2026-03-31T16:50:10.884937+00:00","elapsed":199.86,"level":"INFO","session":"B","msg":"Capturing subpages","detail":null},{"ts":"2026-03-31T16:50:10.895058+00:00","elapsed":199.87,"level":"INFO","session":"B","msg":"0 subpage(s) captured","detail":{"urls":[],"errors":[]}},{"ts":"2026-03-31T16:50:12.193906+00:00","elapsed":201.17,"level":"INFO","session":"B","msg":"Context closed, HAR saved","detail":null},{"ts":"2026-03-31T16:50:12.194079+00:00","elapsed":201.17,"level":"INFO","session":"B","msg":"Checking pre-ticked toggles (separate session)","detail":null},{"ts":"2026-03-31T16:50:12.255123+00:00","elapsed":201.23,"level":"INFO","session":"B","msg":"Navigating to https://sfchronicle.com","detail":null},{"ts":"2026-03-31T16:50:20.816647+00:00","elapsed":209.79,"level":"WARN","session":"B","msg":"Network did not reach idle state — proceeding after load event. Normal for sites with persistent connections (websockets, polling).","detail":null},{"ts":"2026-03-31T16:51:45.463120+00:00","elapsed":294.44,"level":"WARN","session":"B","msg":"Manage/preferences button not visible after 5s wait — toggle check may return 0 results","detail":null},{"ts":"2026-03-31T16:51:46.960982+00:00","elapsed":295.93,"level":"INFO","session":"B","msg":"Pre-ticked toggles: 0 found","detail":{"toggles":{}}},{"ts":"2026-03-31T16:51:46.961198+00:00","elapsed":295.94,"level":"WARN","session":"B","msg":"Toggle check returned 0 results — diagnostics:","detail":{"manage_button_found":false,"manage_button_text":null,"frames_scanned":[],"total_elements_found":0,"note":"Manage/preferences button not found on page"}},{"ts":"2026-03-31T16:51:46.979379+00:00","elapsed":295.95,"level":"STEP","session":"B","msg":"Session B complete","detail":{"post_reject_cookies":6,"post_reject_ad_cookies":0,"post_reject_tracking_storage":0,"post_reject_tracker_globals":[],"post_reject_unblocked_scripts":0,"post_reject_capture_error":null,"accept_clicks":0,"reject_clicks":0,"reject_at_first_screen":false,"subpages_captured":0}},{"ts":"2026-03-31T16:51:46.980216+00:00","elapsed":295.95,"level":"STEP","session":"C","msg":"Session C start (persistence check)","detail":null},{"ts":"2026-03-31T16:51:47.117183+00:00","elapsed":296.09,"level":"INFO","session":"C","msg":"Navigating to https://sfchronicle.com","detail":null},{"ts":"2026-03-31T16:51:55.529942+00:00","elapsed":304.5,"level":"WARN","session":"C","msg":"Network did not reach idle state — proceeding after load event. Normal for sites with persistent connections (websockets, polling).","detail":null},{"ts":"2026-03-31T16:53:09.326449+00:00","elapsed":378.3,"level":"INFO","session":"C","msg":"Reject for persistence test","detail":{"clicked":false,"error":"No reject button and no manage/preferences button found on layer 1. CMP may not have loaded, or uses an unrecognised button label."}},{"ts":"2026-03-31T16:53:09.326711+00:00","elapsed":378.3,"level":"WARN","session":"C","msg":"Reject All failed in Session C — persistence check results will be unreliable.","detail":null},{"ts":"2026-03-31T16:53:11.327114+00:00","elapsed":380.3,"level":"INFO","session":"C","msg":"Opening second tab (same-session test)","detail":null},{"ts":"2026-03-31T16:53:11.401182+00:00","elapsed":380.38,"level":"INFO","session":"C","msg":"Navigating to https://sfchronicle.com","detail":null},{"ts":"2026-03-31T16:53:19.768225+00:00","elapsed":388.74,"level":"WARN","session":"C","msg":"Network did not reach idle state — proceeding after load event. Normal for sites with persistent connections (websockets, polling).","detail":null},{"ts":"2026-03-31T16:53:21.843477+00:00","elapsed":390.82,"level":"INFO","session":"C","msg":"Same-session state captured","detail":{"persistence_1_cookies":6,"persistence_1_ad_cookies":0,"persistence_1_tracking_storage":0,"persistence_1_tracker_globals":[],"persistence_1_unblocked_scripts":0,"persistence_1_capture_error":null}},{"ts":"2026-03-31T16:53:21.883224+00:00","elapsed":390.86,"level":"INFO","session":"C","msg":"Storage state saved, opening new context","detail":null},{"ts":"2026-03-31T16:53:21.978161+00:00","elapsed":390.95,"level":"INFO","session":"C","msg":"Navigating to https://sfchronicle.com","detail":null},{"ts":"2026-03-31T16:53:30.383367+00:00","elapsed":399.36,"level":"WARN","session":"C","msg":"Network did not reach idle state — proceeding after load event. Normal for sites with persistent connections (websockets, polling).","detail":null},{"ts":"2026-03-31T16:53:32.546295+00:00","elapsed":401.52,"level":"INFO","session":"C","msg":"New-session state captured","detail":{"persistence_2_cookies":6,"persistence_2_ad_cookies":0,"persistence_2_tracking_storage":0,"persistence_2_tracker_globals":[],"persistence_2_unblocked_scripts":0,"persistence_2_capture_error":null}},{"ts":"2026-03-31T16:53:32.572636+00:00","elapsed":401.55,"level":"STEP","session":"C","msg":"Session C complete","detail":{"persistence_1_captured":true,"persistence_2_captured":true}},{"ts":"2026-03-31T16:53:32.572801+00:00","elapsed":401.55,"level":"STEP","session":"POLICY_RENDER","msg":"Rendering cookie policy page in browser","detail":null},{"ts":"2026-03-31T16:53:33.174963+00:00","elapsed":402.15,"level":"INFO","session":"POLICY_RENDER","msg":"Navigating to policy: https://sfchronicle.com/cookies","detail":null},{"ts":"2026-03-31T16:53:43.728961+00:00","elapsed":412.7,"level":"INFO","session":"POLICY_RENDER","msg":"Extracted 2051 chars from policy page","detail":null},{"ts":"2026-03-31T16:53:43.750830+00:00","elapsed":412.72,"level":"INFO","session":"POLICY_RENDER","msg":"Policy page rendered (2073 chars)","detail":null},{"ts":"2026-03-31T16:53:43.834951+00:00","elapsed":412.81,"level":"INFO","session":"MAIN","msg":"Browser closed","detail":null},{"ts":"2026-03-31T16:53:43.891043+00:00","elapsed":412.86,"level":"STEP","session":"DNS","msg":"Running CNAME cloaking checks","detail":null},{"ts":"2026-03-31T16:53:43.891233+00:00","elapsed":412.87,"level":"INFO","session":"DNS","msg":"Apex domain: sfchronicle.com (from hostname: sfchronicle.com)","detail":null},{"ts":"2026-03-31T16:53:44.119274+00:00","elapsed":413.09,"level":"INFO","session":"DNS","msg":"Checking 0 subdomain(s)","detail":{"subdomains":[]}},{"ts":"2026-03-31T16:53:44.119451+00:00","elapsed":413.09,"level":"INFO","session":"DNS","msg":"No first-party subdomains to check","detail":null},{"ts":"2026-03-31T16:53:44.130627+00:00","elapsed":413.1,"level":"STEP","session":"POLICY","msg":"Fetching cookie policy","detail":null},{"ts":"2026-03-31T16:53:44.130850+00:00","elapsed":413.1,"level":"INFO","session":"POLICY","msg":"Policy found at https://sfchronicle.com/cookies","detail":null},{"ts":"2026-03-31T16:53:44.130906+00:00","elapsed":413.1,"level":"INFO","session":"POLICY","msg":"Fetching policy, cross-referencing 6 cookie(s)","detail":null},{"ts":"2026-03-31T16:53:55.355613+00:00","elapsed":424.33,"level":"INFO","session":"POLICY","msg":"Policy fetch OK","detail":{"declared":2,"undeclared_observed":6,"ai_used":true}},{"ts":"2026-03-31T16:53:55.355784+00:00","elapsed":424.33,"level":"WARN","session":"POLICY","msg":"6 cookie(s) not in policy","detail":{"cookies":["hnpdiudpf1","ab_bucket","hnpdiudpf2","_fs_ch_cp_79UUvfpJ5mWYtLQv","location_data","_fs_ch_st_FSBmUei20MqUiJb9"]}},{"ts":"2026-03-31T16:53:55.355842+00:00","elapsed":424.33,"level":"STEP","session":"MAIN","msg":"Analysis complete","detail":{"error_count":0}},{"ts":"2026-03-31T16:53:55.355903+00:00","elapsed":424.33,"level":"STEP","session":"C1","msg":"Running Component 1 HAR analysis","detail":null},{"ts":"2026-03-31T16:53:55.722453+00:00","elapsed":424.7,"level":"INFO","session":"C1","msg":"HAR analysis complete — 0 FAIL item(s)","detail":{"total_requests":960,"phases":["pre_consent"],"phase_strategy":{"accept":"not_detected","reject":"not_detected"},"fail_items":[]}},{"ts":"2026-03-31T16:53:55.905529+00:00","elapsed":424.88,"level":"STEP","session":"CHECKS","msg":"Running browser-state checks","detail":null},{"ts":"2026-03-31T16:53:55.906157+00:00","elapsed":424.88,"level":"INFO","session":"CHECKS","msg":"Browser checks complete — 5 FAIL item(s)","detail":{"fail_items":["G.2","G.3","K.5","K.6","L.2"],"mode":"gdpr"}}],"docx_filename":"consent_report_https___sfchronicle.com.docx"}