{
  "core": [
    {
      "code": "RECORD_ID_DUPLICATE",
      "severity": "blocker",
      "title": "Source row identifiers overlap",
      "description": "Two records have the same review ID, making approvals and exclusion ambiguous."
    },
    {
      "code": "STORE_ID_DUPLICATE",
      "severity": "blocker",
      "title": "One store ID is used by multiple records",
      "description": "A target entity must not receive ambiguous repeated rows."
    },
    {
      "code": "IDENTIFIER_FORMAT",
      "severity": "warning",
      "title": "Identifier formatting needs review",
      "description": "Scientific notation or numeric coercion may have changed an identifier; lost digits are never reconstructed."
    },
    {
      "code": "FORMULA_LIKE_TEXT",
      "severity": "warning",
      "title": "A cell could be interpreted as a spreadsheet formula",
      "description": "Preserve source text and use safe destination-aware handling; this module does not execute or silently prefix it."
    },
    {
      "code": "DUPLICATE_ROW",
      "severity": "warning",
      "title": "A complete record is repeated",
      "description": "Identical data may produce repeated creates; continuation records are excluded."
    },
    {
      "code": "UPDATE_REFERENCE_UNCHECKED",
      "severity": "info",
      "title": "Existing-store matching was not checked",
      "description": "No store snapshot was supplied, so existing identity and before-values are unverified."
    },
    {
      "code": "UPDATE_BLANK_SEMANTICS",
      "severity": "warning",
      "title": "Review how blank update cells are handled",
      "description": "Omitted source values are not automatic instructions to clear existing data; the exporter must preserve update intent."
    },
    {
      "code": "NAME_MISSING",
      "severity": "blocker",
      "title": "Product name is missing",
      "description": "A new product needs a sourced name, directly or from an explicit parent."
    },
    {
      "code": "SKU_MISSING",
      "severity": "warning",
      "title": "SKU is missing",
      "description": "A SKU is useful for reliable matching; an importer may impose a stricter requirement."
    },
    {
      "code": "MATCH_KEY_MISSING",
      "severity": "blocker",
      "title": "An update has no stable target key",
      "description": "Map an existing store ID, variant ID, SKU, handle, or kind-specific identity."
    },
    {
      "code": "SKU_CONFLICT",
      "severity": "blocker",
      "title": "The same mapped SKU appears in multiple records",
      "description": "Supplier SKUs are scoped to suppliers; review collisions instead of using row order or silently merging."
    },
    {
      "code": "HANDLE_CONFLICT",
      "severity": "blocker",
      "title": "One product handle has conflicting titles",
      "description": "A handle groups one product in applicable importers; do not silently select the first conflicting title."
    },
    {
      "code": "NAME_SUPPLIER",
      "severity": "warning",
      "title": "Same product name, different suppliers",
      "description": "This may be legitimate multiple sourcing or different items; names alone do not prove identity."
    },
    {
      "code": "NAME_CATEGORY",
      "severity": "warning",
      "title": "Same product name, different categories",
      "description": "Different category membership may be valid; review the full category sets and identifiers."
    },
    {
      "code": "NAME_BRAND",
      "severity": "warning",
      "title": "Same product name, different brands",
      "description": "A shared name is weak evidence; verify brand and product identity."
    },
    {
      "code": "NAME_PACK",
      "severity": "warning",
      "title": "Same product name, different pack quantities",
      "description": "Different packs can be distinct products and must not be compared or merged automatically."
    },
    {
      "code": "NAME_MATCH_UNRESOLVED",
      "severity": "warning",
      "title": "Same name without a confirmed variant relationship",
      "description": "Review duplicate retail items, separate products, or supplier offers; no automatic merge."
    },
    {
      "code": "GTIN_INVALID",
      "severity": "warning",
      "title": "GTIN format or checksum is invalid",
      "description": "Only syntax and check digit are tested; this does not verify GS1 assignment."
    },
    {
      "code": "GTIN_REUSED",
      "severity": "warning",
      "title": "A barcode is reused by different records",
      "description": "Multiple offers may share a genuine barcode; resolve identity before counting them as independent price peers."
    },
    {
      "code": "GTIN_CONFLICT",
      "severity": "blocker",
      "title": "A barcode has conflicting brand or pack data",
      "description": "Conflicting supplied identity facts need a reviewed decision; packaging-level exceptions require evidence."
    },
    {
      "code": "MODEL_GTIN_CONFLICT",
      "severity": "warning",
      "title": "A manufacturer model has different barcodes",
      "description": "Matching brand/model/options/pack may have valid regional identifiers or a source error."
    },
    {
      "code": "CATEGORY_MISSING",
      "severity": "warning",
      "title": "Product category is missing",
      "description": "Offer sourced category choices; do not invent a taxonomy value."
    },
    {
      "code": "SHOPIFY_CATEGORY_MISSING",
      "severity": "warning",
      "title": "Shopify standard product category is missing",
      "description": "Source or Woo categories are not automatically Shopify taxonomy values; choose a supported target category."
    },
    {
      "code": "PRICE_MISSING",
      "severity": "blocker",
      "title": "Selling price is missing",
      "description": "A new sellable product needs an explicit regular price under this app safety policy."
    },
    {
      "code": "PRICE_INVALID",
      "severity": "blocker",
      "title": "Price is invalid",
      "description": "Use a finite nonnegative amount in the selected decimal style and safe monetary range."
    },
    {
      "code": "PRICE_ZERO",
      "severity": "warning",
      "title": "The product price is zero",
      "description": "Confirm that free pricing is intentional; blank and zero are different."
    },
    {
      "code": "PRICE_PRECISION",
      "severity": "warning",
      "title": "Money has more than two decimal places",
      "description": "Review the destination currency precision and rounding before export."
    },
    {
      "code": "SALE_PRICE_INVALID",
      "severity": "blocker",
      "title": "Sale price is invalid",
      "description": "A supplied sale price must be finite, nonnegative, and safely representable."
    },
    {
      "code": "SALE_NOT_LOWER",
      "severity": "warning",
      "title": "Sale price is not lower than regular price",
      "description": "Review swapped columns or an intentional no-discount state."
    },
    {
      "code": "SALE_PRICE_ZERO",
      "severity": "warning",
      "title": "Sale price makes the item free",
      "description": "A supplied zero sale price is different from no sale price."
    },
    {
      "code": "COST_INVALID",
      "severity": "blocker",
      "title": "Cost is invalid",
      "description": "A supplied cost must be finite and nonnegative."
    },
    {
      "code": "BELOW_COST",
      "severity": "warning",
      "title": "Selling price is below the entered cost",
      "description": "Compare the same unit, currency, and tax basis; this is not a complete profit calculation."
    },
    {
      "code": "CURRENCY_FORMAT",
      "severity": "blocker",
      "title": "Currency format is invalid",
      "description": "Use a three-letter currency code; assignment and exchange rates are not verified."
    },
    {
      "code": "CURRENCY_UNRECOGNIZED",
      "severity": "warning",
      "title": "Currency code is not recognized by this runtime",
      "description": "A three-letter shape alone does not establish a supported currency; verify the code and importer currency settings."
    },
    {
      "code": "CURRENCY_MISSING",
      "severity": "warning",
      "title": "Price currency is unknown",
      "description": "Choose an explicit file currency or source column before interpreting cross-record prices."
    },
    {
      "code": "PACK_INVALID",
      "severity": "blocker",
      "title": "Pack quantity is invalid",
      "description": "A supplied pack count must be a positive whole number; missing is not automatically one."
    },
    {
      "code": "TAX_BASIS_UNKNOWN",
      "severity": "warning",
      "title": "Tax basis is not recognized",
      "description": "Use an explicit inclusive/exclusive value; unknown context is excluded from price comparisons."
    },
    {
      "code": "PRICE_BASIS_UNKNOWN",
      "severity": "warning",
      "title": "Price context is not recognized",
      "description": "Distinguish regular, sale, retail, and wholesale price contexts."
    },
    {
      "code": "PRICE_OUTLIER",
      "severity": "warning",
      "title": "Price differs sharply from comparable siblings",
      "description": "Leave the candidate out, use compatible explicit family peers, and require statistical/range and monetary thresholds."
    },
    {
      "code": "PRICE_NOT_EVALUATED",
      "severity": "info",
      "title": "Some prices lack comparable peer evidence",
      "description": "Unknown context, unresolved identity, or too few peers is not a passed price check."
    },
    {
      "code": "OPTION_INCOMPLETE",
      "severity": "blocker",
      "title": "An option name or value is missing",
      "description": "A partial option pair cannot reliably define a sellable variant."
    },
    {
      "code": "OPTION_NAME_DUPLICATE",
      "severity": "blocker",
      "title": "An option name appears twice",
      "description": "One variant must not assign the same option twice."
    },
    {
      "code": "VARIANT_DUPLICATE",
      "severity": "blocker",
      "title": "Duplicate options under an explicit product group",
      "description": "Two sellable records claim the same complete option combination."
    },
    {
      "code": "VARIANT_OPTIONS_MISSING",
      "severity": "blocker",
      "title": "A variation has no option values",
      "description": "An explicitly declared variation needs a sourced combination."
    },
    {
      "code": "VARIANT_OPTION_SCHEMA",
      "severity": "blocker",
      "title": "Variants disagree about their option names",
      "description": "An explicit parent group needs a consistent option structure."
    },
    {
      "code": "PARENT_MISSING",
      "severity": "blocker",
      "title": "Referenced parent is absent from this file",
      "description": "Include the parent or use a reviewed existing-parent update workflow; no store lookup is claimed."
    },
    {
      "code": "PARENT_UNCHECKED",
      "severity": "warning",
      "title": "Existing parent was not checked",
      "description": "An update references an external parent without a supplied store snapshot."
    },
    {
      "code": "PARENT_AMBIGUOUS",
      "severity": "blocker",
      "title": "Parent reference matches multiple records",
      "description": "Resolve the parent identity before exporting its children."
    },
    {
      "code": "PARENT_SELF",
      "severity": "blocker",
      "title": "A product references itself as parent",
      "description": "Self-parent relationships cannot form a valid variant graph."
    },
    {
      "code": "PARENT_CYCLE",
      "severity": "blocker",
      "title": "Product parent relationships contain a cycle",
      "description": "Break the cycle and keep dependent records together for review."
    },
    {
      "code": "PARENT_TYPE_CONFLICT",
      "severity": "blocker",
      "title": "The referenced parent has an incompatible structure",
      "description": "A simple/variation record cannot be used as an explicit variable parent."
    },
    {
      "code": "STOCK_INVALID",
      "severity": "blocker",
      "title": "Stock quantity is invalid",
      "description": "A supplied quantity must be a finite safe whole number for these import profiles."
    },
    {
      "code": "STOCK_NEGATIVE",
      "severity": "warning",
      "title": "Stock quantity is negative",
      "description": "This may represent backorders; confirm the inventory policy instead of forcing zero."
    },
    {
      "code": "WEIGHT_INVALID",
      "severity": "blocker",
      "title": "Weight is invalid",
      "description": "A supplied weight must be finite and nonnegative."
    },
    {
      "code": "WEIGHT_UNIT_MISSING",
      "severity": "warning",
      "title": "Weight unit is unknown",
      "description": "Map the unit explicitly; this module does not guess kilograms or grams."
    },
    {
      "code": "WEIGHT_UNIT_UNKNOWN",
      "severity": "warning",
      "title": "Weight unit needs destination review",
      "description": "Only g, kg, lb/lbs, and oz are recognized here; no conversion is performed."
    },
    {
      "code": "IMAGE_URL_INVALID",
      "severity": "warning",
      "title": "An image URL is malformed or not public HTTP(S)",
      "description": "This checks URL structure only, not accessibility, file type, or licensing."
    },
    {
      "code": "IMAGE_DUPLICATE",
      "severity": "warning",
      "title": "An image URL is repeated",
      "description": "Review repeated images within one product; no automatic removal."
    },
    {
      "code": "GOOGLE_GENDER_INVALID",
      "severity": "warning",
      "title": "Google gender value is not recognized",
      "description": "Use male, female, or unisex only when supplied by reliable product data."
    },
    {
      "code": "GOOGLE_AGE_INVALID",
      "severity": "warning",
      "title": "Google age group is not recognized",
      "description": "Use a supported supplied value; never derive age from a product name alone."
    },
    {
      "code": "CONDITION_INVALID",
      "severity": "warning",
      "title": "Condition is not recognized",
      "description": "Use new, used, or refurbished when supported; unknown condition is excluded from peer groups."
    },
    {
      "code": "GOOGLE_OPTION_CONFLICT",
      "severity": "warning",
      "title": "Google attribute conflicts with a supplied option",
      "description": "Review color/size differences in the same product sheet."
    },
    {
      "code": "GOOGLE_CATEGORY_MULTIPLE",
      "severity": "warning",
      "title": "Google category appears to contain multiple values",
      "description": "Google category is a single taxonomy value, separate from Woo category membership."
    },
    {
      "code": "TAXONOMY_UNCHECKED",
      "severity": "info",
      "title": "Official taxonomy membership was not checked",
      "description": "Supplied category text is preserved; no category registry was loaded."
    },
    {
      "code": "CATEGORY_NAME_MISSING",
      "severity": "blocker",
      "title": "Category name is missing",
      "description": "A new category needs a supplied name."
    },
    {
      "code": "CATEGORY_SLUG_FORMAT",
      "severity": "warning",
      "title": "Category slug may be rewritten by the destination",
      "description": "Whitespace or URL delimiters need review; do not silently slugify."
    },
    {
      "code": "CATEGORY_SLUG_DUPLICATE",
      "severity": "blocker",
      "title": "Category slug is reused",
      "description": "A slug collision makes category identity ambiguous."
    },
    {
      "code": "CATEGORY_DUPLICATE",
      "severity": "warning",
      "title": "Category name is repeated under the same parent",
      "description": "Review duplicate branches while preserving legitimate same-name leaves under different parents."
    },
    {
      "code": "CATEGORY_NEAR_DUPLICATE",
      "severity": "warning",
      "title": "Category labels look similar",
      "description": "Punctuation, spacing, case, or a one-character typo can create duplicate categories; no automatic merge."
    },
    {
      "code": "CATEGORY_PARENT_MISSING",
      "severity": "warning",
      "title": "Category parent is not present in this file",
      "description": "It may already exist in the store; that external reference was not verified."
    },
    {
      "code": "CATEGORY_PARENT_AMBIGUOUS",
      "severity": "blocker",
      "title": "Category parent reference is ambiguous",
      "description": "Use an unambiguous slug, ID, or full path to distinguish same-name branches."
    },
    {
      "code": "CATEGORY_CYCLE",
      "severity": "blocker",
      "title": "Category hierarchy contains a cycle",
      "description": "Self-links and cyclic parent paths must be corrected."
    },
    {
      "code": "CUSTOMER_CONTACT_MISSING",
      "severity": "blocker",
      "title": "Customer has no contact identity",
      "description": "Supply a valid email, phone, or known store ID; never invent an address."
    },
    {
      "code": "CUSTOMER_NAME_MISSING",
      "severity": "warning",
      "title": "Customer name is missing",
      "description": "A contact may be legitimate, but its name has not been established."
    },
    {
      "code": "CUSTOMER_EMAIL_INVALID",
      "severity": "blocker",
      "title": "Email format is invalid",
      "description": "Only practical syntax is checked; mailbox existence and ownership are not verified."
    },
    {
      "code": "CUSTOMER_EMAIL_DUPLICATE",
      "severity": "blocker",
      "title": "An email address appears in multiple customer records",
      "description": "Review repeated customers before choosing a create/update target."
    },
    {
      "code": "CUSTOMER_EMAIL_CONFLICT",
      "severity": "blocker",
      "title": "One email has conflicting customer details",
      "description": "Names or supplied addresses conflict under the same contact key."
    },
    {
      "code": "CUSTOMER_NAME_MATCH",
      "severity": "warning",
      "title": "Same full name, different contact identities",
      "description": "People can legitimately share a name; never merge from name alone."
    },
    {
      "code": "CUSTOMER_PHONE_INVALID",
      "severity": "warning",
      "title": "Phone format needs review",
      "description": "Accept recognizable local or international numbers without inventing a country prefix."
    },
    {
      "code": "CUSTOMER_PHONE_CONTEXT",
      "severity": "warning",
      "title": "Local phone number has no country context",
      "description": "A local number may be valid, but international interpretation is unknown."
    },
    {
      "code": "CUSTOMER_PHONE_REUSED",
      "severity": "warning",
      "title": "A phone number is shared by different contacts",
      "description": "Shared household/business phones can be legitimate; no automatic merge."
    },
    {
      "code": "CUSTOMER_ADDRESS_INCOMPLETE",
      "severity": "warning",
      "title": "Address is incomplete",
      "description": "A supplied street address lacks city or country; postal deliverability was not verified."
    },
    {
      "code": "CUSTOMER_COUNTRY_FORMAT",
      "severity": "warning",
      "title": "Country value needs destination review",
      "description": "A full country name may be accepted by some importers; code-based exporters need an explicit mapping."
    },
    {
      "code": "CONSENT_UNRECOGNIZED",
      "severity": "blocker",
      "title": "Marketing consent is ambiguous",
      "description": "An unrecognized value must not become opt-in automatically."
    },
    {
      "code": "CONSENT_REVIEW",
      "severity": "warning",
      "title": "Positive marketing consent needs evidence",
      "description": "A source flag alone does not prove permission; no marketing action is performed."
    },
    {
      "code": "CONSENT_UNCHECKED",
      "severity": "info",
      "title": "Blank marketing consent remains unknown",
      "description": "Missing consent is not false or true and is never defaulted to opt-in."
    }
  ],
  "deals": [
    {
      "code": "DEAL_AGREEMENT_COVERAGE",
      "title": "Vendor agreement does not cover this deal",
      "fix": "Resolve: the source value. Funding is excluded from profitability until verified.",
      "severity": "blocker",
      "why": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope.",
      "description": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope. Resolve: the source value. Funding is excluded from profitability until verified.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_AGREEMENT_DUPLICATE",
      "title": "Agreement ID is ambiguous",
      "fix": "The agreement snapshot has multiple entries for this ID. Resolve the duplicate.",
      "severity": "blocker",
      "why": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope.",
      "description": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope. The agreement snapshot has multiple entries for this ID. Resolve the duplicate.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_AGREEMENT_NOT_FOUND",
      "title": "Agreement ID was not found",
      "fix": "The agreement does not exist in the supplied agreement snapshot.",
      "severity": "blocker",
      "why": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope.",
      "description": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope. The agreement does not exist in the supplied agreement snapshot.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_AGREEMENT_REQUIRED",
      "title": "Vendor-funded deal has no agreement ID",
      "fix": "Supply the actual agreement ID; a supplier name or funding assumption is not an agreement.",
      "severity": "blocker",
      "why": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope.",
      "description": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope. Supply the actual agreement ID; a supplier name or funding assumption is not an agreement.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_ALLOCATION_EXCEEDS_STOCK",
      "title": "Reserved units exceed on-hand stock",
      "fix": "Reduce the reservation or supply verified additional inventory for this exact scope.",
      "severity": "blocker",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. Reduce the reservation or supply verified additional inventory for this exact scope.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_ALLOCATION_REUSED",
      "title": "Overlapping reservations may reuse the same inventory",
      "severity": "warning",
      "fix": "Determine whether simultaneous deals reserve independent units or share the stock pool; reconcile reservations and availability.",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. Determine whether simultaneous deals reserve independent units or share the stock pool; reconcile reservations and availability.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_ALL_CASE",
      "title": "ALL must be explicit",
      "fix": "Use uppercase ALL for all stores or channels. Other tokens remain case-sensitive.",
      "severity": "blocker",
      "why": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel.",
      "description": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel. Use uppercase ALL for all stores or channels. Other tokens remain case-sensitive.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_ALL_EMPTY",
      "title": "ALL has no active reference locations",
      "fix": "The supplied the source value master has no unambiguous active entries.",
      "severity": "blocker",
      "why": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel.",
      "description": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel. The supplied the source value master has no unambiguous active entries.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_ALL_MIXED",
      "title": "ALL cannot be mixed with individual codes",
      "fix": "Choose ALL alone or list the exact intended codes.",
      "severity": "blocker",
      "why": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel.",
      "description": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel. Choose ALL alone or list the exact intended codes.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_APPROVAL_DUPLICATE",
      "title": "Approval reference is ambiguous",
      "fix": "Multiple supplied approval records share this reference. Resolve the duplicate instead of accepting an arbitrary row.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. Multiple supplied approval records share this reference. Resolve the duplicate instead of accepting an arbitrary row.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_APPROVAL_NOT_GRANTED",
      "title": "Referenced approval is not granted",
      "fix": "The supplied approval record is not explicitly approved.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. The supplied approval record is not explicitly approved.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_APPROVAL_REFERENCE_MISSING",
      "title": "Readiness assertion has no evidence reference",
      "fix": "A Yes flag is not approval proof. Link or identify the actual review evidence without exposing private credentials.",
      "severity": "warning",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. A Yes flag is not approval proof. Link or identify the actual review evidence without exposing private credentials.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_APPROVAL_SCOPE",
      "title": "Approval belongs to another deal",
      "fix": "Use evidence whose deal ID matches this source record.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. Use evidence whose deal ID matches this source record.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_ASSET_NOT_READY",
      "title": "Promotion assets are unfinished",
      "fix": "Confirm that the correct product image and price/date copy are ready in the destination.",
      "severity": "warning",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. Confirm that the correct product image and price/date copy are ready in the destination.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_BELOW_COST",
      "title": "Offer sells below product cost",
      "fix": "The promotional revenue is below the cost of all received units before fees. Review funding and the actual business decision.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The promotional revenue is below the cost of all received units before fees. Review funding and the actual business decision.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_BOGO_PERCENT",
      "title": "BOGO conflicts with the get-item discount",
      "fix": "BOGO means the get items are 100% discounted in this planner. Choose buy_x_get_y for a partial discount.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. BOGO means the get items are 100% discounted in this planner. Choose buy_x_get_y for a partial discount.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_BOOLEAN",
      "title": "Vendor funded flag is invalid",
      "fix": "Use Yes/No, True/False or1/0 for readiness/funding flags. Blank stays unknown.",
      "severity": "blocker",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. Use Yes/No, True/False or1/0 for readiness/funding flags. Blank stays unknown.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_BUNDLE_QUANTITY",
      "title": "Bundle needs multiple items",
      "fix": "A bundle contains at least two received units. Use fixed_price for a single item.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. A bundle contains at least two received units. Use fixed_price for a single item.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_BUY_GET_QUANTITY",
      "title": "Buy/get quantities do not match the offer",
      "fix": "Enter positive Buy quantity and Get quantity; Units in the complete offer must equal their sum. All items in this planner have the same unit price and cost.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Enter positive Buy quantity and Get quantity; Units in the complete offer must equal their sum. All items in this planner have the same unit price and cost.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C10_NOT_CHECKED",
      "title": "C10: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C11_NOT_CHECKED",
      "title": "C11: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C12_NOT_CHECKED",
      "title": "C12: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C13_NOT_CHECKED",
      "title": "C13: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C14_NOT_CHECKED",
      "title": "C14: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C15_NOT_CHECKED",
      "title": "C15: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C16_NOT_CHECKED",
      "title": "C16: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C2_NOT_CHECKED",
      "title": "C2: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C3_NOT_CHECKED",
      "title": "C3: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C4_NOT_CHECKED",
      "title": "C4: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C5_NOT_CHECKED",
      "title": "C5: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C6_NOT_CHECKED",
      "title": "C6: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C7_NOT_CHECKED",
      "title": "C7: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C8_NOT_CHECKED",
      "title": "C8: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_C9_NOT_CHECKED",
      "title": "C9: required evidence is unavailable",
      "severity": "warning",
      "fix": "Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "why": "Absent evidence cannot prove that a promotion is correct or safe to launch.",
      "description": "Absent evidence cannot prove that a promotion is correct or safe to launch. Supply the reference or input evidence named in the row-specific warning, then rerun validation. Missing evidence is never a passed check.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_CATALOG_COST",
      "title": "Entered cost differs from the catalog snapshot",
      "fix": "Reconcile the source and catalog cost before relying on the margin calculation. Neither value is silently substituted.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Reconcile the source and catalog cost before relying on the margin calculation. Neither value is silently substituted.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_CURRENCY",
      "title": "Catalog and deal currencies differ",
      "fix": "Convert using an explicitly approved rate outside this planner, or supply the matching currency snapshot. No exchange rate is guessed.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Convert using an explicitly approved rate outside this planner, or supply the matching currency snapshot. No exchange rate is guessed.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_DUPLICATE",
      "title": "Catalog SKU is ambiguous",
      "fix": "The supplied catalog contains duplicate SKU records. Resolve the duplicates; the first row is not treated as authority.",
      "severity": "blocker",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. The supplied catalog contains duplicate SKU records. Resolve the duplicates; the first row is not treated as authority.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_IDENTITY",
      "title": "Product facts conflict with the catalog",
      "fix": "The same SKU has different the source value in the supplied catalog. Correct or explicitly reconcile the source.",
      "severity": "blocker",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. The same SKU has different the source value in the supplied catalog. Correct or explicitly reconcile the source.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_PRICE",
      "title": "Regular price differs from the catalog",
      "fix": "The reference catalog gives a full-offer regular total of the source value the source value. Check stale prices, packs and units before advertising a discount.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The reference catalog gives a full-offer regular total of the source value the source value. Check stale prices, packs and units before advertising a discount.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_PROMO",
      "title": "Submitted promotion differs from catalog-based math",
      "fix": "Recalculating the same rule from the independent catalog unit price gives the source value the source value. Correct the regular source price and submitted promotion together.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Recalculating the same rule from the independent catalog unit price gives the source value the source value. Correct the regular source price and submitted promotion together.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_PROMO_INVALID",
      "title": "Deal becomes invalid at the catalog price",
      "fix": "The entered rule makes the independently supplied catalog price negative or exceeds the supported range. Reconcile stale prices before calculating a discount.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The entered rule makes the independently supplied catalog price negative or exceeds the supported range. Reconcile stale prices before calculating a discount.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_STOCK",
      "title": "Stock differs from the catalog snapshot",
      "fix": "Reconcile inventory for the same store scope and snapshot time. A typed stock value does not overwrite independent inventory evidence.",
      "severity": "warning",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. Reconcile inventory for the same store scope and snapshot time. A typed stock value does not overwrite independent inventory evidence.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATALOG_VELOCITY",
      "title": "Sales velocity differs from the reference",
      "fix": "Confirm the baseline period, units and store scope before relying on the demand forecast.",
      "severity": "warning",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. Confirm the baseline period, units and store scope before relying on the demand forecast.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATEGORY_CAP",
      "title": "Discount exceeds the supplied category cap",
      "fix": "The effective whole-offer discount exceeds the category policy maximum of the source value%.",
      "severity": "blocker",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. The effective whole-offer discount exceeds the category policy maximum of the source value%.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_CATEGORY_POLICY_DUPLICATE",
      "title": "Category policy is ambiguous",
      "fix": "Multiple supplied category policies have the same normalized category. Resolve the policy instead of accepting the first match.",
      "severity": "blocker",
      "why": "An invalid, unsupported or conflicting rule must not be treated as permission.",
      "description": "An invalid, unsupported or conflicting rule must not be treated as permission. Multiple supplied category policies have the same normalized category. Resolve the policy instead of accepting the first match.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CATEGORY_POLICY_INVALID",
      "title": "Category policy contains an invalid percentage",
      "fix": "Supplied discount caps and gross-margin floors must be decimals from 0 to 100; invalid policy values are not treated as permissions.",
      "severity": "blocker",
      "why": "An invalid, unsupported or conflicting rule must not be treated as permission.",
      "description": "An invalid, unsupported or conflicting rule must not be treated as permission. Supplied discount caps and gross-margin floors must be decimals from 0 to 100; invalid policy values are not treated as permissions.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_CELL_TOO_LONG",
      "title": "A deal cell is too long",
      "fix": "the source value exceeds 10,000 characters. Shorten it before exporting.",
      "severity": "blocker",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. the source value exceeds 10,000 characters. Shorten it before exporting.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_CHANNEL_PARITY",
      "title": "Channel snapshot does not match the plan",
      "fix": "Channel the source value has a different promotional price or activation window. Compare the exact entered snapshot before launch.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. Channel the source value has a different promotional price or activation window. Compare the exact entered snapshot before launch.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_CONTRIBUTION_RANGE",
      "title": "Contribution exceeds the supported range",
      "fix": "The combined entered costs create an unsupported contribution amount.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The combined entered costs create an unsupported contribution amount.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_CONTROL_CHARACTER",
      "title": "Hidden control character",
      "fix": "the source value contains an unsupported control character. Re-enter the value from the source.",
      "severity": "blocker",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. the source value contains an unsupported control character. Re-enter the value from the source.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_COPY_BUNDLE",
      "title": "Deal name and bundle calculation disagree",
      "fix": "The quantity or ending total in the written “N for amount” offer differs from the entered rule.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. The quantity or ending total in the written “N for amount” offer differs from the entered rule.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_COPY_NOT_APPROVED",
      "title": "Promotion copy is not approved",
      "fix": "The source explicitly says the copy is unapproved. Complete review before launch.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. The source explicitly says the copy is unapproved. Complete review before launch.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_COPY_PERCENT",
      "title": "Deal name promises a different discount",
      "fix": "The percentage written in the deal name does not match Discount value. Correct the customer-facing promise or the actual rule.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. The percentage written in the deal name does not match Discount value. Correct the customer-facing promise or the actual rule.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_COST_RANGE",
      "title": "Total product cost exceeds the supported range",
      "fix": "Cost per unit multiplied by received units is too large to calculate safely.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Cost per unit multiplied by received units is too large to calculate safely.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_COST_UNKNOWN",
      "title": "Profitability cannot be checked",
      "fix": "Cost per unit is missing or invalid. Unknown cost is never treated as zero; gross and contribution margins stay blank.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Cost per unit is missing or invalid. Unknown cost is never treated as zero; gross and contribution margins stay blank.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_CURRENCY",
      "title": "Currency is missing or invalid",
      "fix": "Supply a supported three-letter currency code. Values from different currencies cannot be compared.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Supply a supported three-letter currency code. Values from different currencies cannot be compared.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_DATE_ORDER",
      "title": "Promotion ends before it can run",
      "fix": "End must follow start. Date-only end dates include the whole stated day; timestamp end instants are exclusive.",
      "severity": "blocker",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. End must follow start. Date-only end dates include the whole stated day; timestamp end instants are exclusive.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_DATE_POLICY",
      "title": "Schedule policy is invalid",
      "severity": "blocker",
      "fix": "Correct the explicitly supplied maximum-duration or minimum-lead-day policy; invalid policies are not ignored.",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Correct the explicitly supplied maximum-duration or minimum-lead-day policy; invalid policies are not ignored.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_DECIMAL_STYLE",
      "title": "Choose a decimal style",
      "severity": "blocker",
      "fix": "Choose dot or comma decimal style for both source and references before interpreting money.",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. Choose dot or comma decimal style for both source and references before interpreting money.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_DESTINATION_SETUP",
      "title": "This is a promotion planning sheet",
      "severity": "info",
      "fix": "Configure the chosen promotion system and test actual carts, scheduling, stacking and app rounding before launch. File export does not activate a promotion.",
      "why": "A valid planning file does not prove that the selected platform or app has implemented the offer.",
      "description": "A valid planning file does not prove that the selected platform or app has implemented the offer. Configure the chosen promotion system and test actual carts, scheduling, stacking and app rounding before launch. File export does not activate a promotion.",
      "sheets": [
        "deals"
      ],
      "layer": "destination"
    },
    {
      "code": "DEAL_DISCOUNT_RANGE",
      "title": "Percent discount is invalid",
      "fix": "Check the selected type: percent uses 20 for20%; amount_off is removed from the complete regular total; fixed_price/bundle is the complete ending total.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Check the selected type: percent uses 20 for20%; amount_off is removed from the complete regular total; fixed_price/bundle is the complete ending total.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_DURATION_LIMIT",
      "title": "Promotion exceeds the supplied duration policy",
      "fix": "the source value calendar days exceeds the configured maximum of the source value; this maximum is a supplied business policy.",
      "severity": "blocker",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. the source value calendar days exceeds the configured maximum of the source value; this maximum is a supplied business policy.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_EMPTY",
      "title": "No deal rows were supplied",
      "severity": "blocker",
      "fix": "Choose a worksheet containing at least one real deal row.",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. Choose a worksheet containing at least one real deal row.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_END_DATE",
      "title": "End date is invalid",
      "severity": "blocker",
      "fix": "Supply a real end date or explicit-offset timestamp. Date-only ends include the whole local day; timestamp ends are exclusive.",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Supply a real end date or explicit-offset timestamp. Date-only ends include the whole local day; timestamp ends are exclusive.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_EXPIRED",
      "title": "Promotion has already ended",
      "fix": "The end is earlier than the explicitly supplied review time. Confirm this is an intentional historical file.",
      "severity": "warning",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. The end is earlier than the explicitly supplied review time. Confirm this is an intentional historical file.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_FEES_UNKNOWN",
      "title": "Contribution margin is not fully checked",
      "fix": "Supply Variable fee, Fixed fee and Other cost explicitly. Enter 0 only when zero is known; missing fees do not become zero.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Supply Variable fee, Fixed fee and Other cost explicitly. Enter 0 only when zero is known; missing fees do not become zero.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_FEE_RANGE",
      "title": "Combined fees exceed the supported range",
      "fix": "Variable and fixed fees together exceed the safe minor-unit range.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Variable and fixed fees together exceed the safe minor-unit range.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_FORMULA_TEXT",
      "title": "Spreadsheet formula-like text",
      "fix": "the source value begins with a spreadsheet formula trigger. Export it as safe literal text after reviewing the source.",
      "severity": "warning",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. the source value begins with a spreadsheet formula trigger. Export it as safe literal text after reviewing the source.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_FREE_OFFER",
      "title": "Offer total becomes zero",
      "fix": "The complete offer is free after rounding. Confirm a deliberate giveaway and use a promotion system that supports it; no margin can be calculated.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The complete offer is free after rounding. Confirm a deliberate giveaway and use a promotion system that supports it; no margin can be calculated.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_GET_PERCENT",
      "title": "Get-item discount is missing or invalid",
      "fix": "For buy_x_get_y, explicitly enter the discount percentage on the received get items, greater than 0 and at most 100.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. For buy_x_get_y, explicitly enter the discount percentage on the received get items, greater than 0 and at most 100.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_GROSS_MARGIN_FLOOR",
      "title": "Gross margin is below the category policy floor",
      "fix": "Gross margin before fees is below the supplied minimum of the source value%.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Gross margin before fees is below the supplied minimum of the source value%.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_IDENTIFIER_LENGTH",
      "title": "Identifier is too long",
      "fix": "Keep deal IDs at most 100 characters and SKUs at most 255 characters; your destination may impose a smaller limit.",
      "severity": "blocker",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Keep deal IDs at most 100 characters and SKUs at most 255 characters; your destination may impose a smaller limit.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_IDENTIFIER_TRIM",
      "title": "Identifier has surrounding whitespace",
      "fix": "Confirm the exact identifier in the destination. Source whitespace is preserved and must not silently change identity.",
      "severity": "warning",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Confirm the exact identifier in the destination. Source whitespace is preserved and must not silently change identity.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_ID_DUPLICATE",
      "title": "Deal ID is reused",
      "fix": "Assign a unique deal ID after reviewing the duplicated records; do not silently merge.",
      "severity": "blocker",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Assign a unique deal ID after reviewing the duplicated records; do not silently merge.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_INSUFFICIENT_ALLOCATION",
      "title": "Reservation cannot fulfill one offer",
      "fix": "Reserve enough units for all items received in at least one redemption.",
      "severity": "warning",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. Reserve enough units for all items received in at least one redemption.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_INSUFFICIENT_OFFER_STOCK",
      "title": "Not enough stock for one complete offer",
      "fix": "On-hand units cannot fulfill the received quantity of one redemption.",
      "severity": "warning",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. On-hand units cannot fulfill the received quantity of one redemption.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_INVENTORY_SHORTFALL",
      "title": "Inventory may not cover promoted demand",
      "fix": "The supplied forecast estimates the source value units over the source value calendar day(s); only the source value units are available in the entered scope. This is a projection, not a stock reservation.",
      "severity": "warning",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. The supplied forecast estimates the source value units over the source value calendar day(s); only the source value units are available in the entered scope. This is a projection, not a stock reservation.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_LEAD_TIME",
      "title": "Promotion has too little build time",
      "fix": "There are the source value calendar days between submission and start; the supplied policy asks for the source value.",
      "severity": "warning",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. There are the source value calendar days between submission and start; the supplied policy asks for the source value.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_LEAD_UNKNOWN",
      "title": "Build lead time is not checked",
      "fix": "A lead-time policy was supplied but Submission date is blank.",
      "severity": "warning",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. A lead-time policy was supplied but Submission date is blank.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_LIFT",
      "title": "Demand multiplier is invalid",
      "fix": "Enter an explicit positive multiplier no greater than 1,000; 1 means no lift. No forecast multiplier is guessed.",
      "severity": "blocker",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. Enter an explicit positive multiplier no greater than 1,000; 1 means no lift. No forecast multiplier is guessed.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_MARGIN_FLOOR",
      "title": "Contribution margin is below the supplied floor",
      "fix": "The entered policy requires the source value% contribution margin after the entered costs. This is your supplied policy, not a universal threshold.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The entered policy requires the source value% contribution margin after the entered costs. This is your supplied policy, not a universal threshold.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_MIN_EXCEEDS_LIMIT",
      "title": "Minimum quantity exceeds the customer limit",
      "fix": "A customer cannot reach the threshold without exceeding the allowed quantity.",
      "severity": "blocker",
      "why": "Contradictory quantity constraints can make the offer impossible to redeem.",
      "description": "Contradictory quantity constraints can make the offer impossible to redeem. A customer cannot reach the threshold without exceeding the allowed quantity.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_MIXED_DATE_PRECISION",
      "title": "Dates mix a day and a timestamp",
      "fix": "Use two dates or two explicit timestamps so the activation boundary is unambiguous.",
      "severity": "warning",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Use two dates or two explicit timestamps so the activation boundary is unambiguous.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_MONEY_INVALID",
      "title": "Invalid money value",
      "fix": "the source value must be a non-negative decimal in the selected locale.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. the source value must be a non-negative decimal in the selected locale.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_MONEY_PRECISION",
      "title": "Money contains fractions of a minor unit",
      "fix": "the source value is rounded half up to the source value decimal places for the source value. Confirm the intended amount.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. the source value is rounded half up to the source value decimal places for the source value. Confirm the intended amount.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_MONEY_RANGE",
      "title": "Money exceeds the supported range",
      "fix": "Reduce the amount or split the offer; amounts above the safe minor-unit range are not calculated.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Reduce the amount or split the offer; amounts above the safe minor-unit range are not calculated.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_NAME_BRAND",
      "title": "Same name, different brands",
      "fix": "Review the exact SKU and manufacturer; a product name does not establish brand identity.",
      "severity": "warning",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Review the exact SKU and manufacturer; a product name does not establish brand identity.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_NAME_CATEGORY",
      "title": "Same name, different categories",
      "fix": "Review category membership and exact product identifiers before reclassifying anything.",
      "severity": "warning",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Review category membership and exact product identifiers before reclassifying anything.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_NAME_SUPPLIER",
      "title": "Same name, different suppliers",
      "fix": "Compare exact SKUs and supplier identities. A shared product name is only a candidate match.",
      "severity": "warning",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Compare exact SKUs and supplier identities. A shared product name is only a candidate match.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_NEGATIVE_CONTRIBUTION",
      "title": "Offer loses money after entered costs",
      "fix": "Product cost, variable/fixed fees and other entered costs exceed promotional revenue. Vendor funding is not assumed.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Product cost, variable/fixed fees and other entered costs exceed promotional revenue. Vendor funding is not assumed.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_NEGATIVE_PROMO",
      "title": "Promotion creates a negative price",
      "fix": "Revise the discount; a customer cannot owe a negative item total.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Revise the discount; a customer cannot owe a negative item total.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_NO_SAVING",
      "title": "This deal does not reduce the price",
      "fix": "The promotional total is equal to or higher than the regular total. Check the discount type, units and amount.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The promotional total is equal to or higher than the regular total. Check the discount type, units and amount.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_OFFER_EXCEEDS_LIMIT",
      "title": "Customer limit prevents this offer",
      "fix": "The customer unit limit is smaller than the number of received items. Decide whether the limit was meant to count offers instead of units.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The customer unit limit is smaller than the number of received items. Decide whether the limit was meant to count offers instead of units.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_OFFER_EXCEEDS_MAX",
      "title": "Offer cannot fit the maximum quantity",
      "fix": "Maximum quantity must allow all received items in at least one complete offer.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Maximum quantity must allow all received items in at least one complete offer.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_OFFER_RANGE",
      "title": "Offer total exceeds the supported range",
      "fix": "Unit price multiplied by offer quantity exceeds the safe minor-unit range.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Unit price multiplied by offer quantity exceeds the safe minor-unit range.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_OFFER_REGULAR_MISMATCH",
      "title": "Whole-offer regular price does not match",
      "fix": "Unit price × all the source value received items is the source value the source value; the submitted whole-offer regular total differs.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Unit price × all the source value received items is the source value the source value; the submitted whole-offer regular total differs.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_OVERLAP_CONFLICT",
      "title": "Exclusive deals overlap for the same product",
      "severity": "blocker",
      "fix": "Change conflicting windows or exact store/channel scope, or explicitly configure a supported combination policy. Review each related row.",
      "why": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove.",
      "description": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove. Change conflicting windows or exact store/channel scope, or explicitly configure a supported combination policy. Review each related row.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_OVERLAP_REVIEW",
      "title": "Overlapping deals need destination verification",
      "severity": "warning",
      "fix": "Test stacked or best-price cart results, caps and ordering in the chosen destination; a source label is not a configured promotion.",
      "why": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove.",
      "description": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove. Test stacked or best-price cart results, caps and ordering in the chosen destination; a source label is not a configured promotion.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_PERCENT_FRACTION",
      "title": "Check percentage scale",
      "fix": "the source value is between 0 and 1. This planner treats 0.2 as 0.2%, not 20%. Verify the spreadsheet percentage format; no multiplication is guessed.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. the source value is between 0 and 1. This planner treats 0.2 as 0.2%, not 20%. Verify the spreadsheet percentage format; no multiplication is guessed.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_PERCENT_RANGE",
      "title": "Percentage is invalid",
      "fix": "the source value must be from 0 to 100. Enter 20 for 20%, without a percent symbol.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. the source value must be from 0 to 100. Enter 20 for 20%, without a percent symbol.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_POLICY_ID_DUPLICATE",
      "title": "Policy ID is duplicated",
      "fix": "Supplied policy ID the source value is reused. Resolve the duplicate before treating coverage as complete.",
      "severity": "blocker",
      "why": "An invalid, unsupported or conflicting rule must not be treated as permission.",
      "description": "An invalid, unsupported or conflicting rule must not be treated as permission. Supplied policy ID the source value is reused. Resolve the duplicate before treating coverage as complete.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_POLICY_INVALID",
      "title": "Policy has no explicit active flag",
      "fix": "Give each active policy a unique ID, an explicit active flag, a supported type, a valid value and blocker/warning severity.",
      "severity": "blocker",
      "why": "An invalid, unsupported or conflicting rule must not be treated as permission.",
      "description": "An invalid, unsupported or conflicting rule must not be treated as permission. Give each active policy a unique ID, an explicit active flag, a supported type, a valid value and blocker/warning severity.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_POLICY_PURCHASE_LIMIT",
      "title": "Customer limit violates the supplied policy",
      "fix": "Policy the source value allows at most the source value received units per customer.",
      "severity": "blocker",
      "why": "An invalid, unsupported or conflicting rule must not be treated as permission.",
      "description": "An invalid, unsupported or conflicting rule must not be treated as permission. Policy the source value allows at most the source value received units per customer.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_POLICY_STACKING",
      "title": "Stacking does not meet the supplied policy",
      "fix": "Policy the source value requires a written stacking approval reference.",
      "severity": "blocker",
      "why": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove.",
      "description": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove. Policy the source value requires a written stacking approval reference.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_POLICY_TEXT",
      "title": "Promotion text triggers a supplied policy",
      "fix": "Policy the source value: the source value phrase “the source value”. This is a supplied business rule, not a legal opinion.",
      "severity": "blocker",
      "why": "An invalid, unsupported or conflicting rule must not be treated as permission.",
      "description": "An invalid, unsupported or conflicting rule must not be treated as permission. Policy the source value: the source value phrase “the source value”. This is a supplied business rule, not a legal opinion.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_POLICY_UNSUPPORTED",
      "title": "A supplied policy cannot be evaluated",
      "fix": "Policy the source value uses unsupported type the source value. Obtain a manual review; this rule is not counted as checked.",
      "severity": "warning",
      "why": "An invalid, unsupported or conflicting rule must not be treated as permission.",
      "description": "An invalid, unsupported or conflicting rule must not be treated as permission. Policy the source value uses unsupported type the source value. Obtain a manual review; this rule is not counted as checked.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_PRIMARY_NOT_READY",
      "title": "Primary channel is not ready",
      "fix": "The source explicitly marks the primary destination as unfinished. Exporting a plan does not make the promotion live.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. The source explicitly marks the primary destination as unfinished. Exporting a plan does not make the promotion live.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_PROJECTION_RANGE",
      "title": "Forecast is too large",
      "fix": "The supplied velocity, duration or multiplier creates an unsupported unit count.",
      "severity": "blocker",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. The supplied velocity, duration or multiplier creates an unsupported unit count.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_PROMO_MISMATCH",
      "title": "Submitted promotional total is wrong",
      "fix": "The stated rule independently calculates the source value the source value for the complete offer. Check the submitted ending price.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The stated rule independently calculates the source value the source value for the complete offer. Check the submitted ending price.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_PROMO_RANGE",
      "title": "Promotional total exceeds the supported range",
      "fix": "The computed promotion exceeds the safe minor-unit range.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. The computed promotion exceeds the safe minor-unit range.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_PURCHASE_LIMIT_UNKNOWN",
      "title": "Customer purchase limit is unspecified",
      "fix": "Set a positive unit limit or review an intentionally unlimited promotion in the destination. Blank is not assumed to mean unlimited.",
      "severity": "warning",
      "why": "Contradictory quantity constraints can make the offer impossible to redeem.",
      "description": "Contradictory quantity constraints can make the offer impossible to redeem. Set a positive unit limit or review an intentionally unlimited promotion in the destination. Blank is not assumed to mean unlimited.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_QUANTITY_BOUNDS",
      "title": "Maximum quantity is below the minimum",
      "fix": "Raise the maximum or correct the minimum; no cart can satisfy both values.",
      "severity": "blocker",
      "why": "Contradictory quantity constraints can make the offer impossible to redeem.",
      "description": "Contradictory quantity constraints can make the offer impossible to redeem. Raise the maximum or correct the minimum; no cart can satisfy both values.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_QUANTITY_INVALID",
      "title": "Quantity is invalid",
      "fix": "the source value must be a whole numberthe source value.",
      "severity": "blocker",
      "why": "Contradictory quantity constraints can make the offer impossible to redeem.",
      "description": "Contradictory quantity constraints can make the offer impossible to redeem. the source value must be a whole numberthe source value.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_RECORD_SHAPE",
      "title": "A deal row is malformed",
      "severity": "blocker",
      "fix": "Re-read the source into correctly mapped row objects; malformed rows are not validated.",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. Re-read the source into correctly mapped row objects; malformed rows are not validated.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_REQUIRED",
      "title": "Required deal fields are missing",
      "fix": "Fill each missing mandatory source field listed in the warning; no identity, schedule or pricing value is invented.",
      "severity": "blocker",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. Fill each missing mandatory source field listed in the warning; no identity, schedule or pricing value is invented.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_REVIEW_TIME",
      "title": "Review time is invalid",
      "severity": "blocker",
      "fix": "Supply a valid explicit review timestamp when checking expiration.",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Supply a valid explicit review timestamp when checking expiration.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_ROW_ID_DUPLICATE",
      "title": "Source row identity is duplicated",
      "fix": "Re-read source rows with distinct row IDs so exclusions and reviews cannot target the wrong row.",
      "severity": "blocker",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Re-read source rows with distinct row IDs so exclusions and reviews cannot target the wrong row.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_ROW_LIMIT",
      "title": "Too many deal rows",
      "severity": "blocker",
      "fix": "Split the input into batches of at most5,000 rows, then separately review conflicts across batches.",
      "why": "Contradictory quantity constraints can make the offer impossible to redeem.",
      "description": "Contradictory quantity constraints can make the offer impossible to redeem. Split the input into batches of at most5,000 rows, then separately review conflicts across batches.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_SCOPE_AMBIGUOUS",
      "title": "Reference code is duplicated",
      "fix": "The supplied master contains duplicate code the source value; resolve the master before choosing a location.",
      "severity": "blocker",
      "why": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel.",
      "description": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel. The supplied master contains duplicate code the source value; resolve the master before choosing a location.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_SCOPE_INACTIVE",
      "title": "Store or channel is not confirmed active",
      "fix": "Code the source value has an inactive or missing active flag in the supplied master.",
      "severity": "blocker",
      "why": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel.",
      "description": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel. Code the source value has an inactive or missing active flag in the supplied master.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_SCOPE_NOT_FOUND",
      "title": "Store or channel code was not found",
      "fix": "Exact code the source value is absent from the supplied the source value master. Substring matches are never accepted.",
      "severity": "blocker",
      "why": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel.",
      "description": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel. Exact code the source value is absent from the supplied the source value master. Substring matches are never accepted.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_SCOPE_TOKEN",
      "title": "Store or channel list is malformed",
      "fix": "Use exact, unique comma-separated codes in the source value; empty entries, duplicates and free-text names are not accepted.",
      "severity": "blocker",
      "why": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel.",
      "description": "Substring matches, duplicate tokens or inactive destinations can apply an offer to the wrong store or channel. Use exact, unique comma-separated codes in the source value; empty entries, duplicates and free-text names are not accepted.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_SECONDARY_NOT_READY",
      "title": "Secondary channels are not ready",
      "fix": "A customer-facing channel may show different dates or prices. Confirm all intended channels before launch.",
      "severity": "warning",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. A customer-facing channel may show different dates or prices. Confirm all intended channels before launch.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_SKU_FACT_CONFLICT",
      "title": "The same SKU has conflicting product facts",
      "severity": "warning",
      "fix": "Reconcile the different product facts under the same SKU against a trusted catalog; no row wins by position.",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Reconcile the different product facts under the same SKU against a trusted catalog; no row wins by position.",
      "sheets": [
        "deals"
      ],
      "layer": "relationships"
    },
    {
      "code": "DEAL_SKU_NOT_FOUND",
      "title": "Product SKU is absent from the reference catalog",
      "fix": "Use an exact SKU from the supplied catalog or update the catalog snapshot. Names never establish an identity match.",
      "severity": "blocker",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Use an exact SKU from the supplied catalog or update the catalog snapshot. Names never establish an identity match.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_SKU_WHITESPACE",
      "title": "SKU contains whitespace",
      "fix": "Check whether the whitespace is part of the actual SKU. Identifiers are never joined or guessed.",
      "severity": "warning",
      "why": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts.",
      "description": "Duplicate or contradictory identities can target the wrong product or attach the wrong facts. Check whether the whitespace is part of the actual SKU. Identifiers are never joined or guessed.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_STACKING_APPROVAL",
      "title": "Stacking has no written approval reference",
      "fix": "Provide an approval reference and validate combination order, discount caps and the final cart in the destination.",
      "severity": "blocker",
      "why": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal.",
      "description": "Customer-facing text, readiness assertions and approval evidence can disagree with the actual offer or belong to a different deal. Provide an approval reference and validate combination order, discount caps and the final cart in the destination.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_STACKING_POLICY",
      "title": "Stacking policy is not recognized",
      "fix": "Choose exclusive, best_price or stack. Boolean Yes/No only maps to stack/exclusive; it does not configure an app.",
      "severity": "blocker",
      "why": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove.",
      "description": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove. Choose exclusive, best_price or stack. Boolean Yes/No only maps to stack/exclusive; it does not configure an app.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    },
    {
      "code": "DEAL_STACKING_UNVERIFIED",
      "title": "Actual stacked cart is not verified",
      "fix": "An approval reference is not a live cart simulation. Combination order, eligible lines, taxes and rounding must be tested in the destination.",
      "severity": "warning",
      "why": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove.",
      "description": "Multiple eligible promotions can compound or compete in ways a single-row calculation cannot prove. An approval reference is not a live cart simulation. Combination order, eligible lines, taxes and rounding must be tested in the destination.",
      "sheets": [
        "deals"
      ],
      "layer": "destination"
    },
    {
      "code": "DEAL_STAGE",
      "title": "Review stage is invalid",
      "severity": "blocker",
      "fix": "Choose planning or launch. Launch strengthens copy and primary-channel readiness requirements.",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. Choose planning or launch. Launch strengthens copy and primary-channel readiness requirements.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_START_DATE",
      "title": "Start date is invalid",
      "severity": "blocker",
      "fix": "Use a real YYYY-MM-DD date or an ISO timestamp with an explicit offset matching the selected IANA time zone.",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Use a real YYYY-MM-DD date or an ISO timestamp with an explicit offset matching the selected IANA time zone.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_SUBMITTED_AFTER_START",
      "title": "Submission is after the promotion starts",
      "fix": "Review whether this is a late submission or an intentional historical record.",
      "severity": "warning",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Review whether this is a late submission or an intentional historical record.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_SUBMITTED_DATE",
      "title": "Submission date is invalid",
      "severity": "blocker",
      "fix": "Supply an unambiguous submission date in the selected time zone.",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Supply an unambiguous submission date in the selected time zone.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_TIME_ZONE",
      "title": "Time zone is missing or invalid",
      "fix": "Choose the destination store’s IANA time zone. No browser or machine time zone is silently applied.",
      "severity": "blocker",
      "why": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time.",
      "description": "An ambiguous or inconsistent schedule can activate the wrong price at the wrong local time. Choose the destination store’s IANA time zone. No browser or machine time zone is silently applied.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_TYPE",
      "title": "Unsupported deal type",
      "fix": "Choose percent, amount_off, fixed_price, bundle, bogo, or buy_x_get_y. Tiered or mixed-product deals need a separate, explicit configuration.",
      "severity": "blocker",
      "why": "Missing or malformed source data cannot be safely interpreted by a destination importer.",
      "description": "Missing or malformed source data cannot be safely interpreted by a destination importer. Choose percent, amount_off, fixed_price, bundle, bogo, or buy_x_get_y. Tiered or mixed-product deals need a separate, explicit configuration.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_UNITS",
      "title": "Offer quantity is invalid",
      "fix": "Units must be an explicit whole number from 1 to 1,000,000. It counts all items received, including free items.",
      "severity": "blocker",
      "why": "Contradictory quantity constraints can make the offer impossible to redeem.",
      "description": "Contradictory quantity constraints can make the offer impossible to redeem. Units must be an explicit whole number from 1 to 1,000,000. It counts all items received, including free items.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_UNIT_PRICE",
      "title": "Regular unit price is invalid",
      "fix": "Regular price per unit must be positive and fit the currency precision. Currency symbols, expressions and scientific notation are not accepted.",
      "severity": "blocker",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. Regular price per unit must be positive and fit the currency precision. Currency symbols, expressions and scientific notation are not accepted.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_UNUSED_DISCOUNT",
      "title": "Discount value is unused for this type",
      "fix": "BOGO and buy_x_get_y use buy/get quantities and the get-item discount. Clear Discount value to avoid importing contradictory instructions.",
      "severity": "warning",
      "why": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss.",
      "description": "A wrong amount, unit basis or missing cost can produce an incorrect offer or hide a loss. BOGO and buy_x_get_y use buy/get quantities and the get-item discount. Clear Discount value to avoid importing contradictory instructions.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_VELOCITY",
      "title": "Weekly sales velocity is invalid",
      "fix": "Enter a non-negative decimal baseline in units per week.",
      "severity": "blocker",
      "why": "A promotion can promise quantities that its entered inventory and forecast cannot support.",
      "description": "A promotion can promise quantities that its entered inventory and forecast cannot support. Enter a non-negative decimal baseline in units per week.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_VENDOR_CAP",
      "title": "Discount exceeds the vendor agreement cap",
      "fix": "The effective whole-offer discount exceeds the supplied agreement maximum of the source value%.",
      "severity": "blocker",
      "why": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope.",
      "description": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope. The effective whole-offer discount exceeds the supplied agreement maximum of the source value%.",
      "sheets": [
        "deals"
      ],
      "layer": "field"
    },
    {
      "code": "DEAL_VENDOR_POLICY_INVALID",
      "title": "Vendor discount cap is invalid",
      "fix": "The supplied agreement cap must be a decimal from 0 to 100.",
      "severity": "blocker",
      "why": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope.",
      "description": "Incorrect vendor terms can leave a promotion unfunded or outside the agreed scope. The supplied agreement cap must be a decimal from 0 to 100.",
      "sheets": [
        "deals"
      ],
      "layer": "reference"
    }
  ],
  "dealChecks": [
    {
      "code": "C1",
      "title": "Required fields and valid values"
    },
    {
      "code": "C2",
      "title": "Catalog identity"
    },
    {
      "code": "C3",
      "title": "Product, brand, supplier and category match"
    },
    {
      "code": "C4",
      "title": "Reference regular price"
    },
    {
      "code": "C5",
      "title": "Promotion arithmetic"
    },
    {
      "code": "C6",
      "title": "Category discount cap"
    },
    {
      "code": "C7",
      "title": "Margin and cost coverage"
    },
    {
      "code": "C8",
      "title": "Vendor agreement coverage"
    },
    {
      "code": "C9",
      "title": "Vendor discount cap"
    },
    {
      "code": "C10",
      "title": "Dates, time zone and lead time"
    },
    {
      "code": "C11",
      "title": "Overlapping promotions and stacking"
    },
    {
      "code": "C12",
      "title": "Exact store and channel scope"
    },
    {
      "code": "C13",
      "title": "Inventory and allocations"
    },
    {
      "code": "C14",
      "title": "Channel readiness and parity"
    },
    {
      "code": "C15",
      "title": "Copy, assets and approval evidence"
    },
    {
      "code": "C16",
      "title": "Supplied policy rules"
    }
  ],
  "workspace": [
    {
      "title": "File and workbook integrity",
      "description": "Unsupported file type, encoding, broken CSV quotes, null bytes, empty data, oversized files or cells, too many rows/columns/sheets, macros, embedded files and encryption cannot silently become records. Re-save a small data-only source."
    },
    {
      "title": "Bounded archive parsing",
      "description": "Central and local archive sizes, names, methods, flags and boundaries must agree before decompression. ZIP64, streamed entries and overlaps are rejected. A slow reader is stopped; the file must be simplified."
    },
    {
      "title": "Sheet and header selection",
      "description": "A suggested table is only a suggestion. Choose the actual worksheet and header. Empty or duplicate headers, uneven row widths, hidden rows and merged cells need review. Overflow cells remain in the recovery workbook."
    },
    {
      "title": "Unmapped and repeated columns",
      "description": "Populated source columns left unassigned produce omission warnings. Ambiguous aliases stay unassigned. A column used for different fields needs review; different edits are preserved in separate Prepared recovery fields."
    },
    {
      "title": "Pending changes and cancelled reads",
      "description": "Export is blocked while a file is reading or source/reference choices await Apply. Changing mappings, records, settings or destination invalidates previous decisions and prepared download buttons. Clear cancels pending work."
    },
    {
      "title": "Formula caches and source corrections",
      "description": "Source formulas are never evaluated. A missing cached result stays blank, a genuine cached zero stays zero, and error cells block. A deliberate corrected field is rechecked with provenance retained; restoring the original reinstates its applicable finding."
    },
    {
      "title": "Identifier precision",
      "description": "Text SKUs, GTINs, phones and postal codes retain leading zeros. IDs stored as Excel numbers are flagged; unsafe precision blocks. The app cannot recover lost digits. Numeric locale changes do not rewrite shared text identifiers."
    },
    {
      "title": "Compatible reference identity",
      "description": "Unique compatible identifiers must resolve one record. A shared product ID can be narrowed by variant/SKU evidence. Contradictory identifiers block; matching names alone never authorize a fill or merge."
    },
    {
      "title": "Reference value and context conflicts",
      "description": "Conflicting names, brands, suppliers, options, currencies, packs and customer address context prevent automatic filling. Money requires supplied reference currency and product pack context. The source-currency default is never assigned to the reference."
    },
    {
      "title": "Reference evidence safety",
      "description": "Mapped reference formula/error cells and uncertain numeric identifiers cannot supply trusted fills. A deal evidence table with missing/ambiguous headers or unsafe identifiers is omitted and its dependent controls remain Not checked."
    },
    {
      "title": "Destination identities and sparse updates",
      "description": "Create and update rules differ. Updates require an appropriate existing handle, SKU, ID or option identity. Some records need separate files to avoid destructive blank columns. Native Shopify customer overwrite is blocked; use the supported selective alternative."
    },
    {
      "title": "Product and variant structure",
      "description": "Unconfirmed flat WooCommerce families, missing parents/options, repeated combinations, conflicting parent fields, image-list delimiters and unsupported structures require correction or another adapter. Parent and sellable variation fields are not interchangeable."
    },
    {
      "title": "Money and inventory export rules",
      "description": "The actual store currency must be selected for product exports. A source/store mismatch blocks; there is no currency conversion. Destination money precision, sale-reference prices, inventory locations and weight-unit setup are checked or explicitly left for review."
    },
    {
      "title": "Taxonomy and same-sheet Google values",
      "description": "Supplied Shopify and Google fields are tested against their bundled lists. Source/Woo categories and Shopify collections have different meanings. Unsupported integration, ownership scope or populated fields cannot disappear without a warning or blocker."
    },
    {
      "title": "Customer and collection scope",
      "description": "Unknown marketing consent is not opt-in, and positive supplied consent requires review of evidence. Address updates need the supported identity. Shopify Custom Collections are flat; a category hierarchy cannot silently become a collection tree."
    },
    {
      "title": "Final output and omission review",
      "description": "Every prepared cell, including exported worksheet provenance, is checked for executable spreadsheet text. Blockers cannot be accepted away. Unsupported populated fields are reported. CSV-only profiles cannot export XLSX."
    },
    {
      "title": "Review, exclusion and recovery",
      "description": "A warning needs a recorded reason of at least twelve characters. Excluded rows are retained in the session, recovery workbook and report. Changes clear previous review decisions. The report includes all findings, reference coverage and replacement history."
    },
    {
      "title": "External reality and promotion activation",
      "description": "No check proves barcode ownership, contact deliverability, consent authenticity, live stock, current store state or legal compliance. Deal outputs calculate supplied single-SKU offers and document evidence; they do not activate promotions or model mixed-SKU carts."
    }
  ]
}