*** Shop2LLM Changelog ***

2026-07-02 — version 1.1.2 (Plugin Check Compliance — Zero ERROR, Zero WARNING)

* Compliance - Fixed all 428 Plugin Check ERRORs: 425 TextDomainMismatch, 2 OutputNotEscaped, 1 parse_url
* Compliance - Fixed all 170 Plugin Check WARNINGs: 153 DB query (DirectQuery/NoCaching/PreparedSQL/UnescapedDBParameter/SchemaChange), 12 NonPrefixedVariable, 2 NonceVerification, 2 NonPrefixedHookname, 1 error_log
* Compliance - Plugin Check now reports 0 ERROR + 0 WARNING (clean pass)
* i18n - Text domain unified from 'shop2llm' to 'shop-to-llm' across 425 i18n function calls (__(), _e(), esc_html__(), esc_attr__(), etc.)
* i18n - Plugin header Text Domain updated: shop2llm → shop-to-llm
* i18n - load_textdomain() call updated to use 'shop-to-llm'
* i18n - Translation file path pattern updated: /languages/shop2llm-{locale}.mo → /languages/shop-to-llm-{locale}.mo
* i18n - 28 translation files renamed: shop2llm-{locale}.po/mo → shop-to-llm-{locale}.po/mo (14 languages × 2 files)
* i18n - .pot template file renamed: shop2llm.pot → shop-to-llm.pot; X-Domain header updated
* Security - class-citation-widget.php L52: $citedCount now wrapped with esc_html() before output
* Security - class-citation-widget.php L53: $totalChecks now wrapped with esc_html() before output
* Compatibility - class-citation-widget.php L23: parse_url() replaced with wp_parse_url() (WordPress compatibility function)
* WP.org - Text domain now matches plugin directory name (shop-to-llm), enabling translate.wordpress.org community translations
* Backward compat - Menu slug 'shop2llm' kept unchanged (changing would break existing admin URLs)
* Backward compat - JS object name 'shop2llm' in wp_localize_script kept unchanged (changing would break frontend JS)
* Backward compat - All option names, transient keys, cron hooks, table names with 'shop2llm_' prefix kept unchanged

2026-07-02 — version 1.1.1 (Hero Test Search — ChatGPT-style Aha Moment)

* UX - Hero Test Search box at top of Dashboard: prominent yellow gradient card with input + "Ask ChatGPT →" button
* AI - FinCore cloud LLM proxy (api.shop2llm.com/fincore/v1/free/ai-test) generates natural-language reply using user's local search results; no API key required from user
* AI - 5 free tests per day per site; server-side quota enforcement (site_hash based), local transient counter is UI hint only
* AI - Graceful degradation: 429 returns localized quota-exhausted message; other errors return empty string (UI falls back to plain product list)
* AI - Lightweight payload: only name/price/currency/in_stock/rating sent to cloud (no images, no full descriptions); query truncated to 200 chars, product names to 120 chars
* UI - Rich product cards: 48x48 thumbnail (with 📦 placeholder fallback), currency-aware price, ● In Stock / Out of Stock badge, ★ rating, short description (truncated to 120 chars), "View →" link
* UI - Quota badge top-right: "N tests left today", updates in real time after each call; turns red when 0
* UI - Loading spinner + "Asking ChatGPT about your store..." message during cloud call (15s timeout)
* UX - Score-card "Test Search" button (stl-test-search-btn) now scrolls to Hero box and focuses input (replaces hidden inline panel #stl-test-search-box which has been removed)
* UX - "Fix All" button's test_mcp action now calls window.shop2llmFocusHeroSearch() instead of clicking the old inline button
* i18n - All new strings translation-ready: "See how ChatGPT sees your store", "Ask ChatGPT", "ChatGPT-style preview", "tests left today", "matching items found", "In Stock", "Out of Stock", "View", "Powered by FinCore cloud · 5 free tests per day · No API key needed", etc.
* Filter - shop2llm_test_search_daily_limit (default 5) allows programmatic override of local UI hint quota
* Backward compat - Existing AJAX action shop2llm_test_search kept; response shape extended with ai_reply, remaining_quota, daily_limit fields (products field unchanged, only enriched with currency/rating/short_description/url/image_url)

2026-06-25 — version 1.1.0 (MCP Infrastructure Release)

* MCP - SaaS MCP server (mcp-mini-handler.php): cross-store search_products, get_product, trending_products
* MCP - 2 prompts: shopping_assistant + price_comparison for LLM training
* MCP - 7-platform UA detection: ChatGPT, Claude, Gemini, Copilot, Perplexity, Meta, Google
* MCP - Discovery page at /mcp with setup guide and live stats
* MCP - Grafana monitoring (8 panels) + exposure tracking (fc_mcp_search_exposure)
* Index - fc_product_index: server-side tier detection via license lookup
* Index - cron-pull-product-feeds.php: daily pull from store /product-feed.xml
* Index - seed-stores-from-json.php: import 4238 benchmark domains as seed stores
* Revenue - UTM attribution: search → click → order chain (utm_source=shop2llm)
* Revenue - fc_store_revenue: aggregated GMV per store/month, synced via heartbeat
* Revenue - _shop2llm_ai_order meta on UTM/session-detected orders for dashboard
* Plugin - Feed sync on activation + daily cron, independent of analytics opt-in
* Plugin - shop2llm_disable_product_sync filter for opt-out (WP.org compliance)
* Pro/Ultra - Revenue snapshot included in daily product feed sync
* Pro/Ultra - AI order attribution for dashboard revenue display
* Readme - WP.org compliance: full data disclosure, layered privacy model update
* Docs - Technical architecture document (docs/mcp-technical-architecture.md)

2026-06-24 — version 1.0.9

* Analytics - Cloud heartbeat weekly → daily
* UX - Welcome Modal simplified to single card with opt-in
* UX - Welcome Modal shows plugin icon instead of checkmark

2026-06-23 — version 1.0.8

* Trust - Queries & Crawlers scores now fully open in free tier with real calculation (Focus Query coverage ratio + 30-day AI crawler activity), freeMax restored to 100
* Trust - Removed all anchoring-effect copy: "Free tier max: 80/100", "Free max: 80/100 · Pro +20", 🔒 icons, PRO badges on score rows
* Trust - "Fix All Items" button now transparent: shows "Auto-fixed X · Y need manual action", highlights manual items in yellow with scroll-to positioning
* Security - MCP search now restricts post_type to post/page and excludes password-protected content (has_password => false)
* UX - Reduced CTA density: removed Pro upsell from search analytics notice, connection guide pitch, and plugin list action link
* Compliance - Removed class_exists('Shop2LLM_Pro_Visibility_Score') conditional; free version behavior no longer varies based on Pro presence
* UX - First-Run Welcome Modal: full-screen 3-step overlay after activation (Copy AI URL → Test search your own content → Add to ChatGPT). Inline test search delivers the "Aha moment" without leaving WordPress
* Bugfix - Test search handler now correctly iterates $results['products'] instead of $results wrapper array (was returning "Unknown" for all results)
* Retention - First AI crawler visit now triggers wp_mail() to admin (Day 1-7 retention hook — brings users back even when not logged in)
* Retention - Aha-moment review request: Welcome Modal shows ★★★★★ rating link immediately after first successful inline search (localStorage-gated, shows once)
* Marketing - readme.txt free version description reframed from limitation ("supports ChatGPT with 2 tools") to value ("searchable + 12 crawlers + visibility score + no limits")
* Analytics - Layered privacy model: Layer 1 local behavior summary (shop2llm_behavior_summary option, no opt-in needed, never leaves server); Layer 2 opt-in anonymous bucketed summary uploaded via monthly heartbeat; Layer 3 opt-in AI crawler visit reports
* Analytics - New shop_to_llm_log_event() core function + shop2llm_log_event / shop2llm_enable_analytics AJAX handlers (nonce-verified, capability-checked)
* Analytics - Welcome Modal JS now fires AJAX events: welcome_shown, welcome_completed, welcome_skipped (with step), url_copied, first_search (with success flag)
* Analytics - Opt-in card shown after Welcome Modal completion ("Help us improve Shop2LLM" — Yes/Not now), defaults to off, toggleable in Settings
* Privacy - All behavior summary fields bucketed or boolean to prevent fingerprinting: content_count (0/1-4/5-20/21-100/100+), dashboard_visits (1/2-5/6+); no PII, no IP, no email, no exact counts
* Privacy - readme.txt FAQ rewritten with full layered data disclosure listing every collected field and opt-in mechanism

2026-06-21 — version 1.0.6

* Feature - Works without WooCommerce — supports any WordPress site (content search via posts/pages)
* Feature - BlogPosting JSON-LD schema on single posts when WooCommerce absent
* Feature - Content search via MCP tools using WordPress posts/pages fallback
* Feature - llms.txt shows site posts when WooCommerce absent
* Fix - Removed fatal wp_die() on activation without WooCommerce — replaced with dismissible admin notice
* Fix - Graceful degradation for all WooCommerce-dependent features (product feed, AI score, quality checks)
* Fix - Unified domain to shop2llm.com across all links (action links, API calls, Pro CTAs)
* Update - Plugin description and readme now mention standalone WordPress support

2026-06-21 — version 1.0.6

* Compatibility - Lowered PHP requirement from 8.1 to 7.4 (replaced match expressions with switch, added str_starts_with polyfill)

2026-06-17 — version 1.0.6

* Performance - Dashboard load time 80x faster (5s → 62ms) — 7 transient reads merged to 1, blocking HTTP removed
* Performance - Community stats load async via JS REST fetch (non-blocking)
* Performance - Removed duplicate get_recent_searches() call
* Performance - Replaced wc_get_products(5) with lightweight EXISTS SQL for peer comparison
* Performance - Crawler detection moved from parse_request → wp hook (frontend only, admin/AJAX/REST exclude)
* Performance - Crawler report: non-blocking HTTP, 1s timeout, circuit breaker (backoff on 4+ failures)
* Performance - MCP counter writes batched (15s lock window, no race conditions under concurrency)
* Performance - MCP rate limit: 60 req/min, returns 429 for excess
* Performance - llms.txt cached (1h), invalidated on product save — eliminates 100 WC_Product OOM risk
* Performance - Product quality check cached (1h) — avoids large postmeta JOIN on every dashboard load
* Performance - Community stats endpoint: shutdown-deferred fetch, concurrent-fetch lock
* Security - Unauthenticated endpoints serve from cache only, no HTTP call on request
* Fix - 20 concurrent admin page < 300ms, 30 concurrent MCP < 230ms under stress test

2026-06-15 — version 1.0.5

* Conversion - AI Growth Progress card with 5-step milestone tracker + progress bar
* Conversion - Peer Comparison card (Your Score vs Avg Free vs Pro Users)
* Conversion - Smart Dynamic CTA: 3-tier messaging based on crawler/search activity
* Conversion - 4 Achievement Badges (Store Live / AI Discovered / First Search / Power User)
* Conversion - Greyed-out Pro-only platform cards with hover tooltip
* Conversion - Inline Pro upgrade links in every dashboard card (17 CTAs total, unified color)
* Conversion - Feature adoption nudge for first-time visitors
* Conversion - Community social proof bar (weekly download stats from cloud)
* Conversion - Review request trigger on first crawler + first search milestone
* Conversion - Always-visible 5-star review prompt in dashboard header
* Fix - Domain update: aiproductscout.shop → shop2llm.com for all Pro landing links
* Fix - PHP warnings: undefined $crawlerCount / $searchCount in AI Growth Progress
* Backend - New /v1/stats public endpoint for community stats
* Backend - Fixed /v1/free/ping route (was missing)
* Fixed - PostgreSQL compatibility (AUTO_INCREMENT → SERIAL, ENGINE → removed, inline INDEX → CREATE INDEX)
* UI - Unified Pro CTA color to indigo #6366f1 across all cards
* UI - Wizard progress bar with step counter (2/4 style)

2026-06-14 — version 1.0.4

* Privacy - Anonymous activation ping with SHA256-hashed site identifier (replaces plain site_url)
* Feature - Monthly cloud heartbeat ping to distinguish active vs inactive installs
* Privacy - Removed site_name from telemetry; only hashed hostname sent
* Endpoint - Migrated from /v1/free/register to /v1/free/ping

2026-06-07 - version 1.0.2

* Added - HPOS (High Performance Order Storage) compatibility
* Added - WooCommerce Marketplace support
* Fixed - Remove invalid contributor

2026-06-04 - version 1.0.1

* Fixed - permission_callback granting access when API key is empty
* Fixed - Settings save clearing API key from missing form field
* Fixed - Author URI and readme URLs
* Fixed - Add wp_unslash before sanitize_text_field on POST inputs
* Fixed - Proper escaping for dynamic HTML attributes and display values
* Removed - load_plugin_textdomain (WP 4.6+ auto-loads)
* Update - Tested up to 7.0

2026-05-29 - version 1.0.0

* Initial release
