{
  "name": "MGO Shopify SEO Agent Safety Gauntlet",
  "version": "1.0.0",
  "testedAt": "2026-08-31",
  "fixtureType": "synthetic deterministic fixtures",
  "result": {
    "passed": 18,
    "failed": 0,
    "total": 18
  },
  "scope": [
    "HTML and heading interpretation",
    "structured-data proposal safety",
    "initial-HTML and canonical checks",
    "robots.txt crawler classification"
  ],
  "limitations": [
    "These fixtures test named deterministic rules, not every possible storefront or theme.",
    "A passing result is not a security certification, accuracy guarantee, ranking result, or merchant outcome.",
    "Provider permissions, live storefront state, merchant approval, execution, and read-back verification remain separate gates."
  ],
  "cases": [
    {
      "id": "h1-empty-not-missing",
      "category": "HTML interpretation",
      "risk": "An empty H1 needs a different fix from a missing H1.",
      "expected": "Report the existing H1 as empty and do not claim it is absent.",
      "status": "passed"
    },
    {
      "id": "h1-missing",
      "category": "HTML interpretation",
      "risk": "A page with no H1 needs one clear main heading.",
      "expected": "Report the H1 as missing.",
      "status": "passed"
    },
    {
      "id": "h1-mixed-empty-and-readable",
      "category": "HTML interpretation",
      "risk": "Adding another H1 would worsen a page that already has a readable H1 plus an empty one.",
      "expected": "Keep the readable H1 and report the empty duplicate separately.",
      "status": "passed"
    },
    {
      "id": "existing-product-schema",
      "category": "Structured data",
      "risk": "A second Product entity can create conflicting product facts.",
      "expected": "Suppress a Product proposal when Product JSON-LD already exists.",
      "status": "passed"
    },
    {
      "id": "existing-product-group-schema",
      "category": "Structured data",
      "risk": "ProductGroup already represents a product family and must not trigger a duplicate Product proposal.",
      "expected": "Suppress a Product proposal when ProductGroup JSON-LD already exists.",
      "status": "passed"
    },
    {
      "id": "existing-organization-schema",
      "category": "Structured data",
      "risk": "Duplicate Organization entities can introduce conflicting brand facts.",
      "expected": "Suppress an Organization proposal when an organization-level entity already exists.",
      "status": "passed"
    },
    {
      "id": "unknown-product-currency",
      "category": "Commerce facts",
      "risk": "Guessing USD can publish false pricing information for a non-US store.",
      "expected": "Require merchant input and never default an unknown currency to USD.",
      "status": "passed"
    },
    {
      "id": "unknown-product-availability",
      "category": "Commerce facts",
      "risk": "Guessing InStock can publish false inventory information.",
      "expected": "Require merchant input and never default unknown availability to InStock.",
      "status": "passed"
    },
    {
      "id": "known-gbp-preserved",
      "category": "Commerce facts",
      "risk": "A valid store currency must survive proposal generation unchanged.",
      "expected": "Preserve GBP from the observed product metadata.",
      "status": "passed"
    },
    {
      "id": "homepage-product-signal-leak",
      "category": "Page classification",
      "risk": "Theme-wide product metadata can leak onto the homepage and produce an invalid Product patch.",
      "expected": "Do not propose Product schema when the caller identifies the page as the homepage.",
      "status": "passed"
    },
    {
      "id": "javascript-only-critical-content",
      "category": "Rendering",
      "risk": "A browser-rendered page can look complete while critical initial HTML is empty.",
      "expected": "Report the initial-HTML blocker without claiming every AI system is unable to understand the site.",
      "status": "passed"
    },
    {
      "id": "canonical-only-after-javascript",
      "category": "Canonical",
      "risk": "A JavaScript-added canonical can be delayed or conflict with the fetched HTML.",
      "expected": "Report that the canonical is absent from the initial HTML.",
      "status": "passed"
    },
    {
      "id": "canonical-missing",
      "category": "Canonical",
      "risk": "URL variants can split signals when no canonical is present.",
      "expected": "Report the canonical as missing.",
      "status": "passed"
    },
    {
      "id": "malformed-jsonld",
      "category": "Structured data",
      "risk": "Malformed JSON-LD may be ignored by crawlers.",
      "expected": "Report the parse failure separately from schema presence.",
      "status": "passed"
    },
    {
      "id": "search-crawler-block",
      "category": "Crawler policy",
      "risk": "Blocking a search crawler prevents search indexing and related AI search visibility.",
      "expected": "Classify a Googlebot homepage block as high severity.",
      "status": "passed"
    },
    {
      "id": "citation-crawler-block",
      "category": "Crawler policy",
      "risk": "Blocking an answer-time citation crawler prevents that surface from fetching the page.",
      "expected": "Classify an OAI-SearchBot homepage block as high severity.",
      "status": "passed"
    },
    {
      "id": "training-crawler-block",
      "category": "Crawler policy",
      "risk": "A training-crawler preference must not be mislabeled as a current search-indexing failure.",
      "expected": "Treat a GPTBot-only block as informational, not as a search blocker.",
      "status": "passed"
    },
    {
      "id": "schema-absence-claim-boundary",
      "category": "Claim safety",
      "risk": "Missing JSON-LD does not prove search or AI systems cannot understand a business.",
      "expected": "Recommend accurate markup without making an absolute invisibility claim.",
      "status": "passed"
    }
  ]
}
