{
  "version": "2026-10-07-v4 (design v1.4)",
  "priority": [
    "1 stock",
    "2 litter",
    "3 size (+ first-fill offer)",
    "4 frequency"
  ],
  "has_weekly_plans": true,
  "sub_discount": 0.1,
  "days_per_month": 30.4,
  "monthly_kg": {
    "1": 4.5,
    "2": 7,
    "3": 11,
    "4": 14
  },
  "monthly_kg_upper": {
    "1": 5,
    "2": 8,
    "3": 13,
    "4": 14
  },
  "monthly_kg_upper_note": "design v1.4: upper 1 cat 5 / 2 cats 8 / 3 cats 13; 4+ not given -> 14 (v1.4 '6-bag monthly leaves ~3%')",
  "tiers": [
    {
      "key": "2w",
      "days": 14
    },
    {
      "key": "4w",
      "days": 28,
      "weekly": true
    },
    {
      "key": "1m",
      "days": 30.4
    },
    {
      "key": "6w",
      "days": 42,
      "weekly": true
    },
    {
      "key": "8w",
      "days": 56,
      "weekly": true
    },
    {
      "key": "2m",
      "days": 60.8
    },
    {
      "key": "3m",
      "days": 91.3
    }
  ],
  "tier_availability": {
    "tofu": {
      "2pk": [
        "2w",
        "1m",
        "2m"
      ],
      "6bag": [
        "2w",
        "1m",
        "2m",
        "3m"
      ],
      "12kg": [
        "2w",
        "1m",
        "2m"
      ]
    },
    "cassava": {
      "2pk": [
        "2w",
        "1m",
        "2m"
      ],
      "6bag": [
        "2w",
        "1m",
        "2m"
      ],
      "12kg": [
        "2w",
        "1m",
        "2m"
      ]
    }
  },
  "weekly_tiers_added_everywhere": [
    "4w",
    "6w",
    "8w"
  ],
  "tier_note": "live Supr: bi-weekly / monthly / every 2 months on tofu, cassava and 12 kg; every 3 months only on white/green tea 6-pack (and Bulk). 4w / 8w are the tiers v1.4 asks Jing to add; 6w (every 6 weeks, 42 days) added by Jing 10/12 so the B bag stepper subscribes without gaps (2 cats: 2–7 bags). All three are added together in Supr (same subscription plan group) and switched together by the section setting has_weekly_plans.",
  "min_days_to_subscribe": 14,
  "max_early_days": 8,
  "max_early_days_note": "a tier is only allowed if, at the upper usage, the box runs out at most 8 days before the next delivery (keeps v1.4: 2 cats 6-bag every 2 months without weekly tiers = runs out ~7 days early)",
  "sizes": {
    "2pk": {
      "kg": 4.8
    },
    "6bag": {
      "kg": 14.4
    },
    "12kg": {
      "kg": 12
    }
  },
  "prices_cad": {
    "tofu": {
      "green-tea": {
        "2pk": 31.99,
        "6bag": 71.99,
        "12kg": 58.99
      },
      "white-tea": {
        "2pk": 34.99,
        "6bag": 70.99,
        "12kg": 58.99
      }
    },
    "cassava": {
      "unscented": {
        "2pk": 33.99,
        "6bag": 83.99,
        "12kg": 69.99
      }
    }
  },
  "in_stock": {
    "tofu": {
      "green-tea": {
        "2pk": false,
        "6bag": false,
        "12kg": false
      },
      "white-tea": {
        "2pk": false,
        "6bag": false,
        "12kg": false
      }
    },
    "cassava": {
      "unscented": {
        "2pk": true,
        "6bag": true,
        "12kg": true
      }
    }
  },
  "in_stock_note": "2026-10-07 DH 实数 (R6): only cassava has stock (12 kg 39-42 bags, 6-bag 11-14 boxes); white tea / green tea 2-pack, 6-bag, 12 kg out of stock or single digits. Restore tofu after the Q4 batch (1,218 units) reaches the warehouse. Demo override: ?stock=all",
  "scent_order": {
    "tofu": [
      "green-tea",
      "white-tea"
    ],
    "cassava": [
      "unscented"
    ]
  },
  "litter_rules": [
    {
      "id": "neakasa",
      "if": {
        "auto_box": "neakasa"
      },
      "litter": "cassava",
      "why": [
        "why_auto_cassava",
        "why_neakasa_blend"
      ],
      "tips": []
    },
    {
      "id": "already_tofu",
      "if": {
        "q3": "tofu"
      },
      "litter": "tofu",
      "why": [
        "why_keep_tofu"
      ],
      "tips_if_lr": [
        "tip_lr_delay"
      ]
    },
    {
      "id": "already_cassava",
      "if": {
        "q3": "cassava"
      },
      "litter": "cassava",
      "why": [
        "why_keep_cassava"
      ],
      "tips_if_lr": [
        "tip_lr_delay"
      ]
    },
    {
      "id": "litter_robot",
      "if": {
        "auto_box": "litter-robot"
      },
      "litter": "cassava",
      "why": [
        "why_lr_neutral"
      ],
      "tips": [
        "tip_lr_delay"
      ]
    },
    {
      "id": "catlink",
      "if": {
        "auto_box": "catlink"
      },
      "litter": "cassava",
      "why": [
        "why_auto_cassava"
      ],
      "tips": []
    },
    {
      "id": "tried_failed_cassava",
      "if": {
        "q3": "clay_tried",
        "tried_which": "cassava"
      },
      "litter": "tofu",
      "why": [
        "why_tried_was_cassava"
      ],
      "tips": []
    },
    {
      "id": "tried_failed",
      "if": {
        "q3": "clay_tried"
      },
      "litter": "cassava",
      "why": [
        "why_tried"
      ],
      "tips": []
    },
    {
      "id": "by_problem",
      "if": {},
      "litter": "BY_PROBLEM",
      "why": [
        "BY_PROBLEM"
      ],
      "tips": []
    }
  ],
  "problem_litter": {
    "smell": "tofu",
    "dust_human": "tofu",
    "cat_sensitive": "cassava",
    "clumps": "cassava",
    "tracking": "tofu",
    "picky": "cassava"
  },
  "problem_why": {
    "smell": "why_smell",
    "dust_human": "why_dust_human",
    "cat_sensitive": "why_cat_sensitive",
    "clumps": "why_clumps",
    "tracking": "why_tracking",
    "picky": "why_picky"
  },
  "problem_tips_same_litter": {
    "smell": [
      "tip_unscented_option"
    ],
    "dust_human": [],
    "cat_sensitive": [],
    "clumps": [],
    "tracking": [
      "tip_tracking"
    ],
    "picky": [
      "tip_scented_option"
    ]
  },
  "problem_tips_other_litter": {
    "smell": [
      "alt_smell"
    ],
    "dust_human": [
      "alt_dust_human"
    ],
    "cat_sensitive": [
      "alt_cat_sensitive"
    ],
    "clumps": [
      "alt_clumps"
    ],
    "tracking": [
      "tip_tracking"
    ],
    "picky": [
      "alt_picky_keep"
    ]
  },
  "auto_box_generic_tip": "tip_auto_tested",
  "size_order_by_cats": {
    "1": [
      "2pk",
      "6bag",
      "12kg"
    ],
    "2": [
      "6bag",
      "12kg",
      "2pk"
    ],
    "3": [
      "6bag",
      "12kg"
    ],
    "4": [
      "6bag",
      "12kg"
    ]
  },
  "no_other_option_for_cats": [
    "4"
  ],
  "big_household_tip": {
    "cats": "4",
    "tip": "tip_5cats"
  },
  "first_fill": {
    "applies_if_q3_in": [
      "clay_never",
      "clay_tried",
      "crystal_other"
    ],
    "one_box": "2pk",
    "two_plus_boxes": "6bag",
    "fallback_order": [
      "2pk",
      "6bag",
      "12kg"
    ],
    "kg_per_box_label": {
      "tofu": 5,
      "cassava": 4
    },
    "auto_add": false
  },
  "trial_once": {
    "if": {
      "problem": "picky"
    },
    "size": "2pk"
  },
  "box_rule_tip": {
    "when": "numeric boxes < cats",
    "tip": "tip_boxes"
  },
  "in_stock_runtime": "Theme build (nl5): in_stock below is only a fallback. At runtime nl5-core.js overwrites it from Liquid-injected variant.available (window.NL5_PRODUCTS), then applies the section setting force_out_of_stock (e.g. tofu.green-tea.6bag) because Shopify reports oversold variants with continue-selling as available.",
  "prices_runtime": "Theme build (nl5): prices_cad below is only a fallback. At runtime prices come from variant.price; subscription prices from variant.selling_plan_allocations when a subscription app is installed, else price x (1 - sub_discount).",
  "tiers_runtime": "Theme build (nl5): when the product has selling plans, tier_availability is rebuilt from the real plans (plan name/option parsed to days -> nearest tier key) and weekly_tiers_added_everywhere is ignored; when there are no selling plans the table below + section setting has_weekly_plans is used for display only.",
  "bags": {
    "note": "B buy box (Jing 10/9: 阶梯用推荐版). Sold as single 2.4 kg bags: the visitor picks how many cats, we recommend how many bags and how often (table below). Every bag count is its own variant (1 / 2 / 3 / 6 bags; 6 bags ship as the factory 6-bag case). 4 and 5 bags are listed since Jing 10/12 (see decision_1012). Source: 2026-10-09-B版单包按猫数-成本定价与可行性.md section 4. Runtime: nl5-core.js NL5.prepBags / NL5.bagsPlan; only used when buybox_mode = bags-by-cats (or ?nl5_mode=bags). The size-cards buy box only ever shows 2pk / 6bag / 12kg (NL5.SIZE_KEYS), so the 1 / 3-bag sizes never reach it.",
    "bag_kg": 2.4,
    "sizes": {
      "1pk": {
        "kg": 2.4,
        "bags": 1
      },
      "3pk": {
        "kg": 7.2,
        "bags": 3
      },
      "4pk": {
        "kg": 9.6,
        "bags": 4
      },
      "5pk": {
        "kg": 12,
        "bags": 5
      }
    },
    "bag_count": {
      "1pk": 1,
      "2pk": 2,
      "3pk": 3,
      "4pk": 4,
      "5pk": 5,
      "6bag": 6,
      "12kg": 0
    },
    "options": [
      "1pk",
      "2pk",
      "3pk",
      "4pk",
      "5pk",
      "6bag",
      "12kg"
    ],
    "one_time_only": [
      "1pk"
    ],
    "one_time_only_note": "1 bag = one-time trial; subscriptions start at 2 bags (plans on a 1-bag variant are ignored).",
    "split_tier_from": {
      "1pk": "2pk"
    },
    "split_tier_note": "Jing 10/12: 7–12 bags = the 6-bag case × a + one r-bag variant (n = 6a + r). The 1-bag variant is one-time only on its own, but as the r = 1 part of a 7-bag order it rides the same subscription as the 6-bag line: without selling plans it uses the 2-bag tiers; with Supr plans the 1-bag variant must sit in the same plan group (the theme still never offers 1 bag alone on subscription).",
    "tier_availability": {
      "tofu": {
        "1pk": [],
        "3pk": [
          "2w",
          "1m",
          "2m"
        ],
        "4pk": [
          "2w",
          "1m",
          "2m"
        ],
        "5pk": [
          "2w",
          "1m",
          "2m"
        ]
      },
      "cassava": {
        "1pk": [],
        "3pk": [
          "2w",
          "1m",
          "2m"
        ],
        "4pk": [
          "2w",
          "1m",
          "2m"
        ],
        "5pk": [
          "2w",
          "1m",
          "2m"
        ]
      }
    },
    "tier_availability_note": "Only used while the products have no selling plans (same tiers as the 2-bag variant today). The weekly tiers 4w / 6w / 8w are not listed here: they reach every size (bags included) through weekly_tiers_added_everywhere while has_weekly_plans is on. With Supr plans the real plans decide (D-WEEK_6 / \"every 6 weeks\" → 6w).",
    "reco": {
      "1": {
        "size": "2pk",
        "freq": "1m"
      },
      "2": {
        "size": "3pk",
        "freq": "4w",
        "saver": {
          "size": "6bag",
          "freq": "8w"
        }
      },
      "3": {
        "size": "12kg",
        "freq": "4w"
      },
      "4": {
        "size": "6bag",
        "freq": "4w"
      }
    },
    "reco_note": "cats → bags + delivery. When the product has no plan at that frequency the nearest available tier (by days, ties → shorter, never over the 60-day limit) is used and the copy follows it. The saver option (2 cats) is only offered when its exact frequency exists. 3 cats → the 12 kg bag of the same litter / scent (cassava page → cassava 12 kg).",
    "fallback": {
      "1": [
        "3pk",
        "6bag",
        "12kg"
      ],
      "2": [
        "6bag",
        "2pk",
        "12kg"
      ],
      "3": [
        "6bag",
        "3pk"
      ],
      "4": [
        "12kg",
        "3pk"
      ]
    },
    "fallback_note": "recommended size out of stock → first in-stock size of this list; delivery then follows the usual kg rule (freqForKg).",
    "usage_line_note": "top line on the card: 1 bag = 2.4 kg · 2 bags ≈ 1 cat for a month (R8: competitors explain one unit = 1 cat for a month).",
    "lasts_note": "lasts range = kg ÷ monthly_kg_upper (low end, rounded down) … kg ÷ monthly_kg (high end, rounded down), in days (× days_per_month).",
    "per_cat_month_note": "per cat per month = price per delivery × days_per_month ÷ delivery days ÷ cats (one-time / 1 bag: days the amount lasts at monthly_kg).",
    "reference_prices_cad": {
      "tofu": {
        "1pk": 18.99,
        "2pk": 34.99,
        "3pk": 46.99,
        "4pk": 57.99,
        "5pk": 66.99,
        "6bag": 70.99,
        "12kg": 58.99
      },
      "cassava": {
        "1pk": 19.99,
        "2pk": 34.99,
        "3pk": 49.99,
        "4pk": 62.99,
        "5pk": 74.99,
        "6bag": 83.99,
        "12kg": 69.99
      }
    },
    "reference_prices_note": "One-time prices of scheme B (Jing 10/9). Shown prices always come from the variants; 4 / 5 bags are not listed (first phase: 1 / 2 / 3 / 6 bags + 12 kg). Sandbox prices = this table; the live store still needs Jing’s go for green tea 2 bags +$3 and cassava 2 bags +$1.",
    "max_oversupply_days": 10,
    "max_oversupply_note": "advisor A1 (10/9): in B an amount is one-time only when its delivery interval is more than this many days shorter than the days it lasts at the upper usage (1 cat + 6 bags or 12 kg, 1 cat + 3 bags, 2 cats + 12 kg). The recommended amounts are never affected.",
    "max_bags": 12,
    "max_bags_note": "Jing 10/12: the B card has a bag stepper (− N bags +), 1–12 bags, starting at the recommended amount. Above 12 → \"Need more?\" hint (12 kg bag or email). The 12 kg bag stays a separate option.",
    "decision_1012": "Jing 10/12 (listings/session-log 2026-10-12): \"B 版不管建议给的是哪个数量的包装，客户要可以自己加减数量。\" → bag stepper 1–12; 4 and 5 bags listed (NL-xx-4PK \"4 bags · 9.6 kg\" / NL-xx-5PK \"5 bags · 12 kg\", prices = reference_prices_cad, Jing 10/9 ladder); 7–12 bags = 6-bag case × a + r bags × 1, both lines with the same plan / properties + _bags_total = n and _bags_split = \"6×a+r\". DH: 4 / 5 bags ship as single bags packed together (no case), 7–12 bags = case(s) + single bags (two lines). An amount that lasts more than max_oversupply_days longer than its delivery interval is one-time only; 1 bag alone stays a one-time trial.",
    "decision_1012_6w": "Jing 10/12: add an every-6-weeks delivery tier (6w, 42 days) so that the subscribable bag counts are continuous when the visitor steps the amount (e.g. 2 cats 2–6 bags). Theme: tier 6w + weekly_tiers_added_everywhere; live store: Jing adds \"every 6 weeks\" in Supr inside the same subscription plan group (not done by the theme). max_oversupply_days / max_early_days unchanged."
  }
}
