@nextcommerce/campaigns-os 1.33.0

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 (310) hide show
  1. package/AGENTS.md +204 -0
  2. package/CHANGELOG.md +5002 -0
  3. package/CONTEXT.md +685 -0
  4. package/LICENSE +202 -0
  5. package/NOTICE +4 -0
  6. package/README.md +368 -0
  7. package/agents/claude/CLAUDE.md +32 -0
  8. package/agents/codex/AGENTS.md +27 -0
  9. package/agents/copilot/copilot-instructions.md +14 -0
  10. package/agents/cursor/campaigns-os.mdc +13 -0
  11. package/bin/campaigns-os.mjs +38 -0
  12. package/campaign-spec/README.md +138 -0
  13. package/campaign-spec/dist/analytics-vocabulary.d.ts +47 -0
  14. package/campaign-spec/dist/analytics-vocabulary.js +74 -0
  15. package/campaign-spec/dist/index.d.ts +40 -0
  16. package/campaign-spec/dist/index.js +77 -0
  17. package/campaign-spec/dist/normalize.d.ts +22 -0
  18. package/campaign-spec/dist/normalize.js +41 -0
  19. package/campaign-spec/dist/routing.d.ts +190 -0
  20. package/campaign-spec/dist/routing.js +263 -0
  21. package/campaign-spec/dist/rules/analytics-contract-shape.d.ts +42 -0
  22. package/campaign-spec/dist/rules/analytics-contract-shape.js +303 -0
  23. package/campaign-spec/dist/rules/assembly-hints-shape.d.ts +42 -0
  24. package/campaign-spec/dist/rules/assembly-hints-shape.js +191 -0
  25. package/campaign-spec/dist/rules/campaign-metadata.d.ts +14 -0
  26. package/campaign-spec/dist/rules/campaign-metadata.js +40 -0
  27. package/campaign-spec/dist/rules/checkout-has-success-url.d.ts +31 -0
  28. package/campaign-spec/dist/rules/checkout-has-success-url.js +66 -0
  29. package/campaign-spec/dist/rules/cycle-detection.d.ts +12 -0
  30. package/campaign-spec/dist/rules/cycle-detection.js +141 -0
  31. package/campaign-spec/dist/rules/design-source-shape.d.ts +29 -0
  32. package/campaign-spec/dist/rules/design-source-shape.js +142 -0
  33. package/campaign-spec/dist/rules/downsell-without-upsell.d.ts +11 -0
  34. package/campaign-spec/dist/rules/downsell-without-upsell.js +40 -0
  35. package/campaign-spec/dist/rules/exit-intent-validation.d.ts +23 -0
  36. package/campaign-spec/dist/rules/exit-intent-validation.js +147 -0
  37. package/campaign-spec/dist/rules/funnel-count.d.ts +9 -0
  38. package/campaign-spec/dist/rules/funnel-count.js +37 -0
  39. package/campaign-spec/dist/rules/funnel-hypothesis-length.d.ts +22 -0
  40. package/campaign-spec/dist/rules/funnel-hypothesis-length.js +60 -0
  41. package/campaign-spec/dist/rules/funnel-identity.d.ts +15 -0
  42. package/campaign-spec/dist/rules/funnel-identity.js +57 -0
  43. package/campaign-spec/dist/rules/funnel-weight-sum.d.ts +20 -0
  44. package/campaign-spec/dist/rules/funnel-weight-sum.js +66 -0
  45. package/campaign-spec/dist/rules/index.d.ts +69 -0
  46. package/campaign-spec/dist/rules/index.js +131 -0
  47. package/campaign-spec/dist/rules/offer-ref-integrity.d.ts +13 -0
  48. package/campaign-spec/dist/rules/offer-ref-integrity.js +59 -0
  49. package/campaign-spec/dist/rules/package-pricing-sanity.d.ts +12 -0
  50. package/campaign-spec/dist/rules/package-pricing-sanity.js +42 -0
  51. package/campaign-spec/dist/rules/page-count.d.ts +11 -0
  52. package/campaign-spec/dist/rules/page-count.js +31 -0
  53. package/campaign-spec/dist/rules/page-id-uniqueness.d.ts +14 -0
  54. package/campaign-spec/dist/rules/page-id-uniqueness.js +47 -0
  55. package/campaign-spec/dist/rules/promo-code-input-validation.d.ts +8 -0
  56. package/campaign-spec/dist/rules/promo-code-input-validation.js +126 -0
  57. package/campaign-spec/dist/rules/promo-codes-shape.d.ts +30 -0
  58. package/campaign-spec/dist/rules/promo-codes-shape.js +187 -0
  59. package/campaign-spec/dist/rules/route-field-ignored-for-page-type.d.ts +33 -0
  60. package/campaign-spec/dist/rules/route-field-ignored-for-page-type.js +81 -0
  61. package/campaign-spec/dist/rules/route-target-resolves.d.ts +32 -0
  62. package/campaign-spec/dist/rules/route-target-resolves.js +112 -0
  63. package/campaign-spec/dist/rules/schema-version.d.ts +21 -0
  64. package/campaign-spec/dist/rules/schema-version.js +53 -0
  65. package/campaign-spec/dist/rules/sdk-version.d.ts +26 -0
  66. package/campaign-spec/dist/rules/sdk-version.js +96 -0
  67. package/campaign-spec/dist/rules/shipping-countries-shape.d.ts +10 -0
  68. package/campaign-spec/dist/rules/shipping-countries-shape.js +30 -0
  69. package/campaign-spec/dist/rules/shipping-methods-present.d.ts +10 -0
  70. package/campaign-spec/dist/rules/shipping-methods-present.js +26 -0
  71. package/campaign-spec/dist/rules/store-profile-shape.d.ts +30 -0
  72. package/campaign-spec/dist/rules/store-profile-shape.js +127 -0
  73. package/campaign-spec/dist/rules/thank-you-requirement.d.ts +16 -0
  74. package/campaign-spec/dist/rules/thank-you-requirement.js +50 -0
  75. package/campaign-spec/dist/rules/unknown-top-level-fields.d.ts +28 -0
  76. package/campaign-spec/dist/rules/unknown-top-level-fields.js +114 -0
  77. package/campaign-spec/dist/rules/upsell-has-packages.d.ts +9 -0
  78. package/campaign-spec/dist/rules/upsell-has-packages.js +35 -0
  79. package/campaign-spec/dist/rules/upsell-routing-complete.d.ts +10 -0
  80. package/campaign-spec/dist/rules/upsell-routing-complete.js +45 -0
  81. package/campaign-spec/dist/rules/upsell-without-checkout.d.ts +11 -0
  82. package/campaign-spec/dist/rules/upsell-without-checkout.js +44 -0
  83. package/campaign-spec/dist/rules/variant-labels-shape.d.ts +28 -0
  84. package/campaign-spec/dist/rules/variant-labels-shape.js +86 -0
  85. package/campaign-spec/dist/sdk-version-parse.d.ts +43 -0
  86. package/campaign-spec/dist/sdk-version-parse.js +62 -0
  87. package/campaign-spec/dist/types.d.ts +674 -0
  88. package/campaign-spec/dist/types.js +40 -0
  89. package/campaign-spec/package.json +12 -0
  90. package/compatibility.json +25 -0
  91. package/contracts/agent-relevant-change-policy.v1.json +111 -0
  92. package/contracts/brand-theme-source-defaults.figma-sections-export.v0.json +32 -0
  93. package/contracts/brand-theme-target-tokens.next-core.v0.json +65 -0
  94. package/contracts/campaign-cart-checkout-field-contract.v0.json +45 -0
  95. package/contracts/campaign-cart-sdk-support-policy.v0.json +11 -0
  96. package/contracts/commerce-surface-catalog.json +2452 -0
  97. package/contracts/fixtures/orientation/canonicalization/v1.json +34 -0
  98. package/contracts/fixtures/orientation/envelope/current.json +95 -0
  99. package/contracts/fixtures/orientation/envelope/freshness_unknown.json +97 -0
  100. package/contracts/fixtures/orientation/envelope/legacy_baseline.json +95 -0
  101. package/contracts/fixtures/orientation/envelope/orientation_available.json +136 -0
  102. package/contracts/fixtures/orientation/envelope/recovered_interrupted_update.json +136 -0
  103. package/contracts/fixtures/orientation/envelope/refused.json +100 -0
  104. package/contracts/fixtures/orientation/envelope/restart_required.json +137 -0
  105. package/contracts/fixtures/orientation/envelope/updated.json +135 -0
  106. package/contracts/fixtures/orientation/hostile-target/README.md +61 -0
  107. package/contracts/fixtures/orientation/hostile-target/manifest.json +82 -0
  108. package/contracts/fixtures/orientation/hostile-target/repo/CHANGELOG.md +18 -0
  109. package/contracts/fixtures/orientation/hostile-target/repo/bin/intended.mjs +12 -0
  110. package/contracts/fixtures/orientation/hostile-target/repo/bin/tripwire.mjs +15 -0
  111. package/contracts/fixtures/orientation/hostile-target/repo/contracts/release-ledger.json +48 -0
  112. package/contracts/fixtures/orientation/hostile-target/repo/contracts/supported-surface.json +17 -0
  113. package/contracts/fixtures/orientation/hostile-target/repo/docs/example-contract.md +13 -0
  114. package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-checkout +5 -0
  115. package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-merge +5 -0
  116. package/contracts/fixtures/orientation/hostile-target/repo/hooks/pre-commit +5 -0
  117. package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/package.json +15 -0
  118. package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/tripwire.mjs +9 -0
  119. package/contracts/fixtures/orientation/hostile-target/repo/package.json +20 -0
  120. package/contracts/fixtures/orientation/hostile-target/repo/schemas/example.v0.schema.json +15 -0
  121. package/contracts/fixtures/orientation/release-gate/cases.json +1073 -0
  122. package/contracts/fixtures/runtime-recipe/accept/current.json +299 -0
  123. package/contracts/fixtures/runtime-recipe/accept/minimal.json +294 -0
  124. package/contracts/fixtures/runtime-recipe/dist-states.json +51 -0
  125. package/contracts/fixtures/runtime-recipe/manifest.json +85 -0
  126. package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +299 -0
  127. package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +297 -0
  128. package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +299 -0
  129. package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +299 -0
  130. package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +299 -0
  131. package/contracts/fixtures/runtime-recipe/reject/missing-required-field.json +251 -0
  132. package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +299 -0
  133. package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +299 -0
  134. package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +310 -0
  135. package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +299 -0
  136. package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +299 -0
  137. package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +299 -0
  138. package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +299 -0
  139. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/assembly-report.json +180 -0
  140. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/build-context.json +115 -0
  141. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/doctor-output.json +29 -0
  142. package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/qa-verdict.json +27 -0
  143. package/contracts/fixtures/sidecar-bundle/production-shaped/campaign-runtime.build.json +141 -0
  144. package/contracts/migration-sidecar-bundle.v0.json +149 -0
  145. package/contracts/orientation-limits.v1.json +41 -0
  146. package/contracts/orientation-reason-codes.v1.json +196 -0
  147. package/contracts/private-template-sources.json +8 -0
  148. package/contracts/release-ledger.json +4598 -0
  149. package/contracts/reserved-skill-names.json +13 -0
  150. package/contracts/runtime-recipe.campaigns-os-node-v1.json +299 -0
  151. package/contracts/supported-surface.json +180 -0
  152. package/contracts/template-brand-contract.apollo-mv-single-step.v0.json +27 -0
  153. package/contracts/template-brand-contract.apollo.v0.json +27 -0
  154. package/contracts/template-brand-contract.demeter.v0.json +27 -0
  155. package/contracts/template-brand-contract.olympus-mv-single-step.v0.json +27 -0
  156. package/contracts/template-brand-contract.olympus-mv-two-step.v0.json +28 -0
  157. package/contracts/template-brand-contract.olympus.v0.json +27 -0
  158. package/contracts/template-brand-contract.shared-commerce.v0.json +190 -0
  159. package/contracts/template-brand-contract.shop-single-step.v0.json +27 -0
  160. package/contracts/template-brand-contract.shop-three-step.v0.json +29 -0
  161. package/contracts/template-slot-manifest.apollo-mv-single-step.v0.json +14 -0
  162. package/contracts/template-slot-manifest.apollo.v0.json +12 -0
  163. package/contracts/template-slot-manifest.demeter.v0.json +30 -0
  164. package/contracts/template-slot-manifest.olympus-mv-single-step.v0.json +14 -0
  165. package/contracts/template-slot-manifest.olympus-mv-two-step.v0.json +15 -0
  166. package/contracts/template-slot-manifest.olympus.v0.json +12 -0
  167. package/contracts/template-slot-manifest.shared-content-core.v0.json +4254 -0
  168. package/contracts/template-slot-manifest.shop-single-step.v0.json +47 -0
  169. package/contracts/template-slot-manifest.shop-three-step.v0.json +33 -0
  170. package/docs/brand-theme-bridge.md +159 -0
  171. package/docs/build-packet.md +1300 -0
  172. package/docs/campaign-build-brief.md +145 -0
  173. package/docs/campaign-standardization-report.md +329 -0
  174. package/docs/campaigns-os-build-flow.md +117 -0
  175. package/docs/design-source-package.md +784 -0
  176. package/docs/legacy-migration.md +58 -0
  177. package/docs/migration-sidecar-bundle.md +139 -0
  178. package/docs/orientation-contract-reference.md +1220 -0
  179. package/docs/polish-evidence.md +502 -0
  180. package/docs/qa-and-test-orders.md +1691 -0
  181. package/docs/release-ledger-authoring-guide.md +274 -0
  182. package/docs/runtime-readiness.md +211 -0
  183. package/docs/supported-surface.md +83 -0
  184. package/docs/versioning.md +55 -0
  185. package/docs/workflow-findings-sidecar.md +588 -0
  186. package/package.json +135 -0
  187. package/prompts/first-build.md +27 -0
  188. package/prompts/friction-log.md +30 -0
  189. package/schemas/campaign-build-brief.v1.schema.json +149 -0
  190. package/schemas/campaign-design-source-package.v0.schema.json +697 -0
  191. package/schemas/campaign-runtime-assembly-report.v0.schema.json +390 -0
  192. package/schemas/campaign-runtime-build-context.v0.schema.json +339 -0
  193. package/schemas/campaign-runtime-build-packet.v0.schema.json +452 -0
  194. package/schemas/campaign-spec.v4.schema.json +582 -0
  195. package/schemas/campaigns-os-doctor-output.v0.schema.json +43 -0
  196. package/schemas/campaigns-os-legacy-migration-inventory.v0.schema.json +112 -0
  197. package/schemas/campaigns-os-legacy-provisioning-plan.v0.schema.json +38 -0
  198. package/schemas/campaigns-os-legacy-provisioning-receipt.v0.schema.json +57 -0
  199. package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +150 -0
  200. package/schemas/campaigns-os-qa-verdict.v0.schema.json +438 -0
  201. package/schemas/campaigns-os-release-ledger.v1.schema.json +162 -0
  202. package/schemas/campaigns-os-run-record.v0.schema.json +343 -0
  203. package/schemas/campaigns-os-runtime-recipe.v1.schema.json +313 -0
  204. package/schemas/campaigns-os-sidecar-bundle-conformance.v0.schema.json +78 -0
  205. package/schemas/campaigns-os-tooling-orientation.v1.schema.json +381 -0
  206. package/schemas/campaigns-os-workflow-finding.v0.schema.json +134 -0
  207. package/schemas/source-html-manifest.v0.schema.json +252 -0
  208. package/skills/next-campaigns-build/SKILL.md +73 -0
  209. package/skills/next-campaigns-os/SKILL.md +101 -0
  210. package/skills/next-campaigns-os/references/session-intake.md +160 -0
  211. package/skills/next-campaigns-os-setup/SKILL.md +22 -0
  212. package/skills/next-campaigns-polish/SKILL.md +145 -0
  213. package/skills/next-campaigns-qa/SKILL.md +92 -0
  214. package/skills.json +56 -0
  215. package/skills.sh +64 -0
  216. package/src/adapter-decision-contract.mjs +333 -0
  217. package/src/brand-theme.mjs +1151 -0
  218. package/src/browser-launch.mjs +79 -0
  219. package/src/build-brief.mjs +781 -0
  220. package/src/built-site-scope.mjs +312 -0
  221. package/src/campaign-ecosystem.mjs +734 -0
  222. package/src/campaign-identity.mjs +405 -0
  223. package/src/campaign-workspace.mjs +127 -0
  224. package/src/checkpoint-waiver.mjs +302 -0
  225. package/src/cli.mjs +13442 -0
  226. package/src/commercial-journey.mjs +1119 -0
  227. package/src/commercial-parity.mjs +965 -0
  228. package/src/consent.mjs +347 -0
  229. package/src/content-residue.mjs +322 -0
  230. package/src/deadline.mjs +81 -0
  231. package/src/design-source-package.mjs +2604 -0
  232. package/src/deviation.mjs +107 -0
  233. package/src/doctor-check-registry.mjs +49 -0
  234. package/src/doctor-sidecar.mjs +106 -0
  235. package/src/finding-cause.mjs +557 -0
  236. package/src/findings.mjs +326 -0
  237. package/src/fs-identity.mjs +68 -0
  238. package/src/gate-actions.mjs +105 -0
  239. package/src/html-scan.mjs +53 -0
  240. package/src/install-mode.mjs +272 -0
  241. package/src/legacy-migration.d.ts +128 -0
  242. package/src/legacy-migration.mjs +510 -0
  243. package/src/lifecycle.mjs +338 -0
  244. package/src/local-proof.mjs +401 -0
  245. package/src/map-pin-writeback.mjs +210 -0
  246. package/src/orchestration-stage-contract.mjs +81 -0
  247. package/src/package-install-fixture.mjs +33 -0
  248. package/src/page-kit-build-summary.mjs +175 -0
  249. package/src/page-kit-campaign-config.mjs +57 -0
  250. package/src/page-kit-sdk-version.mjs +392 -0
  251. package/src/page-kit-store-profile.mjs +369 -0
  252. package/src/page-kit-sync.mjs +162 -0
  253. package/src/polish-browser.mjs +867 -0
  254. package/src/polish-capture.mjs +1094 -0
  255. package/src/polish-deadline.mjs +51 -0
  256. package/src/polish-gate.mjs +739 -0
  257. package/src/polish-node.mjs +639 -0
  258. package/src/polish-page-load.mjs +1100 -0
  259. package/src/private-template-source.mjs +237 -0
  260. package/src/proof-policy.mjs +82 -0
  261. package/src/qa-analytics-correctness.mjs +307 -0
  262. package/src/qa-analytics-errors.mjs +38 -0
  263. package/src/qa-analytics-parity.mjs +699 -0
  264. package/src/qa-binding-evidence.mjs +140 -0
  265. package/src/qa-browser.mjs +6608 -0
  266. package/src/qa-cart-entry.mjs +406 -0
  267. package/src/qa-commercial-parity.mjs +641 -0
  268. package/src/qa-node.mjs +3620 -0
  269. package/src/qa-order-bump.mjs +381 -0
  270. package/src/qa-parity-capture.mjs +428 -0
  271. package/src/qa-parity-fixture.mjs +359 -0
  272. package/src/qa-publish.mjs +362 -0
  273. package/src/qa-purchase-data-layer.mjs +263 -0
  274. package/src/qa-route-probe.mjs +272 -0
  275. package/src/qa-sidecar.mjs +188 -0
  276. package/src/qa-test-order-topology.mjs +207 -0
  277. package/src/qa-url-privacy.mjs +13 -0
  278. package/src/qa-verdict-discovery.mjs +192 -0
  279. package/src/qa-verdict-publish.mjs +105 -0
  280. package/src/qa-verdict.mjs +287 -0
  281. package/src/remit.mjs +388 -0
  282. package/src/repo-scan.mjs +83 -0
  283. package/src/route-identity.mjs +133 -0
  284. package/src/run-record-closeout.mjs +229 -0
  285. package/src/run-record.mjs +839 -0
  286. package/src/run-session.mjs +226 -0
  287. package/src/runtime-state-ignore.mjs +113 -0
  288. package/src/sdk-attribute-index.mjs +212 -0
  289. package/src/sdk-markup.mjs +358 -0
  290. package/src/sdk-meta-tags.mjs +52 -0
  291. package/src/shell-token.mjs +7 -0
  292. package/src/sidecar-bundle.mjs +399 -0
  293. package/src/source-asset-crawl.mjs +469 -0
  294. package/src/source-html-intake.mjs +627 -0
  295. package/src/source-html-manifest.mjs +276 -0
  296. package/src/source-prep.mjs +284 -0
  297. package/src/spec-derive-store.mjs +431 -0
  298. package/src/spec-derive.mjs +514 -0
  299. package/src/spec-fetch.mjs +66 -0
  300. package/src/spec-hash.mjs +48 -0
  301. package/src/spec-identity.mjs +27 -0
  302. package/src/stage-ledger.mjs +509 -0
  303. package/src/standardization-report.mjs +1297 -0
  304. package/src/template-brand-contract.mjs +473 -0
  305. package/src/template-freshness.mjs +196 -0
  306. package/src/template-reference.mjs +81 -0
  307. package/src/template-slot-manifest.mjs +150 -0
  308. package/src/text-safety.mjs +62 -0
  309. package/src/theme-gate.mjs +185 -0
  310. package/src/upsell-selector-scope.mjs +299 -0
@@ -0,0 +1,2452 @@
1
+ {
2
+ "version": 2,
3
+ "purpose": "Routing catalog for matching designed HTML to Campaign Cart starter template families and commerce-ready surfaces. Keep matching cheap and deterministic; ask the user when confidence is not high.",
4
+ "agentContractVersion": 1,
5
+ "confidencePolicy": {
6
+ "highThreshold": 0.85,
7
+ "askUserBelow": 0.85,
8
+ "maxFamilyCandidatesBeforeAsk": 2,
9
+ "doNotInferFrom": [
10
+ "brand colors alone",
11
+ "product category alone",
12
+ "copy tone alone",
13
+ "one shared include such as payment-methods.html"
14
+ ],
15
+ "preferSignalsInOrder": [
16
+ "explicit user instruction",
17
+ "CampaignSpec template_family or template fields",
18
+ "export folder or file names",
19
+ "unique commerce structure",
20
+ "distinctive checkout layout structure",
21
+ "class-name fingerprints"
22
+ ]
23
+ },
24
+ "copyReviewPolicy": {
25
+ "purpose": "Market-sensitive starter copy must be confirmed against the target campaign instead of blindly carried forward or automatically removed.",
26
+ "appliesWhen": [
27
+ "CampaignSpec declares additional currencies",
28
+ "CampaignSpec declares non-US shipping countries",
29
+ "CampaignSpec available_shipping_countries is all",
30
+ "builder records market mode as country-specific or multi-market"
31
+ ],
32
+ "reviewSurfaces": [
33
+ "landing and presell page copy",
34
+ "checkout trust and delivery copy",
35
+ "upsell shipping info blocks",
36
+ "receipt/support copy",
37
+ "visible carrier, warehouse, and manufacturing claims"
38
+ ],
39
+ "warnOnlyPatterns": [
40
+ {
41
+ "label": "US carrier or warehouse claim",
42
+ "examples": [
43
+ "USPS",
44
+ "ships from the USA",
45
+ "US warehouse",
46
+ "contiguous US"
47
+ ]
48
+ },
49
+ {
50
+ "label": "US shipping promise",
51
+ "examples": [
52
+ "All US orders ship free",
53
+ "USA only",
54
+ "United States only",
55
+ "free shipping on all US orders"
56
+ ]
57
+ },
58
+ {
59
+ "label": "US manufacturing or compliance claim",
60
+ "examples": [
61
+ "Made in USA",
62
+ "manufactured in the USA",
63
+ "FDA-registered US facility"
64
+ ]
65
+ },
66
+ {
67
+ "label": "US address-language assumption",
68
+ "examples": [
69
+ "State",
70
+ "ZIP Code"
71
+ ]
72
+ }
73
+ ],
74
+ "agentRule": "When a warn-only pattern appears in a country-specific or multi-market campaign, treat it as replace-or-confirm campaign copy. Preserve it only when the CampaignSpec, source design, or operator explicitly confirms the claim. Do not remove it automatically."
75
+ },
76
+ "sharedFrontmatterVocabulary": {
77
+ "packages": {
78
+ "purpose": "Named Campaigns App package ref_ids used by checkout selectors, bumps, and display bindings.",
79
+ "canonicalKeys": [
80
+ "main_package",
81
+ "prepurchase_1",
82
+ "prepurchase_2"
83
+ ],
84
+ "sourceOfTruth": [
85
+ "CampaignSpec funnels[].pages[].packages",
86
+ "Campaigns API packages[].ref_id"
87
+ ],
88
+ "demoOnlyValues": [
89
+ 1,
90
+ 7,
91
+ 9
92
+ ],
93
+ "agentRule": "Replace starter refs from the target CampaignSpec/API. Remove optional bump surfaces when the referenced prepurchase package is absent."
94
+ },
95
+ "shipping_methods": {
96
+ "purpose": "Named Campaigns App shipping method ref_ids used by checkout selector cards.",
97
+ "canonicalKeys": [
98
+ "standard",
99
+ "free"
100
+ ],
101
+ "sourceOfTruth": [
102
+ "CampaignSpec shipping_methods[]",
103
+ "Campaigns API shipping_options[].ref_id"
104
+ ],
105
+ "demoOnlyValues": [
106
+ 2,
107
+ 1
108
+ ],
109
+ "agentRule": "Use only on checkout/cart selector surfaces. Do not carry starter refs between campaigns; remove shipping_method rows when the target campaign has no matching method."
110
+ },
111
+ "bundles": {
112
+ "purpose": "Checkout bundle-card rows for package quantity tiers.",
113
+ "canonicalKeys": [
114
+ "id",
115
+ "quantity",
116
+ "shipping_method",
117
+ "selected",
118
+ "title_prefix",
119
+ "badge_text",
120
+ "items_json"
121
+ ],
122
+ "sourceOfTruth": [
123
+ "CampaignSpec checkout page packages/offers",
124
+ "Campaigns API package and shipping refs"
125
+ ],
126
+ "agentRule": "Prefer package_id plus quantity. Use explicit items_json only for genuinely custom item sets."
127
+ },
128
+ "variant_slots": {
129
+ "purpose": "MV/configurable bundle slots for selector rows and later variant choice stages.",
130
+ "canonicalKeys": [
131
+ "id",
132
+ "quantity",
133
+ "shipping_method",
134
+ "selected",
135
+ "title",
136
+ "label_text",
137
+ "configurable"
138
+ ],
139
+ "sourceOfTruth": [
140
+ "CampaignSpec MV checkout/select pages",
141
+ "Campaigns API package refs and variant config"
142
+ ],
143
+ "agentRule": "Keep selector ids aligned with data-next-bundle-slots-for. Preserve configurable bundle item shape unless the API/spec says the package is non-configurable."
144
+ },
145
+ "order_bump": {
146
+ "purpose": "Pre-purchase add-on toggle configuration.",
147
+ "canonicalKeys": [
148
+ "order_bump_variant",
149
+ "selector_order_bump_variant",
150
+ "order_bump.check01",
151
+ "order_bump.check03",
152
+ "order_bump.switch01"
153
+ ],
154
+ "sourceOfTruth": [
155
+ "CampaignSpec checkout page offers/packages",
156
+ "Campaigns API package refs"
157
+ ],
158
+ "agentRule": "Enable only when the target campaign has the referenced package or offer. Do not leave warranty/insurance starter modules pointed at missing package refs. On Apollo and Apollo MV checkouts, `selector_order_bump_variant` controls the product-card bump immediately below the bundle/MV selector (`check03` or `none`); `order_bump_variant` controls only the later `.order-bumps` form-section slot — do not treat `order_bump_variant` as all bumps on the page."
159
+ },
160
+ "upsell_offer": {
161
+ "purpose": "Single-card post-purchase bundle upsell offer.",
162
+ "canonicalKeys": [
163
+ "package_id",
164
+ "selector_id",
165
+ "bundle_id",
166
+ "items_json",
167
+ "vouchers_json",
168
+ "accept_text",
169
+ "decline_text"
170
+ ],
171
+ "sourceOfTruth": [
172
+ "CampaignSpec upsell/downsell pages",
173
+ "Campaigns API package refs and vouchers/offers"
174
+ ],
175
+ "agentRule": "Post-purchase upsells do not use shipping_methods. Package refs and vouchers must come from the upsell page contract."
176
+ },
177
+ "upsell_bundle_tiers": {
178
+ "purpose": "Tiered post-purchase bundle upsell rows.",
179
+ "canonicalKeys": [
180
+ "id",
181
+ "items_json",
182
+ "vouchers_json",
183
+ "selected",
184
+ "label",
185
+ "quantity"
186
+ ],
187
+ "sourceOfTruth": [
188
+ "CampaignSpec upsell/downsell pages",
189
+ "Campaigns API package refs and vouchers/offers"
190
+ ],
191
+ "agentRule": "Keep display tier and in-offer selector ids paired. Do not attach checkout shipping refs to upsell cards."
192
+ },
193
+ "upsell_mv_tiers": {
194
+ "purpose": "Tiered post-purchase MV/configurable bundle upsell rows.",
195
+ "canonicalKeys": [
196
+ "id",
197
+ "quantity",
198
+ "vouchers_json",
199
+ "selected"
200
+ ],
201
+ "sourceOfTruth": [
202
+ "CampaignSpec MV upsell/downsell pages",
203
+ "Campaigns API configurable package refs and vouchers/offers"
204
+ ],
205
+ "agentRule": "Pair with upsell_offer.package_id. Keep quantity tier ids aligned with upsells-mv.js and the hidden bundle selector; do not attach checkout shipping refs to MV upsells."
206
+ },
207
+ "receipt_summary": {
208
+ "purpose": "Receipt order-item template ids and summary copy.",
209
+ "canonicalKeys": [
210
+ "title",
211
+ "scroll_hint",
212
+ "mobile_item_template_id",
213
+ "desktop_item_template_id"
214
+ ],
215
+ "sourceOfTruth": [
216
+ "Template receipt include contract",
217
+ "SDK order display data"
218
+ ],
219
+ "agentRule": "Preserve data-next-order-items templates and ids; change copy only through frontmatter when the family exposes it."
220
+ },
221
+ "payment_flags": {
222
+ "purpose": "Visible payment method rows and express wallet flags.",
223
+ "canonicalKeys": [
224
+ "show_paypal",
225
+ "show_klarna",
226
+ "show_apple_pay",
227
+ "show_google_pay"
228
+ ],
229
+ "sourceOfTruth": [
230
+ "CampaignSpec payment methods",
231
+ "Campaigns API/payment provider capability"
232
+ ],
233
+ "agentRule": "Payment config, CampaignSpec/API support, and visible rows must agree."
234
+ },
235
+ "slot_personalization": {
236
+ "purpose": "MV slot-picker line-item personalization (SDK 0.4.27+). Adds a data-next-property input to each rendered bundle slot — on the checkout/select selector AND the post-purchase upsell offer — so units carry distinct text and become separate order lines. Same contract name across both surfaces.",
237
+ "canonicalKeys": [
238
+ "enabled",
239
+ "property_key",
240
+ "label",
241
+ "optional",
242
+ "placeholder",
243
+ "maxlength"
244
+ ],
245
+ "sourceOfTruth": [
246
+ "Campaign personalization requirement (per-line custom text)",
247
+ "Template slot partials: mv-configurable-selector.html / mv-slot-stage.html (checkout/select) and upsell-mv-offer.html (upsell)"
248
+ ],
249
+ "agentRule": "MV/slot-rendering families only — per-line customization requires a slot picker (eng-confirmed); not available on tier-swap families. Same `slot_personalization` contract on MV checkout/select and MV upsell. Shipped enabled on `apollo-mv-single-step` and `olympus-mv-single-step` (checkout.html + upsell-mv.html), disabled on `olympus-mv-two-step` (one live reference each). To apply on any other MV page, set slot_personalization.enabled:true in that page's frontmatter — the shared partial renders the field from the same contract (no markup copy). property_key becomes the order line-item attribute name. Fill every slot explicitly; do not rely on an order-wide default to fill some slots and override others (same-package overrides drop). When paired with order_personalization, keep property_keys distinct (per-slot overrides the page default on a shared key)."
250
+ },
251
+ "order_personalization": {
252
+ "purpose": "All-lines line-item personalization default (SDK 0.4.27+) via data-next-default-property. One value is applied to every line the active bundle/cart write or upsell accept sends; on a single non-slot upsell this means the one accepted line gets the value.",
253
+ "canonicalKeys": [
254
+ "enabled",
255
+ "property_key",
256
+ "label",
257
+ "optional",
258
+ "placeholder",
259
+ "maxlength"
260
+ ],
261
+ "sourceOfTruth": [
262
+ "Campaign personalization requirement (one shared value across all units or one value on a single non-slot upsell)",
263
+ "Template partial: personalization-field.html; offer partials may render the same order_personalization contract with data-next-default-property"
264
+ ],
265
+ "agentRule": "Reliable for 'same value on every unit' and for single non-variant / non-slot upsells where the accepted set is one line. The generic partial ships in every family's _includes but is NOT wired into generic pages; opt in with a campaign_include or an offer partial that accepts order_personalization. For per-line distinct slot values use slot_personalization (MV checkout/select/upsell) instead. When paired with a per-slot field on the same surface, use a DISTINCT property_key: the merge is { ...default, ...slot } so a per-slot value overrides the default on a shared key (MV checkout uses custom_text vs slot number; MV upsell example uses gift_message vs slot upsell_message)."
266
+ }
267
+ },
268
+ "campaignSpecFixturePolicy": {
269
+ "directory": "contracts/fixtures/campaign-specs",
270
+ "purpose": "Small CampaignSpec-shaped examples for agent contract reasoning, authored in the real Map Builder export dialect (schema_version 4.3). They are not live Campaigns App exports.",
271
+ "requiredShape": [
272
+ "campaign.id",
273
+ "campaign.name",
274
+ "campaign.currency",
275
+ "campaign.language",
276
+ "funnels[].pages[]"
277
+ ],
278
+ "fixtureOnlyConventions": [
279
+ "sdk_hints.template_family names the starter family for the fixture only.",
280
+ "sdk_hints.frontmatter shows the intended starter-template frontmatter mapping.",
281
+ "ref_id values are illustrative and must be replaced from the target Campaigns API."
282
+ ]
283
+ },
284
+ "families": {
285
+ "olympus": {
286
+ "description": "Single-step checkout with tiered bundle cards and strong direct-response checkout framing.",
287
+ "frontmatterStatus": "include-driven",
288
+ "strongSignals": [
289
+ "olympus in spec, path, or export metadata",
290
+ "os-card tier bundle selector",
291
+ "bundle selector include receives bundles frontmatter",
292
+ "side cart summary with Olympus card pricing rows"
293
+ ],
294
+ "canonicalSurfaces": {
295
+ "mainSelector": "tiered-bundle-selector",
296
+ "orderSummary": "cart-summary01|cart-summary02|cart-summary03|cart-summary04",
297
+ "payment": "payment-methods",
298
+ "expressCheckout": "express-checkout|express-checkout-inline",
299
+ "orderBump": "bump-check01|bump-check02|bump-check03|bump-switch01",
300
+ "upsell": "bundle-stepper|bundle-tier-pills|bundle-tier-cards",
301
+ "receipt": "receipt-skeleton"
302
+ },
303
+ "frontmatterInputsObserved": [
304
+ "bundles",
305
+ "cart_summary_variant",
306
+ "order_bump",
307
+ "order_bump_variant",
308
+ "packages",
309
+ "shipping_methods",
310
+ "swiper_slides",
311
+ "swiper_thumbs",
312
+ "upsell_offer",
313
+ "upsell_bundle_tiers"
314
+ ],
315
+ "agentContract": {
316
+ "status": "agent-ready",
317
+ "templateRole": "Classic single-step checkout family with tiered os-card bundle cards and optional pre-purchase bumps. Prefer `apollo` for new campaigns unless the design explicitly matches the Olympus os-card shape.",
318
+ "sourceOfTruth": {
319
+ "campaignSpec": [
320
+ "campaign currency/language/payment/tracking",
321
+ "checkout page packages/offers",
322
+ "shipping_methods[]",
323
+ "upsell/receipt routing"
324
+ ],
325
+ "campaignsApi": [
326
+ "packages[].ref_id",
327
+ "shipping_options[].ref_id",
328
+ "payment method capability"
329
+ ],
330
+ "starterTemplate": [
331
+ "stable SDK DOM shape",
332
+ "family-local includes",
333
+ "page frontmatter contract"
334
+ ]
335
+ },
336
+ "frontmatter": {
337
+ "requiredWhenCloning": [
338
+ "packages.main_package",
339
+ "shipping_methods.standard",
340
+ "bundles[].quantity",
341
+ "bundles[].shipping_method"
342
+ ],
343
+ "optionalWhenSupported": [
344
+ "cart_summary_variant",
345
+ "shipping_methods.free",
346
+ "order_bump_variant",
347
+ "order_bump",
348
+ "packages.prepurchase_1",
349
+ "packages.prepurchase_2",
350
+ "swiper_slides",
351
+ "swiper_thumbs",
352
+ "payment_flags",
353
+ "upsell_offer",
354
+ "upsell_bundle_tiers"
355
+ ],
356
+ "demoOnlyValues": [
357
+ "packages.main_package=1",
358
+ "packages.prepurchase_1=7",
359
+ "packages.prepurchase_2=9",
360
+ "shipping_methods.standard=2",
361
+ "shipping_methods.free=1",
362
+ "upsell_offer.package_id=3",
363
+ "upsell_offer.vouchers_json=[\"UP50\"]",
364
+ "upsell_bundle_tiers packageId=3"
365
+ ],
366
+ "replaceFromSpecOrApi": [
367
+ "packages.*",
368
+ "shipping_methods.*",
369
+ "bundles[].shipping_method",
370
+ "order_bump.*.package_id",
371
+ "upsell_offer.*",
372
+ "upsell_bundle_tiers[].items_json",
373
+ "upsell_bundle_tiers[].vouchers_json"
374
+ ],
375
+ "removeWhenUnsupported": [
376
+ "bundles[].shipping_method when no tier-specific shipping exists",
377
+ "bump includes when prepurchase packages are absent",
378
+ "unsupported payment method rows",
379
+ "upsell pages not present in the funnel"
380
+ ]
381
+ },
382
+ "surfaces": [
383
+ {
384
+ "name": "tiered bundle selector",
385
+ "partials": [
386
+ "bundle-selector.html"
387
+ ],
388
+ "ownedInputs": [
389
+ "packages",
390
+ "shipping_methods",
391
+ "bundles"
392
+ ],
393
+ "sdkRoots": [
394
+ "data-next-bundle-selector",
395
+ "data-next-bundle-card"
396
+ ]
397
+ },
398
+ {
399
+ "name": "payment shell",
400
+ "partials": [
401
+ "payment-methods.html",
402
+ "express-checkout.html"
403
+ ],
404
+ "ownedInputs": [
405
+ "payment_flags"
406
+ ],
407
+ "sdkRoots": [
408
+ "data-next-payment-method",
409
+ "data-next-payment-form",
410
+ "data-next-express-checkout"
411
+ ]
412
+ },
413
+ {
414
+ "name": "order bump",
415
+ "partials": [
416
+ "bump-check01.html",
417
+ "bump-switch01.html"
418
+ ],
419
+ "ownedInputs": [
420
+ "packages",
421
+ "order_bump"
422
+ ],
423
+ "sdkRoots": [
424
+ "data-next-package-toggle",
425
+ "data-next-toggle-card"
426
+ ]
427
+ },
428
+ {
429
+ "name": "Olympus bundle upsell pages",
430
+ "partials": [
431
+ "upsell-bundle-stepper-offer.html",
432
+ "upsell-bundle-tier-pills-offer.html",
433
+ "upsell-bundle-tier-cards-offer.html"
434
+ ],
435
+ "ownedInputs": [
436
+ "upsell_offer",
437
+ "upsell_bundle_tiers"
438
+ ],
439
+ "sdkRoots": [
440
+ "data-next-upsell",
441
+ "data-next-bundle-selector",
442
+ "data-next-bundle-card"
443
+ ]
444
+ }
445
+ ],
446
+ "fixtures": [
447
+ "contracts/fixtures/campaign-specs/olympus-tiered-standard-free.json"
448
+ ],
449
+ "agentNotes": [
450
+ "Use this family when the design explicitly has the classic Olympus os-card tier shape. For new direct-response checkouts, default to `apollo` unless os-card styling is required.",
451
+ "Olympus bundle upsell pages use include-owned offer partials; replace upsell_offer and upsell_bundle_tiers from the target CampaignSpec/API."
452
+ ],
453
+ "qaStructure": {
454
+ "checkout": {
455
+ "description": "Rendered Olympus checkout must adopt the starter-template shell, not a custom shell with only borrowed partials.",
456
+ "requiredVisibleSelectors": [
457
+ {
458
+ "name": "Olympus checkout wrapper",
459
+ "selector": ".checkout-wrapper"
460
+ },
461
+ {
462
+ "name": "left checkout column",
463
+ "selector": ".checkout-layout__left"
464
+ },
465
+ {
466
+ "name": "right checkout column",
467
+ "selector": ".checkout-layout__right"
468
+ },
469
+ {
470
+ "name": "checkout form",
471
+ "selector": "[data-next-checkout=\"form\"]"
472
+ },
473
+ {
474
+ "name": "shipping field row component",
475
+ "selector": "[data-next-component=\"shipping-field-row\"]"
476
+ },
477
+ {
478
+ "name": "checkout payment submit",
479
+ "selector": "[os-checkout-payment]"
480
+ },
481
+ {
482
+ "name": "rendered order summary",
483
+ "selector": "[data-next-cart-summary]"
484
+ }
485
+ ],
486
+ "requiredNonEmptySelectors": [
487
+ {
488
+ "name": "visible order summary content",
489
+ "selector": "[data-next-cart-summary]"
490
+ }
491
+ ]
492
+ }
493
+ }
494
+ },
495
+ "verification": {
496
+ "sdk_version": "0.4.37",
497
+ "verified_at": "2026-08-21T15:26:00Z",
498
+ "evidence": "sdk-0.4.37-2026-08-21",
499
+ "status": "certified",
500
+ "source": "template-verification.json"
501
+ }
502
+ },
503
+ "apollo": {
504
+ "description": "Single-step checkout with Apollo direct-response layout, include-driven bundle selector with interchangeable card styles, and optional checkout reveal.",
505
+ "templateReference": {
506
+ "id": "template-reference-apollo",
507
+ "family": "apollo",
508
+ "version": "sdk-0.4.37-2026-08-21",
509
+ "source_commit": "e9a2fc17beefe572b8ddc0c4f9b1b8e2f97f9a59",
510
+ "provenance_url": "https://raw.githubusercontent.com/NextCommerceCo/campaign-cart-starter-templates/main/docs/template-references/apollo/README.md",
511
+ "contract_path": "contracts/commerce-surface-catalog.json",
512
+ "standard_viewport_refs": [
513
+ {
514
+ "id": "apollo-checkout-desktop",
515
+ "viewport": "desktop",
516
+ "url": "https://raw.githubusercontent.com/NextCommerceCo/campaign-cart-starter-templates/main/docs/template-references/apollo/checkout-desktop.png",
517
+ "width": 1440,
518
+ "height": 1491,
519
+ "sha256": "e0fd4854422b9ca90b54adc1477e1291824fc63e898e50c5c6cc8e4e58ce39e6",
520
+ "device_profile": "Desktop 1440",
521
+ "browser": "chromium",
522
+ "captured_at": "2026-08-24T05:10:18.000Z"
523
+ },
524
+ {
525
+ "id": "apollo-checkout-mobile",
526
+ "viewport": "mobile",
527
+ "url": "https://raw.githubusercontent.com/NextCommerceCo/campaign-cart-starter-templates/main/docs/template-references/apollo/checkout-mobile.png",
528
+ "width": 390,
529
+ "height": 2650,
530
+ "sha256": "14386e851e70b21f03ac2608c1efcde18b2bfc4d31736cb07add199e1953fe5c",
531
+ "device_profile": "Mobile 390",
532
+ "browser": "chromium",
533
+ "captured_at": "2026-08-24T05:10:23.000Z"
534
+ }
535
+ ]
536
+ },
537
+ "frontmatterStatus": "include-driven",
538
+ "strongSignals": [
539
+ "apollo in spec, path, or export metadata",
540
+ "checkout-apollo.js",
541
+ "bundle_card_style frontmatter",
542
+ "bundle-selector.html with bundle-card dispatcher",
543
+ "promo-banner and promo-timer partials (not web components)",
544
+ "checkout-reveal CTA and panel",
545
+ "selector_order_bump_variant for check03 below selector"
546
+ ],
547
+ "canonicalSurfaces": {
548
+ "mainSelector": "tiered-bundle-selector",
549
+ "bundleCardStyles": "bundle-card-product|bundle-card-classic|bundle-card-tiles",
550
+ "selectorOrderBump": "bump-check03",
551
+ "orderSummary": "cart-summary01|cart-summary02|cart-summary03|cart-summary04",
552
+ "payment": "payment-methods",
553
+ "expressCheckout": "express-checkout|express-checkout-inline",
554
+ "orderBump": "bump-check01|bump-check02|bump-check03|bump-switch01",
555
+ "checkoutReveal": "checkout-form--reveal",
556
+ "upsell": "bundle-stepper|bundle-tier-pills|bundle-tier-cards",
557
+ "receipt": "receipt-skeleton"
558
+ },
559
+ "frontmatterInputsObserved": [
560
+ "bundles",
561
+ "bundle_card_style",
562
+ "cart_summary_variant",
563
+ "selector_order_bump_variant",
564
+ "order_bump",
565
+ "order_bump_variant",
566
+ "checkout_reveal",
567
+ "checkout_reveal_cta",
568
+ "as_seen_in",
569
+ "reviews_slider",
570
+ "guarantee",
571
+ "promo_timer",
572
+ "promo_banner",
573
+ "product_heading",
574
+ "packages",
575
+ "shipping_methods",
576
+ "swiper_slides",
577
+ "swiper_thumbs",
578
+ "upsell_offer",
579
+ "upsell_bundle_tiers"
580
+ ],
581
+ "agentContract": {
582
+ "status": "agent-ready",
583
+ "templateRole": "Flagship single-step checkout: Apollo direct-response layout, tiered bundle cards via style dispatcher, selector-area check03 bump, optional checkout reveal, and form-section bumps.",
584
+ "sourceOfTruth": {
585
+ "campaignSpec": [
586
+ "campaign currency/language/payment/tracking",
587
+ "checkout page packages/offers",
588
+ "shipping_methods[]",
589
+ "upsell/receipt routing"
590
+ ],
591
+ "campaignsApi": [
592
+ "packages[].ref_id",
593
+ "shipping_options[].ref_id",
594
+ "payment method capability"
595
+ ],
596
+ "starterTemplate": [
597
+ "stable SDK DOM shape",
598
+ "family-local includes",
599
+ "page frontmatter contract",
600
+ "promoted checkout component CSS in next-core.css"
601
+ ]
602
+ },
603
+ "frontmatter": {
604
+ "requiredWhenCloning": [
605
+ "packages.main_package",
606
+ "shipping_methods.standard",
607
+ "bundles[].quantity",
608
+ "bundles[].shipping_method"
609
+ ],
610
+ "optionalWhenSupported": [
611
+ "bundle_card_style",
612
+ "cart_summary_variant",
613
+ "shipping_methods.free",
614
+ "selector_order_bump_variant",
615
+ "order_bump_variant",
616
+ "order_bump",
617
+ "checkout_reveal",
618
+ "checkout_reveal_cta",
619
+ "as_seen_in",
620
+ "reviews",
621
+ "guarantee",
622
+ "promo_banner",
623
+ "promo_timer",
624
+ "product_heading",
625
+ "packages.prepurchase_1",
626
+ "packages.prepurchase_2",
627
+ "swiper_slides",
628
+ "swiper_thumbs",
629
+ "payment_flags",
630
+ "upsell_offer",
631
+ "upsell_bundle_tiers"
632
+ ],
633
+ "demoOnlyValues": [
634
+ "packages.main_package=1",
635
+ "packages.prepurchase_1=7",
636
+ "packages.prepurchase_2=9",
637
+ "shipping_methods.standard=2",
638
+ "shipping_methods.free=1",
639
+ "bundle_card_style=product",
640
+ "selector_order_bump_variant=check03",
641
+ "order_bump_variant=check01+switch01",
642
+ "order_bump.check03.sync_quantity=1",
643
+ "upsell_offer.package_id=3",
644
+ "upsell_offer.vouchers_json=[\"UP50\"]",
645
+ "upsell_bundle_tiers packageId=3"
646
+ ],
647
+ "replaceFromSpecOrApi": [
648
+ "packages.*",
649
+ "shipping_methods.*",
650
+ "bundles[].shipping_method",
651
+ "order_bump.*.package_id",
652
+ "upsell_offer.*",
653
+ "upsell_bundle_tiers[].items_json",
654
+ "upsell_bundle_tiers[].vouchers_json"
655
+ ],
656
+ "removeWhenUnsupported": [
657
+ "bundles[].shipping_method when no tier-specific shipping exists",
658
+ "selector_order_bump_variant when no selector-area bump package exists",
659
+ "bump includes when prepurchase packages are absent",
660
+ "unsupported payment method rows",
661
+ "upsell pages not present in the funnel"
662
+ ]
663
+ },
664
+ "surfaces": [
665
+ {
666
+ "name": "tiered bundle selector with card style dispatcher",
667
+ "partials": [
668
+ "bundle-selector.html",
669
+ "bundle-card.html",
670
+ "bundle-card-product.html",
671
+ "bundle-card-classic.html",
672
+ "bundle-card-tiles.html"
673
+ ],
674
+ "ownedInputs": [
675
+ "packages",
676
+ "shipping_methods",
677
+ "bundles",
678
+ "bundle_card_style"
679
+ ],
680
+ "sdkRoots": [
681
+ "data-next-bundle-selector",
682
+ "data-next-bundle-card"
683
+ ],
684
+ "note": "product and classic card styles show additive coupon extra savings via data-next-discounts=\"voucher\" gated by cart.hasCoupon(); tiles omits the badge and reflects coupon savings in struck/current pricing. Styling lives in shared next-core.css — no per-page bundle-card CSS link."
685
+ },
686
+ {
687
+ "name": "selector-area order bump",
688
+ "partials": [
689
+ "bump-check03.html"
690
+ ],
691
+ "ownedInputs": [
692
+ "selector_order_bump_variant",
693
+ "order_bump.check03"
694
+ ],
695
+ "sdkRoots": [
696
+ "data-next-package-toggle",
697
+ "data-next-toggle-card"
698
+ ]
699
+ },
700
+ {
701
+ "name": "Apollo checkout layout blocks",
702
+ "partials": [
703
+ "checkout-header.html",
704
+ "product-heading.html",
705
+ "promo-banner.html",
706
+ "promo-timer.html",
707
+ "as-seen-in.html",
708
+ "reviews-slider.html",
709
+ "guarantee.html"
710
+ ],
711
+ "ownedInputs": [
712
+ "product_heading",
713
+ "promo_banner",
714
+ "promo_timer",
715
+ "as_seen_in",
716
+ "reviews",
717
+ "guarantee"
718
+ ],
719
+ "sdkRoots": [],
720
+ "note": "Checkout component CSS is in shared next-core.css. Checkout page styles: typically Swiper CDN only."
721
+ },
722
+ {
723
+ "name": "checkout reveal",
724
+ "partials": [],
725
+ "ownedInputs": [
726
+ "checkout_reveal",
727
+ "checkout_reveal_cta"
728
+ ],
729
+ "sdkRoots": [
730
+ "data-checkout-reveal-trigger",
731
+ "data-checkout-reveal-panel"
732
+ ],
733
+ "note": "initCheckoutReveal() in checkout-apollo.js. Hidden panel is off-screen (not display:none) so Spreedly card iframes mount at real size."
734
+ },
735
+ {
736
+ "name": "form-section order bumps",
737
+ "partials": [
738
+ "bump-check01.html",
739
+ "bump-switch01.html"
740
+ ],
741
+ "ownedInputs": [
742
+ "packages",
743
+ "order_bump",
744
+ "order_bump_variant"
745
+ ],
746
+ "sdkRoots": [
747
+ "data-next-package-toggle",
748
+ "data-next-toggle-card"
749
+ ]
750
+ },
751
+ {
752
+ "name": "payment shell",
753
+ "partials": [
754
+ "payment-methods.html",
755
+ "express-checkout.html"
756
+ ],
757
+ "ownedInputs": [
758
+ "payment_flags"
759
+ ],
760
+ "sdkRoots": [
761
+ "data-next-payment-method",
762
+ "data-next-payment-form",
763
+ "data-next-express-checkout"
764
+ ]
765
+ },
766
+ {
767
+ "name": "Apollo bundle upsell pages",
768
+ "partials": [
769
+ "upsell-bundle-stepper-offer.html",
770
+ "upsell-bundle-tier-pills-offer.html",
771
+ "upsell-bundle-tier-cards-offer.html"
772
+ ],
773
+ "ownedInputs": [
774
+ "upsell_offer",
775
+ "upsell_bundle_tiers"
776
+ ],
777
+ "sdkRoots": [
778
+ "data-next-upsell",
779
+ "data-next-bundle-selector",
780
+ "data-next-bundle-card"
781
+ ]
782
+ }
783
+ ],
784
+ "fixtures": [
785
+ "contracts/fixtures/campaign-specs/apollo-tiered-apollo-layout.json"
786
+ ],
787
+ "agentNotes": [
788
+ "Use Apollo when the design has the Apollo checkout shell (trust bar, product heading, promo banner/timer, as-seen-in, reviews slider, guarantee) plus tiered bundle cards — not a generic Olympus clone.",
789
+ "Two bump slots: selector_order_bump_variant (check03 below selector) vs order_bump_variant (later form-section bumps). check03 config reads order_bump.check03.* frontmatter only.",
790
+ "Do not add per-page checkout component CSS files; promoted styles live in canonical next-core.css synced across all eight families."
791
+ ],
792
+ "qaStructure": {
793
+ "checkout": {
794
+ "description": "Rendered Apollo checkout must adopt the starter-template shell, not a custom shell with only borrowed partials.",
795
+ "requiredVisibleSelectors": [
796
+ {
797
+ "name": "Apollo checkout wrapper",
798
+ "selector": ".checkout-wrapper"
799
+ },
800
+ {
801
+ "name": "left checkout column",
802
+ "selector": ".checkout-layout__left"
803
+ },
804
+ {
805
+ "name": "right checkout column",
806
+ "selector": ".checkout-layout__right"
807
+ },
808
+ {
809
+ "name": "checkout form",
810
+ "selector": "[data-next-checkout=\"form\"]"
811
+ },
812
+ {
813
+ "name": "shipping field row component",
814
+ "selector": "[data-next-component=\"shipping-field-row\"]"
815
+ },
816
+ {
817
+ "name": "checkout payment submit",
818
+ "selector": "[os-checkout-payment]"
819
+ },
820
+ {
821
+ "name": "rendered order summary",
822
+ "selector": "[data-next-cart-summary]"
823
+ }
824
+ ],
825
+ "requiredNonEmptySelectors": [
826
+ {
827
+ "name": "visible order summary content",
828
+ "selector": "[data-next-cart-summary]"
829
+ }
830
+ ]
831
+ }
832
+ }
833
+ },
834
+ "verification": {
835
+ "sdk_version": "0.4.37",
836
+ "verified_at": "2026-08-21T15:26:00Z",
837
+ "evidence": "sdk-0.4.37-2026-08-21",
838
+ "status": "certified",
839
+ "source": "template-verification.json"
840
+ }
841
+ },
842
+ "demeter": {
843
+ "description": "Single-step editorial/luxury checkout with spacious tier cards and open cart summary.",
844
+ "frontmatterStatus": "partial",
845
+ "strongSignals": [
846
+ "demeter in spec, path, or export metadata",
847
+ "editorial 1/2/3 tier selector",
848
+ "checkout-progress bar above bundle selection",
849
+ "open side cart using cart-summary03",
850
+ "luxury/editorial spacing with serif display type",
851
+ "demeter upsell offer includes with upsell_offer or upsell_bundle_tiers frontmatter"
852
+ ],
853
+ "canonicalSurfaces": {
854
+ "mainSelector": "editorial-tier-selector",
855
+ "orderSummary": "cart-summary03 side cart",
856
+ "payment": "payment-methods",
857
+ "expressCheckout": "express-checkout|express-checkout-inline",
858
+ "orderBump": "bump-check01|bump-check02|bump-check03|bump-switch01",
859
+ "upsell": "upsell-bundle-stepper-offer|upsell-bundle-tier-pills-offer|upsell-bundle-tier-cards-offer",
860
+ "receipt": "receipt-skeleton|receipt-order-summary-mobile|receipt-order-summary-desktop"
861
+ },
862
+ "frontmatterInputsNeeded": [
863
+ "progress_steps"
864
+ ],
865
+ "frontmatterInputsObserved": [
866
+ "bundles",
867
+ "packages",
868
+ "shipping_methods",
869
+ "selector_id",
870
+ "selection_mode",
871
+ "price_display_variant",
872
+ "order_bump_variant",
873
+ "order_bump.check01",
874
+ "order_bump.switch01",
875
+ "cart_summary_variant",
876
+ "cart_summary_heading",
877
+ "cart_summary_subtitle",
878
+ "cart_summary_feature_package",
879
+ "receipt_summary",
880
+ "upsell_bundle_tiers",
881
+ "upsell_offer"
882
+ ],
883
+ "agentContract": {
884
+ "status": "agent-ready",
885
+ "templateRole": "Editorial single-step checkout with tier cards and an open side summary.",
886
+ "sourceOfTruth": {
887
+ "campaignSpec": [
888
+ "checkout page package tiers",
889
+ "shipping_methods[]",
890
+ "optional prepurchase packages",
891
+ "upsell/receipt routing"
892
+ ],
893
+ "campaignsApi": [
894
+ "packages[].ref_id",
895
+ "shipping_options[].ref_id",
896
+ "offers/vouchers for upsell pages"
897
+ ],
898
+ "starterTemplate": [
899
+ "stable SDK DOM shape",
900
+ "family-local includes",
901
+ "page frontmatter contract"
902
+ ]
903
+ },
904
+ "frontmatter": {
905
+ "requiredWhenCloning": [
906
+ "packages.main_package",
907
+ "shipping_methods.standard",
908
+ "bundles[].quantity",
909
+ "bundles[].shipping_method"
910
+ ],
911
+ "optionalWhenSupported": [
912
+ "shipping_methods.free",
913
+ "cart_summary_variant",
914
+ "order_bump_variant",
915
+ "upsell_offer",
916
+ "upsell_bundle_tiers",
917
+ "receipt_summary"
918
+ ],
919
+ "demoOnlyValues": [
920
+ "packages.main_package=1",
921
+ "shipping_methods.standard=2",
922
+ "shipping_methods.free=1",
923
+ "packages.prepurchase_1=7",
924
+ "packages.prepurchase_2=9"
925
+ ],
926
+ "replaceFromSpecOrApi": [
927
+ "packages.*",
928
+ "shipping_methods.*",
929
+ "bundles[].shipping_method",
930
+ "order_bump.*.package_id",
931
+ "upsell_offer.package_id",
932
+ "upsell_bundle_tiers[].items_json"
933
+ ],
934
+ "removeWhenUnsupported": [
935
+ "bundles[].shipping_method when no tier-specific shipping exists",
936
+ "order bump variants when prepurchase packages are absent"
937
+ ]
938
+ },
939
+ "surfaces": [
940
+ {
941
+ "name": "editorial tier selector",
942
+ "partials": [
943
+ "editorial-tier-selector.html"
944
+ ],
945
+ "ownedInputs": [
946
+ "packages",
947
+ "shipping_methods",
948
+ "bundles",
949
+ "price_display_variant"
950
+ ],
951
+ "sdkRoots": [
952
+ "data-next-bundle-selector",
953
+ "data-next-bundle-card"
954
+ ]
955
+ },
956
+ {
957
+ "name": "side summary and bumps",
958
+ "partials": [
959
+ "cart-summary03.html",
960
+ "bump-check01.html",
961
+ "bump-switch01.html"
962
+ ],
963
+ "ownedInputs": [
964
+ "cart_summary_variant",
965
+ "packages",
966
+ "order_bump"
967
+ ],
968
+ "sdkRoots": [
969
+ "data-next-cart-summary",
970
+ "data-next-package-toggle"
971
+ ]
972
+ },
973
+ {
974
+ "name": "upsell and receipt includes",
975
+ "partials": [
976
+ "upsell-bundle-stepper-offer.html",
977
+ "upsell-bundle-tier-pills-offer.html",
978
+ "upsell-bundle-tier-cards-offer.html",
979
+ "receipt-skeleton.html"
980
+ ],
981
+ "ownedInputs": [
982
+ "upsell_offer",
983
+ "upsell_bundle_tiers",
984
+ "receipt_summary"
985
+ ],
986
+ "sdkRoots": [
987
+ "data-next-upsell",
988
+ "data-next-order-items"
989
+ ]
990
+ }
991
+ ],
992
+ "fixtures": [
993
+ "contracts/fixtures/campaign-specs/demeter-editorial-tiered.json"
994
+ ],
995
+ "agentNotes": [
996
+ "Demeter text such as shipping labels is copy, not proof; validate actual free/standard shipping against spec/API before launch."
997
+ ],
998
+ "qaStructure": {
999
+ "checkout": {
1000
+ "description": "Rendered Demeter checkout must adopt the starter-template shell, not a custom shell with only borrowed partials.",
1001
+ "requiredVisibleSelectors": [
1002
+ {
1003
+ "name": "Demeter checkout wrapper",
1004
+ "selector": ".checkout-wrapper"
1005
+ },
1006
+ {
1007
+ "name": "left checkout column",
1008
+ "selector": ".checkout-layout__left"
1009
+ },
1010
+ {
1011
+ "name": "right checkout column",
1012
+ "selector": ".checkout-layout__right"
1013
+ },
1014
+ {
1015
+ "name": "checkout form",
1016
+ "selector": "[data-next-checkout=\"form\"]"
1017
+ },
1018
+ {
1019
+ "name": "shipping field row component",
1020
+ "selector": "[data-next-component=\"shipping-field-row\"]"
1021
+ },
1022
+ {
1023
+ "name": "checkout payment submit",
1024
+ "selector": "[os-checkout-payment]"
1025
+ },
1026
+ {
1027
+ "name": "rendered order summary",
1028
+ "selector": "[data-next-cart-summary]"
1029
+ }
1030
+ ],
1031
+ "requiredNonEmptySelectors": [
1032
+ {
1033
+ "name": "visible order summary content",
1034
+ "selector": "[data-next-cart-summary]"
1035
+ }
1036
+ ]
1037
+ }
1038
+ }
1039
+ },
1040
+ "verification": {
1041
+ "sdk_version": "0.4.37",
1042
+ "verified_at": "2026-08-21T15:26:00Z",
1043
+ "evidence": "sdk-0.4.37-2026-08-21",
1044
+ "status": "certified",
1045
+ "source": "template-verification.json"
1046
+ }
1047
+ },
1048
+ "shop-single-step": {
1049
+ "description": "Highly used shop-style single-step checkout with compact cart summary, receipt, and three bundle upsell variants.",
1050
+ "frontmatterStatus": "partial",
1051
+ "strongSignals": [
1052
+ "shop-single-step in spec, path, or export metadata",
1053
+ "shop checkout with checkout.html plus upsell-bundle-stepper/tier-pills/tier-cards pages",
1054
+ "cart-summary04 used on checkout",
1055
+ "receipt order summary split into mobile and desktop order item templates",
1056
+ "upsell bundle offers promoted to shop-single-step *_offer includes"
1057
+ ],
1058
+ "canonicalSurfaces": {
1059
+ "checkoutSummary": "cart-summary04",
1060
+ "payment": "payment-methods",
1061
+ "expressCheckout": "express-checkout",
1062
+ "orderBump": "bump-check01|bump-check02|bump-check03|bump-switch01",
1063
+ "receipt": "receipt-skeleton|receipt-order-summary-mobile|receipt-order-summary-desktop",
1064
+ "upsell": "upsell-bundle-stepper-offer|upsell-bundle-tier-pills-offer|upsell-bundle-tier-cards-offer"
1065
+ },
1066
+ "frontmatterInputsNeeded": [
1067
+ "cart_summary_variant"
1068
+ ],
1069
+ "frontmatterInputsObserved": [
1070
+ "order_bump",
1071
+ "order_bump_variant",
1072
+ "packages",
1073
+ "receipt_summary",
1074
+ "swiper_slides",
1075
+ "swiper_thumbs",
1076
+ "upsell_bundle_tiers",
1077
+ "upsell_offer"
1078
+ ],
1079
+ "agentContract": {
1080
+ "status": "agent-ready",
1081
+ "templateRole": "Shop-style single-step checkout with compact cart summary plus promoted receipt and upsell includes.",
1082
+ "sourceOfTruth": {
1083
+ "campaignSpec": [
1084
+ "checkout page payment/shipping support",
1085
+ "optional order bump package",
1086
+ "upsell pages/packages/offers",
1087
+ "receipt routing"
1088
+ ],
1089
+ "campaignsApi": [
1090
+ "packages[].ref_id",
1091
+ "payment method capability",
1092
+ "offers/vouchers for upsell pages"
1093
+ ],
1094
+ "starterTemplate": [
1095
+ "shop checkout DOM shape",
1096
+ "family-local receipt and upsell includes",
1097
+ "runtime shipping/address fields"
1098
+ ]
1099
+ },
1100
+ "frontmatter": {
1101
+ "requiredWhenCloning": [
1102
+ "next_url",
1103
+ "page_type=checkout"
1104
+ ],
1105
+ "optionalWhenSupported": [
1106
+ "packages.prepurchase_1",
1107
+ "packages.prepurchase_2",
1108
+ "order_bump_variant",
1109
+ "order_bump",
1110
+ "receipt_summary",
1111
+ "upsell_offer",
1112
+ "upsell_bundle_tiers",
1113
+ "swiper_slides",
1114
+ "swiper_thumbs",
1115
+ "payment_flags"
1116
+ ],
1117
+ "demoOnlyValues": [
1118
+ "packages.prepurchase_1=7",
1119
+ "packages.prepurchase_2=9",
1120
+ "order_bump.check02.package_id=9",
1121
+ "upsell_offer.package_id=3",
1122
+ "upsell_offer.vouchers_json=[\"UP50\"]",
1123
+ "upsell_bundle_tiers packageId=3"
1124
+ ],
1125
+ "replaceFromSpecOrApi": [
1126
+ "packages.*",
1127
+ "order_bump.*.package_id",
1128
+ "upsell_offer.*",
1129
+ "upsell_bundle_tiers[].items_json",
1130
+ "upsell_bundle_tiers[].vouchers_json",
1131
+ "receipt_summary.*",
1132
+ "payment_flags"
1133
+ ],
1134
+ "removeWhenUnsupported": [
1135
+ "unsupported payment method rows",
1136
+ "order bump when no bump package exists",
1137
+ "upsell pages not present in the funnel"
1138
+ ]
1139
+ },
1140
+ "surfaces": [
1141
+ {
1142
+ "name": "shop checkout shell",
1143
+ "partials": [
1144
+ "cart-summary04.html",
1145
+ "express-checkout.html",
1146
+ "payment-methods.html",
1147
+ "bump-check02.html"
1148
+ ],
1149
+ "ownedInputs": [
1150
+ "payment_flags"
1151
+ ],
1152
+ "sdkRoots": [
1153
+ "data-next-cart-summary",
1154
+ "data-next-express-checkout",
1155
+ "data-next-payment-method"
1156
+ ]
1157
+ },
1158
+ {
1159
+ "name": "shop upsell offers",
1160
+ "partials": [
1161
+ "upsell-bundle-stepper-offer.html",
1162
+ "upsell-bundle-tier-pills-offer.html",
1163
+ "upsell-bundle-tier-cards-offer.html"
1164
+ ],
1165
+ "ownedInputs": [
1166
+ "upsell_offer",
1167
+ "upsell_bundle_tiers"
1168
+ ],
1169
+ "sdkRoots": [
1170
+ "data-next-upsell",
1171
+ "data-next-bundle-selector"
1172
+ ]
1173
+ },
1174
+ {
1175
+ "name": "shop receipt",
1176
+ "partials": [
1177
+ "receipt-skeleton.html",
1178
+ "receipt-order-summary-mobile.html",
1179
+ "receipt-order-summary-desktop.html"
1180
+ ],
1181
+ "ownedInputs": [
1182
+ "receipt_summary"
1183
+ ],
1184
+ "sdkRoots": [
1185
+ "data-next-order-items"
1186
+ ]
1187
+ }
1188
+ ],
1189
+ "fixtures": [
1190
+ "contracts/fixtures/campaign-specs/shop-single-step-upsell-receipt.json"
1191
+ ],
1192
+ "agentNotes": [
1193
+ "Shop-single-step is a real family, not a generic fallback. Preserve its summary/payment template roots."
1194
+ ],
1195
+ "qaStructure": {
1196
+ "checkout": {
1197
+ "description": "Rendered shop single-step checkout must adopt the starter-template shell, not a custom shell with only borrowed partials.",
1198
+ "requiredVisibleSelectors": [
1199
+ {
1200
+ "name": "shop checkout layout",
1201
+ "selector": ".checkout__layout"
1202
+ },
1203
+ {
1204
+ "name": "left checkout column",
1205
+ "selector": ".checkout__column--left"
1206
+ },
1207
+ {
1208
+ "name": "right checkout column",
1209
+ "selector": ".checkout__column--right"
1210
+ },
1211
+ {
1212
+ "name": "checkout form",
1213
+ "selector": "[data-next-checkout=\"form\"]"
1214
+ },
1215
+ {
1216
+ "name": "shipping field row component",
1217
+ "selector": "[data-next-component=\"shipping-field-row\"]"
1218
+ },
1219
+ {
1220
+ "name": "checkout payment submit",
1221
+ "selector": "[os-checkout-payment]"
1222
+ },
1223
+ {
1224
+ "name": "rendered order summary",
1225
+ "selector": "[data-next-cart-summary]"
1226
+ }
1227
+ ],
1228
+ "requiredNonEmptySelectors": [
1229
+ {
1230
+ "name": "visible order summary content",
1231
+ "selector": "[data-next-cart-summary]"
1232
+ }
1233
+ ]
1234
+ }
1235
+ }
1236
+ },
1237
+ "verification": {
1238
+ "sdk_version": "0.4.37",
1239
+ "verified_at": "2026-08-21T15:26:00Z",
1240
+ "evidence": "sdk-0.4.37-2026-08-21",
1241
+ "status": "certified",
1242
+ "source": "template-verification.json"
1243
+ }
1244
+ },
1245
+ "olympus-mv-single-step": {
1246
+ "description": "Olympus-style single-step checkout with configurable multi-variant bundle slots in the checkout page.",
1247
+ "frontmatterStatus": "partial",
1248
+ "strongSignals": [
1249
+ "olympus-mv-single-step in spec, path, or export metadata",
1250
+ "data-next-bundle-slots-for in checkout",
1251
+ "checkout-olympus-mv-full.js",
1252
+ "variant slot controls inside checkout",
1253
+ "MV product gallery plus bundle slots on one page"
1254
+ ],
1255
+ "canonicalSurfaces": {
1256
+ "mainSelector": "mv-configurable-selector",
1257
+ "variantSlots": "bundle-slot-selector",
1258
+ "personalization": "per-slot picker (data-next-property per slot, toggled by slot_personalization); order-wide default via mv-configurable-selector order_personalization",
1259
+ "orderSummary": "cart-summary03|cart-summary04",
1260
+ "payment": "payment-methods",
1261
+ "expressCheckout": "express-checkout|express-checkout-inline",
1262
+ "orderBump": "bump-check01|bump-check02|bump-check03|bump-switch01",
1263
+ "upsell": "upsell-mv|upsell-bundle-stepper|upsell-bundle-tier-pills|upsell-bundle-tier-cards",
1264
+ "receipt": "receipt-skeleton"
1265
+ },
1266
+ "frontmatterInputsNeeded": [
1267
+ "cart_summary_variant"
1268
+ ],
1269
+ "frontmatterInputsObserved": [
1270
+ "checkout_step",
1271
+ "packages",
1272
+ "shipping_methods",
1273
+ "selector_id",
1274
+ "swiper_slides",
1275
+ "swiper_thumbs",
1276
+ "variant_slots",
1277
+ "slot_personalization",
1278
+ "variant_picker",
1279
+ "upsell_offer",
1280
+ "upsell_mv_tiers",
1281
+ "slot_personalization",
1282
+ "order_personalization",
1283
+ "upsell_bundle_tiers"
1284
+ ],
1285
+ "agentContract": {
1286
+ "status": "agent-ready",
1287
+ "templateRole": "Olympus-style single-step checkout where bundle quantity selection and configurable variant slots live on the same page.",
1288
+ "sourceOfTruth": {
1289
+ "campaignSpec": [
1290
+ "configurable checkout page package",
1291
+ "variant slot expectations",
1292
+ "shipping_methods[]",
1293
+ "payment/routing"
1294
+ ],
1295
+ "campaignsApi": [
1296
+ "configurable package ref_id",
1297
+ "variant product data",
1298
+ "shipping_options[].ref_id"
1299
+ ],
1300
+ "starterTemplate": [
1301
+ "mv-configurable-selector.html",
1302
+ "mv slot DOM contract",
1303
+ "checkout-olympus-mv-full.js"
1304
+ ]
1305
+ },
1306
+ "frontmatter": {
1307
+ "requiredWhenCloning": [
1308
+ "packages.main_package",
1309
+ "shipping_methods.standard",
1310
+ "variant_slots[].id",
1311
+ "variant_slots[].quantity",
1312
+ "variant_slots[].shipping_method"
1313
+ ],
1314
+ "optionalWhenSupported": [
1315
+ "shipping_methods.free",
1316
+ "checkout_step.selector_layout",
1317
+ "swiper_slides",
1318
+ "swiper_thumbs",
1319
+ "variant_slots[].label_text",
1320
+ "upsell_offer",
1321
+ "upsell_mv_tiers",
1322
+ "slot_personalization",
1323
+ "order_personalization",
1324
+ "upsell_bundle_tiers"
1325
+ ],
1326
+ "demoOnlyValues": [
1327
+ "packages.main_package=1",
1328
+ "shipping_methods.standard=2",
1329
+ "shipping_methods.free=1",
1330
+ "upsell_offer.package_id=1",
1331
+ "upsell_offer.package_id=3",
1332
+ "upsell_mv_tiers vouchers_json=[\"UP80TSHIRT\"]",
1333
+ "upsell_bundle_tiers packageId=3",
1334
+ "upsell_bundle_tiers vouchers_json=[\"UP50\"]"
1335
+ ],
1336
+ "replaceFromSpecOrApi": [
1337
+ "packages.main_package",
1338
+ "shipping_methods.*",
1339
+ "variant_slots[].shipping_method",
1340
+ "upsell_offer.*",
1341
+ "upsell_mv_tiers[].vouchers_json",
1342
+ "slot_personalization",
1343
+ "upsell_bundle_tiers[].items_json",
1344
+ "upsell_bundle_tiers[].vouchers_json"
1345
+ ],
1346
+ "removeWhenUnsupported": [
1347
+ "variant slot rows unsupported by the target spec/API",
1348
+ "free shipping row if no free method exists",
1349
+ "upsell pages not present in the funnel"
1350
+ ]
1351
+ },
1352
+ "surfaces": [
1353
+ {
1354
+ "name": "MV configurable selector",
1355
+ "partials": [
1356
+ "mv-configurable-selector.html"
1357
+ ],
1358
+ "ownedInputs": [
1359
+ "packages",
1360
+ "shipping_methods",
1361
+ "variant_slots"
1362
+ ],
1363
+ "sdkRoots": [
1364
+ "data-next-bundle-selector",
1365
+ "data-next-bundle-slots-for",
1366
+ "data-next-bundle-slot-template-id"
1367
+ ]
1368
+ },
1369
+ {
1370
+ "name": "MV variant-picker (alternative selector)",
1371
+ "partials": [
1372
+ "variant-picker.html"
1373
+ ],
1374
+ "ownedInputs": [
1375
+ "variant_picker",
1376
+ "shipping_methods"
1377
+ ],
1378
+ "sdkRoots": [
1379
+ "data-next-bundle-selector",
1380
+ "data-next-bundle-slots-for"
1381
+ ],
1382
+ "note": "Additive alternative to mv-configurable-selector: custom-JS slot rendering (variant-picker.js) with per-variant swatch thumbnails driven from one declared variant_picker.variants source, plus an offline render fixture. Supports per-tier data-next-shipping-id via variant_picker.tiers[].shipping_method/shipping_id. Demoed on the standalone variant-picker.html page; not wired into checkout.html by default."
1383
+ },
1384
+ {
1385
+ "name": "MV payment and summary",
1386
+ "partials": [
1387
+ "payment-methods.html",
1388
+ "cart-summary03.html",
1389
+ "cart-summary04.html"
1390
+ ],
1391
+ "ownedInputs": [
1392
+ "payment_flags"
1393
+ ],
1394
+ "sdkRoots": [
1395
+ "data-next-payment-method",
1396
+ "data-next-cart-summary"
1397
+ ]
1398
+ },
1399
+ {
1400
+ "name": "MV upsell offers",
1401
+ "partials": [
1402
+ "upsell-mv-offer.html",
1403
+ "upsell-bundle-stepper-offer.html",
1404
+ "upsell-bundle-tier-pills-offer.html",
1405
+ "upsell-bundle-tier-cards-offer.html"
1406
+ ],
1407
+ "ownedInputs": [
1408
+ "upsell_offer",
1409
+ "upsell_mv_tiers",
1410
+ "slot_personalization",
1411
+ "order_personalization",
1412
+ "upsell_bundle_tiers"
1413
+ ],
1414
+ "sdkRoots": [
1415
+ "data-next-upsell",
1416
+ "data-next-bundle-selector",
1417
+ "data-next-bundle-card",
1418
+ "data-next-bundle-slots-for"
1419
+ ]
1420
+ }
1421
+ ],
1422
+ "fixtures": [
1423
+ "contracts/fixtures/campaign-specs/olympus-mv-single-step-configurable.json"
1424
+ ],
1425
+ "agentNotes": [
1426
+ "Keep slot ids aligned across selector rows, bundle slots, and JS.",
1427
+ "MV upsell pages now use upsells-mv.js for configurable-slot upsells and upsells.js for the standard bundle upsell chain; replace both upsell_offer and tier voucher/package refs from the target spec/API."
1428
+ ],
1429
+ "qaStructure": {
1430
+ "checkout": {
1431
+ "description": "Rendered Olympus MV single-step checkout must adopt the starter-template shell, not a custom shell with only borrowed partials.",
1432
+ "requiredVisibleSelectors": [
1433
+ {
1434
+ "name": "Olympus MV checkout wrapper",
1435
+ "selector": ".checkout-wrapper"
1436
+ },
1437
+ {
1438
+ "name": "left checkout column",
1439
+ "selector": ".checkout-layout__left"
1440
+ },
1441
+ {
1442
+ "name": "right checkout column",
1443
+ "selector": ".checkout-layout__right"
1444
+ },
1445
+ {
1446
+ "name": "checkout form",
1447
+ "selector": "[data-next-checkout=\"form\"]"
1448
+ },
1449
+ {
1450
+ "name": "shipping field row component",
1451
+ "selector": "[data-next-component=\"shipping-field-row\"]"
1452
+ },
1453
+ {
1454
+ "name": "checkout payment submit",
1455
+ "selector": "[os-checkout-payment]"
1456
+ },
1457
+ {
1458
+ "name": "rendered order summary",
1459
+ "selector": "[data-next-cart-summary]"
1460
+ }
1461
+ ],
1462
+ "requiredNonEmptySelectors": [
1463
+ {
1464
+ "name": "visible order summary content",
1465
+ "selector": "[data-next-cart-summary]"
1466
+ }
1467
+ ]
1468
+ }
1469
+ }
1470
+ },
1471
+ "verification": {
1472
+ "sdk_version": "0.4.37",
1473
+ "verified_at": "2026-08-21T15:26:00Z",
1474
+ "evidence": "sdk-0.4.37-2026-08-21",
1475
+ "status": "certified",
1476
+ "source": "template-verification.json"
1477
+ }
1478
+ },
1479
+ "apollo-mv-single-step": {
1480
+ "description": "Apollo-layout single-step checkout with configurable multi-variant bundle slots, selector layout toggle, and optional checkout reveal.",
1481
+ "frontmatterStatus": "partial",
1482
+ "strongSignals": [
1483
+ "apollo-mv-single-step in spec, path, or export metadata",
1484
+ "checkout-apollo-mv-full.js",
1485
+ "data-next-bundle-slots-for in checkout",
1486
+ "mv-configurable-selector.html with Apollo layout partials",
1487
+ "selector_order_bump_variant and checkout_reveal frontmatter",
1488
+ "checkout_step.selector_layout"
1489
+ ],
1490
+ "canonicalSurfaces": {
1491
+ "mainSelector": "mv-configurable-selector",
1492
+ "selectorLayout": "grid|vertical",
1493
+ "variantSlots": "bundle-slot-selector",
1494
+ "selectorOrderBump": "bump-check03",
1495
+ "personalization": "per-slot picker (data-next-property per slot, toggled by slot_personalization); order-wide default via mv-configurable-selector order_personalization",
1496
+ "orderSummary": "cart-summary03|cart-summary04",
1497
+ "payment": "payment-methods",
1498
+ "expressCheckout": "express-checkout|express-checkout-inline",
1499
+ "orderBump": "bump-check01|bump-check02|bump-check03|bump-switch01",
1500
+ "checkoutReveal": "checkout-form--reveal",
1501
+ "upsell": "upsell-mv|upsell-bundle-stepper|upsell-bundle-tier-pills|upsell-bundle-tier-cards",
1502
+ "receipt": "receipt-skeleton"
1503
+ },
1504
+ "frontmatterInputsNeeded": [
1505
+ "cart_summary_variant"
1506
+ ],
1507
+ "frontmatterInputsObserved": [
1508
+ "checkout_step",
1509
+ "packages",
1510
+ "shipping_methods",
1511
+ "selector_id",
1512
+ "selector_order_bump_variant",
1513
+ "order_bump_variant",
1514
+ "checkout_reveal",
1515
+ "checkout_reveal_cta",
1516
+ "as_seen_in",
1517
+ "reviews",
1518
+ "guarantee",
1519
+ "promo_timer",
1520
+ "promo_banner",
1521
+ "product_heading",
1522
+ "swiper_slides",
1523
+ "swiper_thumbs",
1524
+ "variant_slots",
1525
+ "slot_personalization",
1526
+ "variant_picker",
1527
+ "upsell_offer",
1528
+ "upsell_mv_tiers",
1529
+ "order_personalization",
1530
+ "upsell_bundle_tiers"
1531
+ ],
1532
+ "agentContract": {
1533
+ "status": "agent-ready",
1534
+ "templateRole": "Flagship Apollo-layout single-step MV checkout where bundle quantity selection, configurable variant slots, and Apollo framing live on one page.",
1535
+ "sourceOfTruth": {
1536
+ "campaignSpec": [
1537
+ "configurable checkout page package",
1538
+ "variant slot expectations",
1539
+ "shipping_methods[]",
1540
+ "payment/routing"
1541
+ ],
1542
+ "campaignsApi": [
1543
+ "configurable package ref_id",
1544
+ "variant product data",
1545
+ "shipping_options[].ref_id"
1546
+ ],
1547
+ "starterTemplate": [
1548
+ "mv-configurable-selector.html",
1549
+ "mv slot DOM contract",
1550
+ "checkout-apollo-mv-full.js",
1551
+ "promoted checkout component CSS in next-core.css"
1552
+ ]
1553
+ },
1554
+ "frontmatter": {
1555
+ "requiredWhenCloning": [
1556
+ "packages.main_package",
1557
+ "shipping_methods.standard",
1558
+ "variant_slots[].id",
1559
+ "variant_slots[].quantity",
1560
+ "variant_slots[].shipping_method"
1561
+ ],
1562
+ "optionalWhenSupported": [
1563
+ "shipping_methods.free",
1564
+ "checkout_step.selector_layout",
1565
+ "selector_order_bump_variant",
1566
+ "order_bump_variant",
1567
+ "checkout_reveal",
1568
+ "checkout_reveal_cta",
1569
+ "as_seen_in",
1570
+ "reviews",
1571
+ "guarantee",
1572
+ "promo_banner",
1573
+ "promo_timer",
1574
+ "product_heading",
1575
+ "swiper_slides",
1576
+ "swiper_thumbs",
1577
+ "variant_slots[].label_text",
1578
+ "upsell_offer",
1579
+ "upsell_mv_tiers",
1580
+ "slot_personalization",
1581
+ "order_personalization",
1582
+ "upsell_bundle_tiers"
1583
+ ],
1584
+ "demoOnlyValues": [
1585
+ "packages.main_package=1",
1586
+ "shipping_methods.standard=2",
1587
+ "shipping_methods.free=1",
1588
+ "checkout_step.selector_layout=grid",
1589
+ "selector_order_bump_variant=check03",
1590
+ "order_bump_variant=check01",
1591
+ "upsell_offer.package_id=1",
1592
+ "upsell_offer.package_id=3",
1593
+ "upsell_mv_tiers vouchers_json=[\"UP80TSHIRT\"]",
1594
+ "upsell_bundle_tiers packageId=3",
1595
+ "upsell_bundle_tiers vouchers_json=[\"UP50\"]"
1596
+ ],
1597
+ "replaceFromSpecOrApi": [
1598
+ "packages.main_package",
1599
+ "shipping_methods.*",
1600
+ "variant_slots[].shipping_method",
1601
+ "upsell_offer.*",
1602
+ "upsell_mv_tiers[].vouchers_json",
1603
+ "slot_personalization",
1604
+ "upsell_bundle_tiers[].items_json",
1605
+ "upsell_bundle_tiers[].vouchers_json"
1606
+ ],
1607
+ "removeWhenUnsupported": [
1608
+ "variant slot rows unsupported by the target spec/API",
1609
+ "selector_order_bump_variant when no selector-area bump package exists",
1610
+ "free shipping row if no free method exists",
1611
+ "upsell pages not present in the funnel"
1612
+ ]
1613
+ },
1614
+ "surfaces": [
1615
+ {
1616
+ "name": "MV configurable selector",
1617
+ "partials": [
1618
+ "mv-configurable-selector.html"
1619
+ ],
1620
+ "ownedInputs": [
1621
+ "packages",
1622
+ "shipping_methods",
1623
+ "variant_slots",
1624
+ "checkout_step"
1625
+ ],
1626
+ "sdkRoots": [
1627
+ "data-next-bundle-selector",
1628
+ "data-next-bundle-slots-for",
1629
+ "data-next-bundle-slot-template-id"
1630
+ ],
1631
+ "note": "checkout_step.selector_layout: grid (default) | vertical adds mv-cards--vertical. MV selector CSS lives in shared next-core.css."
1632
+ },
1633
+ {
1634
+ "name": "selector-area order bump",
1635
+ "partials": [
1636
+ "bump-check03.html"
1637
+ ],
1638
+ "ownedInputs": [
1639
+ "selector_order_bump_variant",
1640
+ "order_bump.check03"
1641
+ ],
1642
+ "sdkRoots": [
1643
+ "data-next-package-toggle",
1644
+ "data-next-toggle-card"
1645
+ ]
1646
+ },
1647
+ {
1648
+ "name": "Apollo checkout layout blocks",
1649
+ "partials": [
1650
+ "checkout-header.html",
1651
+ "product-heading.html",
1652
+ "promo-banner.html",
1653
+ "promo-timer.html",
1654
+ "as-seen-in.html",
1655
+ "reviews-slider.html",
1656
+ "guarantee.html"
1657
+ ],
1658
+ "ownedInputs": [
1659
+ "product_heading",
1660
+ "promo_banner",
1661
+ "promo_timer",
1662
+ "as_seen_in",
1663
+ "reviews",
1664
+ "guarantee"
1665
+ ],
1666
+ "sdkRoots": []
1667
+ },
1668
+ {
1669
+ "name": "checkout reveal",
1670
+ "partials": [],
1671
+ "ownedInputs": [
1672
+ "checkout_reveal",
1673
+ "checkout_reveal_cta"
1674
+ ],
1675
+ "sdkRoots": [
1676
+ "data-checkout-reveal-trigger",
1677
+ "data-checkout-reveal-panel"
1678
+ ],
1679
+ "note": "initCheckoutReveal() in checkout-apollo-mv-full.js alongside guardBumpPersonalization() for check03 personalization fields."
1680
+ },
1681
+ {
1682
+ "name": "MV variant-picker (alternative selector)",
1683
+ "partials": [
1684
+ "variant-picker.html"
1685
+ ],
1686
+ "ownedInputs": [
1687
+ "variant_picker",
1688
+ "shipping_methods"
1689
+ ],
1690
+ "sdkRoots": [
1691
+ "data-next-bundle-selector",
1692
+ "data-next-bundle-slots-for"
1693
+ ],
1694
+ "note": "Additive alternative to mv-configurable-selector. Demoed on variant-picker.html; not wired into checkout.html by default. variant-picker.css remains route-specific."
1695
+ },
1696
+ {
1697
+ "name": "MV payment and summary",
1698
+ "partials": [
1699
+ "payment-methods.html",
1700
+ "cart-summary03.html",
1701
+ "cart-summary04.html"
1702
+ ],
1703
+ "ownedInputs": [
1704
+ "payment_flags"
1705
+ ],
1706
+ "sdkRoots": [
1707
+ "data-next-payment-method",
1708
+ "data-next-cart-summary"
1709
+ ]
1710
+ },
1711
+ {
1712
+ "name": "form-section order bumps",
1713
+ "partials": [
1714
+ "bump-check01.html"
1715
+ ],
1716
+ "ownedInputs": [
1717
+ "packages",
1718
+ "order_bump",
1719
+ "order_bump_variant"
1720
+ ],
1721
+ "sdkRoots": [
1722
+ "data-next-package-toggle",
1723
+ "data-next-toggle-card"
1724
+ ],
1725
+ "note": "MV bump-check01 uses data-next-product-sync for variant-safe quantity sync."
1726
+ },
1727
+ {
1728
+ "name": "MV upsell offers",
1729
+ "partials": [
1730
+ "upsell-mv-offer.html",
1731
+ "upsell-bundle-stepper-offer.html",
1732
+ "upsell-bundle-tier-pills-offer.html",
1733
+ "upsell-bundle-tier-cards-offer.html"
1734
+ ],
1735
+ "ownedInputs": [
1736
+ "upsell_offer",
1737
+ "upsell_mv_tiers",
1738
+ "slot_personalization",
1739
+ "order_personalization",
1740
+ "upsell_bundle_tiers"
1741
+ ],
1742
+ "sdkRoots": [
1743
+ "data-next-upsell",
1744
+ "data-next-bundle-selector",
1745
+ "data-next-bundle-card",
1746
+ "data-next-bundle-slots-for"
1747
+ ]
1748
+ }
1749
+ ],
1750
+ "fixtures": [
1751
+ "contracts/fixtures/campaign-specs/apollo-mv-single-step-configurable.json"
1752
+ ],
1753
+ "agentNotes": [
1754
+ "Hybrid of Olympus MV commerce surfaces and Apollo checkout layout. Pick this over olympus-mv-single-step when the design needs Apollo framing (trust bar, reviews slider, checkout reveal, etc.).",
1755
+ "selector_layout grid|vertical on checkout_step. Two bump slots: selector_order_bump_variant vs order_bump_variant.",
1756
+ "Checkout page styles: typically Swiper CDN only; component CSS is in shared next-core.css."
1757
+ ],
1758
+ "qaStructure": {
1759
+ "checkout": {
1760
+ "description": "Rendered Apollo MV single-step checkout must adopt the starter-template shell, not a custom shell with only borrowed partials.",
1761
+ "requiredVisibleSelectors": [
1762
+ {
1763
+ "name": "Apollo checkout wrapper",
1764
+ "selector": ".checkout-wrapper"
1765
+ },
1766
+ {
1767
+ "name": "left checkout column",
1768
+ "selector": ".checkout-layout__left"
1769
+ },
1770
+ {
1771
+ "name": "right checkout column",
1772
+ "selector": ".checkout-layout__right"
1773
+ },
1774
+ {
1775
+ "name": "checkout form",
1776
+ "selector": "[data-next-checkout=\"form\"]"
1777
+ },
1778
+ {
1779
+ "name": "shipping field row component",
1780
+ "selector": "[data-next-component=\"shipping-field-row\"]"
1781
+ },
1782
+ {
1783
+ "name": "checkout payment submit",
1784
+ "selector": "[os-checkout-payment]"
1785
+ },
1786
+ {
1787
+ "name": "rendered order summary",
1788
+ "selector": "[data-next-cart-summary]"
1789
+ },
1790
+ {
1791
+ "name": "MV slot container",
1792
+ "selector": "[data-next-bundle-slots-for]"
1793
+ }
1794
+ ],
1795
+ "requiredNonEmptySelectors": [
1796
+ {
1797
+ "name": "visible order summary content",
1798
+ "selector": "[data-next-cart-summary]"
1799
+ }
1800
+ ]
1801
+ }
1802
+ }
1803
+ },
1804
+ "verification": {
1805
+ "sdk_version": "0.4.37",
1806
+ "verified_at": "2026-08-21T15:26:00Z",
1807
+ "evidence": "sdk-0.4.37-2026-08-21",
1808
+ "status": "certified",
1809
+ "source": "template-verification.json"
1810
+ }
1811
+ },
1812
+ "olympus-mv-two-step": {
1813
+ "description": "Olympus-style multi-variant flow with a separate variant select step before checkout.",
1814
+ "frontmatterStatus": "partial",
1815
+ "strongSignals": [
1816
+ "olympus-mv-two-step in spec, path, or export metadata",
1817
+ "select.html before checkout.html",
1818
+ "checkout-olympus-mv-selection.js",
1819
+ "checkout-olympus-mv-full.js",
1820
+ "variant selection step followed by payment step"
1821
+ ],
1822
+ "canonicalSurfaces": {
1823
+ "selectStep": "mv-selection-step",
1824
+ "checkoutSelector": "mv-selected-bundle-review",
1825
+ "variantSlots": "bundle-slot-selector",
1826
+ "personalization": "per-slot picker (data-next-property per slot, toggled by slot_personalization); order-wide default via personalization-field (ships unwired)",
1827
+ "orderSummary": "cart-summary03|cart-summary04",
1828
+ "payment": "payment-methods",
1829
+ "expressCheckout": "express-checkout|express-checkout-inline",
1830
+ "upsell": "upsell-mv|upsell-bundle-stepper|upsell-bundle-tier-pills|upsell-bundle-tier-cards",
1831
+ "receipt": "receipt-skeleton"
1832
+ },
1833
+ "frontmatterInputsNeeded": [
1834
+ "swiper_slides",
1835
+ "swiper_thumbs"
1836
+ ],
1837
+ "frontmatterInputsObserved": [
1838
+ "checkout_step",
1839
+ "packages",
1840
+ "shipping_methods",
1841
+ "select_step",
1842
+ "selector_id",
1843
+ "variant_slots",
1844
+ "slot_personalization",
1845
+ "variant_picker",
1846
+ "upsell_offer",
1847
+ "upsell_mv_tiers",
1848
+ "slot_personalization",
1849
+ "order_personalization",
1850
+ "upsell_bundle_tiers"
1851
+ ],
1852
+ "agentContract": {
1853
+ "status": "agent-ready",
1854
+ "templateRole": "Olympus-style MV flow with separate select step before checkout/payment.",
1855
+ "sourceOfTruth": {
1856
+ "campaignSpec": [
1857
+ "select page package/variant choices",
1858
+ "checkout routing",
1859
+ "shipping_methods[]",
1860
+ "payment/routing"
1861
+ ],
1862
+ "campaignsApi": [
1863
+ "configurable package ref_id",
1864
+ "variant product data",
1865
+ "shipping_options[].ref_id"
1866
+ ],
1867
+ "starterTemplate": [
1868
+ "mv-selection-step.html",
1869
+ "mv-slot-stage.html",
1870
+ "checkout-olympus-mv-selection.js",
1871
+ "checkout-olympus-mv-full.js"
1872
+ ]
1873
+ },
1874
+ "frontmatter": {
1875
+ "requiredWhenCloning": [
1876
+ "packages.main_package",
1877
+ "shipping_methods.standard",
1878
+ "variant_slots[].id",
1879
+ "variant_slots[].quantity",
1880
+ "variant_slots[].shipping_method",
1881
+ "select_step.selector_id"
1882
+ ],
1883
+ "optionalWhenSupported": [
1884
+ "shipping_methods.free",
1885
+ "checkout_step.selector_id",
1886
+ "select_step.selector_layout",
1887
+ "swiper_slides",
1888
+ "swiper_thumbs",
1889
+ "upsell_offer",
1890
+ "upsell_mv_tiers",
1891
+ "slot_personalization",
1892
+ "order_personalization",
1893
+ "upsell_bundle_tiers"
1894
+ ],
1895
+ "demoOnlyValues": [
1896
+ "packages.main_package=1",
1897
+ "shipping_methods.standard=2",
1898
+ "shipping_methods.free=1",
1899
+ "upsell_offer.package_id=1",
1900
+ "upsell_offer.package_id=3",
1901
+ "upsell_mv_tiers vouchers_json=[\"UP80TSHIRT\"]",
1902
+ "upsell_bundle_tiers packageId=3",
1903
+ "upsell_bundle_tiers vouchers_json=[\"UP50\"]"
1904
+ ],
1905
+ "replaceFromSpecOrApi": [
1906
+ "packages.main_package",
1907
+ "shipping_methods.*",
1908
+ "variant_slots[].shipping_method",
1909
+ "upsell_offer.*",
1910
+ "upsell_mv_tiers[].vouchers_json",
1911
+ "slot_personalization",
1912
+ "upsell_bundle_tiers[].items_json",
1913
+ "upsell_bundle_tiers[].vouchers_json"
1914
+ ],
1915
+ "removeWhenUnsupported": [
1916
+ "variant slot rows unsupported by the target spec/API",
1917
+ "free shipping row if no free method exists",
1918
+ "upsell pages not present in the funnel"
1919
+ ]
1920
+ },
1921
+ "surfaces": [
1922
+ {
1923
+ "name": "MV select step",
1924
+ "partials": [
1925
+ "mv-selection-step.html"
1926
+ ],
1927
+ "ownedInputs": [
1928
+ "select_step",
1929
+ "packages",
1930
+ "shipping_methods",
1931
+ "variant_slots"
1932
+ ],
1933
+ "sdkRoots": [
1934
+ "data-next-bundle-selector",
1935
+ "data-next-bundle-card"
1936
+ ]
1937
+ },
1938
+ {
1939
+ "name": "MV slot stage",
1940
+ "partials": [
1941
+ "mv-slot-stage.html"
1942
+ ],
1943
+ "ownedInputs": [
1944
+ "checkout_step",
1945
+ "variant_slots"
1946
+ ],
1947
+ "sdkRoots": [
1948
+ "data-next-bundle-slots-for",
1949
+ "data-next-bundle-slot-template-id"
1950
+ ]
1951
+ },
1952
+ {
1953
+ "name": "MV variant-picker (alternative selector)",
1954
+ "partials": [
1955
+ "variant-picker.html"
1956
+ ],
1957
+ "ownedInputs": [
1958
+ "variant_picker",
1959
+ "shipping_methods"
1960
+ ],
1961
+ "sdkRoots": [
1962
+ "data-next-bundle-selector",
1963
+ "data-next-bundle-slots-for"
1964
+ ],
1965
+ "note": "Additive alternative to mv-selection-step + mv-slot-stage: custom-JS slot rendering (variant-picker.js) with per-variant swatch thumbnails driven from one declared variant_picker.variants source, plus an offline render fixture. Supports per-tier data-next-shipping-id via variant_picker.tiers[].shipping_method/shipping_id. Demoed on the standalone variant-picker.html page; not wired into select.html by default."
1966
+ },
1967
+ {
1968
+ "name": "MV payment and summary",
1969
+ "partials": [
1970
+ "payment-methods.html",
1971
+ "cart-summary03.html",
1972
+ "cart-summary04.html"
1973
+ ],
1974
+ "ownedInputs": [
1975
+ "payment_flags"
1976
+ ],
1977
+ "sdkRoots": [
1978
+ "data-next-payment-method",
1979
+ "data-next-cart-summary"
1980
+ ]
1981
+ },
1982
+ {
1983
+ "name": "MV upsell offers",
1984
+ "partials": [
1985
+ "upsell-mv-offer.html",
1986
+ "upsell-bundle-stepper-offer.html",
1987
+ "upsell-bundle-tier-pills-offer.html",
1988
+ "upsell-bundle-tier-cards-offer.html"
1989
+ ],
1990
+ "ownedInputs": [
1991
+ "upsell_offer",
1992
+ "upsell_mv_tiers",
1993
+ "slot_personalization",
1994
+ "order_personalization",
1995
+ "upsell_bundle_tiers"
1996
+ ],
1997
+ "sdkRoots": [
1998
+ "data-next-upsell",
1999
+ "data-next-bundle-selector",
2000
+ "data-next-bundle-card",
2001
+ "data-next-bundle-slots-for"
2002
+ ]
2003
+ }
2004
+ ],
2005
+ "fixtures": [
2006
+ "contracts/fixtures/campaign-specs/olympus-mv-two-step-configurable.json"
2007
+ ],
2008
+ "agentNotes": [
2009
+ "Select-step ids and checkout-step ids must remain synchronized; ask if a design blends one-step and two-step MV patterns.",
2010
+ "MV upsell pages now use upsells-mv.js for configurable-slot upsells and upsells.js for the standard bundle upsell chain; replace both upsell_offer and tier voucher/package refs from the target spec/API."
2011
+ ],
2012
+ "qaStructure": {
2013
+ "checkout": {
2014
+ "description": "Rendered Olympus MV two-step checkout must adopt the starter-template shell, not a custom shell with only borrowed partials.",
2015
+ "requiredVisibleSelectors": [
2016
+ {
2017
+ "name": "Olympus MV checkout wrapper",
2018
+ "selector": ".checkout-wrapper"
2019
+ },
2020
+ {
2021
+ "name": "left checkout column",
2022
+ "selector": ".checkout-layout__left"
2023
+ },
2024
+ {
2025
+ "name": "right checkout column",
2026
+ "selector": ".checkout-layout__right"
2027
+ },
2028
+ {
2029
+ "name": "checkout form",
2030
+ "selector": "[data-next-checkout=\"form\"]"
2031
+ },
2032
+ {
2033
+ "name": "shipping field row component",
2034
+ "selector": "[data-next-component=\"shipping-field-row\"]"
2035
+ },
2036
+ {
2037
+ "name": "checkout payment submit",
2038
+ "selector": "[os-checkout-payment]"
2039
+ },
2040
+ {
2041
+ "name": "rendered order summary",
2042
+ "selector": "[data-next-cart-summary]"
2043
+ }
2044
+ ],
2045
+ "requiredNonEmptySelectors": [
2046
+ {
2047
+ "name": "visible order summary content",
2048
+ "selector": "[data-next-cart-summary]"
2049
+ }
2050
+ ]
2051
+ }
2052
+ }
2053
+ },
2054
+ "verification": {
2055
+ "sdk_version": "0.4.37",
2056
+ "verified_at": "2026-08-21T15:26:00Z",
2057
+ "evidence": "sdk-0.4.37-2026-08-21",
2058
+ "status": "certified",
2059
+ "source": "template-verification.json"
2060
+ }
2061
+ },
2062
+ "shop-three-step": {
2063
+ "description": "Shop-style three-step checkout with separate information, shipping, and billing pages plus dynamic shipping options.",
2064
+ "frontmatterStatus": "include-driven",
2065
+ "strongSignals": [
2066
+ "shop-three-step in spec, path, or export metadata",
2067
+ "information.html -> shipping.html -> billing.html flow",
2068
+ "checkout-shop-three-shipping.js dynamic shipping options",
2069
+ "separate shipping method page before billing"
2070
+ ],
2071
+ "canonicalSurfaces": {
2072
+ "informationStep": "shipping/contact form",
2073
+ "shippingStep": "dynamic shipping methods from SDK getShippingMethods()",
2074
+ "billingStep": "payment-methods and checkout review",
2075
+ "receipt": "receipt-skeleton",
2076
+ "upsell": "bundle-stepper|bundle-tier-pills|bundle-tier-cards"
2077
+ },
2078
+ "frontmatterInputsNeeded": [
2079
+ "receipt_summary"
2080
+ ],
2081
+ "frontmatterInputsObserved": [
2082
+ "order_bump",
2083
+ "order_bump_variant",
2084
+ "packages",
2085
+ "shipping_steps",
2086
+ "swiper_slides",
2087
+ "swiper_thumbs",
2088
+ "upsell_offer",
2089
+ "upsell_bundle_tiers"
2090
+ ],
2091
+ "agentContract": {
2092
+ "status": "upsell-include-driven",
2093
+ "templateRole": "Shop checkout split into information, shipping, and billing steps; shipping methods are runtime-derived, not frontmatter refs.",
2094
+ "sourceOfTruth": {
2095
+ "campaignSpec": [
2096
+ "three-step checkout routing",
2097
+ "shipping_methods[]",
2098
+ "payment support",
2099
+ "upsell pages/packages/offers",
2100
+ "receipt routing"
2101
+ ],
2102
+ "campaignsApi": [
2103
+ "shipping_options[].ref_id via SDK getShippingMethods()",
2104
+ "payment method capability",
2105
+ "offers/vouchers for upsell pages"
2106
+ ],
2107
+ "starterTemplate": [
2108
+ "multi-step form sequencing",
2109
+ "checkout-shop-three-shipping.js",
2110
+ "shop receipt and upsell DOM shape"
2111
+ ]
2112
+ },
2113
+ "frontmatter": {
2114
+ "requiredWhenCloning": [
2115
+ "information.next_url=shipping.html",
2116
+ "shipping.next_url=billing.html",
2117
+ "billing.next_url=upsell-bundle-stepper.html"
2118
+ ],
2119
+ "optionalWhenSupported": [
2120
+ "packages.prepurchase_1",
2121
+ "packages.prepurchase_2",
2122
+ "order_bump_variant",
2123
+ "order_bump",
2124
+ "receipt_summary",
2125
+ "upsell_offer",
2126
+ "upsell_bundle_tiers",
2127
+ "swiper_slides",
2128
+ "swiper_thumbs"
2129
+ ],
2130
+ "demoOnlyValues": [
2131
+ "packages.prepurchase_1=7",
2132
+ "packages.prepurchase_2=9",
2133
+ "order_bump.check02.package_id=9",
2134
+ "upsell_offer.package_id=3",
2135
+ "upsell_offer.vouchers_json=[\"UP50\"]",
2136
+ "upsell_bundle_tiers packageId=3"
2137
+ ],
2138
+ "replaceFromSpecOrApi": [
2139
+ "packages.*",
2140
+ "order_bump.*.package_id",
2141
+ "upsell_offer.*",
2142
+ "upsell_bundle_tiers[].items_json",
2143
+ "upsell_bundle_tiers[].vouchers_json",
2144
+ "payment method visibility",
2145
+ "receipt summary copy and order evidence text"
2146
+ ],
2147
+ "removeWhenUnsupported": [
2148
+ "order bump when no bump package exists",
2149
+ "unsupported payment method rows",
2150
+ "upsell pages not present in the funnel"
2151
+ ]
2152
+ },
2153
+ "surfaces": [
2154
+ {
2155
+ "name": "dynamic shipping step",
2156
+ "partials": [
2157
+ "assets/js/checkout-shop-three-shipping.js"
2158
+ ],
2159
+ "ownedInputs": [
2160
+ "Campaigns API shipping methods"
2161
+ ],
2162
+ "sdkRoots": [
2163
+ "data-next-shipping-id"
2164
+ ]
2165
+ },
2166
+ {
2167
+ "name": "billing payment shell",
2168
+ "partials": [
2169
+ "payment-methods.html"
2170
+ ],
2171
+ "ownedInputs": [
2172
+ "payment_flags"
2173
+ ],
2174
+ "sdkRoots": [
2175
+ "data-next-payment-method",
2176
+ "data-next-payment-form"
2177
+ ]
2178
+ },
2179
+ {
2180
+ "name": "upsell selectors/actions",
2181
+ "partials": [
2182
+ "upsell-bundle-stepper-offer.html",
2183
+ "upsell-bundle-tier-pills-offer.html",
2184
+ "upsell-bundle-tier-cards-offer.html"
2185
+ ],
2186
+ "ownedInputs": [
2187
+ "upsell_offer",
2188
+ "upsell_bundle_tiers"
2189
+ ],
2190
+ "sdkRoots": [
2191
+ "data-next-upsell",
2192
+ "data-next-bundle-selector",
2193
+ "data-next-bundle-card"
2194
+ ]
2195
+ }
2196
+ ],
2197
+ "fixtures": [
2198
+ "contracts/fixtures/campaign-specs/shop-three-step-dynamic-shipping.json"
2199
+ ],
2200
+ "agentNotes": [
2201
+ "Do not add shipping_methods frontmatter here for checkout methods. The shipping step renders from the live SDK/API method list.",
2202
+ "Shop-three-step bundle upsell pages use include-owned offer partials; replace upsell_offer and upsell_bundle_tiers from the target CampaignSpec/API."
2203
+ ],
2204
+ "qaStructure": {
2205
+ "checkout": {
2206
+ "description": "Rendered shop three-step checkout must preserve the shop checkout shell and runtime summary/form roots.",
2207
+ "requiredVisibleSelectors": [
2208
+ {
2209
+ "name": "shop checkout layout",
2210
+ "selector": ".checkout__layout"
2211
+ },
2212
+ {
2213
+ "name": "left checkout column",
2214
+ "selector": ".checkout__column--left"
2215
+ },
2216
+ {
2217
+ "name": "right checkout column",
2218
+ "selector": ".checkout__column--right"
2219
+ },
2220
+ {
2221
+ "name": "checkout form",
2222
+ "selector": "[data-next-checkout=\"form\"]"
2223
+ },
2224
+ {
2225
+ "name": "rendered order summary",
2226
+ "selector": "[data-next-cart-summary]"
2227
+ }
2228
+ ],
2229
+ "requiredNonEmptySelectors": [
2230
+ {
2231
+ "name": "visible order summary content",
2232
+ "selector": "[data-next-cart-summary]"
2233
+ }
2234
+ ]
2235
+ }
2236
+ }
2237
+ },
2238
+ "verification": {
2239
+ "sdk_version": "0.4.37",
2240
+ "verified_at": "2026-08-21T15:26:00Z",
2241
+ "evidence": "sdk-0.4.37-2026-08-21",
2242
+ "status": "certified",
2243
+ "source": "template-verification.json"
2244
+ }
2245
+ }
2246
+ },
2247
+ "askUserPromptTemplate": "I can map this design to more than one commerce template family: {candidates}. The ambiguous surfaces are {surfaces}. Which family should I use before wiring SDK components?",
2248
+ "intentionalVariants": {
2249
+ "purpose": "Shared includes that legitimately differ across families. These lineages are DELIBERATE design/structure differences, not drift — do NOT flag or auto-reconcile them in cross-family include-drift audits. Families omitted from an include's lineages do not ship that include.",
2250
+ "verified": "2026-06-26",
2251
+ "regenerate": "For each include, hash the body across families with the next_component/HTML-comment header and whitespace stripped; families with the same hash share a lineage.",
2252
+ "doNotReconcile": true,
2253
+ "includes": {
2254
+ "bump-check01.html": {
2255
+ "surface": "orderBump",
2256
+ "lineages": [
2257
+ {
2258
+ "families": [
2259
+ "olympus",
2260
+ "apollo"
2261
+ ],
2262
+ "note": "Single-package check-style bump."
2263
+ },
2264
+ {
2265
+ "families": [
2266
+ "olympus-mv-single-step",
2267
+ "apollo-mv-single-step",
2268
+ "olympus-mv-two-step"
2269
+ ],
2270
+ "note": "MV/configurable bump: quantity sync via data-next-product-sync (product_id), so it sums across variant swaps (SDK 0.4.25+). See CLAUDE.md."
2271
+ },
2272
+ {
2273
+ "families": [
2274
+ "shop-single-step",
2275
+ "shop-three-step"
2276
+ ],
2277
+ "note": "Shop bump layout for selector-less checkouts."
2278
+ },
2279
+ {
2280
+ "families": [
2281
+ "demeter"
2282
+ ],
2283
+ "note": "Editorial bump styling."
2284
+ }
2285
+ ]
2286
+ },
2287
+ "bump-check03.html": {
2288
+ "surface": "orderBump",
2289
+ "lineages": [
2290
+ {
2291
+ "families": [
2292
+ "olympus",
2293
+ "apollo",
2294
+ "demeter",
2295
+ "olympus-mv-single-step",
2296
+ "apollo-mv-single-step",
2297
+ "olympus-mv-two-step",
2298
+ "shop-single-step",
2299
+ "shop-three-step"
2300
+ ],
2301
+ "note": "Shared unsynced product-card bump with optional PackageToggle line-item property field (SDK 0.4.27+)."
2302
+ }
2303
+ ]
2304
+ },
2305
+ "bump-switch01.html": {
2306
+ "surface": "orderBump",
2307
+ "lineages": [
2308
+ {
2309
+ "families": [
2310
+ "demeter"
2311
+ ],
2312
+ "note": "Switch-style bump with demeter styling."
2313
+ },
2314
+ {
2315
+ "families": [
2316
+ "olympus",
2317
+ "apollo",
2318
+ "olympus-mv-single-step",
2319
+ "apollo-mv-single-step",
2320
+ "olympus-mv-two-step",
2321
+ "shop-single-step",
2322
+ "shop-three-step"
2323
+ ],
2324
+ "note": "Shared switch-style bump."
2325
+ }
2326
+ ]
2327
+ },
2328
+ "checkout-header.html": {
2329
+ "surface": "checkoutHeader",
2330
+ "lineages": [
2331
+ {
2332
+ "families": [
2333
+ "olympus",
2334
+ "olympus-mv-single-step",
2335
+ "olympus-mv-two-step"
2336
+ ],
2337
+ "note": "Olympus/MV header."
2338
+ },
2339
+ {
2340
+ "families": [
2341
+ "apollo",
2342
+ "apollo-mv-single-step"
2343
+ ],
2344
+ "note": "Apollo trust-bar header (promoted checkout CSS in next-core)."
2345
+ },
2346
+ {
2347
+ "families": [
2348
+ "demeter"
2349
+ ],
2350
+ "note": "Demeter header."
2351
+ },
2352
+ {
2353
+ "families": [
2354
+ "shop-single-step",
2355
+ "shop-three-step"
2356
+ ],
2357
+ "note": "Shop top-bar header (checkout-header--lg). See CLAUDE.md shop checkout top-bar notes."
2358
+ }
2359
+ ]
2360
+ },
2361
+ "cart-summary03.html": {
2362
+ "surface": "orderSummary",
2363
+ "lineages": [
2364
+ {
2365
+ "families": [
2366
+ "apollo",
2367
+ "olympus"
2368
+ ],
2369
+ "note": "Apollo + Olympus featured-product order summary (annotated reference)."
2370
+ },
2371
+ {
2372
+ "families": [
2373
+ "olympus-mv-single-step",
2374
+ "apollo-mv-single-step",
2375
+ "olympus-mv-two-step",
2376
+ "shop-single-step",
2377
+ "shop-three-step"
2378
+ ],
2379
+ "note": "Shared featured-product summary body."
2380
+ },
2381
+ {
2382
+ "families": [
2383
+ "demeter"
2384
+ ],
2385
+ "note": "Demeter side-cart summary, parameterized (heading/subtitle/feature_package)."
2386
+ }
2387
+ ]
2388
+ },
2389
+ "cart-summary04.html": {
2390
+ "surface": "orderSummary",
2391
+ "lineages": [
2392
+ {
2393
+ "families": [
2394
+ "olympus",
2395
+ "apollo",
2396
+ "demeter",
2397
+ "olympus-mv-single-step",
2398
+ "apollo-mv-single-step",
2399
+ "olympus-mv-two-step"
2400
+ ],
2401
+ "note": "Large/image-line order summary (annotated in #73)."
2402
+ },
2403
+ {
2404
+ "families": [
2405
+ "shop-single-step",
2406
+ "shop-three-step"
2407
+ ],
2408
+ "note": "Shop structural rewrite of cart-summary04 (188 lines vs olympus's 143)."
2409
+ }
2410
+ ]
2411
+ },
2412
+ "checkout-footer-links.html": {
2413
+ "surface": "footerLinks",
2414
+ "lineages": [
2415
+ {
2416
+ "families": [
2417
+ "shop-single-step",
2418
+ "shop-three-step"
2419
+ ],
2420
+ "note": "Shop footer links."
2421
+ }
2422
+ ]
2423
+ },
2424
+ "footer.html": {
2425
+ "surface": "footer",
2426
+ "lineages": [
2427
+ {
2428
+ "families": [
2429
+ "olympus",
2430
+ "apollo",
2431
+ "olympus-mv-single-step",
2432
+ "apollo-mv-single-step",
2433
+ "olympus-mv-two-step",
2434
+ "shop-single-step",
2435
+ "shop-three-step"
2436
+ ],
2437
+ "note": "Shared footer."
2438
+ },
2439
+ {
2440
+ "families": [
2441
+ "demeter"
2442
+ ],
2443
+ "note": "Demeter footer (cc-medium variant)."
2444
+ }
2445
+ ]
2446
+ }
2447
+ }
2448
+ },
2449
+ "_synced_from_repo": "NextCommerceCo/campaign-cart-starter-templates",
2450
+ "_synced_from_ref": "main",
2451
+ "_synced_from_sha": "a7cc8beaf9d332c5d8e501d36fb9d4d7e3667468"
2452
+ }