← back to Dw Catalog 404 Audit

audit-result.json

107 lines

{
  "audit": "dw-catalog-404-integrity",
  "date": "2026-06-26",
  "owner": "vp-dw-commerce",
  "mode": "READ-ONLY (psql SELECT + public storefront GET/HEAD only)",
  "cost_usd": 0,
  "scope": {
    "active_rows": 74927,
    "handle_null": 0,
    "handle_empty": 0,
    "handle_eq_lower_dwsku": 13715,
    "handle_ne_lower_dwsku": 61212,
    "dwsku_null_among_active": 12983,
    "malformed_handle_suffix_-handle": 2649,
    "malformed_handle_suffix_-sample": 527,
    "handle_contains_banned_word_wallpaper": 6765
  },
  "http_sample_real_handle_column": {
    "requested": 400,
    "determinate_responses": 180,
    "http_200": 172,
    "http_404": 8,
    "http_429_self_throttled_indeterminate": 220,
    "point_404_rate": 0.0444,
    "wilson_95ci": [
      0.023,
      0.084
    ],
    "estimated_active_rows_with_404ing_handle": 3300,
    "estimated_range": [
      1700,
      6300
    ],
    "note": "Shopify/Cloudflare bot protection 429'd 220/400 on 8-way burst and stayed throttled on serial retry; 429 = self-inflicted, NOT a catalog 404. Estimate rests on the 180 determinate responses + structural DB evidence."
  },
  "sample_404_breakdown": {
    "malformed_-handle_garbage": 3,
    "descriptive_slug_pdp_gone": 5,
    "all_status_in_mirror": "ACTIVE",
    "all_synced_at": "2026-06-24 (fresh sync, not generic lag)"
  },
  "known_skus": {
    "DWCW-705546": {
      "panel_url": "/products/dwcw-705546",
      "panel_url_http": 404,
      "real_mirror_handle": "dwcw-705521",
      "real_handle_http": 200,
      "vendor": "China Seas",
      "mirror_status": "ACTIVE",
      "bucket": "b_handle_drift_panel_builds_url_from_dw_sku_not_handle"
    },
    "DWCS-895148": {
      "panel_url": "/products/dwcs-895148",
      "panel_url_http": 404,
      "real_mirror_handle": "dwcs-895122",
      "real_handle_http": 200,
      "vendor": "China Seas",
      "mirror_status": "ACTIVE",
      "bucket": "b_handle_drift_panel_builds_url_from_dw_sku_not_handle"
    }
  },
  "root_cause_summary": {
    "problem_A_panel_bug": "3D catalog panel builds /products/<dw_sku> instead of /products/<handle>. Only 13715/74927 (18.3%) of ACTIVE products have handle==lower(dw_sku), so a dw_sku-derived URL 404s for the other 81.7%. Explains both known 404s. Read-side, catalog NOT at fault.",
    "problem_B_catalog_handle_integrity": "Independent ~4.4% (~3300 ACTIVE rows) whose STORED handle itself 404s. Sub-buckets: (B1) malformed handle suffixes -handle/-sample ~3176 rows (import-template defect, Malibu/PS Removable/Fentucci); (B2) descriptive-slug PDPs that 404 despite mirror status=ACTIVE because the mirror's status column mirrors Shopify product.status, which does NOT reflect Online-Store sales-channel publication (bucket a staleness + c unpublished)."
  },
  "fix_3a_executed": {
    "date": "2026-06-26",
    "method": "DTD verdict A (unanimous 3/3): full-scan Admin API over all ACTIVE",
    "admin_api_full_scan": {
      "endpoint": "GET /admin/api/2024-10/products.json?status=active&limit=250&fields=id,handle,status,published_at,published_scope",
      "active_fetched": 76192,
      "throttling": "none (call-limit steady 1/80)",
      "published_at_not_null": 74449,
      "published_at_null_UNPUBLISHED": 1743,
      "scope_global": 74740,
      "scope_web": 1452,
      "scope_other": 0
    },
    "mechanism_confirmation": {
      "test": "rate-polite storefront check 10 unpublished + 10 published",
      "unpublished_404": "10/10",
      "published_200": "10/10",
      "predicate": "published_at IS NULL <=> storefront 404 (holds across descriptive-slug AND malformed -handle rows; scope is NOT the predicate, 265 unpublished are scope=web)"
    },
    "true_unpublished_active_count": 1743,
    "concentration": {
      "Surface Stick": 742,
      "PS Removable Wallpaper": 735,
      "Schumacher": 265,
      "DW Home": 1
    },
    "handle_shape": {
      "descriptive_slug": 1008,
      "malformed_-handle": 735
    },
    "corrects_prior_estimate": "prior ~3300 conflated 1743 unpublished-to-channel + the Problem-A panel URL bug; FIX 3(a) isolates the publication bucket = 1743",
    "mirror_column": {
      "added": "online_store_published boolean (nullable, additive, reversible, LOCAL dw_unified only)",
      "rows_populated": 75610,
      "active_false": 1743,
      "active_true": 73013,
      "active_null": 171
    },
    "candidate_csv": "unpublished-active-candidates.csv (1743 rows)",
    "cost_usd": 0
  }
}