The human UI and agents read the same product graph (scope §4).
catalog.json is the machine-readable export: stable IDs, canonical URLs,
explicit unavailability, deterministic variant grain. Agents may discover, resolve and
prepare a cart; purchase confirmation stays human. Every page also emits Schema.org
Product / ItemList / BreadcrumbList JSON-LD.
GET /catalog.json
grain design_family × product_type × device → variant (sku)
sku {design_id}--{product_type}--{device_id}
urls brand.html?b=… design.html?d=… product.html?id={sku}
truth a combination exists ⇔ it appears under designs[].offers[].variants[]
gaps offers[].unavailable == true is an explicit range gap — never guess
reasons recommendations are rules 1/2/3/5/6 from the scope, with text reasons
—