@instruments/materialgraph 0.26.0 → 0.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/association-types.d.ts +18 -7
  2. package/attribution-types.d.ts +2 -2
  3. package/brand-types.d.ts +8 -0
  4. package/brands-client.d.ts +5 -36
  5. package/brands-client.js +7 -33
  6. package/by-colour-types.d.ts +40 -13
  7. package/by-spec-types.d.ts +0 -67
  8. package/by-spec-types.js +7 -5
  9. package/catalog-discovery-types.d.ts +1 -16
  10. package/catalogue-client.d.ts +12 -31
  11. package/catalogue-client.js +10 -46
  12. package/catalogue-types.d.ts +40 -0
  13. package/categories-client.d.ts +63 -0
  14. package/categories-client.js +48 -0
  15. package/category-types.d.ts +114 -0
  16. package/client-config.d.ts +2 -4
  17. package/client-config.js +2 -4
  18. package/client-vocabulary.d.ts +2 -4
  19. package/client-vocabulary.js +11 -9
  20. package/client.d.ts +103 -203
  21. package/client.js +128 -251
  22. package/codes-types.d.ts +21 -0
  23. package/colours-client.d.ts +4 -9
  24. package/colours-client.js +0 -8
  25. package/errors.d.ts +1 -1
  26. package/errors.js +1 -0
  27. package/identify-types.d.ts +49 -39
  28. package/identify-types.js +5 -3
  29. package/index.d.ts +11 -21
  30. package/index.js +4 -4
  31. package/list-variant-facets-types.d.ts +60 -0
  32. package/list-variants-types.d.ts +149 -0
  33. package/list-variants-types.js +12 -0
  34. package/match-stream-types.d.ts +13 -0
  35. package/match-stream-types.js +2 -0
  36. package/match-stream.js +12 -8
  37. package/match-types.d.ts +24 -0
  38. package/material-asset-types.d.ts +69 -49
  39. package/material-block-types.d.ts +2 -0
  40. package/material-composition-client.d.ts +21 -0
  41. package/material-composition-client.js +13 -0
  42. package/material-composition-types.d.ts +403 -0
  43. package/material-query-plan-types.d.ts +57 -141
  44. package/material-resources-client.d.ts +9 -7
  45. package/material-resources-client.js +19 -4
  46. package/material-types.d.ts +6 -14
  47. package/operations.d.ts +1 -1
  48. package/operations.js +20 -117
  49. package/package.json +5 -1
  50. package/palette-search-types.d.ts +59 -24
  51. package/query-understanding-types.d.ts +27 -5
  52. package/resolve-client.d.ts +6 -10
  53. package/resolve-client.js +5 -7
  54. package/response-schemas.d.ts +20 -0
  55. package/response-schemas.generated.d.ts +5 -0
  56. package/response-schemas.generated.js +160 -0
  57. package/response-schemas.js +113 -0
  58. package/run-types.d.ts +12 -93
  59. package/runs.d.ts +1 -37
  60. package/runs.js +2 -79
  61. package/schema-resource-types.d.ts +14 -1
  62. package/search-card-types.d.ts +22 -0
  63. package/search-index-plan-types.d.ts +70 -0
  64. package/search-refinement-types.d.ts +8 -38
  65. package/search-refinement-types.js +1 -0
  66. package/search-request-types.d.ts +117 -200
  67. package/search-response-receipt-types.d.ts +12 -268
  68. package/search-result-validation.d.ts +0 -16
  69. package/search-result-validation.js +22 -180
  70. package/spec-facet-types.d.ts +3 -8
  71. package/spec-types.d.ts +17 -10
  72. package/spec-types.js +8 -7
  73. package/specifications.d.ts +13 -55
  74. package/specifications.js +29 -73
  75. package/suggest-types.d.ts +4 -10
  76. package/suggest-types.js +1 -1
  77. package/types.d.ts +135 -338
  78. package/webmcp.d.ts +1 -1
  79. package/webmcp.generated.js +10 -94
  80. package/brand-most-sampled-types.d.ts +0 -33
  81. package/browse-types.d.ts +0 -236
  82. package/client-browse.d.ts +0 -78
  83. package/client-browse.js +0 -71
  84. package/client-exploration.d.ts +0 -9
  85. package/client-exploration.js +0 -5
  86. package/compare-types.d.ts +0 -89
  87. package/composition-client.d.ts +0 -33
  88. package/composition-client.js +0 -28
  89. package/composition-types.d.ts +0 -455
  90. package/composition-types.js +0 -10
  91. package/correction-types.d.ts +0 -88
  92. package/exploration-types.d.ts +0 -118
  93. package/exploration-types.js +0 -1
  94. package/fan-deck-types.d.ts +0 -42
  95. package/fan-deck-types.js +0 -9
  96. package/match-rejection-types.d.ts +0 -43
  97. package/match-rejection-types.js +0 -7
  98. package/palette-completion-types.d.ts +0 -115
  99. package/palette-completion-types.js +0 -1
  100. package/render-assets-types.d.ts +0 -65
  101. package/render-assets-types.js +0 -1
  102. package/search-collapse-types.d.ts +0 -69
  103. package/search-collapse-types.js +0 -1
  104. package/search-mood-types.d.ts +0 -6
  105. package/search-mood-types.js +0 -1
  106. package/search-window-types.d.ts +0 -25
  107. package/search-window-types.js +0 -1
  108. package/slot-pool-types.d.ts +0 -372
  109. package/slot-pool-types.js +0 -1
  110. /package/{brand-most-sampled-types.js → category-types.js} +0 -0
  111. /package/{browse-types.js → list-variant-facets-types.js} +0 -0
  112. /package/{compare-types.js → material-composition-types.js} +0 -0
  113. /package/{correction-types.js → search-index-plan-types.js} +0 -0
@@ -0,0 +1,160 @@
1
+ // GENERATED by apps/web/scripts/generate-openapi-v1.ts. Do not edit.
2
+ // Run `pnpm --filter @materialgraph/web generate:openapi` to regenerate.
3
+ /** The API contract version the schemas were generated from. */
4
+ export const RESPONSE_SCHEMA_API_VERSION = "0.7.0";
5
+ /** Every SDK operation whose success response has a published JSON Schema. */
6
+ export const RESPONSE_SCHEMA_OPERATION_IDS = [
7
+ "samplize_colorvec_cache",
8
+ "samplize_catalogue_search",
9
+ "list_catalog_documents",
10
+ "list_catalog_pages",
11
+ "get_catalog_page_representation",
12
+ "list_catalog_product_references",
13
+ "search_materials_post",
14
+ "retrieval.identify",
15
+ "match_material",
16
+ "search_suggest",
17
+ "get_colour_stats",
18
+ "coordinate_materials",
19
+ "plan_material_query",
20
+ "samplize_catalogue_products",
21
+ "search_materials_get",
22
+ "search_by_colour",
23
+ "get_material",
24
+ "get_catalogue_references_batch",
25
+ "list_catalogue_channel_collections",
26
+ "get_catalogue_document_access",
27
+ "list_material_blocks",
28
+ "list_variant_assets",
29
+ "list_material_documents",
30
+ "get_composition_report",
31
+ "list_schema_blocks",
32
+ "list_schema_attributes",
33
+ "list_schema_verticals",
34
+ "list_schema_product_types",
35
+ "list_schema_units",
36
+ "list_schema_value_dictionaries",
37
+ "list_schema_source_requirements",
38
+ "list_schema_product_type_templates",
39
+ "list_schema_mappings",
40
+ "get_material_pairings",
41
+ "list_associated_finishes",
42
+ "list_associated_products",
43
+ "get_applicability",
44
+ "list_variants",
45
+ "list_variant_facets",
46
+ "get_category_colour_profiles",
47
+ "resolve_colour_name",
48
+ "suggest_colour_names",
49
+ "catalog_list_attributes",
50
+ "catalog_vocabulary_search",
51
+ "resolve_phrases",
52
+ "list_categories",
53
+ "get_category",
54
+ "get_product_type_status_coverage",
55
+ "whoami",
56
+ "get_material_demand",
57
+ "search_by_palette",
58
+ "extract_image_palette",
59
+ "search_by_gradient",
60
+ "list_spec_facets",
61
+ "list_brands",
62
+ "upload_source_material",
63
+ "get_source_material_batch",
64
+ "list_source_material_comments",
65
+ "post_source_material_comment",
66
+ "create_public_run",
67
+ "get_public_run",
68
+ "get_verdict_citation",
69
+ "get_demand_batch",
70
+ "resolveCodeAdvisory",
71
+ "list_code_context",
72
+ "list_code_requirements",
73
+ ];
74
+ export const RESPONSE_SCHEMA_CATALOGUE_JSON = [
75
+ "{\"definitions\":{\"ApplicabilityCollection\":{\"type\":\"object\",\"properties\":{\"direction\":{\"type\":\"string\",\"enum\":[\"forward\",\"reverse\"]},\"kind\":{\"type\":\"string\",\"const\":\"manufacturer_declared_applicability\"},\"requestedSubject\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"product\"}},\"required\":[\"id\",\"kind\"]},{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"variant\"}},\"required\":[\"id\",\"kind\"]}]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"coverage\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"countKind\":{\"type\":\"string\",\"enum\":[\"exact\",\"partial\"]},\"declaredCount\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},{\"type\":\"null\"}]},\"sourceAuthority\":{\"type\":\"string\",\"minLength\":1},\"sourceLocator\":{\"type\":\"string\",\"minLength\":1},\"sourceRevision\":{\"type\":\"string\",\"minLength\":1},\"state\":{\"type\":\"string\",\"enum\":[\"available\",\"partial\",\"none_declared\",\"not_ingested\",\"source_not_applicable\",\"unavailable\"]}},\"required\":[\"countKind\",\"declaredCount\",\"sourceAuthority\",\"sourceLocator\",\"sourceRevision\",\"state\"]},{\"type\":\"null\"}]},\"factRevisions\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}},\"facts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"declaringBrandId\":{\"type\":\"string\",\"minLength\":1},\"evidenceScope\":{\"type\":\"string\",\"const\":\"manufacturer_declared\"},\"finish\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"variant\"}},\"required\":[\"id\",\"kind\"]},\"id\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":21},\"lifecycle\":{\"type\":\"string\",\"enum\":[\"active\",\"tombstoned\"]},\"relation\":{\"type\":\"string\",\"const\":\"applicable_finish\"},\"source\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"string\",\"minLength\":1},\"locator\":{\"type\":\"string\",\"minLength\":1},\"revision\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"locator\",\"revision\"]},\"subject\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"product\"}},\"required\":[\"id\",\"kind\"]},{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"variant\"}},\"required\":[\"id\",\"kind\"]}]}},\"required\":[\"declaringBrandId\",\"evidenceScope\",\"finish\",\"id\",\"lifecycle\",\"relation\",\"source\",\"subject\"]}},\"scope\":{\"type\":\"object\",\"properties\":{\"sourceAuthority\":{\"type\":\"string\",\"minLength\":1},\"sourceLocator\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"sourceAuthority\",\"sourceLocator\"]},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"declaringBrandId\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"finishKind\":{\"type\":\"string\",\"enum\":[\"variant\",\"unknown\"]},\"finishLocator\":{\"type\":\"string\",\"minLength\":1},\"reason\":{\"type\":\"string\",\"enum\":[\"subject_unresolved\",\"finish_unresolved\",\"both_unresolved\",\"unsupported_subject_kind\"]},\"source\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"string\",\"minLength\":1},\"locator\":{\"type\":\"string\",\"minLength\":1},\"revision\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"locator\",\"revision\"]},\"subjectKind\":{\"type\":\"string\",\"enum\":[\"product\",\"variant\",\"unknown\"]},\"subjectLocator\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"declaringBrandId\",\"finishKind\",\"finishLocator\",\"reason\",\"source\",\"subjectKind\",\"subjectLocator\"]}}},\"required\":[\"coverage\",\"factRevisions\",\"facts\",\"scope\",\"unresolved\"]}}},\"required\":[\"direction\",\"kind\",\"requestedSubject\",\"sources\"]},\"BrandCatalogListPage\":{\"type\":\"object\",\"properties\":{\"corpusScope\":{\"type\":\"object\",\"properties\":{\"description\":{\"type\":\"string\",\"description\":\"What the scope admits, in one sentence, for a human reader.\"},\"scope\":{\"type\":\"string\",\"enum\":[\"all\",\"samplizeCatalogue\",\"materialBankOrderable\",\"materialBankNaOrderable\",\"materialBankNaAndCatalogue\",\"materialBankEuOrderable\",\"designShopOrderable\"],\"description\":\"Which corpus to list from. samplizeCatalogue admits published US paint colours regardless of stock. ABSENT (or 'all') means the WHOLE GR",
76
+ "APH — every brand MaterialGraph knows, orderable or not; absence is never a narrower default. Every scope narrows the BRANDS listed AND the corpus `productCount` / `variantCount` are counted over, both applied INSIDE the query: a page of `limit` fills with eligible brands rather than being shortened afterwards. 'materialBankNaOrderable', 'materialBankEuOrderable', 'materialBankNaAndCatalogue' and 'designShopOrderable' gate on governed CHANNEL membership. The token-specific receipt states whether that membership is a storefront or editorial inclusion; the union is not itself a transaction claim. 'materialBankOrderable' does not: it lists brands on record as carrying Material Bank presence, which is a provenance signal, and nearly every brand in the feed carries it. An unknown value is a 400 naming it, never a silent fall back to the whole graph.\"}},\"required\":[\"description\",\"scope\"],\"description\":\"The corpus this page AND its per-brand counts were drawn from. Present only when a narrowing scope applied — absence means the whole graph. Read it alongside `meta.total`: a short list under a scope is a small SCOPED corpus, not a truncated one.\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"homepageUrl\":{\"type\":[\"string\",\"null\"]},\"id\":{\"type\":\"string\"},\"materialBankPresence\":{\"description\":\"Whether this brand is ON RECORD as carrying Material Bank presence. `true` is the standing orderability tell — every brand holding it has Material Bank SKUs. `null` (or absent) means NOT ON RECORD, never false: the brand may still hold products, none of them orderable through Material Bank. `productCount` and `variantCount` are counted over the WHOLE catalogue unless `corpusScope` says otherwise, so a brand without this flag can still report thousands of variants.\",\"type\":[\"boolean\",\"null\"]},\"name\":{\"type\":\"string\"},\"primaryMarketSegment\":{\"type\":\"string\"},\"productCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"slug\":{\"type\":\"string\"},\"variantCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"homepageUrl\",\"id\",\"name\",\"primaryMarketSegment\",\"productCount\",\"slug\",\"variantCount\"]}},\"meta\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"hasMore\":{\"type\":\"boolean\"},\"limit\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":250},\"offset\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"total\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"count\",\"hasMore\",\"limit\",\"offset\",\"total\"]}},\"required\":[\"items\",\"meta\"]},\"ByColourResponse\":{\"type\":\"object\",\"properties\":{\"categoryGate\":{\"description\":\"Receipt for the category gate. Every live page carries it: the caller's `?category=`, or the surface-material default (`defaulted: true`). Unclassified variants are excluded because unknown category is not membership. ABSENT only on responses stored before the default existed.\",\"type\":\"object\",\"properties\":{\"defaulted\":{\"description\":\"Present when the caller named no category: a colour page then holds surface materials only (the `materials` product-type groups, listed in `requested`), so lights, taps and furniture do not answer a colour question. Send `?category=` to search other groups.\",\"type\":\"boolean\",\"const\":true},\"requested\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Category names or keys the caller asked the hard gate to keep.\"},\"requiresAcceptedPrimaryProductType\":{\"type\":\"boolean\",\"const\":true,\"description\":\"The gate admits a variant only through an accepted primary product type.\"},\"unclassifiedVariantsExcluded\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Variants without an accepted primary product type were ineligible, not proven to belong outside the requested category.\"}},\"required\":[\"requested\",\"requiresAcceptedPrimaryProductType\",\"unclassifiedVariantsExcluded\"]},\"collapse\":{\"description\":\"Receipt for the colour-identity collapse the old colour lane ran. ABSENT on live pages: the one search pages one row per product, so there is nothing to collapse. Kept so stored responses still p",
77
+ "arse.\",\"type\":\"object\",\"properties\":{\"considered\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Ranked rows the collapse examined — the retrieved pool for this page, never a corpus total.\"},\"droppedByIdentity\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Rows dropped because an earlier, better-ranked row had the same brand, product and dominant hex.\"},\"droppedBySharedImage\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Rows dropped because an earlier, better-ranked row resolved to the same stored photograph.\"}},\"required\":[\"considered\",\"droppedByIdentity\",\"droppedBySharedImage\"]},\"corpusScope\":{\"description\":\"The corpus this page was drawn from — present ONLY when the request narrowed it. ABSENT means the whole graph: every material MaterialGraph knows, orderable or not. Under a scope the `familyGate` and `collapse` pool counts describe the SCOPED corpus too, because the scope was applied inside retrieval rather than over the page it produced.\",\"type\":\"object\",\"properties\":{\"description\":{\"type\":\"string\",\"description\":\"What the scope admits, in one sentence, for a human reader.\"},\"scope\":{\"type\":\"string\",\"enum\":[\"all\",\"samplizeCatalogue\",\"materialBankOrderable\",\"materialBankNaOrderable\",\"materialBankNaAndCatalogue\",\"materialBankEuOrderable\",\"designShopOrderable\"],\"description\":\"Which corpus to answer from. samplizeCatalogue admits published US paint colours regardless of stock. ABSENT (or 'all') means the WHOLE GRAPH — every material MaterialGraph knows, orderable or not; absence is never a narrower default. Three transaction-oriented scopes gate on governed CHANNEL membership: 'materialBankNaOrderable' (Material Bank North America, ~277,000 materials), 'materialBankEuOrderable' (Material Bank Europe, ~65,000) and 'designShopOrderable' (DesignShop, ~34,000, with the products DesignShop hides from browse excluded). 'materialBankNaAndCatalogue' is the one-query union of Material Bank North America and the governed Catalogue editorial discovery corpus; that union does not by itself claim every member is transactable. 'materialBankOrderable' is NOT one of them: it selects materials carrying a Material Bank identity, which is a provenance signal rather than a channel one, and it admits 98.4% of the graph — use it to exclude crawl-sourced brands, not to mean orderable. A scope answers membership in its named governed corpus, never suitability: scope on channel, then refine on sector. Every scope is applied INSIDE the query: `limit` fills with eligible rows and `counts` describe the scoped corpus, which post-filtering a page cannot give you. An unknown value is a 400 naming it, never a silent fall back to the whole graph.\"}},\"required\":[\"description\",\"scope\"]},\"count\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Number of matches returned.\"},\"familyGate\":{\"description\":\"Receipt for `?family=`: the family applied and the candidate counts behind it. ABSENT when no family filter was asked for. A page filtered to a family can be shorter than `limit` — the gate runs on a retrieved pool, and `considered`/`dropped` say how much of that pool it cost.\",\"type\":\"object\",\"properties\":{\"considered\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Candidates the gate examined — the retrieved pool for this page. A pool size, never a corpus total.\"},\"dropped\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Candidates the gate rejected: their dominant hex belongs to another family, or they carried no readable hex (unknown is not membership).\"},\"droppedOnPublishedHex\":{\"description\":\"Rows the gate rejected a SECOND time, after the page was hydrated with the brand's declared `colour_hex`. A paint's chip photograph and its published hex are different colours and colorscope can place them in different families, so the page is re-gated on the hex it actually reports. Present only when a family gate ran; a",
78
+ " shorter page is the honest answer. Absent means the hydration moved nothing across a family boundary.\",\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"family\":{\"type\":\"string\",\"description\":\"The colorscope taxonomy family id the gate kept (the `?family=` value, normalised).\"}},\"required\":[\"considered\",\"dropped\",\"family\"]},\"lane\":{\"description\":\"Which retrieval lane answered, and the colours it actually ran on. ALWAYS present on the live endpoint — a one-colour query is a containment question and a palette is a similarity question, and a consumer cannot tell which ran from the results alone. Optional only so responses captured before the lane split still parse.\",\"type\":\"object\",\"properties\":{\"droppedColours\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Colours removed from the query for carrying a proportion below the accent threshold. EMPTY is the normal case. Non-empty and the dropped colours are absent from retrieval entirely — they did not merely rank low.\"},\"effectiveColours\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The `#rrggbb` colours the search ACTUALLY ran on, after minor-proportion accents were dropped. Compare against `query.colours`: a difference means the search that ran is not the search that was asked for.\"},\"lane\":{\"type\":\"string\",\"enum\":[\"index\",\"containment\",\"palette\"],\"description\":\"Which retrieval lane answered. `index` = the one search's colour key: materials in the query colour's family on the search index, nearest first by OKLab distance from each material's own colour; every live page says `index`. `containment` = materials holding a swatch within an OKLab ball of the query colour, ranked by their nearest swatch. `palette` = nearest palettes by colorscope embedding, ranked by cosine. The two rank on DIFFERENT geometries, so a match's `distance` means a different thing in each and is not comparable across them. READ `colourDistance`/`proximity` WITH CARE ON THE CONTAINMENT LANE: those describe the distance from your colour to the hex the card REPORTS — the material's dominant or declared colour — not to the swatch that matched. A textured material can hold your colour in a minor swatch and still report `proximity: \\\"unrelated\\\"` about its dominant one; the match is not wrong, the two fields answer different questions. The match's own `distance` is the matched swatch's.\"},\"order\":{\"type\":\"string\",\"enum\":[\"representative\",\"nearest\",\"similarity\"],\"description\":\"How the page was ordered. `similarity` = palette-embedding cosine (the palette lane). `nearest` = strictly closest swatch first. `representative` = the containment lane's default, which draws the page in the contained set's OWN proportions of solid and multi-swatch materials, nearest-first within each. Ordering containment by proximity alone returns a page of solids — measured 48/48 one-swatch for `#6D3D1E` — because a flat image's single swatch can land arbitrarily close to any colour while a textured material's scatter.\"},\"reason\":{\"type\":\"string\",\"description\":\"Why this lane, in one sentence — stated so the route is legible without reading the source.\"}},\"required\":[\"droppedColours\",\"effectiveColours\",\"lane\",\"order\",\"reason\"]},\"matches\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"closeness\":{\"type\":\"number\"},\"color\":{\"type\":[\"string\",\"null\"]},\"distance\":{\"type\":\"number\"},\"hex\":{\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"materialBankId\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":[\"string\",\"null\"]},\"productType\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]},\"category\":{\"description\":\"The match's primary product type (accepted classifications only), or null when unclassified.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"group\":{\"description\":\"Product-type GROUP display name (coarse), or null.\",\"type\":[\"string\",\"null\"]},\"type\":{\"description\":\"Primary product-TYPE display name (fine), or null.\",\"type\":[\"string\",\"null\"]}},\"required\":[",
79
+ "\"group\",\"type\"]},{\"type\":\"null\"}]},\"colourDistance\":{\"description\":\"OKLab distance from the QUERY colour to this match's reported `hex` — two single colours. NOT `distance`, which is the imagery ranking's geometry over whole palettes. They disagree: a match ranked 4th by imagery was the closest by hex. ABSENT when the match has no hex or the query was a palette.\",\"type\":\"number\"},\"hueCompatible\":{\"description\":\"Whether this match's reported `hex` has a hue compatible with the query colour, by colorscope's `isHueCompatible` at its default thresholds. A flag, never a gate: the page and its order are the same with or without it. ABSENT when the match has no hex or the query was a palette.\",\"type\":\"boolean\"},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"oklab\":{\"description\":\"OKLab of the match hex, or null when the match carried no hex.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"]},{\"type\":\"null\"}]},\"palette\":{\"description\":\"The match's own image palette — the FULL stored palette, uncapped and in stored order, each swatch with proportion, stored name and OKLab. A one-swatch palette means the extractor found one colour (solid-colour materials are genuinely monochrome), not that the list was trimmed. ABSENT when no palette is on record for the match: absent means unknown, not 'this material has no colours'.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` of the swatch, as extracted from the product image.\"},\"name\":{\"description\":\"Stored human colour name for the swatch, or null when none was extracted.\",\"type\":[\"string\",\"null\"]},\"oklab\":{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"],\"description\":\"OKLab of this swatch's `hex`, derived so clients need not re-derive it.\"},\"proportion\":{\"type\":\"number\",\"description\":\"The swatch's share of the analysed image, in [0,1].\"}},\"required\":[\"hex\",\"name\",\"oklab\",\"proportion\"]}},\"proximity\":{\"description\":\"`colourDistance` as a named band, so nobody thresholds a float. Not a confidence and not a percentage. `very-near` is Colorscope's closest perceptual band; `very-close` still covers differences a client would reject in a paint order. Read `sourceBasis` before quoting any of it as a specification. ABSENT exactly when `colourDistance` is.\",\"type\":\"string\",\"enum\":[\"very-near\",\"very-close\",\"close\",\"related\",\"unrelated\"]},\"sourceBasis\":{\"description\":\"Where `hex` came from. `declared` means the MANUFACTURER published this hex (their own colour system, as ingested) — a stated colour specification. `derived` means it was extracted from product imagery — a visual likeness, never a stated spec. Per MATCH, not per response: a paint carrying a published hex reports `declared` beside a photographed textile reporting `derived`. ABSENT only when `hex` is null (no colour to state a basis for) or on a response captured before this field existed. Note `distance`/`closeness` always describe the IMAGERY ranking, whatever the basis of `hex`.\",\"type\":\"string\",\"enum\":[\"declared\",\"derived\"]}},\"required\":[\"brand\",\"closeness\",\"color\",\"distance\",\"hex\",\"imageUrl\",\"product\",\"variantId\",\"variantName\",\"category\",\"oklab\"]},\"description\":\"Colour matches, nearest palette first.\"},\"proximityGate\":{\"description\":\"Receipt for `?maxColourDistance=`. ABSENT when no proximity threshold was requested.\",\"type\":\"object\",\"properties\":{\"considered\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"dropped\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"maxColourDistance\":{\"type\":\"number\",\"minimum\":0}},\"required\":[\"considered\",\"dropped\",\"maxColourDistance\"]},\"query\":{\"type\":\"object\",\"properties\":{\"brands\":{\"description\":\"Echoed brand scope as resolved SLUGS, present only when one was applied — the slugs are the answer to 'which brand did that name resolve to'.",
80
+ " ABSENT means every brand.\",\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"categories\":{\"description\":\"Echoed category filter, present only when one was applied.\",\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"colours\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The normalised `#rrggbb` palette the search ran against.\"},\"family\":{\"description\":\"Echoed colour-family filter (normalised), present only when one was applied.\",\"type\":\"string\"},\"maxColourDistance\":{\"type\":\"number\",\"minimum\":0},\"oklab\":{\"description\":\"Echoed OKLab triple, present only when one was provided.\",\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"]},\"order\":{\"type\":\"string\",\"enum\":[\"representative\",\"nearest\"]},\"q\":{\"type\":\"string\"}},\"required\":[\"colours\"],\"description\":\"Echo of the resolved query input.\"},\"understanding\":{\"type\":\"object\",\"properties\":{\"ambiguity\":{\"type\":\"object\",\"properties\":{\"changedArm\":{\"type\":\"boolean\"},\"confidence\":{\"type\":[\"number\",\"null\"]},\"durationMs\":{\"type\":\"number\",\"minimum\":0},\"modelId\":{\"type\":[\"string\",\"null\"]},\"outcome\":{\"type\":\"string\",\"enum\":[\"applied\",\"abstained\",\"refused\",\"timeout\"]},\"productTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"providerRan\":{\"type\":\"boolean\"},\"refusalCode\":{\"type\":[\"string\",\"null\"]},\"routing\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"compound\",\"descriptive\"]},{\"type\":\"null\"}]},\"timeoutMs\":{\"type\":\"number\",\"exclusiveMinimum\":0},\"validation\":{\"type\":\"string\",\"enum\":[\"valid\",\"invalid\",\"not-run\"]}},\"required\":[\"changedArm\",\"confidence\",\"durationMs\",\"modelId\",\"outcome\",\"productTypeIds\",\"providerRan\",\"refusalCode\",\"routing\",\"timeoutMs\",\"validation\"]},\"arm\":{\"type\":\"object\",\"properties\":{\"arm\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"dense\",\"lexical\",\"colour\"]},{\"type\":\"null\"}]},\"decidedBy\":{\"type\":\"string\",\"enum\":[\"deterministic\",\"model\"]},\"outcome\":{\"type\":\"string\",\"enum\":[\"dense\",\"lexical\",\"colour\",\"browse\",\"criteria-only\",\"ambiguous\"]},\"productTypeGate\":{\"type\":\"string\",\"enum\":[\"hard\",\"constrain\",\"none\"]},\"productTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"reason\":{\"type\":\"string\",\"minLength\":1},\"reasonDetail\":{\"type\":\"string\",\"enum\":[\"derived-colour-veto\",\"typo-recovery\",\"literal-compound-without-type\"]},\"registryVersion\":{\"type\":\"string\",\"minLength\":1},\"residual\":{\"type\":\"object\",\"properties\":{\"comparisonFrame\":{\"type\":\"boolean\"},\"kind\":{\"type\":\"string\",\"enum\":[\"compound\",\"descriptive\",\"ambiguous\",\"empty\"]},\"resolvedRatio\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"resolvedTokens\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"tokens\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"unresolvedTokens\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"comparisonFrame\",\"kind\",\"resolvedRatio\",\"resolvedTokens\",\"tokens\",\"unresolvedTokens\"]}},\"required\":[\"arm\",\"decidedBy\",\"outcome\",\"productTypeGate\",\"productTypeIds\",\"reason\",\"registryVersion\",\"residual\"]},\"canonicalLexical\":{\"type\":\"object\",\"properties\":{\"matches\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"canonical\":{\"type\":\"string\"},\"coverage\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"original\":{\"type\":\"string\"},\"readings\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"aliasCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"authority\":{\"type\":\"string\",\"enum\":[\"taxonomy\",\"colorscope\"]},\"code\":{\"type\":\"string\"},\"collisionCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"colorResolution\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"confidence\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"resolved\"},\"others\":{\"maxItems\":4,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"pro",
81
+ "perties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]}},\"principal\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]},\"source\":{\"type\":\"string\",\"enum\":[\"name\",\"family\",\"composed\",\"hex\",\"reference\",\"semantic\"]}},\"required\":[\"confidence\",\"input\",\"kind\",\"others\",\"principal\",\"source\"]},{\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"unresolved\"},\"reason\":{\"type\":\"string\",\"enum\":[\"unknown-term\",\"ambiguous-modifier\",\"contradictory-modifiers\",\"unsupported-base\",\"empty-range\",\"unrepresentable-color\"]},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"input\",\"kind\",\"reason\",\"terms\"]}]},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"applied\",\"suppressed\",\"executable\",\"recognized-but-unexecutable\",\"declined\"],\"description\":\"MaterialGraph's execution verdict for this provider-owned reading. Taxonomy adapters report 'applied' only when their category or criterion contributed to this query; an adapter-known ambiguous or conflicting reading is 'suppressed'. 'recognized-but-unexecutable' means no current mapping can apply it.\"},\"familyId\":{\"type\":\"string\"},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"identity\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"enum\":[\"domain\",\"core-colour\",\"paint\"]},\"label\":{\"type\":\"string\"},\"level\":{\"type\":\"string\",\"enum\":[\"family\",\"tone-band\",\"branch\",\"concept\"]},\"libraryId\":{\"type\":\"string\"},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"introducedAt\":{\"type\":\"string\",\"minLength\":1},\"reviewedAt\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"introducedAt\",\"status\"]},\"matchForm\":{\"type\":\"string\",\"enum\":[\"name\",\"code\",\"authoritative-term\"]},\"matchTarget\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"hasSelection\":{\"type\":\"boolean\",\"const\":false},\"type\":{\"type\":\"string\",\"const\":\"none\"}},\"required\":[\"hasSelection\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"type\":{\"type\":\"string\",\"const\":\"oklab\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"range\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"numbe",
82
+ "r\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"representative\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"}},\"required\":[\"hex\"]},\"type\":{\"type\":\"string\",\"const\":\"range\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"range\",\"representative\",\"type\"]}]},\"outcome\":{\"type\":\"string\",\"enum\":[\"equivalent\",\"ambiguous\",\"declined\"]},\"provenance\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"minLength\":1},\"snapshot\":{\"type\":\"string\",\"minLength\":1},\"source\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"basis\",\"source\"]},\"role\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"primary\",\"secondary\"]},{\"type\":\"null\"}]}},\"required\":[\"authority\",\"executionStatus\",\"identity\",\"outcome\",\"role\"]}},\"receipt\":{\"type\":\"object\",\"properties\":{\"authorities\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"string\",\"enum\":[\"taxonomy\",\"colorscope\"]},\"digest\":{\"type\":\"string\",\"minLength\":1},\"revision\":{\"type\":\"string\",\"minLength\":1},\"version\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"revision\",\"version\"]}},\"canonical\":{\"type\":\"string\"},\"original\":{\"type\":\"string\"},\"rule\":{\"type\":\"string\",\"enum\":[\"exact\",\"plural-to-singular\",\"typo-to-canonical\"]}},\"required\":[\"authorities\",\"canonical\",\"original\",\"rule\"]},\"rule\":{\"type\":\"string\",\"enum\":[\"exact\",\"plural-to-singular\",\"typo-to-canonical\"]},\"span\":{\"type\":\"object\",\"properties\":{\"end\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"start\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"end\",\"start\"]}},\"required\":[\"canonical\",\"coverage\",\"original\",\"readings\",\"receipt\",\"rule\",\"span\"]}},\"original\":{\"type\":\"string\"},\"outcome\":{\"type\":\"string\",\"enum\":[\"resolved\",\"ambiguous\",\"declined\",\"partial\",\"unresolved\"]},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"canonical\":{\"type\":\"string\"},\"coverage\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"original\":{\"type\":\"string\"},\"readings\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"aliasCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"authority\":{\"type\":\"string\",\"enum\":[\"taxonomy\",\"colorscope\"]},\"code\":{\"type\":\"string\"},\"collisionCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"colorResolution\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"confidence\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"resolved\"},\"others\":{\"maxItems\":4,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]}},\"principal\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":",
83
+ "\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]},\"source\":{\"type\":\"string\",\"enum\":[\"name\",\"family\",\"composed\",\"hex\",\"reference\",\"semantic\"]}},\"required\":[\"confidence\",\"input\",\"kind\",\"others\",\"principal\",\"source\"]},{\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"unresolved\"},\"reason\":{\"type\":\"string\",\"enum\":[\"unknown-term\",\"ambiguous-modifier\",\"contradictory-modifiers\",\"unsupported-base\",\"empty-range\",\"unrepresentable-color\"]},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"input\",\"kind\",\"reason\",\"terms\"]}]},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"applied\",\"suppressed\",\"executable\",\"recognized-but-unexecutable\",\"declined\"],\"description\":\"MaterialGraph's execution verdict for this provider-owned reading. Taxonomy adapters report 'applied' only when their category or criterion contributed to this query; an adapter-known ambiguous or conflicting reading is 'suppressed'. 'recognized-but-unexecutable' means no current mapping can apply it.\"},\"familyId\":{\"type\":\"string\"},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"identity\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"enum\":[\"domain\",\"core-colour\",\"paint\"]},\"label\":{\"type\":\"string\"},\"level\":{\"type\":\"string\",\"enum\":[\"family\",\"tone-band\",\"branch\",\"concept\"]},\"libraryId\":{\"type\":\"string\"},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"introducedAt\":{\"type\":\"string\",\"minLength\":1},\"reviewedAt\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"introducedAt\",\"status\"]},\"matchForm\":{\"type\":\"string\",\"enum\":[\"name\",\"code\",\"authoritative-term\"]},\"matchTarget\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"hasSelection\":{\"type\":\"boolean\",\"const\":false},\"type\":{\"type\":\"string\",\"const\":\"none\"}},\"required\":[\"hasSelection\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"type\":{\"type\":\"string\",\"const\":\"oklab\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"range\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"representative\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"}},\"required\":[\"hex\"]},\"type\":{\"type\":\"string\",\"const\":\"range\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"range\",\"rep",
84
+ "resentative\",\"type\"]}]},\"outcome\":{\"type\":\"string\",\"enum\":[\"equivalent\",\"ambiguous\",\"declined\"]},\"provenance\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"minLength\":1},\"snapshot\":{\"type\":\"string\",\"minLength\":1},\"source\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"basis\",\"source\"]},\"role\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"primary\",\"secondary\"]},{\"type\":\"null\"}]}},\"required\":[\"authority\",\"executionStatus\",\"identity\",\"outcome\",\"role\"]}},\"receipt\":{\"type\":\"object\",\"properties\":{\"authorities\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"string\",\"enum\":[\"taxonomy\",\"colorscope\"]},\"digest\":{\"type\":\"string\",\"minLength\":1},\"revision\":{\"type\":\"string\",\"minLength\":1},\"version\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"revision\",\"version\"]}},\"canonical\":{\"type\":\"string\"},\"original\":{\"type\":\"string\"},\"rule\":{\"type\":\"string\",\"enum\":[\"exact\",\"plural-to-singular\",\"typo-to-canonical\"]}},\"required\":[\"authorities\",\"canonical\",\"original\",\"rule\"]},\"rule\":{\"type\":\"string\",\"enum\":[\"exact\",\"plural-to-singular\",\"typo-to-canonical\"]},\"span\":{\"type\":\"object\",\"properties\":{\"end\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"start\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"end\",\"start\"]}},\"required\":[\"canonical\",\"coverage\",\"original\",\"readings\",\"receipt\",\"rule\",\"span\"]}}},\"required\":[\"matches\",\"original\",\"outcome\",\"unresolved\"]},\"categoryScope\":{\"type\":\"object\",\"properties\":{\"ceiling\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"mechanism\":{\"type\":\"string\",\"enum\":[\"sql-predicate\",\"provider-filter\",\"allowlist\",\"prune\"]},\"source\":{\"type\":\"string\",\"enum\":[\"caller\",\"anchor\"]},\"specScanBounded\":{\"type\":\"boolean\"},\"variantCount\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},{\"type\":\"null\"}]}},\"required\":[\"ceiling\",\"mechanism\",\"source\",\"variantCount\"],\"additionalProperties\":{}},\"criteria\":{\"type\":\"object\",\"properties\":{\"applied\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"criterion\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, e.g. \\\"primary_material\\\" or \\\"fire_rating\\\" — or the special id \\\"brand\\\", which filters on the brand RELATION (a join, carried by every variant) rather than on any attribute.\"},\"term\":{\"type\":\"string\",\"description\":\"Canonical term the attribute must equal, e.g. \\\"textile\\\". For \\\"brand\\\", a brand slug (\\\"kvadrat\\\") or display name (\\\"Kvadrat\\\"), case-insensitive — exactly the `value` a `brand` facet reports. An unrecognised brand is a 400 naming it, never an empty page.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"term\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, or the special id \\\"brand\\\" for the brand relation.\"},\"terms\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Canonical terms, ANY ONE of which satisfies the filter — this is how OR is expressed. OR lives inside one entry; separate `filters[]` entries AND together. Used for ordinal scales, where a stricter class satisfies a looser one, and for a multi-select rail — `{attributeId:\\\"brand\\\", terms:[\\\"kvadrat\\\",\\\"rubelli\\\"]}` returns materials from either brand.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"des",
85
+ "cription\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"terms\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"excludesTerm\":{\"type\":\"string\",\"minLength\":1},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}},\"whenUnstated\":{\"description\":\"What an UNKNOWN effective value does. \\\"drop\\\" (default) requires a known effective value — a variant that never states the attribute does not pass. \\\"pass\\\" admits it — a variant only fails by STATING the excluded term.\",\"type\":\"string\",\"enum\":[\"drop\",\"pass\"]}},\"required\":[\"attributeId\",\"excludesTerm\"]},{\"type\":\"object\",\"properties\":{\"asOf\":{\"description\":\"Reference date for EPD expiration, exclusive: the value must remain valid after this date.\",\"type\":\"string\",\"format\":\"date\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))$\"},\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id that must have an accepted value, e.g. \\\"sample_image_mm_per_px\\\".\"},\"hasValue\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Require any accepted value for this attribute.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"hasValue\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id holding a NUMBER, e.g. \\\"light_reflectance_value\\\" or \\\"lead_time_days\\\".\"},\"max\":{\"description\":\"Inclusive upper bound. Omit for a floor-only range.\",\"type\":\"number\"},\"min\":{\"description\":\"Inclusive lower bound. Omit for a ceiling-only range.\",\"type\":\"number\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\"]}]},\"lane\":{\"type\":\"string\",\"enum\":[\"filter\",\"preference\"]},\"lexicalSignal\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"minLength\":1},\"canonical\":{\"type\":\"string\",\"minLength\":1},\"identity\":{\"type\":\"string\",\"minLength\":1},\"original\":{\"type\":\"string\",\"minLength\":1},\"relation\":{\"type\":\"string\",\"enum\":[\"equivalent\",\"broader-storage-term\"]},\"span\":{\"type\":\"object\",\"properties\":{\"end\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"start\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"end\",\"start\"]},\"storedTerm\":{\"typ",
86
+ "e\":\"string\",\"minLength\":1}},\"required\":[\"attributeId\",\"canonical\",\"identity\",\"original\",\"relation\",\"span\",\"storedTerm\"]},\"source\":{\"type\":\"string\",\"enum\":[\"compiled\",\"taxonomy-adapter\"]},\"span\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"criterion\",\"lane\",\"source\",\"span\"]}},\"conflicts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"minLength\":1},\"caller\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, e.g. \\\"primary_material\\\" or \\\"fire_rating\\\" — or the special id \\\"brand\\\", which filters on the brand RELATION (a join, carried by every variant) rather than on any attribute.\"},\"term\":{\"type\":\"string\",\"description\":\"Canonical term the attribute must equal, e.g. \\\"textile\\\". For \\\"brand\\\", a brand slug (\\\"kvadrat\\\") or display name (\\\"Kvadrat\\\"), case-insensitive — exactly the `value` a `brand` facet reports. An unrecognised brand is a 400 naming it, never an empty page.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"term\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, or the special id \\\"brand\\\" for the brand relation.\"},\"terms\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Canonical terms, ANY ONE of which satisfies the filter — this is how OR is expressed. OR lives inside one entry; separate `filters[]` entries AND together. Used for ordinal scales, where a stricter class satisfies a looser one, and for a multi-select rail — `{attributeId:\\\"brand\\\", terms:[\\\"kvadrat\\\",\\\"rubelli\\\"]}` returns materials from either brand.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"terms\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"excludesTerm\":{\"type\":\"string\",\"minLength\":1},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}},\"whenUnstated\":{\"description\":\"What an UNKNOWN effective value does. \\\"drop\\\" (default) requires a known effective value — a variant that never states the attribute does not pass. \\\"pass\\\" admits it — a variant only fails by STATING the excluded term.\",\"type\":\"string\",\"enum\":[\"drop\",\"pass\"]}},\"required\":[\"attributeId\",\"excludesTerm\"]},{\"type\":\"object\",\"properties\":{\"asOf\":{\"description\":\"Reference date for EPD expiration, exclusive: the value must remain valid after this date.\",\"type\":\"string\",\"format\":\"date\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]",
87
+ "|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))$\"},\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id that must have an accepted value, e.g. \\\"sample_image_mm_per_px\\\".\"},\"hasValue\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Require any accepted value for this attribute.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"hasValue\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id holding a NUMBER, e.g. \\\"light_reflectance_value\\\" or \\\"lead_time_days\\\".\"},\"max\":{\"description\":\"Inclusive upper bound. Omit for a floor-only range.\",\"type\":\"number\"},\"min\":{\"description\":\"Inclusive lower bound. Omit for a ceiling-only range.\",\"type\":\"number\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\"]}]},\"compiled\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, e.g. \\\"primary_material\\\" or \\\"fire_rating\\\" — or the special id \\\"brand\\\", which filters on the brand RELATION (a join, carried by every variant) rather than on any attribute.\"},\"term\":{\"type\":\"string\",\"description\":\"Canonical term the attribute must equal, e.g. \\\"textile\\\". For \\\"brand\\\", a brand slug (\\\"kvadrat\\\") or display name (\\\"Kvadrat\\\"), case-insensitive — exactly the `value` a `brand` facet reports. An unrecognised brand is a 400 naming it, never an empty page.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"term\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, or the special id \\\"brand\\\" for the brand relation.\"},\"terms\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Canonical terms, ANY ONE of which satisfies the filter — this is how OR is expressed. OR lives inside one entry; separate `filters[]` entries AND together. Used for ordinal scales, where a stricter class satisfies a looser one, and for a multi-select rail — `{attributeId:\\\"brand\\\", terms:[\\\"kvadrat\\\",\\\"rubelli\\\"]}` returns materials from either brand.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require a",
88
+ "n EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"terms\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"excludesTerm\":{\"type\":\"string\",\"minLength\":1},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}},\"whenUnstated\":{\"description\":\"What an UNKNOWN effective value does. \\\"drop\\\" (default) requires a known effective value — a variant that never states the attribute does not pass. \\\"pass\\\" admits it — a variant only fails by STATING the excluded term.\",\"type\":\"string\",\"enum\":[\"drop\",\"pass\"]}},\"required\":[\"attributeId\",\"excludesTerm\"]},{\"type\":\"object\",\"properties\":{\"asOf\":{\"description\":\"Reference date for EPD expiration, exclusive: the value must remain valid after this date.\",\"type\":\"string\",\"format\":\"date\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))$\"},\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id that must have an accepted value, e.g. \\\"sample_image_mm_per_px\\\".\"},\"hasValue\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Require any accepted value for this attribute.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"hasValue\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id holding a NUMBER, e.g. \\\"light_reflectance_value\\\" or \\\"lead_time_days\\\".\"},\"max\":{\"description\":\"Inclusive upper bound. Omit for a floor-only range.\",\"type\":\"number\"},\"min\":{\"description\":\"Inclusive lower bound. Omit for a ceiling-only range.\",\"type\":\"number\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\"]}]},\"reason\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"attributeId\",\"caller\",\"compiled\",\"reason\"]}},\"exclusions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"criterion\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, e.g. \\\"primary_material\\\" or \\\"fire_rating\\\" — or the special id \\\"brand\\\", which filters on the brand RELATION (a join, carried by every variant) rather than on any attribute.\"},\"term\":{\"type\":\"string\",\"description\":\"Canonical term the attribute must equal, e.g. \\\"textile\\\". For \\\"brand\\\", a brand slug (\\\"kvadrat\\\") or display name (\\\"Kvadrat\\\"), case-insensitive — exactly the `value` a `brand` facet reports. An unrecogn",
89
+ "ised brand is a 400 naming it, never an empty page.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"term\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, or the special id \\\"brand\\\" for the brand relation.\"},\"terms\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Canonical terms, ANY ONE of which satisfies the filter — this is how OR is expressed. OR lives inside one entry; separate `filters[]` entries AND together. Used for ordinal scales, where a stricter class satisfies a looser one, and for a multi-select rail — `{attributeId:\\\"brand\\\", terms:[\\\"kvadrat\\\",\\\"rubelli\\\"]}` returns materials from either brand.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"terms\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"excludesTerm\":{\"type\":\"string\",\"minLength\":1},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}},\"whenUnstated\":{\"description\":\"What an UNKNOWN effective value does. \\\"drop\\\" (default) requires a known effective value — a variant that never states the attribute does not pass. \\\"pass\\\" admits it — a variant only fails by STATING the excluded term.\",\"type\":\"string\",\"enum\":[\"drop\",\"pass\"]}},\"required\":[\"attributeId\",\"excludesTerm\"]},{\"type\":\"object\",\"properties\":{\"asOf\":{\"description\":\"Reference date for EPD expiration, exclusive: the value must remain valid after this date.\",\"type\":\"string\",\"format\":\"date\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))$\"},\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id that must have an accepted value, e.g. \\\"sample_image_mm_per_px\\\".\"},\"hasValue\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Require any accepted value for this attribute.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"hasValue\"]},{\"ty",
90
+ "pe\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id holding a NUMBER, e.g. \\\"light_reflectance_value\\\" or \\\"lead_time_days\\\".\"},\"max\":{\"description\":\"Inclusive upper bound. Omit for a floor-only range.\",\"type\":\"number\"},\"min\":{\"description\":\"Inclusive lower bound. Omit for a ceiling-only range.\",\"type\":\"number\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\"]}]},\"execution\":{\"type\":\"string\",\"const\":\"blocked-positive-only-contract\"},\"lane\":{\"type\":\"string\",\"enum\":[\"hard\",\"soft\"]},\"missingValuePolicy\":{\"type\":\"string\",\"const\":\"retain-unknown\"},\"span\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"criterion\",\"execution\",\"lane\",\"missingValuePolicy\",\"span\"]}},\"preferences\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, e.g. \\\"primary_material\\\" or \\\"fire_rating\\\" — or the special id \\\"brand\\\", which filters on the brand RELATION (a join, carried by every variant) rather than on any attribute.\"},\"term\":{\"type\":\"string\",\"description\":\"Canonical term the attribute must equal, e.g. \\\"textile\\\". For \\\"brand\\\", a brand slug (\\\"kvadrat\\\") or display name (\\\"Kvadrat\\\"), case-insensitive — exactly the `value` a `brand` facet reports. An unrecognised brand is a 400 naming it, never an empty page.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"term\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id, or the special id \\\"brand\\\" for the brand relation.\"},\"terms\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Canonical terms, ANY ONE of which satisfies the filter — this is how OR is expressed. OR lives inside one entry; separate `filters[]` entries AND together. Used for ordinal scales, where a stricter class satisfies a looser one, and for a multi-select rail — `{attributeId:\\\"brand\\\", terms:[\\\"kvadrat\\\",\\\"rubelli\\\"]}` returns materials from either brand.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"terms\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"excludesTerm\":{\"type\":\"string\",\"minLength\":1},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the val",
91
+ "ue must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}},\"whenUnstated\":{\"description\":\"What an UNKNOWN effective value does. \\\"drop\\\" (default) requires a known effective value — a variant that never states the attribute does not pass. \\\"pass\\\" admits it — a variant only fails by STATING the excluded term.\",\"type\":\"string\",\"enum\":[\"drop\",\"pass\"]}},\"required\":[\"attributeId\",\"excludesTerm\"]},{\"type\":\"object\",\"properties\":{\"asOf\":{\"description\":\"Reference date for EPD expiration, exclusive: the value must remain valid after this date.\",\"type\":\"string\",\"format\":\"date\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))$\"},\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id that must have an accepted value, e.g. \\\"sample_image_mm_per_px\\\".\"},\"hasValue\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Require any accepted value for this attribute.\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\",\"hasValue\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id holding a NUMBER, e.g. \\\"light_reflectance_value\\\" or \\\"lead_time_days\\\".\"},\"max\":{\"description\":\"Inclusive upper bound. Omit for a floor-only range.\",\"type\":\"number\"},\"min\":{\"description\":\"Inclusive lower bound. Omit for a ceiling-only range.\",\"type\":\"number\"},\"trust\":{\"type\":\"object\",\"properties\":{\"meetsRequirement\":{\"description\":\"Require the value to clear the attribute's REGISTRY confidence floor. `minConfidence` wins; does NOT constrain basis; no requirement is met vacuously.\",\"type\":\"boolean\",\"const\":true},\"minConfidence\":{\"description\":\"Explicit confidence floor ∈ [0,1] the value must clear.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"sourceBasis\":{\"description\":\"Require an EXACT source basis (closed enum: catalog_feed, declared, derived).\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]}}}},\"required\":[\"attributeId\"]}]}},\"residualText\":{\"type\":[\"string\",\"null\"]},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"code\":{\"type\":\"string\",\"enum\":[\"missing-searchable-attribute\",\"missing-dimension-pair-contract\",\"missing-explicit-comparator\",\"negative-criterion-contract-blocked\",\"registry-contract-drift\",\"unsupported-numeric-format\",\"unsupported-unit\",\"unsupported-strict-comparator\"]},\"reason\":{\"type\":\"string\",\"minLength\":1},\"span\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"code\",\"reason\",\"span\"]}}},\"required\":[\"applied\",\"conflicts\",\"exclusions\",\"preferences\",\"residualText\",\"unresolved\"]},\"mode\":{\"type\":\"string\",\"enum\":[\"image\",\"colour\",\"text\",\"lexical\",\"entity-browse\",\"attribute\"]},\"normalisedQuery\":{\"type\":\"string\"},\"phraseReading\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"outcome\":{\"type\":\"string\",\"const\":\"skipped\"},\"reason\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"outcome\",\"reason\"]},{\"type\":\"object\",\"properties\":{\"calls\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"elapsedMs\":{\"type\":\"number\",\"minimum\":0},\"leftAsText\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"outcome\":{\"type\":\"string\",\"const\":\"read\"},\"reader\":{\"type\":\"string\",\"enum\":[\"jev\",\"second\"]},\"rows\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"applied\":{\"type\":\"boolean\"},\"attributeId\":{\"type\":\"str",
92
+ "ing\",\"minLength\":1},\"confidence\":{\"type\":\"number\"},\"kind\":{\"type\":\"string\",\"enum\":[\"want\",\"avoid\"]},\"values\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"applied\",\"attributeId\",\"confidence\",\"kind\",\"values\"]}}},\"required\":[\"calls\",\"elapsedMs\",\"leftAsText\",\"outcome\",\"reader\",\"rows\"]}]},\"productType\":{\"type\":\"object\",\"properties\":{\"candidates\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\",\"minLength\":1},\"productTypeId\":{\"type\":\"string\",\"minLength\":1},\"similarity\":{\"type\":\"number\"}},\"required\":[\"displayName\",\"productTypeId\",\"similarity\"]}},\"displayName\":{\"type\":[\"string\",\"null\"]},\"durationMs\":{\"type\":\"number\",\"minimum\":0},\"gate\":{\"type\":\"string\",\"enum\":[\"hard\",\"constrain\",\"none\"]},\"groupKey\":{\"type\":[\"string\",\"null\"]},\"kind\":{\"type\":\"string\",\"enum\":[\"leaf\",\"group\",\"vector\",\"ambiguous\",\"none\"]},\"margin\":{\"type\":[\"number\",\"null\"]},\"pass\":{\"type\":\"string\",\"enum\":[\"taxonomy\",\"synonym\",\"display-name\",\"group\",\"head-noun\",\"vector\",\"none\"]},\"productTypeId\":{\"type\":[\"string\",\"null\"]},\"productTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"reason\":{\"type\":\"string\",\"minLength\":1},\"registryVersion\":{\"type\":\"string\",\"minLength\":1},\"residualText\":{\"type\":\"string\"},\"similarity\":{\"type\":[\"number\",\"null\"]},\"vectorPassRan\":{\"type\":\"boolean\"}},\"required\":[\"candidates\",\"displayName\",\"durationMs\",\"gate\",\"groupKey\",\"kind\",\"margin\",\"pass\",\"productTypeId\",\"productTypeIds\",\"reason\",\"registryVersion\",\"residualText\",\"similarity\",\"vectorPassRan\"]},\"rawQuery\":{\"type\":\"string\"},\"residualText\":{\"type\":\"string\"},\"senses\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"confidence\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"effect\":{\"type\":\"string\",\"enum\":[\"restrict\",\"prioritize\",\"rerank\",\"offer\",\"none\"]},\"entity\":{\"type\":\"object\",\"properties\":{\"brandSlug\":{\"type\":\"string\"},\"hex\":{\"type\":\"string\"},\"materialBankId\":{\"type\":\"string\"},\"paintCode\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"productTypeId\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"}}},\"evidence\":{\"type\":\"object\",\"properties\":{\"matchedText\":{\"type\":\"string\",\"minLength\":1},\"source\":{\"type\":\"string\",\"minLength\":1},\"span\":{\"type\":\"object\",\"properties\":{\"end\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"start\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"end\",\"start\"]}},\"required\":[\"matchedText\",\"source\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"enum\":[\"brand\",\"product\",\"paint_identity\",\"category\",\"material\",\"colour\",\"attribute\",\"attribute_value\",\"certification\"]},\"label\":{\"type\":\"string\",\"minLength\":1},\"outcome\":{\"type\":\"string\",\"enum\":[\"applied\",\"ambiguous\",\"recognized\",\"refused\"]},\"reason\":{\"type\":\"string\"}},\"required\":[\"confidence\",\"effect\",\"evidence\",\"id\",\"kind\",\"label\",\"outcome\"]}},\"specAllowlist\":{\"type\":\"object\",\"properties\":{\"emptyMeansScarcity\":{\"type\":\"boolean\"},\"limit\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"outcome\":{\"type\":\"string\",\"enum\":[\"corpus-scarcity\",\"retrieval-miss\",\"unknown\"]},\"retrieved\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"returned\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"truncated\":{\"type\":\"boolean\"}},\"required\":[\"emptyMeansScarcity\",\"limit\",\"returned\",\"truncated\"]},\"status\":{\"type\":\"string\",\"enum\":[\"resolved\",\"ambiguous\",\"partial\",\"unresolved\"]},\"unsatisfiableNarrowing\":{\"type\":\"object\",\"properties\":{\"displayName\":{\"type\":\"string\",\"minLength\":1},\"evidence\":{\"type\":\"string\",\"enum\":[\"zero-accepted-variants\"]},\"gate\":{\"type\":\"string\",\"enum\":[\"hard\"]},\"narrowing\":{\"type\":\"string\",\"enum\":[\"product-type\"]},\"pass\":{\"type\":\"string\",\"minLength\":1},\"productTypeId\":{\"type\":\"string\",\"minLength\":1},\"productTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}},\"relaxedDisplayName\":{\"type\":\"string\",\"minLength\":1},\"relaxedProductTypeId\":{\"type\":\"string\",\"minLength\":1},\"relaxedProductTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}},\"relaxedTo\":{\"type\":\"string\",\"enum\":[\"head-noun\",\"none\"]}},\"required\":[\"displayName\",\"evidence\",\"gate\",\"narrowing\",\"pass\",",
93
+ "\"productTypeId\",\"productTypeIds\",\"relaxedTo\"]},\"version\":{\"type\":\"string\",\"const\":\"1\"}},\"required\":[\"mode\",\"normalisedQuery\",\"rawQuery\",\"residualText\",\"senses\",\"status\",\"version\"]}},\"required\":[\"count\",\"matches\",\"query\"]},\"CatalogDocumentList\":{\"type\":\"object\",\"properties\":{\"catalogs\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\",\"title\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"document\"},\"productStatus\":{\"type\":\"string\",\"enum\":[\"partial\",\"not_processed\"]},\"title\":{\"type\":\"string\",\"minLength\":1},\"availability\":{\"type\":\"string\",\"const\":\"available\"},\"document\":{\"type\":\"object\",\"properties\":{\"contentScope\":{\"type\":\"string\",\"enum\":[\"full_document\",\"cover_only\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"application/pdf\"},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"contentScope\",\"id\",\"mediaType\",\"pageCount\"]},\"receipt\":{\"type\":\"object\",\"properties\":{\"extraction\":{\"type\":\"object\",\"properties\":{\"references\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"status\":{\"type\":\"string\",\"enum\":[\"partial\",\"not_processed\"]}},\"required\":[\"references\",\"status\"]},\"failures\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1},\"stage\":{\"type\":\"string\",\"enum\":[\"source\",\"render\",\"extraction\"]}},\"required\":[\"count\",\"reason\",\"stage\"]}},\"pages\":{\"type\":\"object\",\"properties\":{\"documentPositionBase\":{\"type\":\"number\",\"const\":1},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"documentPositionBase\",\"pageCount\"]},\"render\":{\"type\":\"object\",\"properties\":{\"failedPages\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\",\"reason\"]}},\"renderedPages\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\",\"not_recorded\"]}},\"required\":[\"failedPages\",\"renderedPages\",\"status\"]},\"source\":{\"type\":\"object\",\"properties\":{\"checksum\":{\"type\":\"object\",\"properties\":{\"algorithm\":{\"type\":\"string\",\"const\":\"sha256\"},\"value\":{\"type\":\"string\",\"pattern\":\"^[a-f0-9]{64}$\"}},\"required\":[\"algorithm\",\"value\"]},\"retainedUrl\":{\"type\":\"string\",\"format\":\"uri\"},\"sourceBasis\":{\"type\":\"string\",\"const\":\"brand_supplied\"},\"status\":{\"type\":\"string\",\"const\":\"retained\"}},\"required\":[\"checksum\",\"retainedUrl\",\"sourceBasis\",\"status\"]}},\"required\":[\"extraction\",\"failures\",\"pages\",\"render\",\"source\"]}},\"required\":[\"brand\",\"edition\",\"id\",\"kind\",\"productStatus\",\"title\",\"availability\",\"document\",\"receipt\"]},{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\",\"title\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"document\"},\"productStatus\":{\"type\":\"string\",\"const\":\"not_processed\"},\"title\":{\"type\":\"string\",\"minLength\":1},\"availability\":{\"type\":\"string\",\"const\":\"source_unavailable\"},\"document\":{\"type\":\"null\"},\"receipt\":{\"type\":\"object\",\"properties\":{\"extraction\":{\"type\":\"object\",\"properties\":{\"references\":{\"type\":\"number\",\"const\":0},\"status\":{\"type\":\"string\",\"const\":\"blocked_source_unavailable\"}},\"required\":[\"references\",\"status\"]},\"failures\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"exclusiveMinimum\":0",
94
+ ",\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1},\"stage\":{\"type\":\"string\",\"enum\":[\"source\",\"render\",\"extraction\"]}},\"required\":[\"count\",\"reason\",\"stage\"]}},\"pages\":{\"type\":\"object\",\"properties\":{\"documentPositionBase\":{\"type\":\"number\",\"const\":1},\"pageCount\":{\"type\":\"null\"}},\"required\":[\"documentPositionBase\",\"pageCount\"]},\"render\":{\"type\":\"object\",\"properties\":{\"failedPages\":{\"minItems\":0,\"maxItems\":0,\"type\":\"array\",\"items\":{\"not\":{}}},\"renderedPages\":{\"type\":\"number\",\"const\":0},\"status\":{\"type\":\"string\",\"const\":\"blocked_source_unavailable\"}},\"required\":[\"failedPages\",\"renderedPages\",\"status\"]},\"source\":{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"const\":\"retained_source_not_found\"},\"status\":{\"type\":\"string\",\"const\":\"unavailable\"}},\"required\":[\"reason\",\"status\"]}},\"required\":[\"extraction\",\"failures\",\"pages\",\"render\",\"source\"]}},\"required\":[\"brand\",\"edition\",\"id\",\"kind\",\"productStatus\",\"title\",\"availability\",\"document\",\"receipt\"]}]}},\"source\":{\"type\":\"string\",\"const\":\"verified-source-material-registry\"}},\"required\":[\"catalogs\",\"source\"]},\"CatalogPageListResult\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"catalog\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\",\"title\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"document\"},\"productStatus\":{\"type\":\"string\",\"enum\":[\"partial\",\"not_processed\"]},\"title\":{\"type\":\"string\",\"minLength\":1},\"availability\":{\"type\":\"string\",\"const\":\"available\"},\"document\":{\"type\":\"object\",\"properties\":{\"contentScope\":{\"type\":\"string\",\"enum\":[\"full_document\",\"cover_only\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"application/pdf\"},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"contentScope\",\"id\",\"mediaType\",\"pageCount\"]},\"receipt\":{\"type\":\"object\",\"properties\":{\"extraction\":{\"type\":\"object\",\"properties\":{\"references\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"status\":{\"type\":\"string\",\"enum\":[\"partial\",\"not_processed\"]}},\"required\":[\"references\",\"status\"]},\"failures\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1},\"stage\":{\"type\":\"string\",\"enum\":[\"source\",\"render\",\"extraction\"]}},\"required\":[\"count\",\"reason\",\"stage\"]}},\"pages\":{\"type\":\"object\",\"properties\":{\"documentPositionBase\":{\"type\":\"number\",\"const\":1},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"documentPositionBase\",\"pageCount\"]},\"render\":{\"type\":\"object\",\"properties\":{\"failedPages\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\",\"reason\"]}},\"renderedPages\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\",\"not_recorded\"]}},\"required\":[\"failedPages\",\"renderedPages\",\"status\"]},\"source\":{\"type\":\"object\",\"properties\":{\"checksum\":{\"type\":\"object\",\"properties\":{\"algorithm\":{\"type\":\"string\",\"const\":\"sha256\"},\"value\":{\"type\":\"string\",\"pattern\":\"^[a-f0-9]{64}$\"}},\"required\":[\"algorithm\",\"value\"]},\"retainedUrl\":{\"type\":\"string\",\"format\":\"uri\"},\"sourceBasis\":{\"type\":\"string\",\"const\":\"brand_supplied\"},\"status\":{\"type\":\"string\",\"const\":\"retained\"}},\"required\":[\"checksum\",\"retainedUrl\",\"sourceBasis\",\"status\"]}},\"required\":[\"extraction\",\"failures\",\"pages\",\"render\",\"source\"]}},\"required\":[\"brand\",\"edition\",\"id\",\"kind\",\"productStatus\",\"title\",\"availability\",\"document\",\"receipt\"]},\"pages\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"catalogId\":{\"type\":\"string\",\"minLength\":1},\"documentId\"",
95
+ ":{\"type\":\"string\",\"minLength\":1},\"editionId\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"original\":{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"documentId\",\"documentPage\"]},\"page\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"printedPageLabel\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\"]},\"representation\":{\"type\":\"object\",\"properties\":{\"artifact\":{\"type\":\"object\",\"properties\":{\"bucket\":{\"type\":\"string\",\"const\":\"materialgraph\"},\"key\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"image/webp\"},\"url\":{\"type\":\"string\",\"format\":\"uri\"}},\"required\":[\"bucket\",\"key\",\"mediaType\",\"url\"]},\"status\":{\"type\":\"string\",\"const\":\"available\"}},\"required\":[\"artifact\",\"status\"]}},\"required\":[\"catalogId\",\"documentId\",\"editionId\",\"id\",\"original\",\"page\",\"representation\"]},{\"type\":\"object\",\"properties\":{\"catalogId\":{\"type\":\"string\",\"minLength\":1},\"documentId\":{\"type\":\"string\",\"minLength\":1},\"editionId\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"original\":{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"documentId\",\"documentPage\"]},\"page\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"printedPageLabel\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\"]},\"representation\":{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"const\":\"retained_representation_not_found\"},\"requiredArtifact\":{\"type\":\"object\",\"properties\":{\"mediaType\":{\"type\":\"string\",\"const\":\"image/webp\"},\"version\":{\"type\":\"string\",\"const\":\"catalogue-page-webp-v1\"}},\"required\":[\"mediaType\",\"version\"]},\"status\":{\"type\":\"string\",\"const\":\"unavailable\"}},\"required\":[\"reason\",\"requiredArtifact\",\"status\"]}},\"required\":[\"catalogId\",\"documentId\",\"editionId\",\"id\",\"original\",\"page\",\"representation\"]}]}},\"pagination\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"hasMore\":{\"type\":\"boolean\"},\"limit\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":100},\"offset\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"total\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"count\",\"hasMore\",\"limit\",\"offset\",\"total\"]},\"representationCoverage\":{\"type\":\"object\",\"properties\":{\"available\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"failuresByReason\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"const\":\"retained_representation_not_found\"}},\"required\":[\"count\",\"reason\"]}},\"total\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"unavailable\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"available\",\"failuresByReason\",\"total\",\"unavailable\"]},\"status\":{\"type\":\"string\",\"const\":\"available\"}},\"required\":[\"catalog\",\"pages\",\"pagination\",\"representationCoverage\",\"status\"]},{\"type\":\"object\",\"properties\":{\"catalog\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\",\"title\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"document\"},\"productStatus\":{\"type\":\"string\",\"const\":\"not_processed\"},\"title\":{\"type\":\"string\",\"minLength\":1},\"availability\":{\"type\":\"string\",\"const\":\"source_unavailable\"},\"document\":{\"type\":\"null\"},\"receipt\":{\"type\":\"object\",\"properties\":{\"extraction\":{\"type\":\"object\",\"properties\":{\"references\":{\"type\":\"number\",\"const\":0},\"status\":{\"type\":\"string\",\"const\":\"blocked_s",
96
+ "ource_unavailable\"}},\"required\":[\"references\",\"status\"]},\"failures\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1},\"stage\":{\"type\":\"string\",\"enum\":[\"source\",\"render\",\"extraction\"]}},\"required\":[\"count\",\"reason\",\"stage\"]}},\"pages\":{\"type\":\"object\",\"properties\":{\"documentPositionBase\":{\"type\":\"number\",\"const\":1},\"pageCount\":{\"type\":\"null\"}},\"required\":[\"documentPositionBase\",\"pageCount\"]},\"render\":{\"type\":\"object\",\"properties\":{\"failedPages\":{\"minItems\":0,\"maxItems\":0,\"type\":\"array\",\"items\":{\"not\":{}}},\"renderedPages\":{\"type\":\"number\",\"const\":0},\"status\":{\"type\":\"string\",\"const\":\"blocked_source_unavailable\"}},\"required\":[\"failedPages\",\"renderedPages\",\"status\"]},\"source\":{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"const\":\"retained_source_not_found\"},\"status\":{\"type\":\"string\",\"const\":\"unavailable\"}},\"required\":[\"reason\",\"status\"]}},\"required\":[\"extraction\",\"failures\",\"pages\",\"render\",\"source\"]}},\"required\":[\"brand\",\"edition\",\"id\",\"kind\",\"productStatus\",\"title\",\"availability\",\"document\",\"receipt\"]},\"reason\":{\"type\":\"string\",\"const\":\"retained_source_not_found\"},\"status\":{\"type\":\"string\",\"const\":\"source_unavailable\"}},\"required\":[\"catalog\",\"reason\",\"status\"]}]},\"CatalogProductReferenceReadResult\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"catalog\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\",\"title\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"document\"},\"productStatus\":{\"type\":\"string\",\"enum\":[\"partial\",\"not_processed\"]},\"title\":{\"type\":\"string\",\"minLength\":1},\"availability\":{\"type\":\"string\",\"const\":\"available\"},\"document\":{\"type\":\"object\",\"properties\":{\"contentScope\":{\"type\":\"string\",\"enum\":[\"full_document\",\"cover_only\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"application/pdf\"},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"contentScope\",\"id\",\"mediaType\",\"pageCount\"]},\"receipt\":{\"type\":\"object\",\"properties\":{\"extraction\":{\"type\":\"object\",\"properties\":{\"references\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"status\":{\"type\":\"string\",\"enum\":[\"partial\",\"not_processed\"]}},\"required\":[\"references\",\"status\"]},\"failures\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1},\"stage\":{\"type\":\"string\",\"enum\":[\"source\",\"render\",\"extraction\"]}},\"required\":[\"count\",\"reason\",\"stage\"]}},\"pages\":{\"type\":\"object\",\"properties\":{\"documentPositionBase\":{\"type\":\"number\",\"const\":1},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"documentPositionBase\",\"pageCount\"]},\"render\":{\"type\":\"object\",\"properties\":{\"failedPages\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\",\"reason\"]}},\"renderedPages\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\",\"not_recorded\"]}},\"required\":[\"failedPages\",\"renderedPages\",\"status\"]},\"source\":{\"type\":\"object\",\"properties\":{\"checksum\":{\"type\":\"object\",\"properties\":{\"algorithm\":{\"type\":\"string\",\"const\":\"sha256\"},\"value\":{\"type\":\"string\",\"pattern\":\"^[a-f0-9]{64}$\"}},\"required\":[\"algorithm\",\"value\"]},\"retainedUrl\":{\"type\":\"string\",\"format\":\"uri\"},\"sourceBasis\":{\"type\":\"string\",\"const\":\"brand_supplied\"},\"status\":{\"type\":\"string\",\"const\":\"retained\"}},\"required\":[\"checksum\",\"retainedUrl\",\"sourceBasis\",\"status\"]}},\"required\":[\"extraction\",\"failures\",\"pages\",\"rend",
97
+ "er\",\"source\"]}},\"required\":[\"brand\",\"edition\",\"id\",\"kind\",\"productStatus\",\"title\",\"availability\",\"document\",\"receipt\"]},\"coverage\":{\"type\":\"object\",\"properties\":{\"documentPages\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"withVerifiedReferences\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"total\",\"withVerifiedReferences\"]},\"pagesWithReferences\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"precision\":{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"const\":\"labelled_denominator_not_recorded\"},\"status\":{\"type\":\"string\",\"const\":\"not_measured\"}},\"required\":[\"reason\",\"status\"]},\"productCoverage\":{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"const\":\"source_product_denominator_not_recorded\"},\"status\":{\"type\":\"string\",\"const\":\"not_measured\"}},\"required\":[\"reason\",\"status\"]},\"references\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"unmatched\":{\"type\":\"object\",\"properties\":{\"reasons\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"const\":\"unmatched_source_products_not_recorded\"}},\"status\":{\"type\":\"string\",\"const\":\"not_measured\"}},\"required\":[\"reasons\",\"status\"]}},\"required\":[\"documentPages\",\"pagesWithReferences\",\"precision\",\"productCoverage\",\"references\",\"unmatched\"]},\"references\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"anchor\":{\"type\":\"object\",\"properties\":{\"coordinateSpace\":{\"type\":\"string\",\"const\":\"normalized_0_1000\"},\"height\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"width\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"x\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"y\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"kind\":{\"type\":\"string\",\"const\":\"printed_code\"}},\"required\":[\"coordinateSpace\",\"height\",\"width\",\"x\",\"y\",\"kind\"]},\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"catalogue\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"title\"]},\"document\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"application/pdf\"}},\"required\":[\"id\",\"mediaType\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\"]},\"isPrimary\":{\"type\":\"boolean\"},\"page\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"printedPageLabel\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\"]},\"productRegion\":{\"type\":\"object\",\"properties\":{\"coordinateSpace\":{\"type\":\"string\",\"const\":\"normalized_0_1000\"},\"height\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"width\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"x\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"y\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"kind\":{\"type\":\"string\",\"const\":\"product_region\"},\"review\":{\"type\":\"object\",\"properties\":{\"approvedBy\":{\"type\":\"string\",\"minLength\":1},\"confidence\":{\"type\":\"object\",\"properties\":{\"evidenceBasis\":{\"type\":\"string\",\"enum\":[\"human_visual_review\",\"model_assisted_visual_review\"]},\"level\":{\"type\":\"string\",\"const\":\"reviewed\"}},\"required\":[\"evidenceBasis\",\"level\"]},\"method\":{\"type\":\"string\",\"enum\":[\"human\",\"model_assisted\"]},\"model\":{\"type\":\"string\",\"minLength\":1},\"reviewedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"}},\"required\":[\"approvedBy\",\"confidence\",\"method\",\"reviewedAt\"]}},\"required\":[\"coordinateSpace\",\"height\",\"width",
98
+ "\",\"x\",\"y\",\"kind\",\"review\"]},\"source\":{\"type\":\"object\",\"properties\":{\"brandItemCode\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"brandItemCode\"]},\"status\":{\"type\":\"string\",\"const\":\"verified\"},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"anchor\",\"brand\",\"catalogue\",\"document\",\"edition\",\"isPrimary\",\"page\",\"source\",\"status\",\"variantId\"]}},\"source\":{\"type\":\"string\",\"const\":\"verified-source-material-registry\"},\"status\":{\"type\":\"string\",\"const\":\"available\"}},\"required\":[\"catalog\",\"coverage\",\"references\",\"source\",\"status\"]},{\"type\":\"object\",\"properties\":{\"catalog\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\",\"title\"]},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"document\"},\"productStatus\":{\"type\":\"string\",\"const\":\"not_processed\"},\"title\":{\"type\":\"string\",\"minLength\":1},\"availability\":{\"type\":\"string\",\"const\":\"source_unavailable\"},\"document\":{\"type\":\"null\"},\"receipt\":{\"type\":\"object\",\"properties\":{\"extraction\":{\"type\":\"object\",\"properties\":{\"references\":{\"type\":\"number\",\"const\":0},\"status\":{\"type\":\"string\",\"const\":\"blocked_source_unavailable\"}},\"required\":[\"references\",\"status\"]},\"failures\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"reason\":{\"type\":\"string\",\"minLength\":1},\"stage\":{\"type\":\"string\",\"enum\":[\"source\",\"render\",\"extraction\"]}},\"required\":[\"count\",\"reason\",\"stage\"]}},\"pages\":{\"type\":\"object\",\"properties\":{\"documentPositionBase\":{\"type\":\"number\",\"const\":1},\"pageCount\":{\"type\":\"null\"}},\"required\":[\"documentPositionBase\",\"pageCount\"]},\"render\":{\"type\":\"object\",\"properties\":{\"failedPages\":{\"minItems\":0,\"maxItems\":0,\"type\":\"array\",\"items\":{\"not\":{}}},\"renderedPages\":{\"type\":\"number\",\"const\":0},\"status\":{\"type\":\"string\",\"const\":\"blocked_source_unavailable\"}},\"required\":[\"failedPages\",\"renderedPages\",\"status\"]},\"source\":{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"const\":\"retained_source_not_found\"},\"status\":{\"type\":\"string\",\"const\":\"unavailable\"}},\"required\":[\"reason\",\"status\"]}},\"required\":[\"extraction\",\"failures\",\"pages\",\"render\",\"source\"]}},\"required\":[\"brand\",\"edition\",\"id\",\"kind\",\"productStatus\",\"title\",\"availability\",\"document\",\"receipt\"]},\"reason\":{\"type\":\"string\",\"const\":\"retained_source_not_found\"},\"status\":{\"type\":\"string\",\"const\":\"source_unavailable\"}},\"required\":[\"catalog\",\"reason\",\"status\"]}]},\"CatalogueChannelCollectionsResponse\":{\"type\":\"object\",\"properties\":{\"channel\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"const\":\"governed_variant_membership\"},\"token\":{\"type\":\"string\",\"const\":\"catalogue\"}},\"required\":[\"basis\",\"token\"]},\"collections\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"homepageUrl\":{\"type\":[\"string\",\"null\"]},\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"productCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"sampleProducts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\"},\"imageUrl\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"productName\":{\"type\":\"string\"},\"sourceImageUrl\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"assetId\",\"imageUrl\",\"productId\",\"productName\",\"sourceImageUrl\",\"variantId\",\"variantName\"]}},\"slug\":{\"type\":\"string\"},\"variantCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"homepageUrl\",\"id\",\"name\",\"productCount\",\"sampleProducts\",\"slug\",\"variantCount\"]}},\"counts\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"const\":\"exact_current_channel_membership\"}},\"required\":[\"basis\"]},\"pagination\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"hasMore\":{\"type\":\"boolean\"},\"limit\":{\"type\":\"integer\",\"minimum\":1,\"",
99
+ "maximum\":250},\"offset\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"total\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"count\",\"hasMore\",\"limit\",\"offset\",\"total\"]}},\"required\":[\"channel\",\"collections\",\"counts\",\"pagination\"]},\"CatalogueDocumentAccessResult\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"access\":{\"type\":\"object\",\"properties\":{\"byteRanges\":{\"type\":\"string\",\"enum\":[\"supported\",\"unknown\"]},\"contentType\":{\"type\":\"string\",\"const\":\"application/pdf\"},\"documentId\":{\"type\":\"string\",\"minLength\":1},\"originalUrl\":{\"type\":\"string\",\"format\":\"uri\"},\"readerUrl\":{\"type\":\"string\",\"format\":\"uri\"}},\"required\":[\"byteRanges\",\"contentType\",\"documentId\",\"originalUrl\",\"readerUrl\"]},\"documentId\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"const\":\"available\"}},\"required\":[\"access\",\"documentId\",\"status\"]},{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"const\":\"unresolved_document\"}},\"required\":[\"documentId\",\"status\"]},{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"const\":\"unavailable\"}},\"required\":[\"documentId\",\"status\"]},{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"const\":\"forbidden\"}},\"required\":[\"documentId\",\"status\"]},{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"const\":\"upstream_failure\"}},\"required\":[\"documentId\",\"status\"]}]},\"CataloguePageRepresentationReadResult\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"artifact\":{\"type\":\"object\",\"properties\":{\"bucket\":{\"type\":\"string\",\"const\":\"materialgraph\"},\"key\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"image/webp\"},\"url\":{\"type\":\"string\",\"format\":\"uri\"}},\"required\":[\"bucket\",\"key\",\"mediaType\",\"url\"]},\"page\":{\"type\":\"object\",\"properties\":{\"catalogId\":{\"type\":\"string\",\"minLength\":1},\"documentId\":{\"type\":\"string\",\"minLength\":1},\"editionId\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"original\":{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"documentId\",\"documentPage\"]},\"page\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"printedPageLabel\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\"]},\"representation\":{\"type\":\"object\",\"properties\":{\"artifact\":{\"type\":\"object\",\"properties\":{\"bucket\":{\"type\":\"string\",\"const\":\"materialgraph\"},\"key\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"image/webp\"},\"url\":{\"type\":\"string\",\"format\":\"uri\"}},\"required\":[\"bucket\",\"key\",\"mediaType\",\"url\"]},\"status\":{\"type\":\"string\",\"const\":\"available\"}},\"required\":[\"artifact\",\"status\"]}},\"required\":[\"catalogId\",\"documentId\",\"editionId\",\"id\",\"original\",\"page\",\"representation\"]},\"status\":{\"type\":\"string\",\"const\":\"available\"}},\"required\":[\"artifact\",\"page\",\"status\"]},{\"type\":\"object\",\"properties\":{\"page\":{\"type\":\"object\",\"properties\":{\"catalogId\":{\"type\":\"string\",\"minLength\":1},\"documentId\":{\"type\":\"string\",\"minLength\":1},\"editionId\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"original\":{\"type\":\"object\",\"properties\":{\"documentId\":{\"type\":\"string\",\"minLength\":1},\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"documentId\",\"documentPage\"]},\"page\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"printedPageLabel\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\"]},\"representation\":{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"const\":\"retained_representation_not_found\"},\"requiredArtifact\":{\"type\":\"object\",\"properties\":{\"mediaType\":{\"type\":\"string\",\"const\":\"image/webp\"},\"version\":{\"type\":\"string\",\"const\":\"catalogue-page-webp-v1\"}},\"required\":[\"mediaType\",\"version\"]},\"status\":{\"type\":\"string\",\"const\":\"unavaila",
100
+ "ble\"}},\"required\":[\"reason\",\"requiredArtifact\",\"status\"]}},\"required\":[\"catalogId\",\"documentId\",\"editionId\",\"id\",\"original\",\"page\",\"representation\"]},\"reason\":{\"type\":\"string\",\"const\":\"retained_representation_not_found\"},\"requiredArtifact\":{\"type\":\"object\",\"properties\":{\"mediaType\":{\"type\":\"string\",\"const\":\"image/webp\"},\"version\":{\"type\":\"string\",\"const\":\"catalogue-page-webp-v1\"}},\"required\":[\"mediaType\",\"version\"]},\"status\":{\"type\":\"string\",\"const\":\"unavailable\"}},\"required\":[\"page\",\"reason\",\"requiredArtifact\",\"status\"]},{\"type\":\"object\",\"properties\":{\"pageId\":{\"type\":\"string\",\"minLength\":1},\"status\":{\"type\":\"string\",\"const\":\"unresolved_page\"}},\"required\":[\"pageId\",\"status\"]}]},\"CatalogueReferenceBatchResponse\":{\"type\":\"object\",\"properties\":{\"coverage\":{\"type\":\"object\",\"properties\":{\"noVerifiedReference\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"requested\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"unavailable\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"unresolvedVariant\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"upstreamFailure\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"verified\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"noVerifiedReference\",\"requested\",\"unavailable\",\"unresolvedVariant\",\"upstreamFailure\",\"verified\"]},\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"reference\":{\"type\":\"object\",\"properties\":{\"anchor\":{\"type\":\"object\",\"properties\":{\"coordinateSpace\":{\"type\":\"string\",\"const\":\"normalized_0_1000\"},\"height\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"width\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"x\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"y\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"kind\":{\"type\":\"string\",\"const\":\"printed_code\"}},\"required\":[\"coordinateSpace\",\"height\",\"width\",\"x\",\"y\",\"kind\"]},\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"catalogue\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"title\"]},\"document\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"mediaType\":{\"type\":\"string\",\"const\":\"application/pdf\"}},\"required\":[\"id\",\"mediaType\"]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\"]},\"isPrimary\":{\"type\":\"boolean\"},\"page\":{\"type\":\"object\",\"properties\":{\"documentPage\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"pageCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"printedPageLabel\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"documentPage\"]},\"productRegion\":{\"type\":\"object\",\"properties\":{\"coordinateSpace\":{\"type\":\"string\",\"const\":\"normalized_0_1000\"},\"height\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"width\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":1000},\"x\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"y\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":999},\"kind\":{\"type\":\"string\",\"const\":\"product_region\"},\"review\":{\"type\":\"object\",\"properties\":{\"approvedBy\":{\"type\":\"string\",\"minLength\":1},\"confidence\":{\"type\":\"object\",\"properties\":{\"evidenceBasis\":{\"type\":\"string\",\"enum\":[\"human_visual_review\",\"model_assisted_visual_review\"]},\"level\":{\"type\":\"string\",\"const\":\"reviewed\"}},\"required\":[\"evidenceBasis\",\"level\"]},\"method\":{\"type\":\"string\",\"enum\":[\"human\",\"model_assisted\"]},\"model\":{\"type\":\"string\",\"minLength\":1},\"reviewedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"}}",
101
+ ",\"required\":[\"approvedBy\",\"confidence\",\"method\",\"reviewedAt\"]}},\"required\":[\"coordinateSpace\",\"height\",\"width\",\"x\",\"y\",\"kind\",\"review\"]},\"source\":{\"type\":\"object\",\"properties\":{\"brandItemCode\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"brandItemCode\"]},\"status\":{\"type\":\"string\",\"const\":\"verified\"},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"anchor\",\"brand\",\"catalogue\",\"document\",\"edition\",\"isPrimary\",\"page\",\"source\",\"status\",\"variantId\"]},\"status\":{\"type\":\"string\",\"const\":\"verified\"},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"reference\",\"status\",\"variantId\"]},{\"type\":\"object\",\"properties\":{\"publication\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\"]},\"catalogue\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"title\"]},\"documentId\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"edition\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\"]},\"referencedProductCount\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"brand\",\"catalogue\",\"documentId\",\"edition\"]},\"reason\":{\"type\":\"string\",\"enum\":[\"no_publication_on_record\",\"publication_source_unavailable\",\"publication_not_reviewed\",\"product_not_yet_referenced\"]},\"status\":{\"type\":\"string\",\"const\":\"no_verified_reference\"},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"reason\",\"status\",\"variantId\"]},{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"const\":\"unresolved_variant\"},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"status\",\"variantId\"]},{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"const\":\"unavailable\"},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"status\",\"variantId\"]},{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"const\":\"upstream_failure\"},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"status\",\"variantId\"]}]}}},\"required\":[\"coverage\",\"results\"]},\"CategoryColourProfilesResponse\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"object\",\"properties\":{\"refreshedAt\":{\"description\":\"When the view was last refreshed (ISO 8601), or null if it has not been refreshed since refresh-time tracking was added.\",\"type\":[\"string\",\"null\"]},\"variantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Total variants materialized in `mv_category_colour_profiles` across ALL categories — the size of the snapshot these profiles are computed from, not the size of the corpus.\"}},\"required\":[\"refreshedAt\",\"variantCount\"],\"description\":\"The snapshot these profiles were read from, so a caller can see it is reading a partial or stale view.\"},\"profiles\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"avgChroma\":{\"type\":\"number\",\"description\":\"Variant-weighted mean OKLab chroma across the category.\"},\"avgLightness\":{\"type\":\"number\",\"description\":\"Variant-weighted mean OKLab lightness across the category.\"},\"categoryKey\":{\"type\":\"string\",\"description\":\"The selected category's taxonomy key — a product type id, a group id under groupBy=group, or the sorted keys joined with \\\"+\\\" under groupBy=merged.\"},\"colours\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"The bucket's average OKLab rendered as an sRGB hex.\"},\"oklab\":{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"],\"description\":\"The bucket's average OKLab coordinates.\"},\"proportion\":{\"type\":\"number\",\"description\":\"This bucket's share of the selection's total coloured variants (0–1).\"},\"variantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Variants in this colour bucket across the selected categories.\"}},\"required\":[\"hex\",\"oklab\",\"proportion\",\"variantCount\"]},\"descriptio",
102
+ "n\":\"The category's representative colours, in the order the chosen `select` mode produced.\"},\"level\":{\"type\":\"string\",\"enum\":[\"group\",\"type\",\"merged\"],\"description\":\"Which taxonomy tier `categoryKey` names, or `merged` when it is a composite over a caller-defined key set.\"},\"members\":{\"description\":\"Under groupBy=merged, the caller's keys in composite-key order, so `categoryKey` never has to be split. Absent for single-category profiles.\",\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"name\":{\"type\":\"string\",\"description\":\"Display name of the category, from the taxonomy.\"},\"path\":{\"type\":\"string\",\"description\":\"Display-name path, \\\" / \\\" separated, e.g. \\\"Tile Surfaces / Ceramic and Porcelain Tile\\\". A merged profile joins its members' paths with \\\" + \\\".\"},\"variantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Total coloured variants behind this category in the materialized view.\"}},\"required\":[\"avgChroma\",\"avgLightness\",\"categoryKey\",\"colours\",\"level\",\"name\",\"path\",\"variantCount\"]},\"description\":\"One profile per requested category, in request order — or, under groupBy=merged, a single composite profile.\"}},\"required\":[\"basis\",\"profiles\"]},\"CoSpecifiedResult\":{\"type\":\"object\",\"properties\":{\"found\":{\"type\":\"boolean\"},\"resolution\":{\"type\":\"string\",\"enum\":[\"resolved\",\"ambiguous\",\"not_found\"],\"description\":\"Three-valued seed resolution; distinct from `found`.\"},\"query\":{\"type\":\"string\"},\"seed\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"description\":\"The variant's own true name (holds the paint colour name); null when unnamed.\",\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"color\",\"variantName\",\"imageUrl\",\"brandSlug\",\"productId\"]},{\"type\":\"null\"}]},\"seedCategory\":{\"type\":[\"string\",\"null\"]},\"seedAlternatives\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"description\":\"The variant's own true name (holds the paint colour name); null when unnamed.\",\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"color\",\"variantName\",\"imageUrl\",\"brandSlug\",\"productId\"]},\"description\":\"Best-per-other-brand seeds for the same colour name when steered to one brand.\"},\"candidates\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"description\":\"The variant's own true name (holds the paint colour name); null when unnamed.\",\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"color\",\"variantName\",\"imageUrl\",\"brandSlug\",\"productId\"]},\"description\":\"Best-per-brand candidates when `resolution === \\\"ambiguous\\\"`; empty otherwise.\"},\"window\":{\"type\":\"string\",\"const\":\"trailing_36mo\",\"description\":\"The demand window v1 serves (trailing 36 months).\"},\"companions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"description\":\"The variant's own true name (holds the paint colour name); null when unnamed.\",\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"category\":{\"description\":\"Coarse material category (product-type group), for filtering.\",\"type\":[\"string\",\"null\"]},\"projectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Distinct projects specifying both the seed and this.\"},\"customerCount\":{\"type\":\"integ",
103
+ "er\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"lift\":{\"type\":\"number\",\"description\":\"PMI-style co-specification lift.\"},\"liftLabel\":{\"type\":\"string\",\"description\":\"Human framing of `lift`, e.g. \\\"4.2× more than average\\\".\"},\"demand\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"specCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"projectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"momentum\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"enum\":[\"rising\",\"fading\",\"stable\",\"emerging\",\"insufficient_volume\"]},\"percentChange\":{\"description\":\"Null for `emerging` (no prior base) and `insufficient_volume` (no comparison).\",\"type\":[\"number\",\"null\"]},\"trailingSpecCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"priorSpecCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"state\",\"percentChange\",\"trailingSpecCount\",\"priorSpecCount\"]},{\"type\":\"null\"}]}},\"required\":[\"specCount\",\"projectCount\",\"momentum\"]},{\"type\":\"null\"}]},\"topProjectTypes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"projectType\":{\"type\":\"string\"},\"projectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"projectType\",\"projectCount\"]}}},\"required\":[\"variantId\",\"brand\",\"product\",\"color\",\"variantName\",\"imageUrl\",\"brandSlug\",\"productId\",\"category\",\"projectCount\",\"customerCount\",\"lift\",\"liftLabel\",\"demand\",\"topProjectTypes\"]}}},\"required\":[\"found\",\"resolution\",\"query\",\"seed\",\"seedCategory\",\"seedAlternatives\",\"candidates\",\"window\",\"companions\"]},\"CodeAdvisoryResponse\":{\"type\":\"object\",\"properties\":{\"caveat\":{\"type\":\"string\",\"const\":\"Advisory — model code as adopted, not a legal determination. Always verify with the authority having jurisdiction.\"},\"context\":{\"type\":\"object\",\"properties\":{\"occupancyGroup\":{\"type\":\"string\"},\"spaceType\":{\"type\":\"string\"},\"sprinklered\":{\"type\":\"boolean\"}},\"required\":[\"occupancyGroup\",\"spaceType\",\"sprinklered\"]},\"jurisdiction\":{\"type\":\"object\",\"properties\":{\"adoptionNote\":{\"type\":\"string\"},\"codeFamily\":{\"type\":\"string\"},\"edition\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"adoptionNote\",\"codeFamily\",\"edition\",\"id\",\"name\"]},\"resolvedContext\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"enum\":[\"explicit\",\"derived_from_room\"]},\"jurisdictionId\":{\"type\":\"string\"},\"occupancyGroup\":{\"type\":\"string\"},\"roomType\":{\"type\":[\"string\",\"null\"]},\"spaceType\":{\"type\":\"string\"},\"sprinklered\":{\"type\":\"boolean\"}},\"required\":[\"basis\",\"jurisdictionId\",\"occupancyGroup\",\"roomType\",\"spaceType\",\"sprinklered\"]},\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"material\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"applicationIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"basis\":{\"type\":\"string\",\"enum\":[\"product_type\",\"application\",\"both\",\"unresolved\"]},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]}},\"productTypeId\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"applicationIds\",\"basis\",\"dimensions\",\"productTypeId\"]},{\"type\":\"null\"}]},\"notApplicable\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"detail\":{\"type\":\"string\"},\"dimension\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]},\"reason\":{\"type\":\"string\",\"const\":\"not_a_material_dimension\"},\"requirementId\":{\"type\":\"string\"}},\"required\":[\"detail\",\"dimension\",\"reason\",\"requirementId\"]}},\"requirements\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"caveat\":{\"type\":\"string\",\"const\":\"Advisory — model code as adopted, not a legal determination. Always verify with the authority having jurisdiction.\"},\"dimension\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]},\"evidence\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"enum\":[\"fire_classifications\",\"slip_resistance_dcof\"]},\"confidence\":{\"type\":[\"number\",\"null\"]},\"sourceBasis\":{\"type\":[\"string\",\"null\"]},\"value\":{\"type\":\"string\"}},\"required\":[\"attributeId\",\"confidence\",\"sourceBasi",
104
+ "s\",\"value\"]},{\"type\":\"null\"}]},\"requirement\":{\"type\":\"object\",\"properties\":{\"minClass\":{\"type\":[\"string\",\"null\"]},\"numericFloor\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"metric\":{\"type\":\"string\"},\"unit\":{\"type\":\"string\"},\"value\":{\"type\":\"number\"}},\"required\":[\"metric\",\"unit\",\"value\"]},{\"type\":\"null\"}]},\"scale\":{\"type\":\"string\",\"enum\":[\"ansi_a326_3\",\"astm_e648\",\"astm_e84\",\"doc_ff1\",\"nfpa_701\"]}},\"required\":[\"minClass\",\"numericFloor\",\"scale\"]},\"requirementId\":{\"type\":\"string\"},\"section\":{\"type\":\"string\"},\"verdict\":{\"type\":\"string\",\"enum\":[\"meets\",\"shortfall\",\"unknown\"]}},\"required\":[\"caveat\",\"dimension\",\"evidence\",\"requirement\",\"requirementId\",\"section\",\"verdict\"]}},\"state\":{\"type\":\"string\",\"enum\":[\"evaluated\",\"unknown_variant\"]},\"summary\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"headline\":{\"type\":\"string\"},\"shortfallDimensions\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]}},\"status\":{\"type\":\"string\",\"enum\":[\"meets\",\"shortfall\",\"unverified\",\"not_applicable\"]},\"unverifiedDimensions\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]}}},\"required\":[\"headline\",\"shortfallDimensions\",\"status\",\"unverifiedDimensions\"]},{\"type\":\"null\"}]},\"variantId\":{\"type\":\"string\"}},\"required\":[\"material\",\"notApplicable\",\"requirements\",\"state\",\"summary\",\"variantId\"]}}},\"required\":[\"caveat\",\"context\",\"jurisdiction\",\"resolvedContext\",\"results\"]},\"CodeContextResponse\":{\"type\":\"object\",\"properties\":{\"caveat\":{\"type\":\"string\",\"const\":\"Advisory — model code as adopted, not a legal determination. Always verify with the authority having jurisdiction.\"},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"id\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]},\"label\":{\"type\":\"string\"}},\"required\":[\"attributeId\",\"description\",\"id\",\"label\"]}},\"finishLocations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"shortLabel\":{\"type\":\"string\"}},\"required\":[\"id\",\"label\",\"shortLabel\"]}},\"jurisdictions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"adoptionNote\":{\"type\":\"string\"},\"codeFamily\":{\"type\":\"string\"},\"coverage\":{\"type\":\"string\",\"enum\":[\"thorough\",\"model_baseline\"]},\"edition\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"adoptionNote\",\"codeFamily\",\"coverage\",\"edition\",\"id\",\"name\"]}},\"occupancyGroups\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"}},\"required\":[\"id\",\"label\"]}},\"roomCorrelations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"finishLocation\":{\"type\":[\"string\",\"null\"]},\"label\":{\"type\":\"string\"},\"occupancyGroup\":{\"type\":[\"string\",\"null\"]},\"roomType\":{\"type\":\"string\"}},\"required\":[\"finishLocation\",\"label\",\"occupancyGroup\",\"roomType\"]}},\"scales\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"classes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"detail\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"}},\"required\":[\"classes\",\"detail\",\"id\",\"label\"]}}},\"required\":[\"caveat\",\"dimensions\",\"finishLocations\",\"jurisdictions\",\"occupancyGroups\",\"roomCorrelations\",\"scales\"]},\"CodeRequirementsResponse\":{\"type\":\"object\",\"properties\":{\"caveat\":{\"type\":\"string\",\"const\":\"Advisory — model code as adopted, not a legal determination. Always verify with the authority having jurisdiction.\"},\"context\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"enum\":[\"explicit\",\"derived_from_room\"]},\"jurisdictionId\":{\"type\":\"string\"},\"occupancyGroup\":{\"type\":\"string\"},\"roomType\":{\"type\":[\"string\",\"null\"]},\"spaceType\":{\"type\":\"string\"},\"sprinklered\":{\"type\":\"boolean\"}},\"required\":[\"basis\",\"jurisdictionId\",\"occupancyGroup\",\"roomType\",\"spaceType\",\"sprinklered\"]},\"jurisdiction\":{\"type\":\"object\",\"properties\":{\"adoptionNote\":{\"type\":\"string\"},\"codeFamily\":{\"type\":\"string\"},\"coverage\":{\"type\":\"string\",\"enum\":[\"thorough\",\"model_baseline\"]},\"edition\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"",
105
+ "adoptionNote\",\"codeFamily\",\"coverage\",\"edition\",\"id\",\"name\"]},\"requirements\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"dimension\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]},\"label\":{\"type\":\"string\"},\"requirement\":{\"type\":\"object\",\"properties\":{\"minClass\":{\"type\":[\"string\",\"null\"]},\"numericFloor\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"metric\":{\"type\":\"string\"},\"unit\":{\"type\":\"string\"},\"value\":{\"type\":\"number\"}},\"required\":[\"metric\",\"unit\",\"value\"]},{\"type\":\"null\"}]},\"scale\":{\"type\":\"string\"}},\"required\":[\"minClass\",\"numericFloor\",\"scale\"]},\"requirementId\":{\"type\":\"string\"},\"section\":{\"type\":\"string\"}},\"required\":[\"attributeId\",\"dimension\",\"label\",\"requirement\",\"requirementId\",\"section\"]}},\"specFilter\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"numbers\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"field\":{\"type\":\"string\"},\"op\":{\"type\":\"string\",\"enum\":[\"eq\",\"gt\",\"gte\",\"lt\",\"lte\"]},\"value\":{\"type\":\"number\"}},\"required\":[\"field\",\"op\",\"value\"]}},\"presence\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"field\":{\"type\":\"string\"},\"op\":{\"type\":\"string\",\"enum\":[\"exists\",\"missing\"]}},\"required\":[\"field\",\"op\"]}},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"field\":{\"type\":\"string\"},\"op\":{\"type\":\"string\",\"enum\":[\"in\",\"all\",\"not_in\"]},\"values\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"field\",\"op\",\"values\"]}}}},{\"type\":\"null\"}]},\"specFilterApplied\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]}},\"specFilterUnexpressible\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"detail\":{\"type\":\"string\"},\"dimension\":{\"type\":\"string\",\"enum\":[\"fire\",\"floor\",\"slip\",\"decorative\"]},\"reason\":{\"type\":\"string\",\"enum\":[\"no_matchable_tokens\",\"unsupported_scale\",\"no_floor\"]},\"requirementId\":{\"type\":\"string\"}},\"required\":[\"detail\",\"dimension\",\"reason\",\"requirementId\"]}}},\"required\":[\"caveat\",\"context\",\"jurisdiction\",\"requirements\",\"specFilter\",\"specFilterApplied\",\"specFilterUnexpressible\"]},\"ColourStatsResponse\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"object\",\"properties\":{\"corpus\":{\"type\":\"string\",\"description\":\"Where the corpus totals came from, and how fresh they are.\"},\"families\":{\"type\":\"string\",\"description\":\"Where the family counts came from, and how fresh they are.\"},\"groups\":{\"type\":\"string\",\"description\":\"Where the group coverage came from, and how fresh it is.\"},\"groupsRefreshedAt\":{\"description\":\"When the per-category colour view was last refreshed (ISO 8601), or null if unknown.\",\"type\":[\"string\",\"null\"]},\"groupsVariantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Variants materialized in the per-category colour view. Compare against `corpus.withColour`: a large shortfall means the group section is a partial snapshot.\"},\"omissions\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Questions this endpoint deliberately does NOT answer, and why — never silently absent.\"},\"rows\":{\"description\":\"Where the `rows` matrix came from, how fresh it is, and what it excludes. Present only when `rows` is.\",\"type\":\"string\"}},\"required\":[\"corpus\",\"families\",\"groups\",\"groupsRefreshedAt\",\"groupsVariantCount\",\"omissions\"]},\"corpus\":{\"type\":\"object\",\"properties\":{\"coverage\":{\"type\":\"number\",\"description\":\"`withColour / variants`, 0–1 — the share of the corpus that can answer a colour question.\"},\"variants\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Total material variants in the graph.\"},\"withColour\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Variants carrying an extracted dominant colour (OKLab lightness present).\"}},\"required\":[\"coverage\",\"variants\",\"withColour\"]},\"families\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brands\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Distinct brands with a material in this family.\"},\"id\":{\"type\":\"string\",\"description\":\"The canonical `colour_family` term id.\"}",
106
+ ",\"label\":{\"type\":\"string\",\"description\":\"Human-readable family name.\"},\"variants\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Variants classified into this family.\"}},\"required\":[\"brands\",\"id\",\"label\",\"variants\"]},\"description\":\"Colour-family coverage, most-used first.\"},\"groups\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"key\":{\"type\":\"string\",\"description\":\"Product-type group key, as returned by `/api/v1/categories`.\"},\"name\":{\"type\":\"string\",\"description\":\"Display name of the group.\"},\"productTypes\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Leaf product types under this group with colour data.\"},\"variants\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Coloured variants under this group, per the per-category colour view.\"}},\"required\":[\"key\",\"name\",\"productTypes\",\"variants\"]},\"description\":\"Per product-type-group colour coverage, most-covered first.\"},\"rows\":{\"description\":\"The brand x category x colour-family matrix — one row per combination, each carrying `brandId`/`brandSlug` to join on. Present ONLY when `groupBy=brand,category` or a `brandId`/`brandSlug`/`categoryKey`/`family` scope was asked for; ABSENT means nobody asked, never that the matrix is empty. `families` above is NOT scoped by those parameters and stays platform-wide under all of them.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brandId\":{\"type\":\"string\",\"description\":\"Opaque brand id — the join key for `brands` reads.\"},\"brandName\":{\"type\":\"string\",\"description\":\"Brand display name.\"},\"brandSlug\":{\"type\":\"string\",\"description\":\"Brand slug, the stable public identifier used in routes.\"},\"categoryKey\":{\"description\":\"Product-type key, as `/api/v1/categories` issues them. NULL means the variants counted here carry NO accepted primary product type — a real population, not an error and not a residual bucket. Those rows are included so the matrix sums to the corpus; dropping them would make it quietly short.\",\"type\":[\"string\",\"null\"]},\"family\":{\"type\":\"string\",\"description\":\"Canonical `colour_family` term id.\"},\"variants\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Distinct variants at this (brand, category, family). Counts variants carrying an ACCEPTED `colour_family` value — not every variant of the brand, and not variants whose family is only proposed.\"}},\"required\":[\"brandId\",\"brandName\",\"brandSlug\",\"categoryKey\",\"family\",\"variants\"]}},\"rowsMatched\":{\"description\":\"Rows matching the query BEFORE the response cap — the honest total. Compare against `rows.length`: a shortfall means `rows` is a prefix, and `rowsTruncated` says so.\",\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"rowsTruncated\":{\"description\":\"TRUE when the matrix exceeded the response cap and `rows` is a prefix rather than the whole answer.\",\"type\":\"boolean\"}},\"required\":[\"basis\",\"corpus\",\"families\",\"groups\"]},\"CompositionCorpusSummary\":{\"type\":\"object\",\"properties\":{\"completeness\":{\"type\":\"object\",\"properties\":{\"authoringQueue\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"productTypeId\":{\"type\":\"string\"}},\"required\":[\"tuples\",\"liveSkus\",\"productTypeId\"]}},\"byProductType\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"productTypeId\":{\"type\":\"string\"},\"measured\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"tuples\",\"liveSkus\"]},\"failedClosed\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"tuples\",\"liveSkus\"]},\"empty\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":",
107
+ "0,\"maximum\":9007199254740991}},\"required\":[\"tuples\",\"liveSkus\"]},\"needs\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"unlocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"specify\",\"substitute\",\"compare\"]}},\"liveSkuShare\":{\"type\":[\"number\",\"null\"]},\"tupleShare\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"id\",\"label\",\"unlocks\",\"liveSkuShare\",\"tupleShare\"]}},\"complete\":{\"type\":\"object\",\"properties\":{\"liveSkuShare\":{\"type\":[\"number\",\"null\"]},\"tupleShare\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"liveSkuShare\",\"tupleShare\"]},\"unlocks\":{\"type\":\"object\",\"properties\":{\"compare\":{\"type\":[\"number\",\"null\"]},\"specify\":{\"type\":[\"number\",\"null\"]},\"substitute\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"compare\",\"specify\",\"substitute\"]},\"mostMissedNeed\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"id\",\"label\",\"liveSkus\"]},{\"type\":\"null\"}]}},\"required\":[\"productTypeId\",\"measured\",\"failedClosed\",\"empty\",\"needs\",\"complete\",\"unlocks\",\"mostMissedNeed\"]}},\"unknownProductType\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"tuples\",\"liveSkus\"]}},\"required\":[\"authoringQueue\",\"byProductType\",\"unknownProductType\"]},\"coverage\":{\"type\":\"object\",\"properties\":{\"failedClosed\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"tuples\",\"liveSkus\"]},\"noValue\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"tuples\",\"liveSkus\"]},\"resolvable\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkuShare\":{\"type\":[\"number\",\"null\"]},\"tupleShare\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"tuples\",\"liveSkus\",\"liveSkuShare\",\"tupleShare\"]},\"validity\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkuShare\":{\"type\":[\"number\",\"null\"]},\"tupleShare\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"tuples\",\"liveSkus\",\"liveSkuShare\",\"tupleShare\"]},\"withValue\":{\"type\":\"object\",\"properties\":{\"tuples\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"liveSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"tuples\",\"liveSkus\"]}},\"required\":[\"failedClosed\",\"noValue\",\"resolvable\",\"validity\",\"withValue\"]},\"dictionaryVersion\":{\"type\":\"string\"},\"tokens\":{\"type\":\"object\",\"properties\":{\"costUsd\":{\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"number\"},\"output\":{\"type\":\"number\"},\"total\":{\"type\":\"number\"}},\"required\":[\"input\",\"output\",\"total\"]},\"inputTokens\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"outputTokens\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"costUsd\",\"inputTokens\",\"outputTokens\"]},\"parses\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"linkedSkus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"generatedAt\":{\"type\":\"string\"}},\"required\":[\"completeness\",\"coverage\",\"dictionaryVersion\",\"tokens\",\"parses\",\"linkedSkus\",\"generatedAt\"]},\"CoordinateMaterialsResponse\":{\"type\":\"object\",\"properties\":{\"companions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"brandSlug\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"description\":\"The variant's own true name (paint colourway names live here).\",\"type\":[\"string\",\"null\"]},\"colourFit\":{\"description\":\"Anchor-relative appearance similarity between the se",
108
+ "ed and companion palettes. v1 is annotate-only — never reorders.\",\"type\":[\"number\",\"null\"]},\"demand\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"momentum\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"percentChange\":{\"description\":\"Null for `emerging` (no prior base) and `insufficient_volume`.\",\"type\":[\"number\",\"null\"]},\"priorSpecCount\":{\"type\":\"number\"},\"state\":{\"type\":\"string\",\"enum\":[\"rising\",\"fading\",\"stable\",\"emerging\",\"insufficient_volume\"]},\"trailingSpecCount\":{\"type\":\"number\"}},\"required\":[\"percentChange\",\"priorSpecCount\",\"state\",\"trailingSpecCount\"]},{\"type\":\"null\"}]},\"projectCount\":{\"type\":\"number\"},\"specCount\":{\"type\":\"number\"}},\"required\":[\"momentum\",\"projectCount\",\"specCount\"]},{\"type\":\"null\"}]},\"liftLabel\":{\"type\":\"string\"},\"seedContributions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"seedVariantId\":{\"type\":\"string\"},\"lift\":{\"type\":\"number\"}},\"required\":[\"seedVariantId\",\"lift\"]}},\"seedMatchCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Number of the input seeds this companion co-specifies with.\"},\"swatches\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"proportion\":{\"type\":\"number\"}},\"required\":[\"hex\",\"proportion\"]}},\"totalLift\":{\"type\":\"number\",\"description\":\"Summed lift across the seeds this companion co-specifies with.\"}},\"required\":[\"brand\",\"brandSlug\",\"color\",\"imageUrl\",\"product\",\"productId\",\"variantId\",\"variantName\",\"colourFit\",\"demand\",\"liftLabel\",\"seedContributions\",\"seedMatchCount\",\"swatches\",\"totalLift\"]}},\"seeds\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"brandSlug\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"description\":\"The variant's own true name (paint colourway names live here).\",\"type\":[\"string\",\"null\"]},\"resolvedFrom\":{\"type\":\"string\",\"description\":\"The input reference this seed resolved from.\"}},\"required\":[\"brand\",\"brandSlug\",\"color\",\"imageUrl\",\"product\",\"productId\",\"variantId\",\"variantName\",\"resolvedFrom\"]}},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"References that did not resolve to any variant.\"},\"window\":{\"type\":\"string\",\"const\":\"trailing_36mo\",\"description\":\"The demand window this endpoint serves.\"}},\"required\":[\"companions\",\"seeds\",\"unresolved\",\"window\"]},\"CreatePublicRunResponse\":{\"type\":\"object\",\"properties\":{\"accepted\":{\"type\":\"boolean\"},\"replayed\":{\"type\":\"boolean\"},\"workflowRunId\":{\"type\":\"string\"},\"run\":{\"$ref\":\"#/$defs/PublicRun\"}},\"required\":[\"accepted\",\"replayed\",\"workflowRunId\",\"run\"]},\"DeclaredAssociations\":{\"type\":\"object\",\"properties\":{\"associations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"colourwayCount\":{\"description\":\"The eligible variants of this association's product, the set `list_variants` pages, so a follow-up list returns this many. Absent when the product has no eligible variant.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"declared\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"const\":\"manufacturer_declared\",\"description\":\"The manufacturer enumerated this association in their own catalog data.\"},\"confidence\":{\"type\":\"number\",\"description\":\"The stored confidence for this edge. A FIXED convention value (0.9) for warehouse-declared associations, not a measurement — never present it as a per-edge score or use it to rank.\"},\"source\":{\"type\":\"string\",\"const\":\"warehouse\",\"description\":\"The provenance recorded on the edge: the manufacturer catalog warehouse feed.\"}},\"required\":[\"basis\",\"confidence\",\"source\"]},\"imageUrl\":{\"description\":\"Canonical thumbnail (same policy as siblings/pairings); null when there is none.\",\"type\":[\"string\",\"null\"]},\"product\":{\"type\":\"string\"},\"productTypeReceipt\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"proposedProductTypes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"confidence\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"t",
109
+ "ype\":\"null\"}]},\"displayName\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"isPrimary\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"string\",\"enum\":[\"variant\",\"product\"]},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"confidence\",\"displayName\",\"id\",\"isPrimary\",\"scope\",\"sourceUrl\"]}},\"state\":{\"type\":\"string\",\"const\":\"accepted\"}},\"required\":[\"proposedProductTypes\",\"state\"]},{\"type\":\"object\",\"properties\":{\"proposedProductTypes\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"confidence\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"displayName\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"isPrimary\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"string\",\"enum\":[\"variant\",\"product\"]},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"confidence\",\"displayName\",\"id\",\"isPrimary\",\"scope\",\"sourceUrl\"]}},\"state\":{\"type\":\"string\",\"const\":\"proposed\"}},\"required\":[\"proposedProductTypes\",\"state\"]},{\"type\":\"object\",\"properties\":{\"proposedProductTypes\":{\"minItems\":0,\"maxItems\":0,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"confidence\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"displayName\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"isPrimary\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"string\",\"enum\":[\"variant\",\"product\"]},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"confidence\",\"displayName\",\"id\",\"isPrimary\",\"scope\",\"sourceUrl\"]}},\"state\":{\"type\":\"string\",\"const\":\"unknown\"}},\"required\":[\"proposedProductTypes\",\"state\"]}]},\"kindLabel\":{\"description\":\"The accepted display category (the variant's primary product type), for a card's kind pill. Null when none is accepted; never a proposal.\",\"type\":[\"string\",\"null\"]},\"priceTier\":{\"description\":\"The variant's accepted `price_tier` term (`$` to `$$$$$`). Absent means unknown, never cheap.\",\"type\":\"string\"},\"relation\":{\"type\":\"string\",\"const\":\"applicable_finish\"},\"role\":{\"type\":\"string\",\"enum\":[\"finish\",\"product\"]},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"brand\",\"declared\",\"imageUrl\",\"product\",\"productTypeReceipt\",\"kindLabel\",\"relation\",\"role\",\"variantId\",\"variantName\"]}},\"kind\":{\"type\":\"string\",\"const\":\"declared_association\",\"description\":\"Constant discriminator. These are manufacturer-declared facts; `/pairings` items are inferred companionship. Never merge the two sets.\"},\"nextCursor\":{\"description\":\"Opaque continuation for the same subject, direction and corpus scope; absent on the last page.\",\"type\":\"string\"},\"returnedCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"How many associations this page carries.\"},\"subject\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"brand\",\"product\",\"variantId\",\"variantName\"]},\"totalAssociations\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"The TRUE number of declared associations for this subject and direction under the requested corpus scope, not the size of this page. Safe to render as \\\"Compatible Finishes (N)\\\"; `associations` is one page of that set, so walk `nextCursor` before making any claim about the whole set.\"}},\"required\":[\"associations\",\"kind\",\"returnedCount\",\"subject\",\"totalAssociations\"]},\"EnrichCandidateDemandResponse\":{\"type\":\"object\",\"properties\":{\"context\":{\"description\":\"The echoed declared context, or null when none was supplied.\",\"anyOf\":[{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"coverage\":{\"type\":\"object\",\"properties\":{\"available\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"insufficientData\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"noSignal\":{\"type\":\"integer\",",
110
+ "\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"requested\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"unknownVariant\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"available\",\"insufficientData\",\"noSignal\",\"requested\",\"unknownVariant\"],\"description\":\"Outcome tallies over `results` — never a denominator for the metric.\"},\"generationId\":{\"type\":\"string\",\"description\":\"The completed ingestion-session id these counts were mined in (the dataset generation).\"},\"guardrail\":{\"type\":\"object\",\"properties\":{\"audience\":{\"type\":\"string\",\"enum\":[\"public\",\"internal\"]},\"minCustomerCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Privacy floor applied for this signal.\"},\"minProjectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Quality floor applied for this signal.\"}},\"required\":[\"audience\",\"minCustomerCount\",\"minProjectCount\"],\"description\":\"The guardrail status under which `results` were projected.\"},\"metric\":{\"type\":\"string\",\"const\":\"specification_demand\"},\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"evidence\":{\"description\":\"Exact guardrail evidence for `internal` callers; null for public.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"belowPrivacyFloor\":{\"type\":\"boolean\",\"description\":\"Fewer distinct customers than the privacy floor — hidden from public callers.\"},\"belowQualityFloor\":{\"type\":\"boolean\",\"description\":\"Fewer distinct projects than the quality floor — too thin for a public metric.\"},\"suppressedForPublic\":{\"type\":\"boolean\",\"description\":\"True when a public caller would receive `no_signal` for this variant (privacy suppression).\"}},\"required\":[\"belowPrivacyFloor\",\"belowQualityFloor\",\"suppressedForPublic\"]},{\"type\":\"null\"}]},\"funnel\":{\"description\":\"The consideration→specification funnel (project-grain, both audiences); null when the signal is not `sampled` or no `considered` row/session exists.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"consideredProjects\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"excludedCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"exclusionRate\":{\"type\":\"number\"},\"specifiedProjects\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"consideredProjects\",\"excludedCount\",\"exclusionRate\",\"specifiedProjects\"]},{\"type\":\"null\"}]},\"intervals\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"projectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"quarter\":{\"type\":\"string\",\"description\":\"`YYYY-Q#` quarter label.\"},\"specCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"projectCount\",\"quarter\",\"specCount\"]},\"description\":\"Exact per-quarter counts (sparse — zero-spec quarters are absent).\"},\"momentum\":{\"type\":\"object\",\"properties\":{\"percentChange\":{\"description\":\"Null for `emerging` (no prior base) and `insufficient_volume` (no comparison).\",\"type\":[\"number\",\"null\"]},\"priorSpecCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"state\":{\"type\":\"string\",\"enum\":[\"rising\",\"fading\",\"stable\",\"emerging\",\"insufficient_volume\"]},\"trailingSpecCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"percentChange\",\"priorSpecCount\",\"state\",\"trailingSpecCount\"]},\"population\":{\"type\":\"object\",\"properties\":{\"customerCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Distinct customers specifying this variant.\"},\"projectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Distinct projects specifying this variant.\"},\"specCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Order lines (master-order grain) specifying this variant in the window.\"}},\"required\":[\"customerCount\",\"projectCount\",\"specCount\"]},\"state\":{\"type\":\"string\",\"const\":\"av",
111
+ "ailable\"},\"variantId\":{\"type\":\"string\"}},\"required\":[\"evidence\",\"funnel\",\"intervals\",\"momentum\",\"population\",\"state\",\"variantId\"]},{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"const\":\"insufficient_data\"},\"variantId\":{\"type\":\"string\"}},\"required\":[\"state\",\"variantId\"]},{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"const\":\"no_signal\"},\"variantId\":{\"type\":\"string\"}},\"required\":[\"state\",\"variantId\"]},{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"const\":\"unknown_variant\"},\"variantId\":{\"type\":\"string\"}},\"required\":[\"state\",\"variantId\"]}]}},\"universe\":{\"type\":\"object\",\"properties\":{\"description\":{\"type\":\"string\"},\"signal\":{\"type\":\"string\",\"enum\":[\"sampled\",\"considered\",\"specified\"]},\"window\":{\"type\":\"string\",\"const\":\"trailing_36mo\"}},\"required\":[\"description\",\"signal\",\"window\"],\"description\":\"The metric universe — window and signal the counts are scoped to.\"}},\"required\":[\"context\",\"coverage\",\"generationId\",\"guardrail\",\"metric\",\"results\",\"universe\"]},\"ExtractPaletteResponse\":{\"type\":\"object\",\"properties\":{\"palette\":{\"description\":\"The extracted palette, or null when extraction found no usable colour.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"colors\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"proportion\":{\"type\":\"number\"}},\"required\":[\"hex\",\"name\",\"proportion\"]},\"description\":\"Named palette swatches, most dominant first.\"},\"dominant\":{\"description\":\"The dominant colour, or null when none could be derived.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"family\":{\"type\":\"string\",\"description\":\"Coarse hue family, e.g. 'green'.\"},\"hex\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"oklch\":{\"type\":\"string\",\"description\":\"OKLCH string, e.g. 'oklch(72% 0.040 145)'.\"}},\"required\":[\"family\",\"hex\",\"name\",\"oklch\"]},{\"type\":\"null\"}]},\"mood\":{\"type\":\"string\",\"description\":\"A one-word read of the palette, e.g. \\\"muted\\\", \\\"vibrant\\\", \\\"dark\\\".\"}},\"required\":[\"colors\",\"dominant\",\"mood\"]},{\"type\":\"null\"}]}},\"required\":[\"palette\"]},\"GetCategoryResponse\":{\"type\":\"object\",\"properties\":{\"aliases\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"ancestors\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]}},\"children\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]}},\"description\":{\"type\":[\"string\",\"null\"]},\"formerNames\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"id\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"enum\":[\"group\",\"product_type\"]},\"name\":{\"type\":\"string\"},\"productCategory\":{\"type\":\"object\",\"properties\":{\"concepts\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"label\":{\"type\":\"string\"},\"match\":{\"description\":\"How the concept relates to this product type; absent for groups.\",\"type\":\"string\",\"enum\":[\"exact\",\"close\",\"broad\",\"narrow\"]},\"termId\":{\"type\":\"string\"},\"uri\":{\"type\":\"string\"}},\"required\":[\"label\",\"termId\",\"uri\"]}},\"recordValue\":{\"description\":\"The product_category a record holds when the category fixes it.\",\"type\":[\"string\",\"null\"]},\"status\":{\"type\":\"string\",\"enum\":[\"mapped\",\"conditional\",\"unmapped\"],\"description\":\"mapped: fixed by category; conditional: per record; unmapped: none.\"}},\"required\":[\"concepts\",\"recordValue\",\"status\"]}},\"required\":[\"aliases\",\"ancestors\",\"children\",\"description\",\"formerNames\",\"id\",\"kind\",\"name\",\"productCategory\"]},\"ListAttributesResponse\":{\"type\":\"object\",\"properties\":{\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"blockIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"description\":{\"type\":\"string\"},\"dictionaryId\":{\"type\":[\"string\",\"null\"]},\"filterOps\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"in\",\"not_in\",\"all\",\"exists\",\"missing\",\"eq\",\"gt\",\"gte\",\"lt\",\"lte\"]},\"description\":\"list_variants ops; empty when it cannot filter on it.\"},\"filterable\":{\"type\":\"boolean\"},\"id\":{\"type\":\"string\"},\"match\":{\"description\":\"Present only when the page answers a query.\",\"type\":\"object\",\"properties\":{\"distance\":{\"description\":\"Fuse distance, 0 best.\",\"type",
112
+ "\":\"number\"},\"matchedText\":{\"type\":[\"string\",\"null\"]},\"method\":{\"type\":\"string\",\"enum\":[\"exact\",\"alias\",\"fuzzy\",\"vector\"]},\"similarity\":{\"description\":\"Cosine similarity, 1 best.\",\"type\":\"number\"},\"valueId\":{\"description\":\"The dictionary term matchedText named exactly or by alias; present only for a value-tier match.\",\"type\":\"string\"}},\"required\":[\"matchedText\",\"method\"]},\"name\":{\"type\":\"string\"},\"statedBy\":{\"description\":\"Live variants in the categories stating this; absent without categoryIds.\",\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"unitId\":{\"type\":[\"string\",\"null\"]},\"valueKind\":{\"type\":\"string\"}},\"required\":[\"blockIds\",\"description\",\"dictionaryId\",\"filterOps\",\"filterable\",\"id\",\"name\",\"unitId\",\"valueKind\"]}},\"liveVariants\":{\"description\":\"Live variants across the requested categories; absent without categoryIds.\",\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"outsideScope\":{\"description\":\"Page one only: matches outside blockIds ranking above the best item.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"blockIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"blockIds\",\"id\",\"name\"]}},\"pageInfo\":{\"type\":\"object\",\"properties\":{\"endCursor\":{\"type\":[\"string\",\"null\"]},\"hasNextPage\":{\"type\":\"boolean\"}},\"required\":[\"endCursor\",\"hasNextPage\"]}},\"required\":[\"items\",\"pageInfo\"]},\"ListCategoriesResponse\":{\"type\":\"object\",\"properties\":{\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hasChildren\":{\"type\":\"boolean\"},\"id\":{\"type\":\"string\"},\"match\":{\"description\":\"Present only when the page answers a query.\",\"type\":\"object\",\"properties\":{\"matchedText\":{\"type\":[\"string\",\"null\"]},\"method\":{\"type\":\"string\",\"enum\":[\"exact\",\"alias\",\"fuzzy\",\"vector\"]}},\"required\":[\"matchedText\",\"method\"]},\"name\":{\"type\":\"string\"},\"parentId\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"hasChildren\",\"id\",\"name\",\"parentId\"]}},\"notice\":{\"description\":\"Present only when the query is refused as a category.\",\"type\":\"string\"},\"pageInfo\":{\"type\":\"object\",\"properties\":{\"nextCursor\":{\"type\":[\"string\",\"null\"]},\"returnedCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"totalMatches\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"nextCursor\",\"returnedCount\",\"totalMatches\"]}},\"required\":[\"items\",\"pageInfo\"]},\"ListVariantFacetsResponse\":{\"type\":\"object\",\"properties\":{\"matchedVariantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"facets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"missingVariantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"kind\":{\"type\":\"string\",\"const\":\"categorical\"},\"values\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"value\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"variantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"value\",\"label\",\"variantCount\"]}},\"hasMoreValues\":{\"type\":\"boolean\"}},\"required\":[\"attributeId\",\"name\",\"missingVariantCount\",\"kind\",\"values\",\"hasMoreValues\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"missingVariantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"kind\":{\"type\":\"string\",\"const\":\"boolean\"},\"values\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"value\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"variantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"value\",\"label\",\"variantCount\"]}},\"hasMoreValues\":{\"type\":\"boolean\"}},\"required\":[\"attributeId\",\"name\",\"missingVariantCount\",\"kind\",\"values\",\"hasMoreValues\"]},{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"missingVariantCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"kind\":{\"type\":\"string\",\"const\":\"numeric\"},\"min\":{\"type\":[\"number\",\"null\"]},\"max\":{\"type\":[\"number\",\"null\"]},\"unitId\":{\"type\":[\"string\",\"null\"",
113
+ "]}},\"required\":[\"attributeId\",\"name\",\"missingVariantCount\",\"kind\",\"min\",\"max\",\"unitId\"]}]}}},\"required\":[\"matchedVariantCount\",\"facets\"]},\"ListVariantsResponse\":{\"type\":\"object\",\"properties\":{\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"category\":{\"type\":\"string\"},\"code\":{\"type\":[\"string\",\"null\"]},\"image\":{\"type\":[\"string\",\"null\"]},\"maker\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]},\"materialBankId\":{\"description\":\"The variant's Material Bank SKU. Absent: none recorded.\",\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"notApplicable\":{\"type\":\"object\",\"properties\":{\"attributes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"description\":\"Requested blocks or attributes this product type does not carry.\"},\"preference\":{\"type\":\"object\",\"properties\":{\"matched\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}},\"score\":{\"type\":\"number\"}},\"required\":[\"matched\",\"score\"]},\"product\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]},\"specifications\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"$ref\":\"#/$defs/__schema3\"}}},\"url\":{\"type\":[\"string\",\"null\"]},\"variantCount\":{\"description\":\"Eligible variants of this product. Absent: none counted.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"variantId\":{\"type\":\"string\"}},\"required\":[\"category\",\"code\",\"maker\",\"name\",\"product\",\"variantId\"]}},\"pageInfo\":{\"type\":\"object\",\"properties\":{\"endCursor\":{\"type\":[\"string\",\"null\"]},\"hasNextPage\":{\"type\":\"boolean\"}},\"required\":[\"endCursor\",\"hasNextPage\"]},\"preferenceMatchesRemain\":{\"description\":\"False: nothing from this page on meets any optionalFilter.\",\"type\":\"boolean\"},\"unresolvedVariantIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"items\",\"pageInfo\"]},\"LookupVariantResponse\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"evidence\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"detail\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"enum\":[\"manufacturer-url\",\"brand-homepage\",\"manufacturer-code\",\"visible-label\"]},\"url\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"detail\",\"kind\"]}},\"receipt\":{\"type\":\"object\",\"properties\":{\"normalizationSteps\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"normalizedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"},\"submittedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"normalizationSteps\",\"normalizedUrl\",\"submittedUrl\"]},\"outcome\":{\"type\":\"string\",\"const\":\"identified\"},\"subject\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]},\"code\":{\"type\":\"string\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"variant\"},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"kind\",\"name\"]}},\"required\":[\"evidence\",\"outcome\",\"subject\"]},{\"type\":\"object\",\"properties\":{\"evidence\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"detail\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"enum\":[\"manufacturer-url\",\"brand-homepage\",\"manufacturer-code\",\"visible-label\"]},\"url\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"detail\",\"kind\"]}},\"receipt\":{\"type\":\"object\",\"properties\":{\"normalizationSteps\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"normalizedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"},\"submittedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"normalizationSteps\",\"normalizedUrl\",\"submittedUrl\"]},\"outcome\":{\"type\":\"string\",\"const\":\"placed\"},\"subject\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]},\"code\":{\"type\":\"string\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"brand\"},\"name\":{\"type\":\"string\",\"minLength\":1}",
114
+ "},\"required\":[\"id\",\"kind\",\"name\"]}},\"required\":[\"evidence\",\"outcome\",\"subject\"]},{\"type\":\"object\",\"properties\":{\"evidence\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"detail\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"enum\":[\"manufacturer-url\",\"brand-homepage\",\"manufacturer-code\",\"visible-label\"]},\"url\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"detail\",\"kind\"]}},\"receipt\":{\"type\":\"object\",\"properties\":{\"normalizationSteps\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"normalizedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"},\"submittedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"normalizationSteps\",\"normalizedUrl\",\"submittedUrl\"]},\"candidates\":{\"minItems\":1,\"maxItems\":20,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\"]},\"code\":{\"type\":\"string\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"enum\":[\"variant\",\"brand\"]},\"name\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"kind\",\"name\"]}},\"outcome\":{\"type\":\"string\",\"const\":\"ambiguous\"},\"truncated\":{\"type\":\"boolean\"}},\"required\":[\"evidence\",\"candidates\",\"outcome\",\"truncated\"]},{\"type\":\"object\",\"properties\":{\"evidence\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"detail\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"enum\":[\"manufacturer-url\",\"brand-homepage\",\"manufacturer-code\",\"visible-label\"]},\"url\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"detail\",\"kind\"]}},\"receipt\":{\"type\":\"object\",\"properties\":{\"normalizationSteps\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"normalizedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"},\"submittedUrl\":{\"type\":\"string\",\"maxLength\":2048,\"format\":\"uri\"}},\"required\":[\"normalizationSteps\",\"normalizedUrl\",\"submittedUrl\"]},\"outcome\":{\"type\":\"string\",\"const\":\"unresolved\"},\"reason\":{\"type\":\"string\",\"enum\":[\"no-stored-url\",\"no-code-match\"]}},\"required\":[\"evidence\",\"outcome\",\"reason\"]}]},\"links\":{\"type\":\"object\",\"properties\":{}},\"meta\":{\"type\":\"object\",\"properties\":{\"operationId\":{\"type\":\"string\",\"const\":\"retrieval.identify\"},\"requestId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"operationId\",\"requestId\"]},\"warnings\":{\"maxItems\":0,\"type\":\"array\",\"items\":{\"not\":{}}}},\"required\":[\"data\",\"links\",\"meta\",\"warnings\"]},\"MatchMaterialResponse\":{\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"resultId\":{\"type\":\"string\",\"description\":\"This exact hit's attribution key — `<responseId>:<rank>`, where rank is 1-based within THIS response. Unique across pages, because each page is its own response with its own id. Store it verbatim next to the outcome; it is opaque, and `attribution.responseId` is the field to group by.\"},\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"productId\":{\"type\":[\"string\",\"null\"]},\"materialBankId\":{\"description\":\"The variant's Material Bank SKU — the ONE EXTERNAL identifier on a result, in contrast to the OPAQUE `variantId`: it is the id you are expected to match against Material Bank's own catalogue (carts, ordering and analytics all key on it), so a result list can be joined without a second lookup. Populated by the search and by Match alike. ABSENT means no MB identity is known for the variant, never that the SKU cannot be ordered; presence is the orderability tell, absence is silence.\",\"type\":\"string\"},\"manufacturerCode\":{\"description\":\"The governed manufacturer/source-native item code from `variants.code` (for example \\\"GADLC02\\\"). Populated when the full-result retrieval source carries that canonical field; Match always hydrates it from the variant row. ABSENT means unknown or an older external serving projection, never an invented code. Independent of materialBankId.\",\"type\":\"string\"},\"projectSaveCapability\":{\"description\":\"Explicit source-governed permission to save this exact source-coded variant to a Project. ABSENT means unknown/not allowed; it is never inferr",
115
+ "ed from the brand or name.\",\"type\":\"string\",\"const\":\"allowed\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"sourceStatus\":{\"description\":\"The governed data status supporting Project capture. ABSENT means unknown. Provisional data remains source-backed but is not a verified catalogue claim.\",\"type\":\"string\",\"const\":\"provisional\"},\"productType\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. Lets a caller key a cache or dedupe on the asset rather than its URL. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"hasImage\":{\"type\":\"boolean\"},\"variantCount\":{\"description\":\"How many eligible variants the row's product has, the same set `list_variants` pages, so a follow-up list of the product returns this many: the card's \\\"12 colourways\\\". ABSENT means the product is unknown or has no eligible variant.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"palette\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` of the swatch, as extracted from the product image.\"},\"name\":{\"description\":\"Stored human colour name for the swatch, when one was extracted.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"The swatch's share of the analysed image, in [0,1].\"}},\"required\":[\"hex\",\"proportion\"]},\"description\":\"The material's main-image palette — the FULL stored palette, uncapped and in stored order. Colours are EXTRACTED FROM PRODUCT IMAGERY (visual likeness, never a declared colour specification). A one-swatch palette means the extractor found one colour — solid-colour materials are genuinely monochrome — never that the list was trimmed. This array is always present: EMPTY means nothing is on record (unknown), not 'this material has no colours'.\"},\"colourMeta\":{\"type\":\"object\",\"properties\":{\"dominantFamily\":{\"type\":\"string\"},\"dominantHex\":{\"type\":\"string\"},\"mood\":{\"type\":\"string\"}}},\"colourChip\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` to fill the chip with. EXTRACTED FROM the product image (a visual likeness), never a manufacturer-declared colour specification — surfaces must not present it as one.\"}},\"required\":[\"hex\"],\"description\":\"Present when this material's product imagery carries nothing beyond one colour, so a surface should render that colour rather than the photograph. Set for COATINGS (paints, primers, stains, floor coatings) whose stored palette quantises to a single swatch — a paint's photo is a flat fill, and the colour we hold structured beats a JPEG of it. ABSENT means the question was not established (unknown product type, unextracted or multi-swatch palette) and the image should be rendered; it NEVER asserts 'this is not a coating'.\"},\"attributes\":{\"description\":\"Resolved attribute values for the ids sent in `returnAttributes`, keyed by attribute id. ABSENT entirely when `returnAttributes` was not sent. A key present with `null` means this variant carries no accepted value for that attribute — absent is not empty and neither is null: the three states are distinct on purpose. Values resolve with the normal variant-over-product precedence.\",\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]}},\"colourBand\":{\"description\":\"`colourDistance` as a word (identical / very close / close / related / different), or null when unmeasurable. Absent when the colour stage did not run.\",\"type\":[\"string\",\"null\"]},\"colourDistance\":{\"description\":\"Match only. OKLab earth mover's distance between the query crop's palette and this material's, reading both palettes' proportions, so a colour that is a small share of the product cannot carry the match. Under 0.1 the colour AGREES, and the ",
116
+ "page lists agreeing rows first. `null` means the material carries no stored palette — UNKNOWN colour, never 'no colour' and never 'distant'. Absent when the colour stage did not run.\",\"type\":[\"number\",\"null\"]},\"confidence\":{\"description\":\"Match only (MG-1031). How close this material is to the query, as an ABSOLUTE image-space similarity in [0,1], not adjusted for colour — the same unit as `qualityFloor` and `comparison.bestRejected`, so all three can be drawn on one axis. Never normalised against the page, so the number means the same thing across runs. It is the TRUE value and may reach 1; rendering it so that no card claims '100%' is the consumer's job (round toward zero, or show '99%+'). Capping it here would put it on a different ceiling from `bestRejected`, which publishes the same unit uncapped. A Match page is ordered by colour agreement (`colourDistance` under 0.1, then unmeasured, then the rest) and then by this number, so inside each of those sets it never rises down the page. Distinct from `score`, which is the retrieval score on the `[0, maxScore]` scale and does not order a Match page. Absent outside Match.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"confidenceBand\":{\"description\":\"`confidence` as a word, banded on the engine's measured readings (strong >= 0.85, good >= 0.72, fair >= 0.55 = the default quality floor, weak below it and reachable only under `includeBelowFloor`). Present exactly when `confidence` is.\",\"type\":\"string\",\"enum\":[\"strong\",\"good\",\"fair\",\"weak\"]},\"score\":{\"type\":\"number\",\"description\":\"The selected mode's weighted primary score on the `[0, maxScore]` scale. On a Match page this is the retrieval score and does NOT order the page; the order is colour agreement, then `confidence`.\"},\"signals\":{\"description\":\"Match only: the measured image similarity the row carries.\",\"type\":\"object\",\"properties\":{\"image\":{\"description\":\"Image-space cosine between the query image and this row's image, in [0,1]. Null when it was not measured.\",\"type\":[\"number\",\"null\"]}},\"required\":[\"image\"]},\"retired\":{\"description\":\"MB lists the SKU as not visible/retired; demoted in ranking. Omitted when false.\",\"type\":\"boolean\"},\"belowFloor\":{\"description\":\"Present (true) only on quality-floor rejects returned under includeBelowFloor — the item failed the match image-quality floor and would be dropped by default.\",\"type\":\"boolean\"},\"admittedOnColour\":{\"description\":\"Present (true) only on Match rows the colour probe admitted: this material is as close in colour as the catalogue gets, and its image similarity is BELOW the match quality floor by design. It is on the page because no image-retrieved row is nearer in colour, not because it cleared the floor — so a consumer can present it as a colour answer or suppress it knowingly, and a quality check can tell a designed admission from a genuine floor leak. Absent (never false) on rows that came through image retrieval. Distinct from `belowFloor`, which marks rejects returned only under `includeBelowFloor`.\",\"type\":\"boolean\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"brandSlug\",\"productId\",\"color\",\"variantName\",\"imageUrl\",\"hasImage\",\"palette\",\"score\"]}},\"inferredCategories\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"productTypeId\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"boost\":{\"type\":\"number\"}},\"required\":[\"productTypeId\",\"displayName\",\"boost\"]}},\"qualityFloor\":{\"type\":\"number\",\"description\":\"Minimum image similarity a candidate had to clear, in [0,1]. Same unit as `bestRejected` and each result's `confidence`.\"},\"poolSize\":{\"type\":\"number\"},\"droppedBelowFloor\":{\"type\":\"number\"},\"droppedAsDuplicateProduct\":{\"type\":\"number\"},\"bestRejected\":{\"description\":\"The closest candidate the quality floor rejected, in the same unit as `qualityFloor`. Turns an empty result set into a finding: 'the closest thing we hold read 0.48 against a 0.55 bar'. Absent when nothing was rejected.\",\"type\":[\"number\",\"null\"]},\"maxScore\":{\"type\":\"number\",\"description\":\"The maximum score achievable under the weights this query ran — `score`'s denominator. NOT `confidence`'s scale",
117
+ ".\"},\"colour\":{\"description\":\"Per-candidate colour readings against the query image, in `results` order. Null means the colour stage DID NOT RUN — never 'no colour'.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"variantId\":{\"type\":\"string\"},\"colourDistance\":{\"type\":[\"number\",\"null\"]},\"colourBand\":{\"type\":[\"string\",\"null\"]},\"measurable\":{\"type\":\"boolean\"}},\"required\":[\"variantId\",\"colourDistance\",\"colourBand\",\"measurable\"]}},{\"type\":\"null\"}]},\"segmentPalette\":{\"description\":\"The query image's own palette — what colour was compared against.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"proportion\":{\"type\":\"number\"}},\"required\":[\"hex\",\"proportion\"]}},{\"type\":\"null\"}]},\"note\":{\"type\":\"string\"}},\"required\":[\"results\",\"inferredCategories\",\"qualityFloor\",\"poolSize\",\"droppedBelowFloor\",\"droppedAsDuplicateProduct\",\"maxScore\"]},\"MatchWorkflowResponse\":{\"type\":\"object\",\"properties\":{\"imageType\":{\"type\":\"string\",\"enum\":[\"swatch\",\"installation\",\"flatplan\"],\"description\":\"What the image classifier read: a single material, a room, or a flatplan.\"},\"surfaces\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"surface\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"}},\"required\":[\"id\"],\"description\":\"Stable surface id within this response.\"},\"status\":{\"type\":\"string\",\"enum\":[\"pending\",\"matching\",\"complete\",\"error\",\"colour_fallback\"],\"description\":\"Terminal states only on a finished response; `colour_fallback` means the crop was too small to read texture and the rows were answered on colour plus category.\"},\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"resultId\":{\"type\":\"string\",\"description\":\"This exact hit's attribution key — `<responseId>:<rank>`, where rank is 1-based within THIS response. Unique across pages, because each page is its own response with its own id. Store it verbatim next to the outcome; it is opaque, and `attribution.responseId` is the field to group by.\"},\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"productId\":{\"type\":[\"string\",\"null\"]},\"materialBankId\":{\"description\":\"The variant's Material Bank SKU — the ONE EXTERNAL identifier on a result, in contrast to the OPAQUE `variantId`: it is the id you are expected to match against Material Bank's own catalogue (carts, ordering and analytics all key on it), so a result list can be joined without a second lookup. Populated by the search and by Match alike. ABSENT means no MB identity is known for the variant, never that the SKU cannot be ordered; presence is the orderability tell, absence is silence.\",\"type\":\"string\"},\"manufacturerCode\":{\"description\":\"The governed manufacturer/source-native item code from `variants.code` (for example \\\"GADLC02\\\"). Populated when the full-result retrieval source carries that canonical field; Match always hydrates it from the variant row. ABSENT means unknown or an older external serving projection, never an invented code. Independent of materialBankId.\",\"type\":\"string\"},\"projectSaveCapability\":{\"description\":\"Explicit source-governed permission to save this exact source-coded variant to a Project. ABSENT means unknown/not allowed; it is never inferred from the brand or name.\",\"type\":\"string\",\"const\":\"allowed\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"sourceStatus\":{\"description\":\"The governed data status supporting Project capture. ABSENT means unknown. Provisional data remains source-backed but is not a verified catalogue claim.\",\"type\":\"string\",\"const\":\"provisional\"},\"productType\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. Lets a caller key a cache or dedupe on the asset rather than its URL. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"",
118
+ "hasImage\":{\"type\":\"boolean\"},\"variantCount\":{\"description\":\"How many eligible variants the row's product has, the same set `list_variants` pages, so a follow-up list of the product returns this many: the card's \\\"12 colourways\\\". ABSENT means the product is unknown or has no eligible variant.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"palette\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` of the swatch, as extracted from the product image.\"},\"name\":{\"description\":\"Stored human colour name for the swatch, when one was extracted.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"The swatch's share of the analysed image, in [0,1].\"}},\"required\":[\"hex\",\"proportion\"]},\"description\":\"The material's main-image palette — the FULL stored palette, uncapped and in stored order. Colours are EXTRACTED FROM PRODUCT IMAGERY (visual likeness, never a declared colour specification). A one-swatch palette means the extractor found one colour — solid-colour materials are genuinely monochrome — never that the list was trimmed. This array is always present: EMPTY means nothing is on record (unknown), not 'this material has no colours'.\"},\"colourMeta\":{\"type\":\"object\",\"properties\":{\"dominantFamily\":{\"type\":\"string\"},\"dominantHex\":{\"type\":\"string\"},\"mood\":{\"type\":\"string\"}}},\"colourChip\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` to fill the chip with. EXTRACTED FROM the product image (a visual likeness), never a manufacturer-declared colour specification — surfaces must not present it as one.\"}},\"required\":[\"hex\"],\"description\":\"Present when this material's product imagery carries nothing beyond one colour, so a surface should render that colour rather than the photograph. Set for COATINGS (paints, primers, stains, floor coatings) whose stored palette quantises to a single swatch — a paint's photo is a flat fill, and the colour we hold structured beats a JPEG of it. ABSENT means the question was not established (unknown product type, unextracted or multi-swatch palette) and the image should be rendered; it NEVER asserts 'this is not a coating'.\"},\"attributes\":{\"description\":\"Resolved attribute values for the ids sent in `returnAttributes`, keyed by attribute id. ABSENT entirely when `returnAttributes` was not sent. A key present with `null` means this variant carries no accepted value for that attribute — absent is not empty and neither is null: the three states are distinct on purpose. Values resolve with the normal variant-over-product precedence.\",\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]}},\"colourBand\":{\"description\":\"`colourDistance` as a word (identical / very close / close / related / different), or null when unmeasurable. Absent when the colour stage did not run.\",\"type\":[\"string\",\"null\"]},\"colourDistance\":{\"description\":\"Match only. OKLab earth mover's distance between the query crop's palette and this material's, reading both palettes' proportions, so a colour that is a small share of the product cannot carry the match. Under 0.1 the colour AGREES, and the page lists agreeing rows first. `null` means the material carries no stored palette — UNKNOWN colour, never 'no colour' and never 'distant'. Absent when the colour stage did not run.\",\"type\":[\"number\",\"null\"]},\"confidence\":{\"description\":\"Match only (MG-1031). How close this material is to the query, as an ABSOLUTE image-space similarity in [0,1], not adjusted for colour — the same unit as `qualityFloor` and `comparison.bestRejected`, so all three can be drawn on one axis. Never normalised against the page, so the number means the same thing across runs. It is the TRUE value and may reach 1; rendering it so that no card claims '100%' is the consumer's job (round toward zero, or show '99%+'). Capping it here would put it on a different ceiling from `bestRejected`, which publishes the same unit uncapped. A Match page is ordered b",
119
+ "y colour agreement (`colourDistance` under 0.1, then unmeasured, then the rest) and then by this number, so inside each of those sets it never rises down the page. Distinct from `score`, which is the retrieval score on the `[0, maxScore]` scale and does not order a Match page. Absent outside Match.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"confidenceBand\":{\"description\":\"`confidence` as a word, banded on the engine's measured readings (strong >= 0.85, good >= 0.72, fair >= 0.55 = the default quality floor, weak below it and reachable only under `includeBelowFloor`). Present exactly when `confidence` is.\",\"type\":\"string\",\"enum\":[\"strong\",\"good\",\"fair\",\"weak\"]},\"score\":{\"type\":\"number\",\"description\":\"The selected mode's weighted primary score on the `[0, maxScore]` scale. On a Match page this is the retrieval score and does NOT order the page; the order is colour agreement, then `confidence`.\"},\"signals\":{\"description\":\"Match only: the measured image similarity the row carries.\",\"type\":\"object\",\"properties\":{\"image\":{\"description\":\"Image-space cosine between the query image and this row's image, in [0,1]. Null when it was not measured.\",\"type\":[\"number\",\"null\"]}},\"required\":[\"image\"]},\"retired\":{\"description\":\"MB lists the SKU as not visible/retired; demoted in ranking. Omitted when false.\",\"type\":\"boolean\"},\"belowFloor\":{\"description\":\"Present (true) only on quality-floor rejects returned under includeBelowFloor — the item failed the match image-quality floor and would be dropped by default.\",\"type\":\"boolean\"},\"admittedOnColour\":{\"description\":\"Present (true) only on Match rows the colour probe admitted: this material is as close in colour as the catalogue gets, and its image similarity is BELOW the match quality floor by design. It is on the page because no image-retrieved row is nearer in colour, not because it cleared the floor — so a consumer can present it as a colour answer or suppress it knowingly, and a quality check can tell a designed admission from a genuine floor leak. Absent (never false) on rows that came through image retrieval. Distinct from `belowFloor`, which marks rejects returned only under `includeBelowFloor`.\",\"type\":\"boolean\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"brandSlug\",\"productId\",\"color\",\"variantName\",\"imageUrl\",\"hasImage\",\"palette\",\"score\"]},\"description\":\"This surface's ranked hits, in the order shown.\"}},\"required\":[\"surface\",\"status\",\"results\"]},\"description\":\"One entry per detected surface, in detection order. Empty for a swatch run, which answers in top-level `results` instead.\"},\"results\":{\"description\":\"Top-level hits — present on the swatch shortcut, which detects no surfaces.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"resultId\":{\"type\":\"string\",\"description\":\"This exact hit's attribution key — `<responseId>:<rank>`, where rank is 1-based within THIS response. Unique across pages, because each page is its own response with its own id. Store it verbatim next to the outcome; it is opaque, and `attribution.responseId` is the field to group by.\"},\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"productId\":{\"type\":[\"string\",\"null\"]},\"materialBankId\":{\"description\":\"The variant's Material Bank SKU — the ONE EXTERNAL identifier on a result, in contrast to the OPAQUE `variantId`: it is the id you are expected to match against Material Bank's own catalogue (carts, ordering and analytics all key on it), so a result list can be joined without a second lookup. Populated by the search and by Match alike. ABSENT means no MB identity is known for the variant, never that the SKU cannot be ordered; presence is the orderability tell, absence is silence.\",\"type\":\"string\"},\"manufacturerCode\":{\"description\":\"The governed manufacturer/source-native item code from `variants.code` (for example \\\"GADLC02\\\"). Populated when the full-result retrieval source carries that canonical field; Match always hydrates it from the variant row. ABSENT means unknown or an older external serving projection, never an invented code.",
120
+ " Independent of materialBankId.\",\"type\":\"string\"},\"projectSaveCapability\":{\"description\":\"Explicit source-governed permission to save this exact source-coded variant to a Project. ABSENT means unknown/not allowed; it is never inferred from the brand or name.\",\"type\":\"string\",\"const\":\"allowed\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"sourceStatus\":{\"description\":\"The governed data status supporting Project capture. ABSENT means unknown. Provisional data remains source-backed but is not a verified catalogue claim.\",\"type\":\"string\",\"const\":\"provisional\"},\"productType\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. Lets a caller key a cache or dedupe on the asset rather than its URL. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"hasImage\":{\"type\":\"boolean\"},\"variantCount\":{\"description\":\"How many eligible variants the row's product has, the same set `list_variants` pages, so a follow-up list of the product returns this many: the card's \\\"12 colourways\\\". ABSENT means the product is unknown or has no eligible variant.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"palette\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` of the swatch, as extracted from the product image.\"},\"name\":{\"description\":\"Stored human colour name for the swatch, when one was extracted.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"The swatch's share of the analysed image, in [0,1].\"}},\"required\":[\"hex\",\"proportion\"]},\"description\":\"The material's main-image palette — the FULL stored palette, uncapped and in stored order. Colours are EXTRACTED FROM PRODUCT IMAGERY (visual likeness, never a declared colour specification). A one-swatch palette means the extractor found one colour — solid-colour materials are genuinely monochrome — never that the list was trimmed. This array is always present: EMPTY means nothing is on record (unknown), not 'this material has no colours'.\"},\"colourMeta\":{\"type\":\"object\",\"properties\":{\"dominantFamily\":{\"type\":\"string\"},\"dominantHex\":{\"type\":\"string\"},\"mood\":{\"type\":\"string\"}}},\"colourChip\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` to fill the chip with. EXTRACTED FROM the product image (a visual likeness), never a manufacturer-declared colour specification — surfaces must not present it as one.\"}},\"required\":[\"hex\"],\"description\":\"Present when this material's product imagery carries nothing beyond one colour, so a surface should render that colour rather than the photograph. Set for COATINGS (paints, primers, stains, floor coatings) whose stored palette quantises to a single swatch — a paint's photo is a flat fill, and the colour we hold structured beats a JPEG of it. ABSENT means the question was not established (unknown product type, unextracted or multi-swatch palette) and the image should be rendered; it NEVER asserts 'this is not a coating'.\"},\"attributes\":{\"description\":\"Resolved attribute values for the ids sent in `returnAttributes`, keyed by attribute id. ABSENT entirely when `returnAttributes` was not sent. A key present with `null` means this variant carries no accepted value for that attribute — absent is not empty and neither is null: the three states are distinct on purpose. Values resolve with the normal variant-over-product precedence.\",\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]}},\"colourBand\":{\"description\":\"`colourDistance` as a word (identical / very close / close / related / different), or null when unmeasurable. Absent when the colour stage did not run.\",\"type\":[\"string\",\"null\"]},\"colourDistance\":{\"description\":\"Match onl",
121
+ "y. OKLab earth mover's distance between the query crop's palette and this material's, reading both palettes' proportions, so a colour that is a small share of the product cannot carry the match. Under 0.1 the colour AGREES, and the page lists agreeing rows first. `null` means the material carries no stored palette — UNKNOWN colour, never 'no colour' and never 'distant'. Absent when the colour stage did not run.\",\"type\":[\"number\",\"null\"]},\"confidence\":{\"description\":\"Match only (MG-1031). How close this material is to the query, as an ABSOLUTE image-space similarity in [0,1], not adjusted for colour — the same unit as `qualityFloor` and `comparison.bestRejected`, so all three can be drawn on one axis. Never normalised against the page, so the number means the same thing across runs. It is the TRUE value and may reach 1; rendering it so that no card claims '100%' is the consumer's job (round toward zero, or show '99%+'). Capping it here would put it on a different ceiling from `bestRejected`, which publishes the same unit uncapped. A Match page is ordered by colour agreement (`colourDistance` under 0.1, then unmeasured, then the rest) and then by this number, so inside each of those sets it never rises down the page. Distinct from `score`, which is the retrieval score on the `[0, maxScore]` scale and does not order a Match page. Absent outside Match.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"confidenceBand\":{\"description\":\"`confidence` as a word, banded on the engine's measured readings (strong >= 0.85, good >= 0.72, fair >= 0.55 = the default quality floor, weak below it and reachable only under `includeBelowFloor`). Present exactly when `confidence` is.\",\"type\":\"string\",\"enum\":[\"strong\",\"good\",\"fair\",\"weak\"]},\"score\":{\"type\":\"number\",\"description\":\"The selected mode's weighted primary score on the `[0, maxScore]` scale. On a Match page this is the retrieval score and does NOT order the page; the order is colour agreement, then `confidence`.\"},\"signals\":{\"description\":\"Match only: the measured image similarity the row carries.\",\"type\":\"object\",\"properties\":{\"image\":{\"description\":\"Image-space cosine between the query image and this row's image, in [0,1]. Null when it was not measured.\",\"type\":[\"number\",\"null\"]}},\"required\":[\"image\"]},\"retired\":{\"description\":\"MB lists the SKU as not visible/retired; demoted in ranking. Omitted when false.\",\"type\":\"boolean\"},\"belowFloor\":{\"description\":\"Present (true) only on quality-floor rejects returned under includeBelowFloor — the item failed the match image-quality floor and would be dropped by default.\",\"type\":\"boolean\"},\"admittedOnColour\":{\"description\":\"Present (true) only on Match rows the colour probe admitted: this material is as close in colour as the catalogue gets, and its image similarity is BELOW the match quality floor by design. It is on the page because no image-retrieved row is nearer in colour, not because it cleared the floor — so a consumer can present it as a colour answer or suppress it knowingly, and a quality check can tell a designed admission from a genuine floor leak. Absent (never false) on rows that came through image retrieval. Distinct from `belowFloor`, which marks rejects returned only under `includeBelowFloor`.\",\"type\":\"boolean\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"brandSlug\",\"productId\",\"color\",\"variantName\",\"imageUrl\",\"hasImage\",\"palette\",\"score\"]}},\"inferredCategories\":{\"description\":\"Product-type names inferred from the query image.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"productTypeId\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"boost\":{\"type\":\"number\"}},\"required\":[\"productTypeId\",\"displayName\",\"boost\"]}},\"totals\":{\"type\":\"object\",\"properties\":{\"surfacesDetected\":{\"type\":\"number\"},\"surfacesResolved\":{\"type\":\"number\"},\"surfacesFailed\":{\"type\":\"number\"},\"matchesSoFar\":{\"type\":\"number\"}},\"required\":[\"surfacesDetected\",\"surfacesResolved\",\"surfacesFailed\",\"matchesSoFar\"],\"description\":\"The run's tally, counted rather than inferred: `surfacesFailed > 0` with no results is a broken run, zero failures with no results is a ",
122
+ "genuine empty answer.\"},\"comparison\":{\"description\":\"What a swatch run compared against — the single-surface equivalent of a surface comparison.\",\"type\":\"object\",\"properties\":{\"poolSize\":{\"type\":\"number\"},\"droppedBelowFloor\":{\"type\":\"number\"},\"qualityFloor\":{\"type\":\"number\"},\"bestRejected\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"poolSize\",\"droppedBelowFloor\",\"qualityFloor\"]},\"outcome\":{\"description\":\"How the run ended. Absent means `matched`.\",\"type\":\"string\",\"enum\":[\"matched\",\"no_surfaces\"]}},\"required\":[\"imageType\",\"surfaces\",\"totals\"]},\"MaterialBlockProjection\":{\"type\":\"object\",\"properties\":{\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"canonicalBlockId\":{\"type\":\"string\"},\"canonicalBlockName\":{\"type\":\"string\"},\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"confidence\":{\"type\":\"number\"},\"displayValue\":{\"description\":\"The value dictionary's label for a single-term `value`. Absent when no label is on record; `value` stays the canonical token.\",\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"sourceBasis\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"verified\",\"partial\",\"missing\",\"not_applicable\"]},\"unit\":{\"type\":\"string\"},\"value\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"number\"},{\"type\":\"boolean\"},{\"type\":\"array\",\"items\":{}},{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},{\"type\":\"null\"}]}},\"required\":[\"attributeId\",\"label\",\"status\",\"value\"]}},\"missingAttributeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"status\":{\"type\":\"string\",\"enum\":[\"verified\",\"partial\",\"missing\",\"not_applicable\"]}},\"required\":[\"canonicalBlockId\",\"canonicalBlockName\",\"fields\",\"missingAttributeIds\",\"status\"]}},\"variantId\":{\"type\":\"string\"}},\"required\":[\"blocks\",\"variantId\"]},\"MaterialDemandResult\":{\"type\":\"object\",\"properties\":{\"found\":{\"type\":\"boolean\"},\"query\":{\"type\":\"string\"},\"seed\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"description\":\"The variant's own true name (holds the paint colour name); null when unnamed.\",\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"color\",\"variantName\",\"imageUrl\",\"brandSlug\",\"productId\"]},{\"type\":\"null\"}]},\"window\":{\"type\":\"string\",\"const\":\"trailing_36mo\",\"description\":\"The demand window v1 serves (trailing 36 months).\"},\"demand\":{\"description\":\"Headline counts + quarterly series + momentum; null when no stats are tracked.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"specCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"projectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"customerCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"byQuarter\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"quarter\":{\"type\":\"string\"},\"specCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"projectCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"quarter\",\"specCount\",\"projectCount\"]}},\"momentum\":{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"enum\":[\"rising\",\"fading\",\"stable\",\"emerging\",\"insufficient_volume\"]},\"percentChange\":{\"description\":\"Null for `emerging` (no prior base) and `insufficient_volume` (no comparison).\",\"type\":[\"number\",\"null\"]},\"trailingSpecCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"priorSpecCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"state\",\"percentChange\",\"trailingSpecCount\",\"priorSpecCount\"]}},\"required\":[\"specCount\",\"projectCount\",\"customerCount\",\"byQuarter\",\"momentum\"]},{\"type\":\"null\"}]}},\"required\":[\"found\",\"query\",\"seed\",\"window\",\"demand\"]},\"MaterialDetail\":{\"type\":\"object\",\"properties\":{\"availability\":{\"type\":\"string\",\"enum\":[\"available\",\"discontinued\",\"superseded\",\"unknown\"],\"description\":",
123
+ "\"Orderability: 'available' (listed in the catalog of record), 'discontinued' (withdrawn from that catalog — not a reviewed manufacturer-discontinuation claim), 'superseded' (a reviewed successor relationship exists and the material is no longer listed), 'unknown' (never checked).\"},\"brand\":{\"type\":\"string\"},\"category\":{\"type\":[\"string\",\"null\"]},\"colour\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":[\"number\",\"null\"]},\"dominantHex\":{\"type\":[\"string\",\"null\"]},\"hsl\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"h\":{\"type\":\"number\",\"minimum\":0,\"exclusiveMaximum\":360},\"l\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"s\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1}},\"required\":[\"h\",\"l\",\"s\"]},{\"type\":\"null\"}]},\"oklab\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"]},{\"type\":\"null\"}]},\"sourceBasis\":{\"description\":\"Where `dominantHex` — and the `hsl` derived from it — came from: 'declared' is the brand's own published colour, 'derived' was read out of product imagery. It does NOT cover `oklab`, `chroma` or `vibrancy`: those are statistics of the IMAGE and stay measured whatever the hex says. Only the record read resolves this; a tile omits the key, and absent means unresolved, never 'declared'.\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]},\"vibrancy\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"chroma\",\"dominantHex\",\"hsl\",\"oklab\",\"vibrancy\"]},\"colourName\":{\"description\":\"The accepted Colour Name attribute — the colourway's true name where variants.name collapsed to the product's; absent means the attribute is absent (MG-940).\",\"type\":\"string\"},\"imageSource\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"r2\",\"origin\"]},{\"type\":\"null\"}]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"product\":{\"type\":\"string\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"categoryPath\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"color\":{\"type\":[\"string\",\"null\"]},\"colourEvidence\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"const\":\"no_eligible_asset\"}},\"required\":[\"status\"]},{\"type\":\"object\",\"properties\":{\"origin\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"minLength\":1},\"method\":{\"type\":\"string\",\"const\":\"colorscope_primary_image\"}},\"required\":[\"assetId\",\"method\"]},\"status\":{\"type\":\"string\",\"const\":\"extractor_not_run\"}},\"required\":[\"origin\",\"status\"]},{\"type\":\"object\",\"properties\":{\"extractedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},\"extractionVersion\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"origin\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"minLength\":1},\"method\":{\"type\":\"string\",\"const\":\"colorscope_primary_image\"}},\"required\":[\"assetId\",\"method\"]},\"basis\":{\"type\":\"string\",\"enum\":[\"palette\",\"dominant_oklab\",\"palette_and_dominant_oklab\"]},\"status\":{\"type\":\"string\",\"const\":\"available\"}},\"required\":[\"extractedAt\",\"extractionVersion\",\"origin\",\"basis\",\"status\"]},{\"type\":\"object\",\"properties\":{\"extractedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},\"extractionVersion\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"origin\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"minLength\":1},\"method\":{\"type\":\"string\",\"const\":\"colorscope_primary_image\"}},\"required\":[\"assetId\",\"method\"]},\"status\":{\"type\":\"string\",\"const\":\"",
124
+ "projection_missing\"}},\"required\":[\"extractedAt\",\"extractionVersion\",\"origin\",\"status\"]},{\"type\":\"object\",\"properties\":{\"extractedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},\"extractionVersion\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"origin\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"minLength\":1},\"method\":{\"type\":\"string\",\"const\":\"colorscope_primary_image\"}},\"required\":[\"assetId\",\"method\"]},\"status\":{\"type\":\"string\",\"const\":\"genuinely_colourless\"}},\"required\":[\"extractedAt\",\"extractionVersion\",\"origin\",\"status\"]}]},\"dimensions\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"depth_mm\":{\"description\":\"Depth in millimetres.\",\"type\":\"number\"},\"diameter_mm\":{\"description\":\"Diameter in millimetres.\",\"type\":\"number\"},\"height_mm\":{\"description\":\"Height in millimetres.\",\"type\":\"number\"},\"label\":{\"description\":\"Free-text descriptor of this configuration (e.g. \\\"Plank\\\").\",\"type\":\"string\"},\"length_mm\":{\"description\":\"Length in millimetres.\",\"type\":\"number\"},\"measurement_basis\":{\"description\":\"How the measurements were taken (e.g. \\\"nominal\\\", \\\"actual\\\").\",\"type\":\"string\"},\"thickness_mm\":{\"description\":\"Thickness in millimetres.\",\"type\":\"number\"},\"tile_size\":{\"description\":\"Nominal tile size as the source states it (e.g. \\\"3x8\\\").\",\"type\":\"string\"},\"visible_projection_mm\":{\"description\":\"Visible projection (relief depth) in millimetres.\",\"type\":\"number\"},\"weight_kg\":{\"description\":\"Weight in kilograms.\",\"type\":\"number\"},\"width_mm\":{\"description\":\"Width in millimetres.\",\"type\":\"number\"}},\"additionalProperties\":{},\"description\":\"One dimensional configuration; numeric fields are millimetres/kilograms.\"}},{\"type\":\"null\"}]},\"displayCategory\":{\"type\":[\"string\",\"null\"]},\"facets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"role\":{\"type\":\"string\",\"enum\":[\"identity\",\"specification\"]},\"term\":{\"type\":\"string\"}},\"required\":[\"attributeId\",\"role\",\"term\"]},\"description\":\"Accepted searchable facet values on this material (attribute id + canonical term), explicitly classified as identity or specification. Only `specification` facets are queryable through bySpec. Does NOT carry the virtual `certification_programme` facet — certifications live in the certification attributes' own records — so an absence here can never prove a product lacks a certification.\"},\"installationImageUrl\":{\"type\":[\"string\",\"null\"]},\"manufacturerCode\":{\"description\":\"The governed manufacturer/source-native item code from `variants.code`, the same key search results carry. ABSENT means no code is recorded for the variant, never an invented one.\",\"type\":\"string\"},\"materialBankId\":{\"description\":\"The variant's Material Bank SKU. Null means none is recorded; presence identifies the source and does not establish sampleability.\",\"type\":[\"string\",\"null\"]},\"palette\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"name\":{\"type\":[\"string\",\"null\"]},\"oklab\":{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"]},\"proportion\":{\"type\":\"number\"}},\"required\":[\"hex\",\"proportion\"]}},\"productId\":{\"type\":\"string\"},\"productTypeReceipt\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"proposedProductTypes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"confidence\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"displayName\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"isPrimary\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"string\",\"enum\":[\"variant\",\"product\"]},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"confidence\",\"displayName\",\"id\",\"isPrimary\",\"scope\",\"sourceUrl\"]}},\"state\":{\"type\":\"string\",\"const\":\"accepted\"}},\"required\":[\"proposedProductTypes\",\"state\"]},{\"",
125
+ "type\":\"object\",\"properties\":{\"proposedProductTypes\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"confidence\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"displayName\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"isPrimary\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"string\",\"enum\":[\"variant\",\"product\"]},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"confidence\",\"displayName\",\"id\",\"isPrimary\",\"scope\",\"sourceUrl\"]}},\"state\":{\"type\":\"string\",\"const\":\"proposed\"}},\"required\":[\"proposedProductTypes\",\"state\"]},{\"type\":\"object\",\"properties\":{\"proposedProductTypes\":{\"minItems\":0,\"maxItems\":0,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"confidence\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"displayName\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"isPrimary\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"string\",\"enum\":[\"variant\",\"product\"]},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"confidence\",\"displayName\",\"id\",\"isPrimary\",\"scope\",\"sourceUrl\"]}},\"state\":{\"type\":\"string\",\"const\":\"unknown\"}},\"required\":[\"proposedProductTypes\",\"state\"]}]},\"projectSaveCapability\":{\"description\":\"Explicit source-governed permission to save this exact source-coded variant to a Project. Absent means unknown/not allowed; it is never inferred from the brand or name.\",\"type\":\"string\",\"const\":\"allowed\"},\"sourceStatus\":{\"description\":\"The governed data status supporting Project capture. Absent means unknown. Provisional data remains source-backed but is not a verified catalogue claim.\",\"type\":\"string\",\"const\":\"provisional\"},\"supersededBy\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"availability\":{\"type\":\"string\",\"enum\":[\"available\",\"discontinued\",\"superseded\",\"unknown\"],\"description\":\"Orderability: 'available' (listed in the catalog of record), 'discontinued' (withdrawn from that catalog — not a reviewed manufacturer-discontinuation claim), 'superseded' (a reviewed successor relationship exists and the material is no longer listed), 'unknown' (never checked).\"},\"brand\":{\"type\":\"string\"},\"brandSlug\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"variant\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"}},\"required\":[\"availability\",\"brand\",\"brandSlug\",\"color\",\"product\",\"productId\",\"variant\",\"variantId\"]},{\"type\":\"null\"}]}},\"required\":[\"availability\",\"brand\",\"category\",\"colour\",\"imageSource\",\"imageUrl\",\"product\",\"variantId\",\"variantName\",\"brandSlug\",\"categoryPath\",\"color\",\"colourEvidence\",\"dimensions\",\"displayCategory\",\"facets\",\"installationImageUrl\",\"materialBankId\",\"palette\",\"productId\",\"productTypeReceipt\",\"supersededBy\"]},\"MaterialQueryPlanResponse\":{\"type\":\"object\",\"properties\":{\"cached\":{\"type\":\"boolean\",\"description\":\"True when the plan came from the plan cache.\"},\"correction\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"from\":{\"type\":\"string\",\"description\":\"The query as typed, normalised.\"},\"to\":{\"type\":\"string\",\"description\":\"The phrasing that was read: showing results for.\"},\"words\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"correction\":{\"type\":\"string\",\"minLength\":1},\"word\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"correction\",\"word\"]}}},\"required\":[\"from\",\"to\",\"words\"]},{\"type\":\"null\"}]},\"normalisedQuery\":{\"type\":\"string\"},\"plan\":{\"type\":\"object\",\"properties\":{\"brands\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"ids\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}},\"names\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}},\"phrase\":{\"type\":\"string\"}},\"required\":[\"ids\",\"names\",\"phrase\"]},{\"type\":\"null\"}]},\"category\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"label\":{\"type\":\"string\"},\"phrase\":{\"type\":\"string\"},\"productTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}}},\"required\":[\"label\",\"phrase\",\"productTypeIds\"]},{\"type\":\"null\"}]},\"colour\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"family12\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}},\"familyId\":{\"type\":\"string\",\"minLength\":1},\"hex\":{\"type\":\"string\",\"mi",
126
+ "nLength\":1},\"oklab\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":3,\"maxItems\":3},\"phrase\":{\"type\":\"string\"}},\"required\":[\"family12\",\"familyId\",\"hex\",\"oklab\",\"phrase\"]},{\"type\":\"null\"}]},\"excludeBrands\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}},\"excludes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"minLength\":1},\"phrase\":{\"type\":\"string\"},\"term\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"attributeId\",\"phrase\",\"term\"]}},\"leftover\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Words left for the text query, in query order.\"},\"normalised\":{\"type\":\"string\"},\"softAlone\":{\"type\":\"boolean\",\"description\":\"True when nothing hard was read and no word was left, so the soft wants' words also go to text.\"},\"vendorColourNames\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"wants\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"minLength\":1},\"fill\":{\"type\":\"number\",\"minimum\":0,\"description\":\"Share of the category's Variants that state this attribute.\"},\"phrase\":{\"type\":\"string\"},\"strength\":{\"type\":\"string\",\"enum\":[\"hard\",\"soft\"],\"description\":\"hard filters the page; soft only orders it, because too few Variants state the attribute.\"},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}}},\"required\":[\"attributeId\",\"fill\",\"phrase\",\"strength\",\"terms\"]}}},\"required\":[\"brands\",\"category\",\"colour\",\"excludeBrands\",\"excludes\",\"leftover\",\"normalised\",\"softAlone\",\"vendorColourNames\",\"wants\"]},\"rawQuery\":{\"type\":\"string\",\"minLength\":1},\"readingVersion\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The dictionaries' version the plan was read against.\"},\"requests\":{\"minItems\":1,\"maxItems\":1,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"description\":\"Opaque pagination token from the previous page of the same text. Pass it verbatim, or omit it for the first page.\",\"type\":\"string\",\"minLength\":1},\"limit\":{\"description\":\"Results in one page, at most 24. The search's own page size when omitted.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":24},\"text\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":500,\"description\":\"The ask to search, as the planner phrased it.\"},\"view\":{\"description\":\"\\\"card\\\" (default) for the lean projection, \\\"full\\\" for every result field.\",\"type\":\"string\",\"enum\":[\"card\",\"full\"]}},\"required\":[\"text\"]}},\"source\":{\"type\":\"string\",\"enum\":[\"dictionary\",\"jev\"],\"description\":\"Who read the plan: the dictionaries, or the background Jev reading.\"},\"version\":{\"type\":\"string\",\"const\":\"2\"}},\"required\":[\"cached\",\"correction\",\"normalisedQuery\",\"plan\",\"rawQuery\",\"readingVersion\",\"requests\",\"source\",\"version\"]},\"MaterialTile\":{\"type\":\"object\",\"properties\":{\"availability\":{\"type\":\"string\",\"enum\":[\"available\",\"discontinued\",\"superseded\",\"unknown\"],\"description\":\"Orderability: 'available' (listed in the catalog of record), 'discontinued' (withdrawn from that catalog — not a reviewed manufacturer-discontinuation claim), 'superseded' (a reviewed successor relationship exists and the material is no longer listed), 'unknown' (never checked).\"},\"brand\":{\"type\":\"string\"},\"category\":{\"type\":[\"string\",\"null\"]},\"colour\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":[\"number\",\"null\"]},\"dominantHex\":{\"type\":[\"string\",\"null\"]},\"hsl\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"h\":{\"type\":\"number\",\"minimum\":0,\"exclusiveMaximum\":360},\"l\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"s\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1}},\"required\":[\"h\",\"l\",\"s\"]},{\"type\":\"null\"}]},\"oklab\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"]},{\"type\":\"null\"}]},\"sourceBasis\":{\"description\":\"Where `dominantHex` — and the `hsl` derived from it — came from: 'declared' is the brand's own published colour, 'derived' was read out of product imagery. It does NOT cover `oklab`, `chroma` or `vibrancy`: those are statistics of the IMAGE and stay measured whatever the hex says. Only the record read resolves this; a tile omit",
127
+ "s the key, and absent means unresolved, never 'declared'.\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]},\"vibrancy\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"chroma\",\"dominantHex\",\"hsl\",\"oklab\",\"vibrancy\"]},\"colourName\":{\"description\":\"The accepted Colour Name attribute — the colourway's true name where variants.name collapsed to the product's; absent means the attribute is absent (MG-940).\",\"type\":\"string\"},\"imageSource\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"r2\",\"origin\"]},{\"type\":\"null\"}]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"product\":{\"type\":\"string\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"availability\",\"brand\",\"category\",\"colour\",\"imageSource\",\"imageUrl\",\"product\",\"variantId\",\"variantName\"]},\"PairingItem\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"inScope\":{\"type\":[\"boolean\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"category\":{\"type\":[\"string\",\"null\"]},\"color\":{\"type\":[\"string\",\"null\"]},\"customerCount\":{\"type\":\"number\"},\"demand\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"momentum\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"percentChange\":{\"type\":[\"number\",\"null\"]},\"priorSpecCount\":{\"type\":\"number\"},\"state\":{\"type\":\"string\",\"enum\":[\"rising\",\"fading\",\"stable\",\"emerging\",\"insufficient_volume\"]},\"trailingSpecCount\":{\"type\":\"number\"}},\"required\":[\"percentChange\",\"priorSpecCount\",\"state\",\"trailingSpecCount\"]},{\"type\":\"null\"}]},\"projectCount\":{\"type\":\"number\"},\"specCount\":{\"type\":\"number\"}},\"required\":[\"momentum\",\"projectCount\",\"specCount\"]},{\"type\":\"null\"}]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"lift\":{\"type\":\"number\"},\"liftLabel\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"projectCount\":{\"type\":\"number\"},\"relation\":{\"type\":\"string\",\"enum\":[\"companion\",\"brand_sibling\",\"colourway\"]},\"topProjectTypes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"projectCount\":{\"type\":\"number\"},\"projectType\":{\"type\":\"string\"}},\"required\":[\"projectCount\",\"projectType\"]}},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]},\"ranking\":{\"type\":\"object\",\"properties\":{\"anchorColourSimilarity\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"anchorColourSimilarityMeasurable\":{\"type\":\"boolean\"},\"basis\":{\"type\":\"string\",\"const\":\"dominant_colour_oklab\"},\"lightness\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"lightnessMeasurable\":{\"type\":\"boolean\"}},\"required\":[\"anchorColourSimilarity\",\"anchorColourSimilarityMeasurable\",\"basis\",\"lightness\",\"lightnessMeasurable\"]},\"source\":{\"type\":\"string\",\"const\":\"cospec\"}},\"required\":[\"brand\",\"brandSlug\",\"category\",\"color\",\"customerCount\",\"demand\",\"imageUrl\",\"lift\",\"liftLabel\",\"product\",\"productId\",\"projectCount\",\"topProjectTypes\",\"variantId\",\"variantName\",\"source\"]},{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"inScope\":{\"type\":[\"boolean\",\"null\"]},\"brandSlug\":{\"type\":\"string\"},\"category\":{\"type\":[\"string\",\"null\"]},\"color\":{\"type\":[\"string\",\"null\"]},\"customerCount\":{\"type\":\"number\"},\"demand\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"momentum\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"percentChange\":{\"type\":[\"number\",\"null\"]},\"priorSpecCount\":{\"type\":\"number\"},\"state\":{\"type\":\"string\",\"enum\":[\"rising\",\"fading\",\"stable\",\"emerging\",\"insufficient_volume\"]},\"trailingSpecCount\":{\"type\":\"number\"}},\"required\":[\"percentChange\",\"priorSpecCount\",\"state\",\"trailingSpecCount\"]},{\"type\":\"null\"}]},\"projectCount\":{\"type\":\"number\"},\"specCount\":{\"type\":\"number\"}},\"required\":[\"momentum\",\"projectCount\",\"specCount\"]},{\"type\":\"null\"}]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"lift\":{\"type\":\"number\"},\"liftLabel\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":\"string\"},\"projectCount\":{\"type\":\"number\"},\"relation\":{\"type\":\"string\",\"enum\":[\"companion\",\"brand_sibling\",\"colourway\"]},\"topProjectTypes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"projectCo",
128
+ "unt\":{\"type\":\"number\"},\"projectType\":{\"type\":\"string\"}},\"required\":[\"projectCount\",\"projectType\"]}},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]},\"ranking\":{\"type\":\"object\",\"properties\":{\"anchorColourSimilarity\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"anchorColourSimilarityMeasurable\":{\"type\":\"boolean\"},\"basis\":{\"type\":\"string\",\"const\":\"dominant_colour_oklab\"},\"lightness\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"lightnessMeasurable\":{\"type\":\"boolean\"}},\"required\":[\"anchorColourSimilarity\",\"anchorColourSimilarityMeasurable\",\"basis\",\"lightness\",\"lightnessMeasurable\"]},\"source\":{\"type\":\"string\",\"const\":\"considered\"}},\"required\":[\"brand\",\"brandSlug\",\"category\",\"color\",\"customerCount\",\"demand\",\"imageUrl\",\"lift\",\"liftLabel\",\"product\",\"productId\",\"projectCount\",\"topProjectTypes\",\"variantId\",\"variantName\",\"source\"]},{\"type\":\"object\",\"properties\":{\"availability\":{\"type\":\"string\",\"enum\":[\"available\",\"discontinued\",\"superseded\",\"unknown\"],\"description\":\"Orderability: 'available' (listed in the catalog of record), 'discontinued' (withdrawn from that catalog — not a reviewed manufacturer-discontinuation claim), 'superseded' (a reviewed successor relationship exists and the material is no longer listed), 'unknown' (never checked).\"},\"brand\":{\"type\":\"string\"},\"category\":{\"type\":[\"string\",\"null\"]},\"colour\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":[\"number\",\"null\"]},\"dominantHex\":{\"type\":[\"string\",\"null\"]},\"hsl\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"h\":{\"type\":\"number\",\"minimum\":0,\"exclusiveMaximum\":360},\"l\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"s\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1}},\"required\":[\"h\",\"l\",\"s\"]},{\"type\":\"null\"}]},\"oklab\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"l\":{\"type\":\"number\"}},\"required\":[\"a\",\"b\",\"l\"]},{\"type\":\"null\"}]},\"sourceBasis\":{\"description\":\"Where `dominantHex` — and the `hsl` derived from it — came from: 'declared' is the brand's own published colour, 'derived' was read out of product imagery. It does NOT cover `oklab`, `chroma` or `vibrancy`: those are statistics of the IMAGE and stay measured whatever the hex says. Only the record read resolves this; a tile omits the key, and absent means unresolved, never 'declared'.\",\"type\":\"string\",\"enum\":[\"catalog_feed\",\"declared\",\"derived\"]},\"vibrancy\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"chroma\",\"dominantHex\",\"hsl\",\"oklab\",\"vibrancy\"]},\"colourName\":{\"description\":\"The accepted Colour Name attribute — the colourway's true name where variants.name collapsed to the product's; absent means the attribute is absent (MG-940).\",\"type\":\"string\"},\"imageSource\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"r2\",\"origin\"]},{\"type\":\"null\"}]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"product\":{\"type\":\"string\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]},\"inScope\":{\"type\":[\"boolean\",\"null\"]},\"ranking\":{\"type\":\"object\",\"properties\":{\"anchorColourSimilarity\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"anchorColourSimilarityMeasurable\":{\"type\":\"boolean\"},\"basis\":{\"type\":\"string\",\"const\":\"dominant_colour_oklab\"},\"lightness\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"null\"}]},\"lightnessMeasurable\":{\"type\":\"boolean\"}},\"required\":[\"anchorColourSimilarity\",\"anchorColourSimilarityMeasurable\",\"basis\",\"lightness\",\"lightnessMeasurable\"]},\"score\":{\"type\":\"number\"},\"source\":{\"type\":\"string\",\"const\":\"colour\"}},\"required\":[\"availability\",\"brand\",\"category\",\"colour\",\"imageSource\",\"imageUrl\",\"product\",\"variantId\",\"variantName\",\"score\",\"source\"]}]},\"PairingOrdering\":{\"type\":\"object\",\"properties\":{\"anchorColourBasis\":{\"type\":\"string\",\"const\":\"one_minus_oklab_euclidean_distance\"},\"applied\":{\"type\":\"string\",\"enum\":[\"relevance\",\"lightness_asc\",\"lightness_desc\"]},\"colourSpace\":{\"type\":\"string\",\"const\":\"oklab\"},\"direction\":{\"type\":\"string\",\"enum\"",
129
+ ":[\"ascending\",\"descending\"]},\"lightnessRange\":{\"type\":\"object\",\"properties\":{\"max\":{\"type\":\"number\",\"const\":1},\"min\":{\"type\":\"number\",\"const\":0}},\"required\":[\"max\",\"min\"]},\"missingValues\":{\"type\":\"string\",\"const\":\"last\"},\"requested\":{\"type\":\"string\",\"enum\":[\"relevance\",\"lightness_asc\",\"lightness_desc\"]},\"tieBreak\":{\"type\":\"string\",\"const\":\"variantId_asc\"}},\"required\":[\"anchorColourBasis\",\"applied\",\"colourSpace\",\"direction\",\"lightnessRange\",\"missingValues\",\"requested\",\"tieBreak\"]},\"PostSourceMaterialCommentResponse\":{\"type\":\"object\",\"properties\":{\"sourceId\":{\"type\":\"string\",\"description\":\"The file the comment hangs off (`smf_…`).\"},\"comment\":{\"$ref\":\"#/$defs/StoredSourceMaterialComment\"}},\"required\":[\"sourceId\",\"comment\"]},\"ProductDocumentPage\":{\"type\":\"object\",\"properties\":{\"coverage\":{\"type\":\"object\",\"properties\":{\"productUnion\":{\"type\":\"object\",\"properties\":{\"declaredCount\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},{\"type\":\"null\"}]},\"exact\":{\"type\":\"boolean\"},\"readableCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"state\":{\"type\":\"string\",\"enum\":[\"available\",\"none_declared\",\"not_ingested\",\"unavailable_source\",\"dead_link\",\"failed_ingest\"]}},\"required\":[\"declaredCount\",\"exact\",\"readableCount\",\"state\"]},\"requestedVariant\":{\"type\":\"object\",\"properties\":{\"declaredCount\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},{\"type\":\"null\"}]},\"exact\":{\"type\":\"boolean\"},\"readableCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"state\":{\"type\":\"string\",\"enum\":[\"available\",\"none_declared\",\"not_ingested\",\"unavailable_source\",\"dead_link\",\"failed_ingest\"]}},\"required\":[\"declaredCount\",\"exact\",\"readableCount\",\"state\"]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"declaredCount\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},{\"type\":\"null\"}]},\"exact\":{\"type\":\"boolean\"},\"readableCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"scope\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"product\"}},\"required\":[\"id\",\"kind\"]},{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"variant\"}},\"required\":[\"id\",\"kind\"]}]},\"source\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"revision\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"id\",\"revision\"]},\"state\":{\"type\":\"string\",\"enum\":[\"available\",\"none_declared\",\"not_ingested\",\"unavailable_source\",\"dead_link\",\"failed_ingest\"]}},\"required\":[\"declaredCount\",\"exact\",\"readableCount\",\"scope\",\"source\",\"state\"]}}},\"required\":[\"productUnion\",\"requestedVariant\",\"sources\"]},\"documents\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"appliesToRequestedVariant\":{\"type\":\"boolean\"},\"contentType\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"declarations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"readable\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"product\"}},\"required\":[\"id\",\"kind\"]},{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"variant\"}},\"required\":[\"id\",\"kind\"]}]},\"source\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"revision\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"id\",\"revision\"]},\"status\":{\"type\":\"string\",\"enum\":[\"downloaded\",\"linked_not_downloaded\",\"unavailable_source\",\"dead_link\",\"failed_ingest\"]}},\"required\":[\"readable\",\"scope\",\"source\",\"status\"]}},\"declaredScopes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"product\"}},\"required\":[\"id\",\"kind\"]},{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"kind\":{\"type\":\"string\",\"const\":\"variant\"}},\"required\":[\"id\",\"kind\"]}]}},\"docu",
130
+ "mentType\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"fileExtension\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"id\":{\"type\":\"string\",\"minLength\":1},\"originalName\":{\"type\":\"string\",\"minLength\":1},\"scope\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"inherited\":{\"type\":\"boolean\"},\"kind\":{\"type\":\"string\",\"enum\":[\"product\",\"variant\"]}},\"required\":[\"id\",\"inherited\",\"kind\"]},\"source\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"string\",\"minLength\":1},\"id\":{\"type\":\"string\",\"minLength\":1},\"revision\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"id\",\"revision\"]},\"status\":{\"type\":\"string\",\"enum\":[\"downloaded\",\"linked_not_downloaded\",\"unavailable_source\",\"dead_link\",\"failed_ingest\"]},\"url\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"variantAttribution\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}}},\"required\":[\"appliesToRequestedVariant\",\"contentType\",\"declarations\",\"declaredScopes\",\"documentType\",\"fileExtension\",\"id\",\"originalName\",\"scope\",\"source\",\"status\",\"url\",\"variantAttribution\"]}},\"nextCursor\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"type\":\"null\"}]},\"totalDocuments\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"variantId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"coverage\",\"documents\",\"nextCursor\",\"totalDocuments\",\"variantId\"]},\"PublicRun\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"capabilityKind\":{\"type\":\"string\",\"enum\":[\"agent\",\"tool\",\"workflow\"]},\"capabilityId\":{\"type\":\"string\"},\"clientReference\":{\"type\":[\"string\",\"null\"]},\"status\":{\"type\":\"string\",\"enum\":[\"queued\",\"claimed\",\"running\",\"suspended\",\"succeeded\",\"failed\",\"canceled\"]},\"redactedInputJson\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},\"redactedOutputJson\":{\"anyOf\":[{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},{\"type\":\"null\"}]},\"usageJson\":{\"anyOf\":[{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},{\"type\":\"null\"}]},\"artifactRefs\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\"},\"ref\":{\"type\":\"string\"}},\"required\":[\"kind\",\"ref\"]}},{\"type\":\"null\"}]},\"failureJson\":{\"anyOf\":[{\"$ref\":\"#/$defs/PublicRunFailure\"},{\"type\":\"null\"}]},\"suspensionPayload\":{\"description\":\"The current typed question payload while `status` is `suspended`; null otherwise. The same exact payload is retained on the `suspended` ledger event.\",\"anyOf\":[{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},{\"type\":\"null\"}]},\"suspensionStepId\":{\"description\":\"The step awaiting input while `status` is `suspended` — pass it back as `stepId` when resuming, so a stale client cannot resume a step the run has already moved past. Read `suspensionPayload` for the current typed question. The same exact payload is retained on the `suspended` ledger event for event-stream consumers.\",\"type\":[\"string\",\"null\"]},\"eventCursor\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"attempts\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"startedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},{\"type\":\"null\"}]},\"cancellationRequestedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},{\"type\":\"null\"}]},\"completedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)",
131
+ "|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},{\"type\":\"null\"}]},\"createdAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"}},\"required\":[\"id\",\"capabilityKind\",\"capabilityId\",\"clientReference\",\"status\",\"redactedInputJson\",\"redactedOutputJson\",\"usageJson\",\"artifactRefs\",\"failureJson\",\"suspensionPayload\",\"suspensionStepId\",\"eventCursor\",\"attempts\",\"startedAt\",\"cancellationRequestedAt\",\"completedAt\",\"createdAt\",\"updatedAt\"]},\"PublicRunFailure\":{\"type\":\"object\",\"properties\":{\"code\":{\"type\":\"string\"},\"message\":{\"type\":\"string\"},\"retryable\":{\"type\":\"boolean\"},\"detail\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}}},\"required\":[\"code\",\"message\",\"retryable\"]},\"PublicRunResponse\":{\"type\":\"object\",\"properties\":{\"run\":{\"$ref\":\"#/$defs/PublicRun\"}},\"required\":[\"run\"]},\"ResolveColourResponse\":{\"type\":\"object\",\"properties\":{\"alternatives\":{\"description\":\"Explicit manufacturer choices when a paint name is ambiguous; never selected automatically.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"code\":{\"type\":\"string\"},\"hex\":{\"type\":\"string\"},\"libraryId\":{\"type\":\"string\"},\"libraryName\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"query\":{\"type\":\"string\"}},\"required\":[\"hex\",\"libraryId\",\"libraryName\",\"name\",\"query\"]}},\"genericResolution\":{\"description\":\"Generic colour meaning only; paint identity is reported by match.\",\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"confidence\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"resolved\"},\"others\":{\"maxItems\":4,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]}},\"principal\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{",
132
+ "\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]},\"source\":{\"type\":\"string\",\"enum\":[\"name\",\"family\",\"composed\",\"hex\",\"reference\",\"semantic\"]}},\"required\":[\"confidence\",\"input\",\"kind\",\"others\",\"principal\",\"source\"]},{\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"unresolved\"},\"reason\":{\"type\":\"string\",\"enum\":[\"unknown-term\",\"ambiguous-modifier\",\"contradictory-modifiers\",\"unsupported-base\",\"empty-range\",\"unrepresentable-color\"]},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"input\",\"kind\",\"reason\",\"terms\"]}]},\"match\":{\"description\":\"The resolved colour, or null when nothing resolved.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"The resolved `#rrggbb` hex.\"},\"name\":{\"type\":\"string\",\"description\":\"The resolved display name (echoes the query when unnamed).\"},\"code\":{\"description\":\"The code the library gives the colour (e.g. \\\"OC-17\\\", \\\"7016\\\"). Present only on a library hit.\",\"type\":\"string\"},\"libraryId\":{\"description\":\"The ColorScope library the colour resolved in (e.g. \\\"benjamin-moore\\\", \\\"ral\\\"). A library is not necessarily a maker: read `libraryType`. Absent for a hex, and for a colour word or semantic match that resolved without a library.\",\"type\":\"string\"},\"libraryType\":{\"description\":\"The type ColorScope declares for `libraryId`: `brand` is a maker's paint, `reference` a colour standard (RAL, Pantone, HKS), `core` ColorScope's descriptive vocabulary. Present exactly when `libraryId` is. Only a `brand` hit is looked up in the catalogue.\",\"type\":\"string\",\"enum\":[\"brand\",\"consumer\",\"core\",\"reference\"]},\"matchTarget\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"hasSelection\":{\"type\":\"boolean\",\"const\":false},\"type\":{\"type\":\"string\",\"const\":\"none\"}},\"required\":[\"hasSelection\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"type\":{\"type\":\"string\",\"const\":\"oklab\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"range\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"representative\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"}},\"required\":[\"hex\"]},\"type\":{\"type\":\"string\",\"const\":\"range\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"range\",\"representative\",\"type\"]}]},\"variant\":{\"description\":\"Whether the named paint is a variant in the catalogue. Only a colour that resolved in a `brand` library is looked up. The lookup is exact (maker paint names and codes), global, and independent of `corpusScope`, which only sets each variant's `inScope`.\",\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\"],\"description\":\"The variant's brand exactly as stored, suspect or not.\"},\"inScope\":{\"description\":\"Whether this variant is in the requested `corpusScope`. Null when no `corpusScope` was passed. The lookup itself is neve",
133
+ "r narrowed by scope.\",\"type\":[\"boolean\",\"null\"]},\"parentageSuspect\":{\"type\":\"boolean\",\"description\":\"True when the stored brand is Samplize, a sampling channel, and the listing is not Samplize's own merchandise: the colour is another maker's, so do not report `brand` as who made it. The variant is still returned and still the right one for the name.\"},\"variantId\":{\"type\":\"string\",\"description\":\"The variant id. Opaque; never parse it.\"},\"status\":{\"type\":\"string\",\"const\":\"matched\",\"description\":\"The name is one maker's paint and one variant carries it.\"}},\"required\":[\"brand\",\"inScope\",\"parentageSuspect\",\"variantId\",\"status\"]},{\"type\":\"object\",\"properties\":{\"candidates\":{\"minItems\":2,\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"slug\"],\"description\":\"The variant's brand exactly as stored, suspect or not.\"},\"inScope\":{\"description\":\"Whether this variant is in the requested `corpusScope`. Null when no `corpusScope` was passed. The lookup itself is never narrowed by scope.\",\"type\":[\"boolean\",\"null\"]},\"parentageSuspect\":{\"type\":\"boolean\",\"description\":\"True when the stored brand is Samplize, a sampling channel, and the listing is not Samplize's own merchandise: the colour is another maker's, so do not report `brand` as who made it. The variant is still returned and still the right one for the name.\"},\"variantId\":{\"type\":\"string\",\"description\":\"The variant id. Opaque; never parse it.\"}},\"required\":[\"brand\",\"inScope\",\"parentageSuspect\",\"variantId\"]},\"description\":\"Every variant that carries the paint, catalogue order.\"},\"status\":{\"type\":\"string\",\"const\":\"ambiguous\",\"description\":\"The name is one maker's paint and more than one variant carries it, typically once per product line. Never picked between.\"}},\"required\":[\"candidates\",\"status\"]},{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"const\":\"not-in-catalogue\",\"description\":\"The name is one maker's paint and no variant in the catalogue carries it. A looked-up absence, distinct from `not-looked-up`.\"}},\"required\":[\"status\"]},{\"type\":\"object\",\"properties\":{\"reason\":{\"type\":\"string\",\"enum\":[\"reference-colour\",\"descriptive-colour\",\"no-paint-identity\",\"generic-colour\",\"several-paints\"],\"description\":\"`reference-colour`: the name resolved to a colour standard (RAL, Pantone, HKS), which no maker's variant carries. `descriptive-colour`: the name resolved to a descriptive colour (\\\"sage\\\", \\\"warm terracotta\\\"), not a paint. `no-paint-identity`: the name is not exactly any maker's paint name or code, or it is a hex. `generic-colour`: the name is a colour word makers also use as a paint name; qualify it with a maker. `several-paints`: the name is more than one maker's paint; qualify it with a maker.\"},\"status\":{\"type\":\"string\",\"const\":\"not-looked-up\",\"description\":\"The catalogue was not searched; there was no one maker's paint to find.\"}},\"required\":[\"reason\",\"status\"]}]}},\"required\":[\"hex\",\"name\",\"matchTarget\",\"variant\"]},{\"type\":\"null\"}]},\"rangeSamples\":{\"description\":\"The range drawn as a lightness ramp at the resolved colour's own hue and chroma, dark to light. Illustrative members of the range, never additional target colours.\",\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"genericResolution\",\"match\"]},\"ResolveResponse\":{\"type\":\"object\",\"properties\":{\"resolutions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"normalised\":{\"type\":\"string\",\"description\":\"The phrase in the single normalised form the resolvers fold to — the same `normalise` stage a search query passes through. Empty when the phrase was all punctuation.\"},\"phrase\":{\"type\":\"string\",\"description\":\"The phrase exactly as sent, so a caller can rejoin the batch by value.\"},\"resolved\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"ambiguity\":{\"description\":\"Present only when the resolver reported a runner-up. A small gap means the answer was nearly something else; when the resolver refused to break the tie, every tied reading is listed.\",\"type\":\"obj",
134
+ "ect\",\"properties\":{\"gap\":{\"type\":\"number\",\"description\":\"The leader's margin over the runner-up. 0 means a dead tie.\"}},\"required\":[\"gap\"]},\"confidence\":{\"description\":\"The resolver's own confidence in [0,1], present only when the underlying resolver produces one. ABSENT means the rung is the whole statement — an exact paint identity is an equality, not a score.\",\"type\":\"number\"},\"coverage\":{\"description\":\"How much of the catalogue stands behind this reading. ABSENT means coverage could not be determined for this reading — never that there is none; a measured nothing is `variants: 0`.\",\"type\":\"object\",\"properties\":{\"inCategory\":{\"description\":\"Whether the requested `category` holds ANY accepted value for the attribute behind this reading. Present only when the request named a category AND the answer could be determined — its absence is a statement about the measurement, never a `false`. FALSE means no criterion built on this reading can be satisfied inside that category at any rung of retrieval's relaxation ladder, however large `variants` is. The probe is ATTRIBUTE-level: `true` says the category holds some value for the attribute, not that it holds THIS value.\",\"type\":\"boolean\"},\"variants\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991,\"description\":\"How many variants carry this reading, CORPUS-WIDE and across every brand — never scoped to `category`, even when one was sent. 0 is a measured answer, not missing data: the word is in the vocabulary and the catalogue holds nothing under it. For an `attribute` reading over an ARRAY-valued attribute a variant is counted once per token it carries, so the figure is an upper bound on distinct variants there; it is exact for scalar attributes, exact for every `attribute_value`, and the zero is exact in every case.\"}},\"required\":[\"variants\"]},\"id\":{\"type\":\"string\",\"description\":\"The canonical token — OPAQUE. Hand it back verbatim; never parse, tidy or construct one. A `colour` / `attribute_value` id is namespaced `<dictionaryId>.<termId>`, because term ids are unique only within their dictionary.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"brand\",\"paint_identity\",\"colour\",\"category\",\"attribute\",\"attribute_value\",\"jurisdiction\",\"occupancy_group\"],\"description\":\"Which controlled vocabulary this resolution landed in.\"},\"rung\":{\"type\":\"string\",\"enum\":[\"exact\",\"alias\",\"lexical\"],\"description\":\"How the phrase matched: `exact` (it IS the token), `alias` (it IS a recorded alternative name), `lexical` (it resembles one above the resolver's confidence floor).\"},\"term\":{\"type\":\"string\",\"description\":\"The canonical display term, for showing a human.\"}},\"required\":[\"id\",\"kind\",\"rung\",\"term\"]},\"description\":\"Everything the phrase means, best first. Empty when it means nothing here.\"},\"unresolved\":{\"type\":\"boolean\",\"description\":\"TRUE when nothing resolved. Stated rather than inferred: a consumer that cannot see what failed to resolve cannot tell an absent word from a dropped one.\"}},\"required\":[\"normalised\",\"phrase\",\"resolved\",\"unresolved\"]},\"description\":\"One entry per phrase, in request order — never reordered, never deduplicated.\"}},\"required\":[\"resolutions\"]},\"SamplizeCataloguePage\":{\"type\":\"object\",\"properties\":{\"complete\":{\"type\":\"boolean\"},\"corpusScope\":{\"type\":\"string\",\"const\":\"samplizeCatalogue\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"}},\"required\":[\"name\",\"slug\"]},\"code\":{\"type\":\"string\"},\"collectionMemberships\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"handle\":{\"type\":\"string\"},\"observedAt\":{\"type\":[\"string\",\"null\"]},\"publisher\":{\"type\":\"string\",\"const\":\"Samplize\"},\"source\":{\"type\":\"string\",\"const\":\"algolia_shopify_products\"},\"sourceCollectionId\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"}},\"required\":[\"handle\",\"observedAt\",\"publisher\",\"source\",\"sourceCollectionId\",\"url\"]}},\"colourAnalysis\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},\"demand\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"observedAt\":{\"type\":[\"string\",\"null\"]},\"publ",
135
+ "isher\":{\"type\":\"string\",\"const\":\"Samplize\"},\"source\":{\"type\":\"string\",\"const\":\"algolia_shopify_products\"},\"sourceUrl\":{\"type\":\"string\"},\"field\":{\"type\":\"string\",\"const\":\"recently_ordered_count\"},\"grain\":{\"type\":\"string\",\"const\":\"shopify_variant\"},\"recentlyOrderedCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"sourceVariantId\":{\"type\":\"string\"},\"window\":{\"type\":\"null\"}},\"required\":[\"observedAt\",\"publisher\",\"source\",\"sourceUrl\",\"field\",\"grain\",\"recentlyOrderedCount\",\"sourceVariantId\",\"window\"]},{\"type\":\"null\"}]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9A-F]{6}$\"},\"hexObservations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"differsFromSelected\":{\"type\":\"boolean\"},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9A-F]{6}$\"},\"observedAt\":{\"type\":[\"string\",\"null\"]},\"publisher\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"sourceBasis\":{\"type\":\"string\"},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"differsFromSelected\",\"hex\",\"observedAt\",\"publisher\",\"source\",\"sourceBasis\",\"sourceUrl\"]}},\"hexSource\":{\"type\":\"object\",\"properties\":{\"publisher\":{\"type\":\"string\",\"const\":\"Samplize\"},\"source\":{\"type\":\"string\",\"const\":\"snowflake_product_tags\"},\"url\":{\"type\":\"string\"}},\"required\":[\"publisher\",\"source\",\"url\"]},\"lrv\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":100},{\"type\":\"null\"}]},\"lrvObservations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"observedAt\":{\"type\":[\"string\",\"null\"]},\"publisher\":{\"type\":\"string\",\"const\":\"Samplize\"},\"source\":{\"type\":\"string\",\"const\":\"algolia_shopify_products\"},\"sourceUrl\":{\"type\":\"string\"},\"field\":{\"type\":\"string\"},\"value\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100}},\"required\":[\"observedAt\",\"publisher\",\"source\",\"sourceUrl\",\"field\",\"value\"]}},\"lrvSource\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"observedAt\":{\"type\":[\"string\",\"null\"]},\"publisher\":{\"type\":\"string\",\"const\":\"Samplize\"},\"source\":{\"type\":\"string\",\"const\":\"algolia_shopify_products\"},\"sourceUrl\":{\"type\":\"string\"},\"field\":{\"type\":\"string\"},\"value\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100}},\"required\":[\"observedAt\",\"publisher\",\"source\",\"sourceUrl\",\"field\",\"value\"]},{\"type\":\"null\"}]},\"name\":{\"type\":\"string\"},\"oklab\":{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"}},\"required\":[\"L\",\"a\",\"b\"]},\"productId\":{\"type\":\"string\"},\"publishedHexes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"differsFromSelected\":{\"type\":\"boolean\"},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9A-F]{6}$\"},\"observedAt\":{\"type\":[\"string\",\"null\"]},\"publisher\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"sourceBasis\":{\"type\":\"string\"},\"sourceUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"differsFromSelected\",\"hex\",\"observedAt\",\"publisher\",\"source\",\"sourceBasis\",\"sourceUrl\"]}},\"sizeVariants\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"demand\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"observedAt\":{\"type\":[\"string\",\"null\"]},\"publisher\":{\"type\":\"string\",\"const\":\"Samplize\"},\"source\":{\"type\":\"string\",\"const\":\"algolia_shopify_products\"},\"sourceUrl\":{\"type\":\"string\"},\"field\":{\"type\":\"string\",\"const\":\"recently_ordered_count\"},\"grain\":{\"type\":\"string\",\"const\":\"shopify_variant\"},\"recentlyOrderedCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"sourceVariantId\":{\"type\":\"string\"},\"window\":{\"type\":\"null\"}},\"required\":[\"observedAt\",\"publisher\",\"source\",\"sourceUrl\",\"field\",\"grain\",\"recentlyOrderedCount\",\"sourceVariantId\",\"window\"]},{\"type\":\"null\"}]},\"inventoryAvailable\":{\"type\":\"boolean\"},\"price\":{\"type\":[\"number\",\"null\"]},\"sku\":{\"type\":[\"string\",\"null\"]},\"sourceVariantId\":{\"type\":\"string\"},\"title\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"demand\",\"inventoryAvailable\",\"price\",\"sku\",\"sourceVariantId\",\"title\"]}},\"sourceProductId\":{\"type\":\"string\"},\"url\":{\"type\":\"string\"},\"variantId\":{\"type\":\"string\"}},\"required\":[\"brand\",\"code\",\"collectionMemberships\",\"colourAnalysis\",\"demand\",\"hex\",\"hexObservations\",\"hexSource\",\"lrv\",\"lrvObservations\",\"lrvSource\",\"name\",\"oklab\",\"productId\",\"publishedHexes\",\"sizeVariants\",\"sourceProductId\",\"url\",\"variantId\"]}},\"nextCursor\":{\"type\":[\"string\",\"null",
136
+ "\"]},\"schemaVersion\":{\"type\":\"number\",\"const\":2},\"source\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},\"sourceVersion\":{\"type\":\"string\"},\"total\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"complete\",\"corpusScope\",\"items\",\"nextCursor\",\"schemaVersion\",\"source\",\"sourceVersion\",\"total\"]},\"SamplizeCatalogueSearchResponse\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"enum\":[\"published-colour-similarity\",\"description-retrieval\",\"image-colour-distribution\",\"named-colour-similarity\"]},\"countBasis\":{\"type\":\"string\",\"enum\":[\"complete-catalogue\",\"retrieved-pool\"]},\"counts\":{\"type\":\"object\",\"properties\":{\"family\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"lightness\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"intensity\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"brand\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}}},\"required\":[\"family\",\"lightness\",\"intensity\",\"brand\"]},\"dictionaryVersion\":{\"type\":\"string\"},\"eligibleCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"embeddingVersion\":{\"type\":\"string\"},\"groups\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"proportion\":{\"type\":\"number\"},\"quota\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"ids\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"shortfall\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"hex\",\"proportion\",\"quota\",\"ids\",\"shortfall\"]}},\"ids\":{\"maxItems\":100,\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"limited\":{\"type\":\"boolean\"},\"rankingVersion\":{\"type\":\"string\"},\"sourceVersion\":{\"type\":\"string\"},\"target\":{\"type\":\"object\",\"properties\":{\"code\":{\"type\":\"string\"},\"confidence\":{\"type\":\"number\"},\"hex\":{\"type\":\"string\"},\"libraryId\":{\"type\":\"string\"},\"matchTarget\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"hasSelection\":{\"type\":\"boolean\",\"const\":false},\"type\":{\"type\":\"string\",\"const\":\"none\"}},\"required\":[\"hasSelection\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"type\":{\"type\":\"string\",\"const\":\"oklab\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"type\"]},{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"},\"hasSelection\":{\"type\":\"boolean\",\"const\":true},\"label\":{\"type\":\"string\"},\"previewColors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"range\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"representative\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"}},\"required\":[\"hex\"]},\"type\":{\"type\":\"string\",\"const\":\"range\"}},\"required\":[\"L\",\"a\",\"b\",\"hasSelection\",\"label\",\"previewColors\",\"range\",\"representative\",\"type\"]}]},\"name\":{\"type\":\"string\"},\"ref\":{\"type\":\"string\"},\"resolution\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"confidence\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"resolved\"},\"others\":{\"maxItems\":4,\"type\":\"array\"",
137
+ ",\"items\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]}},\"principal\":{\"type\":\"object\",\"properties\":{\"band\":{\"type\":\"string\",\"enum\":[\"inside\",\"near\",\"far\"]},\"family\":{\"type\":\"string\",\"enum\":[\"white\",\"cream\",\"gray\",\"black\",\"beige\",\"taupe\",\"brown\",\"red\",\"orange\",\"yellow\",\"green\",\"teal\",\"blue\",\"purple\",\"pink\"]},\"hex\":{\"type\":\"string\",\"pattern\":\"^#[0-9a-f]{6}$\"},\"id\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\",\"minLength\":1},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0},{\"type\":\"number\",\"minimum\":0}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":360},{\"type\":\"number\",\"minimum\":0,\"maximum\":360}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1},{\"type\":\"number\",\"minimum\":0,\"maximum\":1}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"band\",\"family\",\"hex\",\"id\",\"name\",\"range\"]},\"source\":{\"type\":\"string\",\"enum\":[\"name\",\"family\",\"composed\",\"hex\",\"reference\",\"semantic\"]}},\"required\":[\"confidence\",\"input\",\"kind\",\"others\",\"principal\",\"source\"]},{\"type\":\"object\",\"properties\":{\"input\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\",\"const\":\"unresolved\"},\"reason\":{\"type\":\"string\",\"enum\":[\"unknown-term\",\"ambiguous-modifier\",\"contradictory-modifiers\",\"unsupported-base\",\"empty-range\",\"unrepresentable-color\"]},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"input\",\"kind\",\"reason\",\"terms\"]}]},\"source\":{\"type\":\"string\",\"enum\":[\"hex\",\"lexical-exact\",\"lexical-fuzzy\",\"semantic\"]}},\"required\":[\"hex\",\"ref\",\"source\"]}},\"required\":[\"basis\",\"countBasis\",\"counts\",\"ids\",\"limited\",\"sourceVersion\"]},\"SamplizeColorVecCache\":{\"type\":\"object\",\"properties\":{\"dictionaryVersion\":{\"type\":\"string\"},\"embeddingVersion\":{\"type\":\"string\",\"const\":\"oklch-anchor-quantiles-v12\"},\"generatedAt\":{\"type\":\"string\"},\"paints\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"family\":{\"type\":\"string\"},\"hex\":{\"type\":\"string\"},\"intensity\":{\"type\":\"string\"},\"lightness\":{\"type\":\"string\"},\"oklab\":{\"type\":\"object\",\"properties\":{\"L\":{\"type\":\"number\"},\"a\":{\"type\":\"number\"},\"b\":{\"type\":\"number\"}},\"required\":[\"L\",\"a\",\"b\"]},\"variantId\":{\"type\":\"string\"},\"vector\":{\"type\":\"string\",\"description\":\"128 IEEE754 float32 values, little endian, base64 encoded. Decode through the SDK index.\"}},\"required\":[\"brand\",\"family\",\"hex\",\"intensity\",\"lightness\",\"oklab\",\"variantId\",\"vector\"]}},\"rankingVersion\":{\"type\":\"string\",\"const\":\"solid-colorvec-cosine-v2\"},\"sourceVersion\":{\"type\":\"string\"}},\"required\":[\"dictionaryVersion\",\"embeddingVersion\",\"generatedAt\",\"paints\",\"rankingVersion\",\"sourceVersion\"]},\"SchemaAttributesResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"attributes\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"typ",
138
+ "e\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"supersededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"valueKind\":{\"type\":\"string\",\"enum\":[\"string\",\"text\",\"integer\",\"number\",\"boolean\",\"enum\",\"object\",\"reference\"]},\"quantityKind\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"length\",\"area\",\"volume\",\"mass\",\"time\",\"temperature\",\"currency\",\"ratio\",\"density\",\"coverage\",\"emissions\",\"force\",\"thermal_conductivity\",\"power\",\"voltage\",\"current\",\"frequency\",\"luminous_flux\",\"color_temperature\",\"count\",\"unitless\"]},{\"type\":\"null\"}]},\"canonicalUnitId\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},{\"type\":\"null\"}]},\"acceptedUnitIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"}},\"valueDictionaryId\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},{\"type\":\"null\"}]},\"defaultSourceRequirementId\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},{\"type\":\"null\"}]},\"externalMappings\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"mappingType\":{\"type\":\"string\",\"enum\":[\"direct\",\"transform\",\"derived\",\"classification\",\"semantic\"]},\"matchStrength\":{\"type\":\"string\",\"enum\":[\"exact\",\"close\",\"broad\",\"narrow\",\"related\"]},\"notes\":{\"type\":\"string\"},\"target\":{\"type\":\"string\",\"enum\":[\"schema_org\",\"ifc_pset\",\"bsdd\",\"iso_23387\",\"eclass\",\"gs1_gdm\",\"gdsn\",\"etim\",\"uniclass\"]},\"targetPath\":{\"type\":\"string\"}},\"required\":[\"mappingType\",\"target\",\"targetPath\"]}},\"searchFacet\":{\"type\":\"boolean\"},\"comparable\":{\"type\":\"boolean\"},\"usedInBlocks\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"}},\"enumValues\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"shapeId\":{\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},{\"type\":\"null\"}]},\"domainContract\":{\"type\":\"object\",\"properties\":{\"canonicalGrain\":{\"type\":\"string\",\"enum\":[\"brand\",\"product_family\",\"product\",\"variant\",\"option_value\"]},\"evidenceConflictPolicy\":{\"type\":\"string\",\"enum\":[\"review-required\",\"stronger-source-basis-then-recency\",\"latest-within-authority\"]},\"physicalStorage\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"attribute_values\"},\"requiresFamilyAuthority\":{\"type\":\"boolean\"},\"scope\":{\"type\":\"string\",\"enum\":[\"brand\",\"product\",\"variant\"]}},\"required\":[\"kind\",\"requiresFamilyAuthority\",\"scope\"]},{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"option_corpus\"}},\"required\":[\"kind\"]}]},\"sourceRequirementId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"canonicalGrain\",\"evidenceConflictPolicy\",\"physicalStorage\",\"sourceRequirementId\"]}},\"required\":[\"id\",\"lifecycle\",\"semanticId\",\"name\",\"description\",\"valueKind\",\"quantityKind\",\"canonicalUnitId\",\"acceptedUnitIds\",\"valueDictionaryId\",\"defaultSourceRequirementId\",\"externalMappings\",\"searchFacet\",\"comparable\",\"usedInBlocks\",\"enumValues\",\"shapeId\",\"domainContract\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaBlocksResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"blocks\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"type\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"supersededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"attributeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"}}},\"required\":[\"id\",\"lifecycle\",\"semanticId\",\"name\",\"description\",\"attributeIds\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"requi",
139
+ "red\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaMappingsResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"mappings\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"canonicalPath\":{\"type\":\"string\"},\"mappingType\":{\"type\":\"string\",\"enum\":[\"direct\",\"transform\",\"derived\",\"classification\",\"semantic\"]},\"matchStrength\":{\"type\":\"string\",\"enum\":[\"exact\",\"close\",\"broad\",\"narrow\",\"related\"]},\"notes\":{\"type\":\"string\"},\"subjectId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"subjectKind\":{\"type\":\"string\",\"enum\":[\"attribute\",\"block\",\"product_type\",\"template\",\"unit\",\"value_dictionary\",\"value_dictionary_term\"]},\"target\":{\"type\":\"string\",\"enum\":[\"schema_org\",\"ifc_pset\",\"bsdd\",\"iso_23387\",\"eclass\",\"gs1_gdm\",\"gdsn\",\"etim\",\"uniclass\"]},\"targetPath\":{\"type\":\"string\"}},\"required\":[\"canonicalPath\",\"mappingType\",\"matchStrength\",\"target\",\"targetPath\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaProductTypeTemplatesResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"productTypeTemplates\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"applicability\":{\"type\":\"string\",\"enum\":[\"required\",\"recommended\",\"optional\",\"unusual\"]},\"blockId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"completenessWeight\":{\"type\":\"number\"},\"notes\":{\"type\":\"string\"},\"optionalAttributes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"requiredAttributes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"sourceRequirementId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"}},\"required\":[\"applicability\",\"blockId\"]}},\"defaultSourceRequirementId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"name\":{\"type\":\"string\"},\"notes\":{\"type\":\"string\"},\"productTypeId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"type\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"supersededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"blocks\",\"id\",\"name\",\"productTypeId\",\"lifecycle\",\"semanticId\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaProductTypesResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"productTypes\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"blocks\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"applicability\":{\"type\":\"string\",\"enum\":[\"required\",\"recommended\",\"optional\",\"unusual\"]},\"blockId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"completenessWeight\":{\"type\":\"number\"},\"notes\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"},\"optionalAttributes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"requiredAttributes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"sourceRequirementId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"}},\"required\":[\"applicability\",\"blockId\"]}},\"description\":{\"type\":\"string\"},\"formerNames\":{\"description\":\"Display names this type carried before a rename, kept so they still find it.\",\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"name\":{\"type\":\"string\"},\"parentProductTypeGroupId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"productTypeSpecificAttributes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"verticalId\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"type\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"su",
140
+ "persededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"blocks\",\"id\",\"name\",\"verticalId\",\"lifecycle\",\"semanticId\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaSourceRequirementsResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"sourceRequirements\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"allowedSourceTypes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"manufacturer_page\",\"technical_data_sheet\",\"safety_data_sheet\",\"test_report\",\"certificate\",\"image\",\"commerce_page\",\"catalog_pdf\",\"derived_analysis\"]}},\"allowedMethods\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"manual_review\",\"agent_extract\",\"pdf_extract\",\"image_analysis\",\"html_scrape\",\"structured_feed\",\"calculation\"]}},\"minConfidence\":{\"type\":\"number\"},\"reviewRequired\":{\"type\":\"boolean\"},\"freshnessDays\":{\"type\":\"number\"},\"sourceBasis\":{\"type\":\"string\",\"enum\":[\"declared\",\"derived\"]},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"type\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"supersededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\",\"description\",\"allowedSourceTypes\",\"allowedMethods\",\"minConfidence\",\"reviewRequired\",\"lifecycle\",\"semanticId\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaUnitsResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"units\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"acceptedSourceUnits\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"conversionToCanonical\":{\"type\":\"object\",\"properties\":{\"factor\":{\"type\":\"number\"},\"offset\":{\"type\":\"number\"}},\"required\":[\"factor\"]},\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"name\":{\"type\":\"string\"},\"notes\":{\"type\":\"string\"},\"quantityKind\":{\"type\":\"string\",\"enum\":[\"length\",\"area\",\"volume\",\"mass\",\"time\",\"temperature\",\"currency\",\"ratio\",\"density\",\"coverage\",\"emissions\",\"force\",\"thermal_conductivity\",\"power\",\"voltage\",\"current\",\"frequency\",\"luminous_flux\",\"color_temperature\",\"count\",\"unitless\"]},\"qudtUnit\":{\"type\":\"string\",\"format\":\"uri\"},\"symbol\":{\"type\":\"string\"},\"uncefactCode\":{\"type\":\"string\",\"pattern\":\"^[0-9A-Z]{2,3}$\"},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"type\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"supersededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"name\",\"quantityKind\",\"symbol\",\"lifecycle\",\"semanticId\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaValueDictionariesResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"valueDictionaries\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"authority\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"taxonomy\"},\"system\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"kind\",\"system\"]},{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"colorscope\"},\"system\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"kind\",\"system\"]},{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"materialgraph\"},\"system\":{\"type\":\"string\",\"const\":\"@materialgraph/schema\"}},\"required\":[\"kind\",\"system\"]},{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"external-standard\"},\"system\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"kind\",\"system\"]}]},\"description\":{\"type\":\"",
141
+ "string\"},\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"},\"name\":{\"type\":\"string\"},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"minLength\":1},\"label\":{\"type\":\"string\"},\"aliases\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"broaderTermId\":{\"type\":\"string\",\"minLength\":1},\"definition\":{\"type\":\"string\",\"minLength\":1},\"externalMappings\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"mappingType\":{\"type\":\"string\",\"enum\":[\"direct\",\"transform\",\"derived\",\"classification\",\"semantic\"]},\"matchStrength\":{\"type\":\"string\",\"enum\":[\"exact\",\"close\",\"broad\",\"narrow\",\"related\"]},\"notes\":{\"type\":\"string\"},\"target\":{\"type\":\"string\",\"enum\":[\"schema_org\",\"ifc_pset\",\"bsdd\",\"iso_23387\",\"eclass\",\"gs1_gdm\",\"gdsn\",\"etim\",\"uniclass\"]},\"targetPath\":{\"type\":\"string\"}},\"required\":[\"mappingType\",\"target\",\"targetPath\"]}},\"metadata\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":[\"string\",\"number\",\"boolean\",\"null\"]}},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"type\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"supersededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"id\",\"label\",\"lifecycle\",\"semanticId\"]}},\"lifecycle\":{\"type\":\"object\",\"properties\":{\"deprecatedIn\":{\"type\":\"string\"},\"introducedIn\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"draft\",\"active\",\"deprecated\"]},\"supersededBy\":{\"type\":\"string\"}},\"required\":[\"introducedIn\",\"status\"]},\"semanticId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"authority\",\"description\",\"id\",\"name\",\"terms\",\"lifecycle\",\"semanticId\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SchemaVerticalsResponse\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"const\":\"verticals\"},\"schemaVersion\":{\"type\":\"string\"},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"description\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"id\":{\"type\":\"string\",\"minLength\":1,\"pattern\":\"^[a-z][a-z0-9_]*$\"}},\"required\":[\"description\",\"displayName\",\"id\"]}},\"totalCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"kind\",\"schemaVersion\",\"items\",\"totalCount\"]},\"SearchByGradientResponse\":{\"type\":\"object\",\"properties\":{\"categoryGate\":{\"description\":\"The category gate the page ran under: the caller's `category`, or the surface-material default (`defaulted: true`). ABSENT only on responses stored before the one search.\",\"type\":\"object\",\"properties\":{\"defaulted\":{\"description\":\"Present when the caller named no category: a colour page then holds surface materials only (the `materials` product-type groups, listed in `requested`), so lights, taps and furniture do not answer a colour question. Send `?category=` to search other groups.\",\"type\":\"boolean\",\"const\":true},\"requested\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Category names or keys the caller asked the hard gate to keep.\"},\"requiresAcceptedPrimaryProductType\":{\"type\":\"boolean\",\"const\":true,\"description\":\"The gate admits a variant only through an accepted primary product type.\"},\"unclassifiedVariantsExcluded\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Variants without an accepted primary product type were ineligible, not proven to belong outside the requested category.\"}},\"required\":[\"requested\",\"requiresAcceptedPrimaryProductType\",\"unclassifiedVariantsExcluded\"]},\"corpusScope\":{\"type\":\"object\",\"properties\":{\"description\":{\"type\":\"string\",\"description\":\"What the scope admits, in one sentence, for a human reader.\"},\"scope\":{\"type\":\"string\",\"enum\":[\"all\",\"samplizeCatalogue\",\"materialBankOrderable\",\"materialBankNaOrderable\",\"materialBankNaAndCatalogue\",\"materialBankEuOrderable\",\"designShopOrderable\"],\"description\":\"Which corpus to answer from. samplizeCatalogue admits published US paint colours regardless of stock. ABSENT (or 'all') means the WHOLE GRAPH — every material MaterialGraph",
142
+ " knows, orderable or not; absence is never a narrower default. Three transaction-oriented scopes gate on governed CHANNEL membership: 'materialBankNaOrderable' (Material Bank North America, ~277,000 materials), 'materialBankEuOrderable' (Material Bank Europe, ~65,000) and 'designShopOrderable' (DesignShop, ~34,000, with the products DesignShop hides from browse excluded). 'materialBankNaAndCatalogue' is the one-query union of Material Bank North America and the governed Catalogue editorial discovery corpus; that union does not by itself claim every member is transactable. 'materialBankOrderable' is NOT one of them: it selects materials carrying a Material Bank identity, which is a provenance signal rather than a channel one, and it admits 98.4% of the graph — use it to exclude crawl-sourced brands, not to mean orderable. A scope answers membership in its named governed corpus, never suitability: scope on channel, then refine on sector. Every scope is applied INSIDE the query: `limit` fills with eligible rows and `counts` describe the scoped corpus, which post-filtering a page cannot give you. An unknown value is a 400 naming it, never a silent fall back to the whole graph.\"}},\"required\":[\"description\",\"scope\"],\"description\":\"The corpus this page AND its `counts` were drawn from. Present only when a narrowing scope applied — absence means the whole graph. Read it alongside `counts`: a short page under a scope is a small SCOPED corpus, not a truncated one.\"},\"count\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"hueGate\":{\"description\":\"The thresholds behind each sample receipt's `hueCompatible`. ABSENT only on responses stored before MG-2295.\",\"type\":\"object\",\"properties\":{\"achromaticQueryChroma\":{\"type\":\"number\",\"description\":\"Below this query chroma the colour is treated as achromatic and any hue is admitted.\"},\"minChromaRatio\":{\"type\":\"number\",\"description\":\"A swatch must carry at least this share of the query colour's chroma.\"},\"minHueCosine\":{\"type\":\"number\",\"description\":\"Floor on the cosine agreement between the two hue vectors.\"}},\"required\":[\"achromaticQueryChroma\",\"minChromaRatio\",\"minHueCosine\"]},\"matches\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"category\":{\"description\":\"The catalog GROUP this material belongs to — Flooring, Textile Materials, Coatings — or null when it has no accepted primary product type. A palette query is cross-category BY INTENT (a scheme, not one aisle), so the category is what says whether a result answers the question at all: 30 of 40 results for one real palette were Coatings while every one of the 14 groups held something closer. Null means UNKNOWN, not uncategorised, and it is not rare — group by it, but keep null as its own bucket rather than dropping it.\",\"type\":[\"string\",\"null\"]},\"color\":{\"type\":[\"string\",\"null\"]},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"palette\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"name\":{\"description\":\"colorscope's name for the swatch.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"Share of the image this swatch occupies.\"}},\"required\":[\"hex\",\"name\",\"proportion\"]},\"description\":\"The candidate's FULL extracted palette — every stored swatch, uncapped and in stored order, the same list the material's own record reports. This is the whole evidence set scored against; the per-colour `matched` swatch is one entry drawn from it. A ONE-swatch palette means the candidate's image is genuinely monochrome, NOT that the list was trimmed — and it is the common case here, because a page ordered by nearest swatch favours flat images, whose one swatch can land arbitrarily close to any colour.\"},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":[\"string\",\"null\"]},\"retired\":{\"type\":\"boolean\",\"description\":\"MB has retired or hidden ",
143
+ "this SKU.\"},\"score\":{\"type\":\"number\",\"description\":\"Closeness in [0,1] of the material's own colour on the search index to the searched colour, the page's order. It falls from 1 to 0 across a fixed OKLab span; not a confidence or a percentage.\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]},\"coverage\":{\"type\":\"number\",\"description\":\"Thirds of the path where the material holds a swatch at least 0.5 close to a sampled point, over 3: 1 spans the whole transition. A receipt; it does not reorder the page.\"},\"samples\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"colourScore\":{\"type\":\"number\",\"description\":\"Closeness in [0,1] of the matched swatch to the queried colour, from plain OKLab distance with lightness counted in full: 1 is the same colour, 0 is 0.3 or more apart. Not a confidence or a percentage.\"},\"matched\":{\"description\":\"The ONE swatch of the candidate's `palette` that produced this score — evidence for THIS queried colour, not the candidate's colours as a whole (that is `palette`). Null when no swatch produced a score.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"name\":{\"description\":\"colorscope's name for the swatch.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"Share of the image this swatch occupies.\"}},\"required\":[\"hex\",\"name\",\"proportion\"]},{\"type\":\"null\"}]},\"proportionScore\":{\"type\":\"number\",\"description\":\"Proportion agreement in [0,1]. Always 1 on the one search: no proportion is applied.\"},\"hueCompatible\":{\"description\":\"Whether `matched` has a hue compatible with the queried colour, by colorscope's `isHueCompatible` at the response's `hueGate` thresholds. A flag, never a gate: an incompatible swatch still scores and still ranks. ABSENT when there is no `matched` swatch.\",\"type\":\"boolean\"},\"queryHex\":{\"type\":\"string\",\"description\":\"The queried colour, normalised to `#rrggbb`.\"},\"score\":{\"type\":\"number\",\"description\":\"The receipt's score: `colourScore` × `proportionScore`, so `colourScore` on the one search.\"}},\"required\":[\"colourScore\",\"matched\",\"proportionScore\",\"queryHex\",\"score\"]},\"description\":\"One receipt per sampled point along the path, in path order.\"}},\"required\":[\"brand\",\"brandSlug\",\"category\",\"color\",\"imageUrl\",\"palette\",\"product\",\"productId\",\"retired\",\"score\",\"variantId\",\"variantName\",\"coverage\",\"samples\"]},\"description\":\"Matches, best score first.\"},\"query\":{\"type\":\"object\",\"properties\":{\"samples\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The sampled path points the search actually ran against.\"},\"stops\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The stops, normalised to `#rrggbb`.\"}},\"required\":[\"samples\",\"stops\"],\"description\":\"Echo of the resolved query.\"}},\"required\":[\"count\",\"matches\",\"query\"]},\"SearchByPaletteResponse\":{\"type\":\"object\",\"properties\":{\"categoryGate\":{\"description\":\"The category gate the page ran under: the caller's `category`, or the surface-material default (`defaulted: true`). ABSENT only on responses stored before the one search.\",\"type\":\"object\",\"properties\":{\"defaulted\":{\"description\":\"Present when the caller named no category: a colour page then holds surface materials only (the `materials` product-type groups, listed in `requested`), so lights, taps and furniture do not answer a colour question. Send `?category=` to search other groups.\",\"type\":\"boolean\",\"const\":true},\"requested\":{\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Category names or keys the caller asked the hard gate to keep.\"},\"requiresAcceptedPrimaryProductType\":{\"type\":\"boolean\",\"const\":true,\"description\":\"The gate admits a variant only through an accepted primary product type.\"},\"unclassifiedVariantsExcluded\":{\"type\":\"boolean\",\"const\":true,\"description\":\"Variants without an accepted primary product type were ineligible, not proven to belong outside the requested category.\"}},\"required\":[\"requested\",\"requiresAcceptedPrimaryProductType\",\"unclassifiedVariantsExcluded\"]},\"corpusScope\":{\"type\":\"object\",\"properties\":{\"description\":{\"type\":\"string\",\"description\":\"What the sco",
144
+ "pe admits, in one sentence, for a human reader.\"},\"scope\":{\"type\":\"string\",\"enum\":[\"all\",\"samplizeCatalogue\",\"materialBankOrderable\",\"materialBankNaOrderable\",\"materialBankNaAndCatalogue\",\"materialBankEuOrderable\",\"designShopOrderable\"],\"description\":\"Which corpus to answer from. samplizeCatalogue admits published US paint colours regardless of stock. ABSENT (or 'all') means the WHOLE GRAPH — every material MaterialGraph knows, orderable or not; absence is never a narrower default. Three transaction-oriented scopes gate on governed CHANNEL membership: 'materialBankNaOrderable' (Material Bank North America, ~277,000 materials), 'materialBankEuOrderable' (Material Bank Europe, ~65,000) and 'designShopOrderable' (DesignShop, ~34,000, with the products DesignShop hides from browse excluded). 'materialBankNaAndCatalogue' is the one-query union of Material Bank North America and the governed Catalogue editorial discovery corpus; that union does not by itself claim every member is transactable. 'materialBankOrderable' is NOT one of them: it selects materials carrying a Material Bank identity, which is a provenance signal rather than a channel one, and it admits 98.4% of the graph — use it to exclude crawl-sourced brands, not to mean orderable. A scope answers membership in its named governed corpus, never suitability: scope on channel, then refine on sector. Every scope is applied INSIDE the query: `limit` fills with eligible rows and `counts` describe the scoped corpus, which post-filtering a page cannot give you. An unknown value is a 400 naming it, never a silent fall back to the whole graph.\"}},\"required\":[\"description\",\"scope\"],\"description\":\"The corpus this page AND its `counts` were drawn from. Present only when a narrowing scope applied — absence means the whole graph. Read it alongside `counts`: a short page under a scope is a small SCOPED corpus, not a truncated one.\"},\"count\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"hueGate\":{\"description\":\"The thresholds behind each receipt's `hueCompatible`. ABSENT only on responses stored before MG-2295.\",\"type\":\"object\",\"properties\":{\"achromaticQueryChroma\":{\"type\":\"number\",\"description\":\"Below this query chroma the colour is treated as achromatic and any hue is admitted.\"},\"minChromaRatio\":{\"type\":\"number\",\"description\":\"A swatch must carry at least this share of the query colour's chroma.\"},\"minHueCosine\":{\"type\":\"number\",\"description\":\"Floor on the cosine agreement between the two hue vectors.\"}},\"required\":[\"achromaticQueryChroma\",\"minChromaRatio\",\"minHueCosine\"]},\"matches\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brand\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"category\":{\"description\":\"The catalog GROUP this material belongs to — Flooring, Textile Materials, Coatings — or null when it has no accepted primary product type. A palette query is cross-category BY INTENT (a scheme, not one aisle), so the category is what says whether a result answers the question at all: 30 of 40 results for one real palette were Coatings while every one of the 14 groups held something closer. Null means UNKNOWN, not uncategorised, and it is not rare — group by it, but keep null as its own bucket rather than dropping it.\",\"type\":[\"string\",\"null\"]},\"color\":{\"type\":[\"string\",\"null\"]},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"palette\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"name\":{\"description\":\"colorscope's name for the swatch.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"Share of the image this swatch occupies.\"}},\"required\":[\"hex\",\"name\",\"proportion\"]},\"description\":\"The candidate's FULL extracted palette — every stored swatch, uncapped and in stored order, the same list the material's own record reports. This is the whole evidence set scored against; the per-colour `matched` swatch is one ",
145
+ "entry drawn from it. A ONE-swatch palette means the candidate's image is genuinely monochrome, NOT that the list was trimmed — and it is the common case here, because a page ordered by nearest swatch favours flat images, whose one swatch can land arbitrarily close to any colour.\"},\"product\":{\"type\":\"string\"},\"productId\":{\"type\":[\"string\",\"null\"]},\"retired\":{\"type\":\"boolean\",\"description\":\"MB has retired or hidden this SKU.\"},\"score\":{\"type\":\"number\",\"description\":\"Closeness in [0,1] of the material's own colour on the search index to the searched colour, the page's order. It falls from 1 to 0 across a fixed OKLab span; not a confidence or a percentage.\"},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]},\"colours\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"colourScore\":{\"type\":\"number\",\"description\":\"Closeness in [0,1] of the matched swatch to the queried colour, from plain OKLab distance with lightness counted in full: 1 is the same colour, 0 is 0.3 or more apart. Not a confidence or a percentage.\"},\"matched\":{\"description\":\"The ONE swatch of the candidate's `palette` that produced this score — evidence for THIS queried colour, not the candidate's colours as a whole (that is `palette`). Null when no swatch produced a score.\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"name\":{\"description\":\"colorscope's name for the swatch.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"Share of the image this swatch occupies.\"}},\"required\":[\"hex\",\"name\",\"proportion\"]},{\"type\":\"null\"}]},\"proportionScore\":{\"type\":\"number\",\"description\":\"Proportion agreement in [0,1]. Always 1 on the one search: no proportion is applied.\"},\"hueCompatible\":{\"description\":\"Whether `matched` has a hue compatible with the queried colour, by colorscope's `isHueCompatible` at the response's `hueGate` thresholds. A flag, never a gate: an incompatible swatch still scores and still ranks. ABSENT when there is no `matched` swatch.\",\"type\":\"boolean\"},\"queryHex\":{\"type\":\"string\",\"description\":\"The queried colour, normalised to `#rrggbb`.\"},\"score\":{\"type\":\"number\",\"description\":\"The receipt's score: `colourScore` × `proportionScore`, so `colourScore` on the one search.\"}},\"required\":[\"colourScore\",\"matched\",\"proportionScore\",\"queryHex\",\"score\"]},\"description\":\"One receipt per queried colour, in query order.\"}},\"required\":[\"brand\",\"brandSlug\",\"category\",\"color\",\"imageUrl\",\"palette\",\"product\",\"productId\",\"retired\",\"score\",\"variantId\",\"variantName\",\"colours\"]},\"description\":\"Matches, best score first.\"},\"query\":{\"type\":\"object\",\"properties\":{\"colours\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"proportion\":{\"type\":\"number\"},\"weight\":{\"type\":\"number\"}},\"required\":[\"hex\"]}},\"droppedColours\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"proportion\":{\"type\":\"number\"},\"weight\":{\"type\":\"number\"}},\"required\":[\"hex\"]},\"description\":\"Colours not searched: every colour after the first, since a palette is ordered by its first colour alone, and any colour whose stated share is below 5%. These colours were not retrieved or scored.\"},\"logic\":{\"type\":\"string\",\"enum\":[\"all\",\"any\"]},\"outcome\":{\"type\":\"string\",\"enum\":[\"matches\",\"no_effective_colours\"],\"description\":\"`no_effective_colours` means every colour was omitted for a stated share below 5%, so no search ran.\"}},\"required\":[\"colours\",\"droppedColours\",\"logic\",\"outcome\"],\"description\":\"Echo of the resolved query — every colour normalised to `#rrggbb`.\"}},\"required\":[\"count\",\"matches\",\"query\"]},\"SearchResponse\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"resultId\":{\"type\":\"string\",\"description\":\"This exact hit's attribution key — `<responseId>:<rank>`, where rank is 1-based within THIS response. Unique across pages, because each page is its own response with its own id. Store it verbatim next to the outcome; it is opaque, and `attribution.responseId` is the field to group by",
146
+ ".\"},\"variantId\":{\"type\":\"string\"},\"brand\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"productId\":{\"type\":[\"string\",\"null\"]},\"materialBankId\":{\"description\":\"The variant's Material Bank SKU — the ONE EXTERNAL identifier on a result, in contrast to the OPAQUE `variantId`: it is the id you are expected to match against Material Bank's own catalogue (carts, ordering and analytics all key on it), so a result list can be joined without a second lookup. Populated by the search and by Match alike. ABSENT means no MB identity is known for the variant, never that the SKU cannot be ordered; presence is the orderability tell, absence is silence.\",\"type\":\"string\"},\"manufacturerCode\":{\"description\":\"The governed manufacturer/source-native item code from `variants.code` (for example \\\"GADLC02\\\"). Populated when the full-result retrieval source carries that canonical field; Match always hydrates it from the variant row. ABSENT means unknown or an older external serving projection, never an invented code. Independent of materialBankId.\",\"type\":\"string\"},\"projectSaveCapability\":{\"description\":\"Explicit source-governed permission to save this exact source-coded variant to a Project. ABSENT means unknown/not allowed; it is never inferred from the brand or name.\",\"type\":\"string\",\"const\":\"allowed\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"sourceStatus\":{\"description\":\"The governed data status supporting Project capture. ABSENT means unknown. Provisional data remains source-backed but is not a verified catalogue claim.\",\"type\":\"string\",\"const\":\"provisional\"},\"productType\":{\"type\":\"string\"},\"color\":{\"type\":[\"string\",\"null\"]},\"variantName\":{\"type\":[\"string\",\"null\"]},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. Lets a caller key a cache or dedupe on the asset rather than its URL. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"hasImage\":{\"type\":\"boolean\"},\"variantCount\":{\"description\":\"How many eligible variants the row's product has, the same set `list_variants` pages, so a follow-up list of the product returns this many: the card's \\\"12 colourways\\\". ABSENT means the product is unknown or has no eligible variant.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"palette\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` of the swatch, as extracted from the product image.\"},\"name\":{\"description\":\"Stored human colour name for the swatch, when one was extracted.\",\"type\":[\"string\",\"null\"]},\"proportion\":{\"type\":\"number\",\"description\":\"The swatch's share of the analysed image, in [0,1].\"}},\"required\":[\"hex\",\"proportion\"]},\"description\":\"The material's main-image palette — the FULL stored palette, uncapped and in stored order. Colours are EXTRACTED FROM PRODUCT IMAGERY (visual likeness, never a declared colour specification). A one-swatch palette means the extractor found one colour — solid-colour materials are genuinely monochrome — never that the list was trimmed. This array is always present: EMPTY means nothing is on record (unknown), not 'this material has no colours'.\"},\"colourMeta\":{\"type\":\"object\",\"properties\":{\"dominantFamily\":{\"type\":\"string\"},\"dominantHex\":{\"type\":\"string\"},\"mood\":{\"type\":\"string\"}}},\"colourChip\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\",\"description\":\"`#rrggbb` to fill the chip with. EXTRACTED FROM the product image (a visual likeness), never a manufacturer-declared colour specification — surfaces must not present it as one.\"}},\"required\":[\"hex\"],\"description\":\"Present when this material's product imagery carries nothing beyond one colour, so a surface should render that colour rather than the photograph. Set for COATINGS (paints, primers, stains, floor coatings) whose stored palette quantises to a single swatch — a paint's photo is a flat fill, and the colour we ",
147
+ "hold structured beats a JPEG of it. ABSENT means the question was not established (unknown product type, unextracted or multi-swatch palette) and the image should be rendered; it NEVER asserts 'this is not a coating'.\"},\"attributes\":{\"description\":\"Resolved attribute values for the ids sent in `returnAttributes`, keyed by attribute id. ABSENT entirely when `returnAttributes` was not sent. A key present with `null` means this variant carries no accepted value for that attribute — absent is not empty and neither is null: the three states are distinct on purpose. Values resolve with the normal variant-over-product precedence.\",\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]}},\"colourBand\":{\"description\":\"`colourDistance` as a word (identical / very close / close / related / different), or null when unmeasurable. Absent when the colour stage did not run.\",\"type\":[\"string\",\"null\"]},\"colourDistance\":{\"description\":\"Match only. OKLab earth mover's distance between the query crop's palette and this material's, reading both palettes' proportions, so a colour that is a small share of the product cannot carry the match. Under 0.1 the colour AGREES, and the page lists agreeing rows first. `null` means the material carries no stored palette — UNKNOWN colour, never 'no colour' and never 'distant'. Absent when the colour stage did not run.\",\"type\":[\"number\",\"null\"]},\"confidence\":{\"description\":\"Match only (MG-1031). How close this material is to the query, as an ABSOLUTE image-space similarity in [0,1], not adjusted for colour — the same unit as `qualityFloor` and `comparison.bestRejected`, so all three can be drawn on one axis. Never normalised against the page, so the number means the same thing across runs. It is the TRUE value and may reach 1; rendering it so that no card claims '100%' is the consumer's job (round toward zero, or show '99%+'). Capping it here would put it on a different ceiling from `bestRejected`, which publishes the same unit uncapped. A Match page is ordered by colour agreement (`colourDistance` under 0.1, then unmeasured, then the rest) and then by this number, so inside each of those sets it never rises down the page. Distinct from `score`, which is the retrieval score on the `[0, maxScore]` scale and does not order a Match page. Absent outside Match.\",\"type\":\"number\",\"minimum\":0,\"maximum\":1},\"confidenceBand\":{\"description\":\"`confidence` as a word, banded on the engine's measured readings (strong >= 0.85, good >= 0.72, fair >= 0.55 = the default quality floor, weak below it and reachable only under `includeBelowFloor`). Present exactly when `confidence` is.\",\"type\":\"string\",\"enum\":[\"strong\",\"good\",\"fair\",\"weak\"]},\"score\":{\"type\":\"number\",\"description\":\"The selected mode's weighted primary score on the `[0, maxScore]` scale. On a Match page this is the retrieval score and does NOT order the page; the order is colour agreement, then `confidence`.\"},\"signals\":{\"description\":\"Match only: the measured image similarity the row carries.\",\"type\":\"object\",\"properties\":{\"image\":{\"description\":\"Image-space cosine between the query image and this row's image, in [0,1]. Null when it was not measured.\",\"type\":[\"number\",\"null\"]}},\"required\":[\"image\"]},\"retired\":{\"description\":\"MB lists the SKU as not visible/retired; demoted in ranking. Omitted when false.\",\"type\":\"boolean\"},\"belowFloor\":{\"description\":\"Present (true) only on quality-floor rejects returned under includeBelowFloor — the item failed the match image-quality floor and would be dropped by default.\",\"type\":\"boolean\"},\"admittedOnColour\":{\"description\":\"Present (true) only on Match rows the colour probe admitted: this material is as close in colour as the catalogue gets, and its image similarity is BELOW the match quality floor by design. It is on the page because no image-retrieved row is nearer in colour, not because it cleared the floor — so a consumer can present it as a colour answer or suppress it knowingly, and a quality check can tell a designed a",
148
+ "dmission from a genuine floor leak. Absent (never false) on rows that came through image retrieval. Distinct from `belowFloor`, which marks rejects returned only under `includeBelowFloor`.\",\"type\":\"boolean\"}},\"required\":[\"variantId\",\"brand\",\"product\",\"brandSlug\",\"productId\",\"color\",\"variantName\",\"imageUrl\",\"hasImage\",\"palette\",\"score\"]}},\"view\":{\"default\":\"full\",\"description\":\"Projection echo — always 'full' on this envelope variant.\",\"type\":\"string\",\"const\":\"full\"},\"correctedQuery\":{\"description\":\"Present when a word no material carries was corrected before the search ran: `from` is the query as typed (normalised), `to` the phrasing the page shows results for.\",\"type\":\"object\",\"properties\":{\"from\":{\"type\":\"string\"},\"to\":{\"type\":\"string\"}},\"required\":[\"from\",\"to\"]},\"attribution\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"enum\":[\"image\",\"colour\",\"lexical\",\"agent\",\"attribute\",\"match\"],\"description\":\"The ranking basis, groupable across both ranked routes. On /api/v1/search this is the envelope's `mode` verbatim; /api/v1/search/match reports 'match'. Group your stored outcomes by this field.\"},\"issuedAt\":{\"type\":\"string\",\"description\":\"ISO-8601 timestamp of when this response was assembled, so a stored outcome carries its own age without a second lookup.\"},\"responseId\":{\"type\":\"string\",\"description\":\"This response's stable id — the same value as the `X-Request-Id` header. Store it next to the outcome (an order, a save, a click) to join that outcome back to the ranking that produced it. Opaque: round-trip it verbatim, never parse it.\"}},\"required\":[\"basis\",\"issuedAt\",\"responseId\"],\"description\":\"Result attribution receipt. Present on every successful ranked response. Nothing on our side retains it — what you store IS the record.\"},\"suggestions\":{\"default\":[],\"description\":\"Always empty: the one search offers no refinements. Read nothing from it.\",\"maxItems\":0,\"type\":\"array\",\"items\":{\"not\":{}}},\"mode\":{\"type\":\"string\",\"enum\":[\"image\",\"colour\",\"lexical\",\"agent\",\"attribute\"],\"description\":\"What ordered the page: 'image' (a look-alike: image similarity to the seed), 'colour' (the words or the caller named a colour: colour distance inside that colour's family), 'lexical' (the query's words, ranked by text rank on the index), 'attribute' (no words left to rank on: the category and filters define the page), or 'agent' (the search agent chose these variants and their order; scores are rank-based, 1 for the first result falling linearly, and `maxScore` is 1).\"},\"maxScore\":{\"type\":\"number\"},\"note\":{\"type\":\"string\"},\"cursor\":{\"type\":\"string\"},\"timings\":{\"description\":\"Wall-clock milliseconds per step of the search, keyed by step id. The key set is open and depends on the path a query took, so read it by iterating rather than by naming a key. Present only when `explain` is set: diagnostic, not part of the ranking contract.\",\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"number\"}},\"explain\":{\"description\":\"Present only under `explain`: the receipt of the plan the search ran on. Diagnostic, like `timings`.\",\"type\":\"object\",\"properties\":{\"plan\":{\"type\":\"object\",\"properties\":{\"cached\":{\"type\":\"boolean\"},\"plan\":{\"type\":\"object\",\"properties\":{\"brands\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"ids\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"names\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"phrase\":{\"type\":\"string\"}},\"required\":[\"ids\",\"names\",\"phrase\"]},{\"type\":\"null\"}]},\"category\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"label\":{\"type\":\"string\"},\"phrase\":{\"type\":\"string\"},\"productTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"label\",\"phrase\",\"productTypeIds\"]},{\"type\":\"null\"}]},\"colour\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"family12\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"familyId\":{\"type\":\"string\"},\"hex\":{\"type\":\"string\"},\"oklab\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":3,\"maxItems\":3},\"phrase\":{\"type\":\"string\"},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type",
149
+ "\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"family12\",\"familyId\",\"hex\",\"oklab\",\"phrase\"]},{\"type\":\"null\"}]},\"corpusScope\":{\"type\":\"string\",\"enum\":[\"samplizeCatalogue\",\"materialBankOrderable\",\"materialBankNaOrderable\",\"materialBankNaAndCatalogue\",\"materialBankEuOrderable\",\"designShopOrderable\"]},\"excludeBrands\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"excludes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"phrase\":{\"type\":\"string\"},\"term\":{\"type\":\"string\"}},\"required\":[\"attributeId\",\"phrase\",\"term\"]}},\"leftover\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"normalised\":{\"type\":\"string\"},\"softAlone\":{\"type\":\"boolean\"},\"vendorColourNames\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"wants\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"fill\":{\"type\":\"number\"},\"phrase\":{\"type\":\"string\"},\"presence\":{\"type\":\"boolean\",\"const\":true},\"strength\":{\"type\":\"string\",\"enum\":[\"hard\",\"soft\"]},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"attributeId\",\"fill\",\"phrase\",\"strength\",\"terms\"]}}},\"required\":[\"brands\",\"category\",\"colour\",\"excludeBrands\",\"excludes\",\"leftover\",\"normalised\",\"softAlone\",\"vendorColourNames\",\"wants\"],\"description\":\"The plan the search ran on: the category, makers, wanted and excluded attribute terms (each hard or soft, with its fill), the colour, the words left for text, and the caller's corpus scope when one was sent.\"},\"signature\":{\"type\":\"string\"},\"source\":{\"type\":\"string\",\"enum\":[\"dictionary\",\"jev\"]},\"version\":{\"type\":\"string\"}},\"required\":[\"cached\",\"plan\",\"signature\",\"source\",\"version\"]}},\"required\":[\"plan\"]},\"query\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},\"seed\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}}},\"required\":[\"results\",\"view\",\"suggestions\",\"mode\",\"maxScore\",\"query\"]},{\"type\":\"object\",\"properties\":{\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributes\":{\"description\":\"Resolved attribute values for the ids sent in `returnAttributes`, keyed by attribute id. ABSENT entirely when `returnAttributes` was not sent. A key present with `null` means this variant carries no accepted value for that attribute — absent is not empty and neither is null: the three states are distinct on purpose. Values resolve with the normal variant-over-product precedence.\",\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]}},\"brand\":{\"type\":\"string\"},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"imageSha256\":{\"description\":\"SHA-256 of the displayed image `imageUrl` points at, as a hex digest. Lets a caller key a cache or dedupe on the asset rather than its URL. ABSENT means no hash is on record, never that there is no image.\",\"type\":\"string\"},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"manufacturerCode\":{\"description\":\"The governed manufacturer/source-native item code from `variants.code` (for example \\\"K-7265-BV\\\") — the same key and the same value the full item publishes. It is what separates two cards a reader cannot otherwise tell apart: brand, product name and variant name are shared by 280,334 of 371,515 cardable variants, because `name` is the PRODUCT name and a paint product is a whole collection. ABSENT means no code is recorded for the variant, never an invented one.\",\"type\":\"string\"},\"name\":{\"type\":\"string\",\"description\":\"Product name (the full item's `product`).\"},\"productId\":{\"type\":[\"string\",\"null\"]},\"projectSaveCapability\":{\"type\":\"string\",\"const\":\"allowed\"},\"resultId\":{\"type\":\"string\",\"description\":\"This exact hit's attribution key — `<responseId>:<rank>`, where rank is 1-based within TH",
150
+ "IS response. Unique across pages, because each page is its own response with its own id. Store it verbatim next to the outcome; it is opaque, and `attribution.responseId` is the field to group by.\"},\"sampleable\":{\"description\":\"Whether a physical sample is explicitly known to be orderable. Absent means unknown, never unavailable.\",\"type\":\"boolean\"},\"score\":{\"type\":\"number\"},\"sourceStatus\":{\"type\":\"string\",\"const\":\"provisional\"},\"variantCount\":{\"description\":\"How many eligible variants the row's product has, the same set `list_variants` pages, so a follow-up list of the product returns this many: the card's \\\"12 colourways\\\". ABSENT means the product is unknown or has no eligible variant.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"variantId\":{\"type\":\"string\"},\"variantName\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"brand\",\"brandSlug\",\"imageUrl\",\"name\",\"productId\",\"score\",\"variantId\",\"variantName\"]}},\"view\":{\"type\":\"string\",\"const\":\"card\",\"description\":\"Projection echo — always 'card' on this envelope variant.\"},\"correctedQuery\":{\"description\":\"Present when a word no material carries was corrected before the search ran: `from` is the query as typed (normalised), `to` the phrasing the page shows results for.\",\"type\":\"object\",\"properties\":{\"from\":{\"type\":\"string\"},\"to\":{\"type\":\"string\"}},\"required\":[\"from\",\"to\"]},\"attribution\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"string\",\"enum\":[\"image\",\"colour\",\"lexical\",\"agent\",\"attribute\",\"match\"],\"description\":\"The ranking basis, groupable across both ranked routes. On /api/v1/search this is the envelope's `mode` verbatim; /api/v1/search/match reports 'match'. Group your stored outcomes by this field.\"},\"issuedAt\":{\"type\":\"string\",\"description\":\"ISO-8601 timestamp of when this response was assembled, so a stored outcome carries its own age without a second lookup.\"},\"responseId\":{\"type\":\"string\",\"description\":\"This response's stable id — the same value as the `X-Request-Id` header. Store it next to the outcome (an order, a save, a click) to join that outcome back to the ranking that produced it. Opaque: round-trip it verbatim, never parse it.\"}},\"required\":[\"basis\",\"issuedAt\",\"responseId\"],\"description\":\"Result attribution receipt. Present on every successful ranked response. Nothing on our side retains it — what you store IS the record.\"},\"suggestions\":{\"default\":[],\"description\":\"Always empty: the one search offers no refinements. Read nothing from it.\",\"maxItems\":0,\"type\":\"array\",\"items\":{\"not\":{}}},\"mode\":{\"type\":\"string\",\"enum\":[\"image\",\"colour\",\"lexical\",\"agent\",\"attribute\"],\"description\":\"What ordered the page: 'image' (a look-alike: image similarity to the seed), 'colour' (the words or the caller named a colour: colour distance inside that colour's family), 'lexical' (the query's words, ranked by text rank on the index), 'attribute' (no words left to rank on: the category and filters define the page), or 'agent' (the search agent chose these variants and their order; scores are rank-based, 1 for the first result falling linearly, and `maxScore` is 1).\"},\"maxScore\":{\"type\":\"number\"},\"note\":{\"type\":\"string\"},\"cursor\":{\"type\":\"string\"},\"timings\":{\"description\":\"Wall-clock milliseconds per step of the search, keyed by step id. The key set is open and depends on the path a query took, so read it by iterating rather than by naming a key. Present only when `explain` is set: diagnostic, not part of the ranking contract.\",\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"number\"}},\"explain\":{\"description\":\"Present only under `explain`: the receipt of the plan the search ran on. Diagnostic, like `timings`.\",\"type\":\"object\",\"properties\":{\"plan\":{\"type\":\"object\",\"properties\":{\"cached\":{\"type\":\"boolean\"},\"plan\":{\"type\":\"object\",\"properties\":{\"brands\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"ids\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"names\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"phrase\":{\"type\":\"string\"}},\"required\":[\"ids\",\"names\",\"phrase\"]},{\"type\":\"null\"}]},\"category\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"label",
151
+ "\":{\"type\":\"string\"},\"phrase\":{\"type\":\"string\"},\"productTypeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"label\",\"phrase\",\"productTypeIds\"]},{\"type\":\"null\"}]},\"colour\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"family12\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"familyId\":{\"type\":\"string\"},\"hex\":{\"type\":\"string\"},\"oklab\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":3,\"maxItems\":3},\"phrase\":{\"type\":\"string\"},\"range\":{\"type\":\"object\",\"properties\":{\"chroma\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":2,\"maxItems\":2},\"hue\":{\"anyOf\":[{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":2,\"maxItems\":2},{\"type\":\"null\"}]},\"lightness\":{\"type\":\"array\",\"prefixItems\":[{\"type\":\"number\"},{\"type\":\"number\"}],\"items\":false,\"minItems\":2,\"maxItems\":2}},\"required\":[\"chroma\",\"hue\",\"lightness\"]}},\"required\":[\"family12\",\"familyId\",\"hex\",\"oklab\",\"phrase\"]},{\"type\":\"null\"}]},\"corpusScope\":{\"type\":\"string\",\"enum\":[\"samplizeCatalogue\",\"materialBankOrderable\",\"materialBankNaOrderable\",\"materialBankNaAndCatalogue\",\"materialBankEuOrderable\",\"designShopOrderable\"]},\"excludeBrands\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"excludes\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"phrase\":{\"type\":\"string\"},\"term\":{\"type\":\"string\"}},\"required\":[\"attributeId\",\"phrase\",\"term\"]}},\"leftover\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"normalised\":{\"type\":\"string\"},\"softAlone\":{\"type\":\"boolean\"},\"vendorColourNames\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"wants\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\"},\"fill\":{\"type\":\"number\"},\"phrase\":{\"type\":\"string\"},\"presence\":{\"type\":\"boolean\",\"const\":true},\"strength\":{\"type\":\"string\",\"enum\":[\"hard\",\"soft\"]},\"terms\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"attributeId\",\"fill\",\"phrase\",\"strength\",\"terms\"]}}},\"required\":[\"brands\",\"category\",\"colour\",\"excludeBrands\",\"excludes\",\"leftover\",\"normalised\",\"softAlone\",\"vendorColourNames\",\"wants\"],\"description\":\"The plan the search ran on: the category, makers, wanted and excluded attribute terms (each hard or soft, with its fill), the colour, the words left for text, and the caller's corpus scope when one was sent.\"},\"signature\":{\"type\":\"string\"},\"source\":{\"type\":\"string\",\"enum\":[\"dictionary\",\"jev\"]},\"version\":{\"type\":\"string\"}},\"required\":[\"cached\",\"plan\",\"signature\",\"source\",\"version\"]}},\"required\":[\"plan\"]},\"query\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},\"seed\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}}},\"required\":[\"results\",\"view\",\"suggestions\",\"mode\",\"maxScore\",\"query\"]}]},\"links\":{\"type\":\"object\",\"properties\":{}},\"meta\":{\"type\":\"object\",\"properties\":{\"operationId\":{\"type\":\"string\",\"enum\":[\"search_materials_post\",\"search_materials_get\"]},\"requestId\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"operationId\",\"requestId\"]},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"minLength\":1}}},\"required\":[\"data\",\"links\",\"meta\",\"warnings\"]},\"SourceImageAnalysis\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"scene_match\"],\"description\":\"The kind of read. `scene_match` is the Scene Match pass. The vocabulary grows over time; clients should tolerate new values.\"},\"model\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The model version that produced `result`.\"},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"failed\"],\"description\":\"`failed` analyses are returned, not hidden — so you can tell 'we looked and it did not work' apart from 'nobody has looked yet' (which is an empty `analyses` array).\"},\"result\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"$ref\":\"#/$defs/__schema2\"},\"description\":\"The analysis payload verbatim, or the failure record when `status` is `failed`. For `scene_match`: the detected regions with their candidate variant ids and scores. The interior shape belongs to the producing mode",
152
+ "l and may gain fields.\"},\"analysedAt\":{\"type\":\"string\",\"minLength\":1,\"description\":\"ISO-8601 timestamp of the most recent analysis.\"}},\"required\":[\"kind\",\"model\",\"status\",\"result\",\"analysedAt\"]},\"SourceMaterialBatchDetail\":{\"type\":\"object\",\"properties\":{\"batchId\":{\"type\":\"string\",\"description\":\"The stored batch id (`smb_…`).\"},\"createdAt\":{\"type\":\"string\",\"description\":\"ISO-8601 timestamp of the upload.\"},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"sourceId\":{\"type\":\"string\",\"description\":\"The stored file id (`smf_…`).\"},\"role\":{\"type\":\"string\",\"enum\":[\"brief\",\"reference_image\",\"document\",\"document_image\",\"inspiration_image\",\"unclassified\"],\"description\":\"The pipeline-assigned role. `unclassified` is a legitimate terminal value when the file could not be placed; clients should tolerate new values.\"},\"filename\":{\"type\":\"string\"},\"mediaType\":{\"type\":\"string\"},\"sha256\":{\"type\":\"string\",\"description\":\"Lowercase hex SHA-256 of the stored bytes.\"},\"bytes\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"pages\":{\"description\":\"PDF page count; null for images.\",\"anyOf\":[{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},{\"type\":\"null\"}]},\"url\":{\"type\":\"string\",\"description\":\"Fetchable URL for the stored bytes.\"},\"analyses\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/SourceImageAnalysis\"},\"description\":\"Every analysis computed over this file's bytes. ALWAYS an array: `[]` means nothing has been computed yet, never a missing field. Preprocessing is triggered manually today; when it becomes automatic only the trigger changes and this contract does not.\"},\"comments\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/SourceMaterialComment\"},\"description\":\"The argument about this file - the thread of remarks people left on it, oldest root first, each carrying its replies. ALWAYS an array: `[]` means nobody has commented, which is a state to draw rather than an absence to guess at.\"},\"commentsTruncated\":{\"type\":\"boolean\",\"description\":\"`true` when this file holds more than 500 comment rows, so `comments` is the oldest of them rather than all. Always present; `false` on a file whose thread you are seeing in full, including one nobody has commented on.\"}},\"required\":[\"sourceId\",\"role\",\"filename\",\"mediaType\",\"sha256\",\"bytes\",\"pages\",\"url\",\"analyses\",\"comments\",\"commentsTruncated\"]}}},\"required\":[\"batchId\",\"createdAt\",\"sources\"]},\"SourceMaterialBatchReceipt\":{\"type\":\"object\",\"properties\":{\"batchId\":{\"type\":\"string\",\"description\":\"The stored batch id (`smb_…`).\"},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"sourceId\":{\"type\":\"string\",\"description\":\"The stored file id (`smf_…`).\"},\"role\":{\"type\":\"string\",\"enum\":[\"brief\",\"reference_image\",\"document\",\"document_image\",\"inspiration_image\",\"unclassified\"],\"description\":\"The pipeline-assigned role. `unclassified` is a legitimate terminal value when the file could not be placed; clients should tolerate new values.\"},\"filename\":{\"type\":\"string\"},\"mediaType\":{\"type\":\"string\"},\"sha256\":{\"type\":\"string\",\"description\":\"Lowercase hex SHA-256 of the stored bytes.\"},\"bytes\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"pages\":{\"description\":\"PDF page count; null for images.\",\"anyOf\":[{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},{\"type\":\"null\"}]}},\"required\":[\"sourceId\",\"role\",\"filename\",\"mediaType\",\"sha256\",\"bytes\",\"pages\"]}}},\"required\":[\"batchId\",\"sources\"]},\"SourceMaterialComment\":{\"type\":\"object\",\"properties\":{\"commentId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The stored comment id (`smc_…`).\"},\"author\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":160,\"description\":\"Who the comment is reported to be from. Nothing authenticates this name — it is transcription, and it is read back labelled as such.\"},\"organisation\":{\"description\":\"Their practice or team. Nullable, NOT optional: `null` is the answer for a note carrying no organisation, and the key is always present.\",\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"maxLength\":160},{\"typ",
153
+ "e\":\"null\"}]},\"attribution\":{\"type\":\"string\",\"const\":\"reported\",\"description\":\"How this name got here. `reported` means a caller typed it and nothing verified it — render it as 'recorded as from X', never as a statement X signed. The verified identity is `recordedBy`. New members may be added if a verified channel is ever built; treat an unfamiliar value as unverified.\"}},\"required\":[\"name\",\"organisation\",\"attribution\"]},\"recordedBy\":{\"type\":\"object\",\"properties\":{\"principalId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The authenticated principal that wrote the row — the trustworthy half of the attribution. Comments can only be posted against a batch the poster owns, so this is your own principal on every comment you can read.\"}},\"required\":[\"principalId\"]},\"body\":{\"type\":\"string\",\"minLength\":1},\"createdAt\":{\"type\":\"string\",\"minLength\":1,\"description\":\"ISO-8601 timestamp of the posting.\"},\"replies\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/SourceMaterialCommentReply\"},\"description\":\"The replies answering this comment, oldest first. ALWAYS an array: `[]` means nobody answered, never a missing field.\"}},\"required\":[\"commentId\",\"author\",\"recordedBy\",\"body\",\"createdAt\",\"replies\"]},\"SourceMaterialCommentReply\":{\"type\":\"object\",\"properties\":{\"commentId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The stored comment id (`smc_…`).\"},\"author\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":160,\"description\":\"Who the comment is reported to be from. Nothing authenticates this name — it is transcription, and it is read back labelled as such.\"},\"organisation\":{\"description\":\"Their practice or team. Nullable, NOT optional: `null` is the answer for a note carrying no organisation, and the key is always present.\",\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"maxLength\":160},{\"type\":\"null\"}]},\"attribution\":{\"type\":\"string\",\"const\":\"reported\",\"description\":\"How this name got here. `reported` means a caller typed it and nothing verified it — render it as 'recorded as from X', never as a statement X signed. The verified identity is `recordedBy`. New members may be added if a verified channel is ever built; treat an unfamiliar value as unverified.\"}},\"required\":[\"name\",\"organisation\",\"attribution\"]},\"recordedBy\":{\"type\":\"object\",\"properties\":{\"principalId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The authenticated principal that wrote the row — the trustworthy half of the attribution. Comments can only be posted against a batch the poster owns, so this is your own principal on every comment you can read.\"}},\"required\":[\"principalId\"]},\"body\":{\"type\":\"string\",\"minLength\":1},\"createdAt\":{\"type\":\"string\",\"minLength\":1,\"description\":\"ISO-8601 timestamp of the posting.\"}},\"required\":[\"commentId\",\"author\",\"recordedBy\",\"body\",\"createdAt\"]},\"SourceMaterialCommentThread\":{\"type\":\"object\",\"properties\":{\"sourceId\":{\"type\":\"string\",\"description\":\"The file the thread hangs off (`smf_…`).\"},\"comments\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/SourceMaterialComment\"},\"description\":\"The thread, oldest root first. ALWAYS an array: `[]` means the file is yours and nobody has commented on it.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"`true` when this file holds more than 500 comment rows and `comments` is therefore the oldest of them rather than all. Always present: whether you are looking at the whole thread is an answer, not something to infer from a count.\"}},\"required\":[\"sourceId\",\"comments\",\"truncated\"]},\"SpecFacetsListResponse\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Number of facets returned.\"},\"facets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeId\":{\"type\":\"string\",\"description\":\"Canonical attribute id — query it in search/specifications as `attribute:value`, or as `specRange=attribute:min..max` when `kind` is `numeric`.\"},\"brands\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Brands carrying any value for this attribute.\"},\"description\":{\"description\":\"How the fa",
154
+ "cet is queried (set for virtual facets like certification programmes).\",\"type\":\"string\"},\"isArray\":{\"type\":\"boolean\",\"description\":\"Whether the attribute holds multiple values per variant.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"token\",\"numeric\"],\"description\":\"How this facet is queried. `token` — pick a value from `values` and pass `spec=attribute:value`. `numeric` — state inclusive bounds and pass `specRange=attribute:min..max`; `values` is empty and `range` carries the span.\"},\"name\":{\"type\":\"string\",\"description\":\"Human-readable attribute name.\"},\"range\":{\"description\":\"Observed span + coverage. Present ONLY on a `numeric` facet.\",\"type\":\"object\",\"properties\":{\"max\":{\"type\":\"number\",\"description\":\"Highest value on record. Inclusive.\"},\"min\":{\"type\":\"number\",\"description\":\"Lowest value on record. Inclusive.\"},\"unparseableVariants\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Variants recording a value that is NOT a number. A range filter EXCLUDES these; it never reads them as zero.\"},\"variants\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Variants carrying a value that parses as a number — the COVERAGE a range filter can actually reach. Read it before concluding an empty result means nothing qualifies.\"}},\"required\":[\"max\",\"min\",\"unparseableVariants\",\"variants\"]},\"values\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brands\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Distinct brands carrying this value.\"},\"label\":{\"description\":\"Human label for the value, when one is known (e.g. certification programmes).\",\"type\":\"string\"},\"value\":{\"type\":\"string\",\"description\":\"A canonical value token queryable in search/specifications.\"},\"variants\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"Variants carrying this value.\"}},\"required\":[\"brands\",\"value\",\"variants\"]},\"description\":\"Top canonical values, most-cross-brand first. EMPTY for a `numeric` facet, which has no token vocabulary.\"}},\"required\":[\"attributeId\",\"brands\",\"isArray\",\"kind\",\"name\",\"values\"]},\"description\":\"Queryable specification facets, most-cross-brand first.\"},\"mode\":{\"type\":\"string\",\"const\":\"facets\",\"description\":\"The complete live specification-facet collection.\"}},\"required\":[\"count\",\"facets\",\"mode\"]},\"StoredSourceMaterialComment\":{\"type\":\"object\",\"anyOf\":[{\"type\":\"object\",\"properties\":{\"commentId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The stored comment id (`smc_…`).\"},\"author\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":160,\"description\":\"Who the comment is reported to be from. Nothing authenticates this name — it is transcription, and it is read back labelled as such.\"},\"organisation\":{\"description\":\"Their practice or team. Nullable, NOT optional: `null` is the answer for a note carrying no organisation, and the key is always present.\",\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"maxLength\":160},{\"type\":\"null\"}]},\"attribution\":{\"type\":\"string\",\"const\":\"reported\",\"description\":\"How this name got here. `reported` means a caller typed it and nothing verified it — render it as 'recorded as from X', never as a statement X signed. The verified identity is `recordedBy`. New members may be added if a verified channel is ever built; treat an unfamiliar value as unverified.\"}},\"required\":[\"name\",\"organisation\",\"attribution\"]},\"recordedBy\":{\"type\":\"object\",\"properties\":{\"principalId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The authenticated principal that wrote the row — the trustworthy half of the attribution. Comments can only be posted against a batch the poster owns, so this is your own principal on every comment you can read.\"}},\"required\":[\"principalId\"]},\"body\":{\"type\":\"string\",\"minLength\":1},\"createdAt\":{\"type\":\"string\",\"minLength\":1,\"description\":\"ISO-8601 timestamp of the posting.\"},\"replies\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/SourceMaterialCommentReply\"},\"description\":\"The replies answering this comment, oldest first. ALWAYS an arr",
155
+ "ay: `[]` means nobody answered, never a missing field.\"},\"kind\":{\"type\":\"string\",\"const\":\"root\"}},\"required\":[\"commentId\",\"author\",\"recordedBy\",\"body\",\"createdAt\",\"replies\",\"kind\"]},{\"type\":\"object\",\"properties\":{\"commentId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The stored comment id (`smc_…`).\"},\"author\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":160,\"description\":\"Who the comment is reported to be from. Nothing authenticates this name — it is transcription, and it is read back labelled as such.\"},\"organisation\":{\"description\":\"Their practice or team. Nullable, NOT optional: `null` is the answer for a note carrying no organisation, and the key is always present.\",\"anyOf\":[{\"type\":\"string\",\"minLength\":1,\"maxLength\":160},{\"type\":\"null\"}]},\"attribution\":{\"type\":\"string\",\"const\":\"reported\",\"description\":\"How this name got here. `reported` means a caller typed it and nothing verified it — render it as 'recorded as from X', never as a statement X signed. The verified identity is `recordedBy`. New members may be added if a verified channel is ever built; treat an unfamiliar value as unverified.\"}},\"required\":[\"name\",\"organisation\",\"attribution\"]},\"recordedBy\":{\"type\":\"object\",\"properties\":{\"principalId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The authenticated principal that wrote the row — the trustworthy half of the attribution. Comments can only be posted against a batch the poster owns, so this is your own principal on every comment you can read.\"}},\"required\":[\"principalId\"]},\"body\":{\"type\":\"string\",\"minLength\":1},\"createdAt\":{\"type\":\"string\",\"minLength\":1,\"description\":\"ISO-8601 timestamp of the posting.\"},\"kind\":{\"type\":\"string\",\"const\":\"reply\"},\"parentCommentId\":{\"type\":\"string\",\"minLength\":1,\"description\":\"The root comment this one answers.\"}},\"required\":[\"commentId\",\"author\",\"recordedBy\",\"body\",\"createdAt\",\"kind\",\"parentCommentId\"]}]},\"SuggestColourResponse\":{\"type\":\"object\",\"properties\":{\"suggestions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"hex\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\"},\"libraryId\":{\"type\":\"string\"},\"term\":{\"type\":\"string\"}},\"required\":[\"hex\",\"kind\",\"term\"]},\"description\":\"Ranked colour-name suggestions, best match first.\"}},\"required\":[\"suggestions\"]},\"SuggestResponse\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\"},\"suggestions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"brandName\":{\"type\":[\"string\",\"null\"]},\"brandSlug\":{\"type\":[\"string\",\"null\"]},\"categoryKey\":{\"type\":[\"string\",\"null\"]},\"kind\":{\"type\":\"string\",\"enum\":[\"product\",\"brand\",\"category\"]},\"label\":{\"type\":\"string\"},\"match\":{\"type\":\"string\",\"enum\":[\"prefix\",\"word\",\"fuzzy\"]},\"refId\":{\"type\":\"string\"},\"variantCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"variantId\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"brandName\",\"brandSlug\",\"categoryKey\",\"kind\",\"label\",\"match\",\"refId\",\"variantCount\",\"variantId\"]}}},\"required\":[\"query\",\"suggestions\"]},\"VariantAssetPage\":{\"type\":\"object\",\"properties\":{\"documentCoverage\":{\"description\":\"Maker document list state. Absent when documents are filtered out.\",\"type\":\"string\",\"enum\":[\"available\",\"none_declared\",\"not_ingested\",\"unavailable_source\",\"dead_link\",\"failed_ingest\"]},\"items\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"appliesTo\":{\"description\":\"Only 'product': a product-wide document. Absent: this variant's own.\",\"type\":\"string\",\"const\":\"product\"},\"assetId\":{\"type\":\"string\",\"minLength\":1},\"availability\":{\"type\":\"string\",\"enum\":[\"available\",\"unknown\",\"unavailable\"],\"description\":\"available: MaterialGraph serves url. unknown: maker's link, unchecked.\"},\"byteSize\":{\"description\":\"Not on images; absent when unknown.\",\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"documentTypes\":{\"description\":\"Documents only; absent when unknown.\",\"minItems\":1,\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"technical_data_sheet\",\"product_sheet\",\"technical_bulletin\",\"sustainability_report\",\"specification\",\"installation_guide\",\"care_maintenance_guide\",\"operation_manual\",\"warranty\",\"parts_list\",\"",
156
+ "technical_drawing\",\"test_report\",\"certificate\",\"declaration_of_performance\",\"environmental_product_declaration\",\"health_product_declaration\",\"ingredient_disclosure\",\"safety_data_sheet\",\"brochure\",\"catalogue\",\"colour_finish_chart\",\"other\",\"unknown\"]}},\"height\":{\"description\":\"Images only; absent when unknown.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"imageRole\":{\"description\":\"Images only; absent when unknown.\",\"type\":\"string\",\"enum\":[\"product\",\"swatch\",\"detail\",\"scene\",\"technical\",\"colour_chart\",\"sample_collection\",\"other\",\"unknown\"]},\"kind\":{\"type\":\"string\",\"enum\":[\"image\",\"document\",\"cad\",\"bim\",\"model_3d\",\"texture\",\"archive\",\"other\",\"unknown\"]},\"name\":{\"description\":\"Not on images; absent when unknown.\",\"type\":\"string\"},\"presentation\":{\"description\":\"Images only; absent when unknown.\",\"type\":\"string\",\"enum\":[\"edge_to_edge\",\"packshot\",\"cutout_margin\",\"montage\",\"unknown\"]},\"url\":{\"description\":\"Absent when availability is unavailable.\",\"type\":\"string\"},\"width\":{\"description\":\"Images only; absent when unknown.\",\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"availability\",\"kind\"]}},\"pageInfo\":{\"type\":\"object\",\"properties\":{\"nextCursor\":{\"type\":[\"string\",\"null\"]},\"returnedCount\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"totalMatches\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"nextCursor\",\"returnedCount\",\"totalMatches\"]},\"primaryAssetId\":{\"description\":\"The variant's primary image. Absent when it has none.\",\"type\":\"string\",\"minLength\":1}},\"required\":[\"items\",\"pageInfo\"]},\"VocabularySearchResponse\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Echo of the resolved (trimmed) query phrase.\"},\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"attributeIds\":{\"description\":\"For a term: the ids of the registry attributes whose value dictionary owns it — resolve values against them via attributes/{attributeId}/values/resolve. Omitted for an attribute.\",\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"dictionaryId\":{\"description\":\"For a term: the owning value dictionary's id. Absent for an attribute.\",\"type\":\"string\"},\"id\":{\"type\":\"string\",\"description\":\"Canonical token — a registry attribute id or a value-dictionary term id.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"attribute\",\"term\"],\"description\":\"Which controlled vocabulary the candidate came from.\"},\"label\":{\"type\":\"string\",\"description\":\"Human-readable label for the token.\"},\"score\":{\"type\":\"number\",\"description\":\"Match confidence in [0,1] (1 = exact). Higher is a better match.\"},\"tier\":{\"type\":\"string\",\"enum\":[\"exact_id\",\"exact_alias\",\"lexical\",\"semantic\"],\"description\":\"Which resolution rung produced the winning score.\"},\"via\":{\"description\":\"Present only for a colour candidate resolved via the colorscope fallback.\",\"type\":\"string\",\"const\":\"colorscope\"}},\"required\":[\"id\",\"kind\",\"label\",\"score\",\"tier\"]},\"description\":\"Matching vocabulary tokens, best (nearest) first.\"}},\"required\":[\"query\",\"results\"]},\"WhoamiResponse\":{\"type\":\"object\",\"properties\":{\"principal\":{\"type\":\"string\",\"description\":\"The resolved principal for the credential (e.g. `apikey:read`).\"},\"scopes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The scopes granted to this credential (e.g. `mg:read`).\"}},\"required\":[\"principal\",\"scopes\"]},\"__schema2\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"number\"},{\"type\":\"boolean\"},{\"type\":\"null\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/__schema2\"}},{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"$ref\":\"#/$defs/__schema2\"}}]},\"__schema3\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"number\"},{\"type\":\"boolean\"},{\"type\":\"null\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/__schema3\"}},{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"$ref\":\"#/$defs/__schema3\"}}]}},\"operations\":{\"samplize_colorvec_cache\":{\"$ref\":\"#/$defs/SamplizeColorVecCache\"},\"samplize_catalogue_search\":{\"$ref\":\"#/$defs/SamplizeCatalogueSearchResponse\"},\"list_catalog_documents\":{\"$ref\":\"#/$defs/CatalogDocumentList\"},\"list_c",
157
+ "atalog_pages\":{\"$ref\":\"#/$defs/CatalogPageListResult\"},\"get_catalog_page_representation\":{\"$ref\":\"#/$defs/CataloguePageRepresentationReadResult\"},\"list_catalog_product_references\":{\"$ref\":\"#/$defs/CatalogProductReferenceReadResult\"},\"search_materials_post\":{\"$ref\":\"#/$defs/SearchResponse\"},\"retrieval.identify\":{\"$ref\":\"#/$defs/LookupVariantResponse\"},\"match_material\":{\"anyOf\":[{\"$ref\":\"#/$defs/MatchMaterialResponse\"},{\"$ref\":\"#/$defs/MatchWorkflowResponse\"}]},\"search_suggest\":{\"$ref\":\"#/$defs/SuggestResponse\"},\"get_colour_stats\":{\"$ref\":\"#/$defs/ColourStatsResponse\"},\"coordinate_materials\":{\"$ref\":\"#/$defs/CoordinateMaterialsResponse\"},\"plan_material_query\":{\"$ref\":\"#/$defs/MaterialQueryPlanResponse\"},\"samplize_catalogue_products\":{\"$ref\":\"#/$defs/SamplizeCataloguePage\"},\"search_materials_get\":{\"$ref\":\"#/$defs/SearchResponse\"},\"search_by_colour\":{\"$ref\":\"#/$defs/ByColourResponse\"},\"get_material\":{\"type\":\"object\",\"properties\":{\"material\":{\"$ref\":\"#/$defs/MaterialDetail\"}},\"required\":[\"material\"]},\"get_catalogue_references_batch\":{\"$ref\":\"#/$defs/CatalogueReferenceBatchResponse\"},\"list_catalogue_channel_collections\":{\"$ref\":\"#/$defs/CatalogueChannelCollectionsResponse\"},\"get_catalogue_document_access\":{\"$ref\":\"#/$defs/CatalogueDocumentAccessResult\"},\"list_material_blocks\":{\"$ref\":\"#/$defs/MaterialBlockProjection\"},\"list_variant_assets\":{\"$ref\":\"#/$defs/VariantAssetPage\"},\"list_material_documents\":{\"$ref\":\"#/$defs/ProductDocumentPage\"},\"get_composition_report\":{\"$ref\":\"#/$defs/CompositionCorpusSummary\"},\"list_schema_blocks\":{\"$ref\":\"#/$defs/SchemaBlocksResponse\"},\"list_schema_attributes\":{\"$ref\":\"#/$defs/SchemaAttributesResponse\"},\"list_schema_verticals\":{\"$ref\":\"#/$defs/SchemaVerticalsResponse\"},\"list_schema_product_types\":{\"$ref\":\"#/$defs/SchemaProductTypesResponse\"},\"list_schema_units\":{\"$ref\":\"#/$defs/SchemaUnitsResponse\"},\"list_schema_value_dictionaries\":{\"$ref\":\"#/$defs/SchemaValueDictionariesResponse\"},\"list_schema_source_requirements\":{\"$ref\":\"#/$defs/SchemaSourceRequirementsResponse\"},\"list_schema_product_type_templates\":{\"$ref\":\"#/$defs/SchemaProductTypeTemplatesResponse\"},\"list_schema_mappings\":{\"$ref\":\"#/$defs/SchemaMappingsResponse\"},\"get_material_pairings\":{\"type\":\"object\",\"properties\":{\"seed\":{\"$ref\":\"#/$defs/MaterialTile\"},\"items\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/$defs/PairingItem\"}},\"cospecCount\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991,\"description\":\"How many items came from real order evidence (the cospec arm).\"},\"skippedCandidates\":{\"description\":\"Candidates dropped at hydration for violating the material contract; present only when > 0. A malformed row costs itself, never the rail (MG-985).\",\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991},\"ordering\":{\"description\":\"Graph-owned ranking contract; present only when `order` was requested.\",\"$ref\":\"#/$defs/PairingOrdering\"},\"nextCursor\":{\"description\":\"Opaque continuation when another ordered page exists.\",\"type\":\"string\"}},\"required\":[\"seed\",\"items\",\"cospecCount\"]},\"list_associated_finishes\":{\"$ref\":\"#/$defs/DeclaredAssociations\"},\"list_associated_products\":{\"$ref\":\"#/$defs/DeclaredAssociations\"},\"get_applicability\":{\"$ref\":\"#/$defs/ApplicabilityCollection\"},\"list_variants\":{\"$ref\":\"#/$defs/ListVariantsResponse\"},\"list_variant_facets\":{\"$ref\":\"#/$defs/ListVariantFacetsResponse\"},\"get_category_colour_profiles\":{\"$ref\":\"#/$defs/CategoryColourProfilesResponse\"},\"resolve_colour_name\":{\"$ref\":\"#/$defs/ResolveColourResponse\"},\"suggest_colour_names\":{\"$ref\":\"#/$defs/SuggestColourResponse\"},\"catalog_list_attributes\":{\"$ref\":\"#/$defs/ListAttributesResponse\"},\"catalog_vocabulary_search\":{\"$ref\":\"#/$defs/VocabularySearchResponse\"},\"resolve_phrases\":{\"$ref\":\"#/$defs/ResolveResponse\"},\"list_categories\":{\"$ref\":\"#/$defs/ListCategoriesResponse\"},\"get_category\":{\"$ref\":\"#/$defs/GetCategoryResponse\"},\"get_product_type_status_coverage\":{\"type\":\"object\",\"properties\":{\"basis\":{\"type\":\"object\",\"properties\":{\"assignment\":{\"type\":\"string\",\"const\":\"variant_primary_only\"},\"comparisonThreshold\":{\"type\":\"number\",\"minimum\":0,\"",
158
+ "maximum\":1,\"description\":\"A reporting cutoff, not an inferred acceptance rule. Proposed assignments at or above this cutoff remain proposed.\"},\"count\":{\"type\":\"string\",\"const\":\"exact\"},\"sourcePath\":{\"type\":\"string\",\"const\":\"products.source_category_path\"},\"universe\":{\"type\":\"string\",\"const\":\"non_superseded_variants\"}},\"required\":[\"assignment\",\"comparisonThreshold\",\"count\",\"sourcePath\",\"universe\"]},\"computedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"},\"sourcePaths\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"accepted\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"missingPrimary\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"otherStatus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"proposed\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"proposedBelowThreshold\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"proposedUnknownConfidence\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"variants\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"sourcePath\":{\"description\":\"The complete stored source category path, verbatim; compound leaves are not split or guessed. Null means no path is recorded.\",\"type\":[\"string\",\"null\"]}},\"required\":[\"accepted\",\"missingPrimary\",\"otherStatus\",\"proposed\",\"proposedBelowThreshold\",\"proposedUnknownConfidence\",\"variants\",\"sourcePath\"]}},\"totals\":{\"type\":\"object\",\"properties\":{\"accepted\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"missingPrimary\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"otherStatus\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"proposed\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"proposedBelowThreshold\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"proposedUnknownConfidence\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"variants\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"accepted\",\"missingPrimary\",\"otherStatus\",\"proposed\",\"proposedBelowThreshold\",\"proposedUnknownConfidence\",\"variants\"]}},\"required\":[\"basis\",\"computedAt\",\"sourcePaths\",\"totals\"]},\"whoami\":{\"$ref\":\"#/$defs/WhoamiResponse\"},\"get_material_demand\":{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"description\":\"Echo of the resolved reference (`variantId` or `material`).\"},\"demand\":{\"$ref\":\"#/$defs/MaterialDemandResult\"},\"cospec\":{\"$ref\":\"#/$defs/CoSpecifiedResult\"}},\"required\":[\"query\",\"demand\",\"cospec\"]},\"search_by_palette\":{\"$ref\":\"#/$defs/SearchByPaletteResponse\"},\"extract_image_palette\":{\"$ref\":\"#/$defs/ExtractPaletteResponse\"},\"search_by_gradient\":{\"$ref\":\"#/$defs/SearchByGradientResponse\"},\"list_spec_facets\":{\"$ref\":\"#/$defs/SpecFacetsListResponse\"},\"list_brands\":{\"$ref\":\"#/$defs/BrandCatalogListPage\"},\"upload_source_material\":{\"$ref\":\"#/$defs/SourceMaterialBatchReceipt\"},\"get_source_material_batch\":{\"$ref\":\"#/$defs/SourceMaterialBatchDetail\"},\"list_source_material_comments\":{\"$ref\":\"#/$defs/SourceMaterialCommentThread\"},\"post_source_material_comment\":{\"$ref\":\"#/$defs/PostSourceMaterialCommentResponse\"},\"create_public_run\":{\"$ref\":\"#/$defs/CreatePublicRunResponse\"},\"get_public_run\":{\"$ref\":\"#/$defs/PublicRunResponse\"},\"get_verdict_citation\":{\"type\":\"object\",\"properties\":{\"citationId\":{\"type\":\"string\",\"minLength\":1},\"source\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"source_record\",\"source_material\",\"source_fact\",\"url\",\"asset\",\"download\",\"manual_note\",\"agent_output\"]},\"locator\":{\"type\":\"object\",\"properties\":{\"imageBox\":{\"type\":\"object\",\"properties\":{\"height\":{\"type\":\"number\",\"exclusiveMinimum\":0},\"width\":{\"type\":\"number\",\"exclusiveMinimum\":0},\"x\":{\"type\":\"number\"},\"y\":{\"type\":\"number\"}},\"required\":[\"height\",\"width\",\"x\",\"y\"]},\"page\":{\"type\":\"integer\",\"exclusiveMinimum\":0,\"maximum\":9007199254740991},\"select",
159
+ "or\":{\"type\":\"string\",\"minLength\":1},\"xPath\":{\"type\":\"string\",\"minLength\":1}}},\"publicPath\":{\"type\":\"string\",\"format\":\"starts_with\",\"pattern\":\"^\\\\/api\\\\/assets\\\\/.*\"},\"ref\":{\"type\":\"string\",\"minLength\":1},\"sourceAssetId\":{\"type\":\"string\",\"minLength\":1},\"sourceDownloadId\":{\"type\":\"string\",\"minLength\":1},\"sourceFactId\":{\"type\":\"string\",\"minLength\":1},\"sourceId\":{\"type\":\"string\",\"minLength\":1},\"title\":{\"type\":\"string\",\"minLength\":1},\"url\":{\"type\":\"string\",\"format\":\"uri\"}},\"required\":[\"kind\",\"ref\"]},\"sourceType\":{\"type\":\"string\",\"minLength\":1}},\"required\":[\"citationId\",\"source\",\"sourceType\"]},\"get_demand_batch\":{\"$ref\":\"#/$defs/EnrichCandidateDemandResponse\"},\"resolveCodeAdvisory\":{\"$ref\":\"#/$defs/CodeAdvisoryResponse\"},\"list_code_context\":{\"$ref\":\"#/$defs/CodeContextResponse\"},\"list_code_requirements\":{\"$ref\":\"#/$defs/CodeRequirementsResponse\"}}}",
160
+ ].join("");