@nextcommerce/campaigns-os 1.34.1 → 1.37.2

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 (119) hide show
  1. package/AGENTS.md +42 -13
  2. package/CHANGELOG.md +117 -0
  3. package/README.md +48 -21
  4. package/contracts/agent-relevant-change-policy.v1.json +1 -0
  5. package/contracts/campaign-cart-sdk-support-policy.v0.json +2 -2
  6. package/contracts/commerce-surface-catalog.json +31 -29
  7. package/contracts/fixtures/progress/observation.v0.json +89 -0
  8. package/contracts/release-ledger.json +425 -0
  9. package/contracts/supported-surface.json +20 -5
  10. package/contracts/template-brand-contract.shared-commerce.v0.json +1 -1
  11. package/demo/apollo-v0/NOTICE.txt +51 -0
  12. package/demo/apollo-v0/assets/css/demo.css +2 -0
  13. package/demo/apollo-v0/assets/css/landing/tokens.css +35 -0
  14. package/demo/apollo-v0/assets/css/next-core.css +16124 -0
  15. package/demo/apollo-v0/assets/images/1x1_1.svg +19 -0
  16. package/demo/apollo-v0/assets/images/1x1_2.svg +19 -0
  17. package/demo/apollo-v0/assets/images/affirm-logo.svg +24 -0
  18. package/demo/apollo-v0/assets/images/apple-pay-logo.svg +4 -0
  19. package/demo/apollo-v0/assets/images/bancontact-logo.svg +1 -0
  20. package/demo/apollo-v0/assets/images/cc-visa.svg +28 -0
  21. package/demo/apollo-v0/assets/images/cc_amex.svg +20 -0
  22. package/demo/apollo-v0/assets/images/cc_discover.svg +21 -0
  23. package/demo/apollo-v0/assets/images/cc_master.svg +22 -0
  24. package/demo/apollo-v0/assets/images/credit-card-flags.svg +38 -0
  25. package/demo/apollo-v0/assets/images/demo-inline-40788e52a7c75b78.svg +1 -0
  26. package/demo/apollo-v0/assets/images/demo-inline-686e73c8840a0f0a.svg +1 -0
  27. package/demo/apollo-v0/assets/images/google-pay-logo.svg +7 -0
  28. package/demo/apollo-v0/assets/images/guarantee-badge.png +0 -0
  29. package/demo/apollo-v0/assets/images/icon-dollar.svg +5 -0
  30. package/demo/apollo-v0/assets/images/icon-guarantee.svg +5 -0
  31. package/demo/apollo-v0/assets/images/icon-shipping.svg +5 -0
  32. package/demo/apollo-v0/assets/images/icons8-lock-24_1icons8-lock-24.png +0 -0
  33. package/demo/apollo-v0/assets/images/ideal-logo.svg +30 -0
  34. package/demo/apollo-v0/assets/images/klarna-logo.svg +9 -0
  35. package/demo/apollo-v0/assets/images/landing/_shared/16x9.svg +19 -0
  36. package/demo/apollo-v0/assets/images/landing/_shared/1x1_1.svg +19 -0
  37. package/demo/apollo-v0/assets/images/landing/_shared/4x3.svg +19 -0
  38. package/demo/apollo-v0/assets/images/landing/_shared/arrow-right.svg +6 -0
  39. package/demo/apollo-v0/assets/images/landing/_shared/cta-guarantee-icon.png +0 -0
  40. package/demo/apollo-v0/assets/images/landing/benefits-2/benefits-2-icon-1.svg +8 -0
  41. package/demo/apollo-v0/assets/images/landing/benefits-2/benefits-2-icon-2.svg +10 -0
  42. package/demo/apollo-v0/assets/images/landing/benefits-2/benefits-2-icon-3.svg +13 -0
  43. package/demo/apollo-v0/assets/images/landing/benefits-2/benefits-2-icon-4.svg +11 -0
  44. package/demo/apollo-v0/assets/images/landing/benefits-2/benefits-2-quote.svg +6 -0
  45. package/demo/apollo-v0/assets/images/landing/benefits-2/benefits-2-verified.svg +10 -0
  46. package/demo/apollo-v0/assets/images/landing/bottomcta-1/check-bullet.svg +5 -0
  47. package/demo/apollo-v0/assets/images/landing/faq-1/faq-chevron.svg +6 -0
  48. package/demo/apollo-v0/assets/images/landing/footer-1/footer-logo.png +0 -0
  49. package/demo/apollo-v0/assets/images/landing/guarantee-1/guarantee-1-badge.svg +8 -0
  50. package/demo/apollo-v0/assets/images/landing/hero-1/icon-check.svg +5 -0
  51. package/demo/apollo-v0/assets/images/landing/hero-1/icon-star.svg +6 -0
  52. package/demo/apollo-v0/assets/images/landing/hero-1/icon-verified.svg +6 -0
  53. package/demo/apollo-v0/assets/images/landing/icons-5/icon-batteries.svg +7 -0
  54. package/demo/apollo-v0/assets/images/landing/icons-5/icon-cuff-checking.svg +6 -0
  55. package/demo/apollo-v0/assets/images/landing/icons-5/icon-dual-user.svg +5 -0
  56. package/demo/apollo-v0/assets/images/landing/icons-5/icon-fda-cleared.svg +5 -0
  57. package/demo/apollo-v0/assets/images/landing/icons-5/icon-heartbeat.svg +17 -0
  58. package/demo/apollo-v0/assets/images/landing/icons-5/icon-lcd-display.svg +10 -0
  59. package/demo/apollo-v0/assets/images/landing/icons-5/icon-movement-error.svg +7 -0
  60. package/demo/apollo-v0/assets/images/landing/icons-5/icon-portable.png +0 -0
  61. package/demo/apollo-v0/assets/images/landing/icons-5/icon-reading-memory.svg +6 -0
  62. package/demo/apollo-v0/assets/images/landing/icons-5/icon-wrist-comfort.svg +5 -0
  63. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-card-1.jpg +0 -0
  64. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-card-2.jpg +0 -0
  65. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-card-3.jpg +0 -0
  66. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-card-4.jpg +0 -0
  67. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-promise-1.png +0 -0
  68. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-promise-2.png +0 -0
  69. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-promise-3.png +0 -0
  70. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-promise-4.png +0 -0
  71. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-promise-5.png +0 -0
  72. package/demo/apollo-v0/assets/images/landing/ingredients-3/ingredients-3-promise-6.png +0 -0
  73. package/demo/apollo-v0/assets/images/landing/nav-1/flag-us.png +0 -0
  74. package/demo/apollo-v0/assets/images/landing/reviews-3/star-card.svg +3 -0
  75. package/demo/apollo-v0/assets/images/landing/reviews-3/star-lg.svg +3 -0
  76. package/demo/apollo-v0/assets/images/landing/reviews-3/star-sm.svg +3 -0
  77. package/demo/apollo-v0/assets/images/landing/reviews-3/verified.svg +10 -0
  78. package/demo/apollo-v0/assets/images/landing/testimonials-2/testimonials-2-reactions.svg +9 -0
  79. package/demo/apollo-v0/assets/images/landing/testimonials-2/testimonials-2-stars.svg +6 -0
  80. package/demo/apollo-v0/assets/images/link-logo.svg +1 -0
  81. package/demo/apollo-v0/assets/images/next-dark.svg +8 -0
  82. package/demo/apollo-v0/assets/images/paypal-logo.svg +5 -0
  83. package/demo/apollo-v0/assets/images/paypal-txt.svg +8 -0
  84. package/demo/apollo-v0/assets/images/paypal.svg +22 -0
  85. package/demo/apollo-v0/assets/images/sepa-logo.svg +275 -0
  86. package/demo/apollo-v0/assets/images/twint-logo.svg +1 -0
  87. package/demo/apollo-v0/assets/images/united-states-flag-icon.webp +0 -0
  88. package/demo/apollo-v0/assets/images/upsell-payment-logos.svg +38 -0
  89. package/demo/apollo-v0/assets/images/usps.png +0 -0
  90. package/demo/apollo-v0/checkout/index.html +1370 -0
  91. package/demo/apollo-v0/landing/index.html +1836 -0
  92. package/demo/apollo-v0/provenance.json +342 -0
  93. package/demo/apollo-v0/receipt/index.html +292 -0
  94. package/demo/apollo-v0/upsell-bundle-stepper/index.html +401 -0
  95. package/docs/activation-and-evidence.md +37 -0
  96. package/docs/build-packet.md +107 -0
  97. package/docs/demo-preview.md +63 -0
  98. package/docs/diagnostics.md +55 -0
  99. package/docs/orientation-contract-reference.md +2 -1
  100. package/docs/progress-snapshots.md +142 -0
  101. package/docs/runtime-readiness.md +1 -1
  102. package/docs/supported-surface.md +13 -1
  103. package/package.json +13 -3
  104. package/schemas/campaign-runtime-build-context.v0.schema.json +42 -0
  105. package/schemas/campaigns-os-progress-snapshot.v0.schema.json +370 -0
  106. package/skills/next-campaigns-build/SKILL.md +17 -1
  107. package/skills/next-campaigns-os/SKILL.md +19 -3
  108. package/skills/next-campaigns-os-setup/SKILL.md +17 -1
  109. package/skills/next-campaigns-polish/SKILL.md +18 -2
  110. package/skills/next-campaigns-qa/SKILL.md +24 -8
  111. package/skills.json +5 -5
  112. package/src/cli.mjs +74 -4
  113. package/src/consent.mjs +2 -2
  114. package/src/demo-artifact.mjs +97 -0
  115. package/src/demo.mjs +85 -0
  116. package/src/diagnostic.mjs +101 -0
  117. package/src/install-mode.mjs +13 -1
  118. package/src/progress-node.mjs +177 -0
  119. package/src/progress.mjs +133 -0
@@ -0,0 +1,401 @@
1
+ <!DOCTYPE html><html lang="en"><head><meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; form-action 'none'; base-uri 'none'; connect-src 'none'; frame-src 'none'; object-src 'none'"><link rel="stylesheet" href="../assets/css/demo.css">
2
+ <meta charset="utf-8">
3
+ <title>Apollo — Upsell (bundle stepper)</title>
4
+
5
+ <meta property="og:type" content="website">
6
+ <meta property="og:title" content="Apollo — Upsell (bundle stepper)">
7
+ <meta name="twitter:card" content="summary_large_image">
8
+ <meta name="twitter:title" content="Apollo — Upsell (bundle stepper)">
9
+
10
+
11
+ <meta property="og:description" content="Apollo checkout funnel">
12
+ <meta name="twitter:description" content="Apollo checkout funnel">
13
+
14
+
15
+
16
+
17
+ <meta property="og:site_name" content="Next Commerce">
18
+
19
+
20
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link href="../assets/css/next-core.css" rel="stylesheet" type="text/css">
49
+
50
+
51
+
52
+
53
+
54
+
55
+ </head>
56
+ <body><aside data-demo-banner="true" class="demo-banner"><strong>Demo only</strong><span>Sample content. Checkout, payment and source controls are disabled.</span><nav aria-label="Sample pages"><a data-demo-nav="true" href="../landing/index.html">Landing</a><a data-demo-nav="true" href="../checkout/index.html">Checkout</a><a data-demo-nav="true" href="../upsell-bundle-stepper/index.html">Offer</a><a data-demo-nav="true" href="../receipt/index.html">Receipt</a></nav><p>For a real campaign, start in a new folder with a saved Campaign Map. Keep this demo and any edits as reference.</p></aside>
57
+
58
+
59
+
60
+
61
+ <div class="page-wrapper">
62
+ <div class="main-wrapper">
63
+ <div class="announcement">
64
+ <div class="announcement__block">
65
+ <div class="announcement__text"><strong>Special Offer Unlocked - Do Not Close This Page</strong></div>
66
+ </div>
67
+ </div>
68
+ <section class="upsell-header-bar">
69
+ <div class="container">
70
+ <div class="upsell-header-bar__wrapper">
71
+ <div class="upsell-header-bar__left">
72
+ <div class="upsell-header-bar__logo"><img src="../assets/images/next-dark.svg" alt="Next Commerce" class="brand-logo" loading="eager"></div>
73
+ </div>
74
+ <div class="upsell-header-bar__right">
75
+ <div class="upsell-header-bar__steps">
76
+ <div class="upsell-header-bar__stepper">
77
+
78
+ <div class="upsell-header-bar__step">
79
+
80
+ <div class="upsell-header-bar__step-content">
81
+ <div class="upsell-header-bar__step-label">Checkout</div>
82
+ </div>
83
+ </div>
84
+ <div class="upsell-header-bar__step">
85
+
86
+ <div class="upsell-header-bar__step-content">
87
+ <div class="upsell-header-bar__step-label"> › </div>
88
+ </div>
89
+ </div>
90
+ <div class="upsell-header-bar__step upsell-header-bar__step--active">
91
+
92
+ <div class="upsell-header-bar__step-content">
93
+ <div class="upsell-header-bar__step-label">Upgrades</div>
94
+ </div>
95
+ </div>
96
+ <div class="upsell-header-bar__step">
97
+
98
+ <div class="upsell-header-bar__step-content">
99
+ <div class="upsell-header-bar__step-label"> › </div>
100
+ </div>
101
+ </div>
102
+ <div class="upsell-header-bar__step">
103
+
104
+ <div class="upsell-header-bar__step-content">
105
+ <div class="upsell-header-bar__step-label">Summary</div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ </section>
114
+
115
+
116
+ <section class="section upsell-header">
117
+ <div class="container">
118
+ <div class="upsell-header__inner">
119
+ <div class="upsell-header__title">Wait! Your Order Isn't Complete</div>
120
+ <div class="upsell-header__offer">
121
+ Special Discount: Get 1 More
122
+ <span>Sample product</span>
123
+ For Only
124
+ <span>$29.00 (sample)</span>
125
+ </div>
126
+ <div class="upsell-header__suboffer">
127
+ Add this to your order and get a
128
+ <span>Sample</span>
129
+ discount
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </section>
134
+
135
+
136
+ <div>
137
+ <section class="section upsell-box">
138
+ <div class="container">
139
+ <div class="upsell-wrapper">
140
+
141
+
142
+ <div class="os-option" style="display:none">
143
+ <div role="button" aria-disabled="true" class="os-card next-selected demo-inert"></div>
144
+ </div>
145
+
146
+ <div class="upsell-container">
147
+ <div class="grid-full flex-col flex-horizontal-lg-up">
148
+ <div class="upsell-content__column">
149
+ <div class="upsell-offer__card">
150
+ <h2 class="display-lg"><span>Sample product</span></h2>
151
+ <div class="review_component cc-sm margin-12">
152
+ <div class="review_component-wrapper">
153
+ <div class="review_stars-wrapper cc-color cc-black">
154
+ <div class="review_component-star"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--heroicons" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.007l5.404.433c1.164.093 1.636 1.545.749 2.305l-4.117 3.527l1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354L7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273l-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.433l2.082-5.006Z" clip-rule="evenodd"></path></svg></div>
155
+ <div class="review_component-star"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--heroicons" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.007l5.404.433c1.164.093 1.636 1.545.749 2.305l-4.117 3.527l1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354L7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273l-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.433l2.082-5.006Z" clip-rule="evenodd"></path></svg></div>
156
+ <div class="review_component-star"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--heroicons" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.007l5.404.433c1.164.093 1.636 1.545.749 2.305l-4.117 3.527l1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354L7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273l-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.433l2.082-5.006Z" clip-rule="evenodd"></path></svg></div>
157
+ <div class="review_component-star"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--heroicons" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.007l5.404.433c1.164.093 1.636 1.545.749 2.305l-4.117 3.527l1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354L7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273l-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.433l2.082-5.006Z" clip-rule="evenodd"></path></svg></div>
158
+ <div class="review_component-star"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--heroicons" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.007l5.404.433c1.164.093 1.636 1.545.749 2.305l-4.117 3.527l1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354L7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273l-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.433l2.082-5.006Z" clip-rule="evenodd"></path></svg></div>
159
+ </div>
160
+ <div class="font-bold">(19,569 Ratings)</div>
161
+ </div>
162
+ </div>
163
+ <div class="divider_line _25"></div>
164
+ <div class="upsell-offer__bullets">
165
+ <div class="bullet_inner-one">
166
+ <div class="hero_bullet-features-box-inner">
167
+ <div class="bullet-features-icon-box"><div class="bullet_features-icon-svg"><svg width="100%" height="100%" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_upsell_u1)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10 0.930023C4.48 0.930023 0 5.41002 0 10.93C0 16.45 4.48 20.93 10 20.93C15.52 20.93 20 16.45 20 10.93C20 5.41002 15.52 0.930023 10 0.930023ZM9.99994 18.9302C5.58994 18.9302 1.99994 15.3402 1.99994 10.9302C1.99994 6.52025 5.58994 2.93025 9.99994 2.93025C14.4099 2.93025 17.9999 6.52025 17.9999 10.9302C17.9999 15.3402 14.4099 18.9302 9.99994 18.9302ZM8.00003 13.1002L14.59 6.51021L16 7.93021L8.00003 15.9302L4.00003 11.9302L5.41003 10.5202L8.00003 13.1002Z" fill="currentColor"></path></g><defs><clipPath id="clip0_upsell_u1"><rect width="20" height="20" fill="white" transform="translate(0 0.930023)"></rect></clipPath></defs></svg></div></div>
168
+ <div class="bullet-features-text-box"><div class="text-size-regular text-weight-bold">The standard chunk of Lorem Ipsum</div></div>
169
+ </div>
170
+ <div class="hero_bullet-features-box-inner">
171
+ <div class="bullet-features-icon-box"><div class="bullet_features-icon-svg"><svg width="100%" height="100%" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_upsell_u2)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10 0.930023C4.48 0.930023 0 5.41002 0 10.93C0 16.45 4.48 20.93 10 20.93C15.52 20.93 20 16.45 20 10.93C20 5.41002 15.52 0.930023 10 0.930023ZM9.99994 18.9302C5.58994 18.9302 1.99994 15.3402 1.99994 10.9302C1.99994 6.52025 5.58994 2.93025 9.99994 2.93025C14.4099 2.93025 17.9999 6.52025 17.9999 10.9302C17.9999 15.3402 14.4099 18.9302 9.99994 18.9302ZM8.00003 13.1002L14.59 6.51021L16 7.93021L8.00003 15.9302L4.00003 11.9302L5.41003 10.5202L8.00003 13.1002Z" fill="currentColor"></path></g><defs><clipPath id="clip0_upsell_u2"><rect width="20" height="20" fill="white" transform="translate(0 0.930023)"></rect></clipPath></defs></svg></div></div>
172
+ <div class="bullet-features-text-box"><div class="text-size-regular text-weight-bold">Contrary to popular belief, Lorem Ipsum</div></div>
173
+ </div>
174
+ <div class="hero_bullet-features-box-inner">
175
+ <div class="bullet-features-icon-box"><div class="bullet_features-icon-svg"><svg width="100%" height="100%" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_upsell_u3)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10 0.930023C4.48 0.930023 0 5.41002 0 10.93C0 16.45 4.48 20.93 10 20.93C15.52 20.93 20 16.45 20 10.93C20 5.41002 15.52 0.930023 10 0.930023ZM9.99994 18.9302C5.58994 18.9302 1.99994 15.3402 1.99994 10.9302C1.99994 6.52025 5.58994 2.93025 9.99994 2.93025C14.4099 2.93025 17.9999 6.52025 17.9999 10.9302C17.9999 15.3402 14.4099 18.9302 9.99994 18.9302ZM8.00003 13.1002L14.59 6.51021L16 7.93021L8.00003 15.9302L4.00003 11.9302L5.41003 10.5202L8.00003 13.1002Z" fill="currentColor"></path></g><defs><clipPath id="clip0_upsell_u3"><rect width="20" height="20" fill="white" transform="translate(0 0.930023)"></rect></clipPath></defs></svg></div></div>
176
+ <div class="bullet-features-text-box"><div class="text-size-regular text-weight-bold">Lorem Ipsum has been the industry's</div></div>
177
+ </div>
178
+ <div class="hero_bullet-features-box-inner">
179
+ <div class="bullet-features-icon-box"><div class="bullet_features-icon-svg"><svg width="100%" height="100%" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_upsell_u4)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10 0.930023C4.48 0.930023 0 5.41002 0 10.93C0 16.45 4.48 20.93 10 20.93C15.52 20.93 20 16.45 20 10.93C20 5.41002 15.52 0.930023 10 0.930023ZM9.99994 18.9302C5.58994 18.9302 1.99994 15.3402 1.99994 10.9302C1.99994 6.52025 5.58994 2.93025 9.99994 2.93025C14.4099 2.93025 17.9999 6.52025 17.9999 10.9302C17.9999 15.3402 14.4099 18.9302 9.99994 18.9302ZM8.00003 13.1002L14.59 6.51021L16 7.93021L8.00003 15.9302L4.00003 11.9302L5.41003 10.5202L8.00003 13.1002Z" fill="currentColor"></path></g><defs><clipPath id="clip0_upsell_u4"><rect width="20" height="20" fill="white" transform="translate(0 0.930023)"></rect></clipPath></defs></svg></div></div>
180
+ <div class="bullet-features-text-box"><div class="text-size-regular text-weight-bold">Lorem Ipsum is simply dummy text</div></div>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ <div class="divider_line margin-32"></div>
185
+
186
+ <div class="checkout-button-wrapper">
187
+
188
+ <div class="next-bundle-qty">
189
+ <div class="next-bundle-qty__label">
190
+ <div>Select Quantity</div>
191
+ <div class="right-bullet-icon"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--ic" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M16.01 11H4v2h12.01v3L20 12l-3.99-4z"></path></svg></div>
192
+ </div>
193
+ <div class="next-bundle-qty__row">
194
+ <button type="button" aria-label="Decrease quantity" disabled="" aria-disabled="true" class="next-bundle-qty__btn demo-inert">−</button>
195
+ <span class="text-lg tw-600" style="min-width: 1.5rem; text-align: center;">1</span>
196
+ <button type="button" aria-label="Increase quantity" disabled="" aria-disabled="true" class="next-bundle-qty__btn demo-inert">+</button>
197
+ </div>
198
+ </div>
199
+
200
+ <div class="prices-text-wrapper">
201
+ <div class="price-wrapper">
202
+ <div class="text-sm tw-600">Retail Price</div>
203
+ <div class="upsell-offer__price diagonal-strike color-muted">$29.00 (sample)</div>
204
+ <div class="text-xs font-bold"><strike>+$4.95 SHIPPING</strike></div>
205
+ </div>
206
+ <div class="upsell-offer__divider"></div>
207
+ <div class="price-wrapper">
208
+ <div class="upsell-offer__price-heading">
209
+ <div class="text-sm tw-600">Offer Price</div>
210
+ <div class="text-sm font-bold color-primary">
211
+ (<span>Sample</span> OFF)
212
+ </div>
213
+ </div>
214
+ <div class="upsell-offer__price">$29.00 (sample)</div>
215
+ <div class="text-xs font-bold color-primary">+ FREE SHIPPING</div>
216
+ </div>
217
+ </div>
218
+
219
+ <a pb-animate="pulse-upsell" aria-disabled="true" class="button demo-inert">
220
+ <div data-button="content" class="button_content"><div>Yes, Add to My Order</div></div>
221
+ </a>
222
+
223
+ <div class="upsell-ships-info">
224
+ <img class="upsell-ships-info__icon" src="../assets/images/usps.png" alt="USPS" loading="eager">
225
+ <p class="upsell-ships-info__text">
226
+ All orders ship from the USA
227
+ <img class="upsell-ships-info__flag" src="../assets/images/united-states-flag-icon.webp" alt="" loading="eager">
228
+ via USPS within 1 business day. A tracking number will be issued to your email.
229
+ </p>
230
+ </div>
231
+ <div class="payment-img-wrapper hide-tablet-up">
232
+ <div class="trust-badge invert"><img src="../assets/images/icons8-lock-24_1icons8-lock-24.png" alt="" class="trust-badge__icon" loading="eager">
233
+ <div class="badge-text-black">100% Encrypted &amp; Secure Checkout</div>
234
+ </div><img src="../assets/images/upsell-payment-logos.svg" alt="" class="credit-card__flags" loading="eager">
235
+ </div>
236
+
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+ <div class="upsell-offer__image-column">
242
+ <div>
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+ <div data-component="swiper" data-variant="sw1">
253
+ <div class="slider_component">
254
+ <div class="slider_component-wrapper">
255
+ <div swiper="slider-main" class="swiper">
256
+ <div class="swiper-wrapper">
257
+
258
+ <div class="swiper-slide">
259
+ <div class="swiper-slide_inner">
260
+ <div class="swiper-slide_image-wrap is-square"><img src="../assets/images/1x1_1.svg" alt="" class="cover" loading="eager"></div>
261
+ </div>
262
+ </div>
263
+
264
+ <div class="swiper-slide">
265
+ <div class="swiper-slide_inner">
266
+ <div class="swiper-slide_image-wrap is-square"><img src="../assets/images/1x1_1.svg" alt="" class="cover" loading="eager"></div>
267
+ </div>
268
+ </div>
269
+
270
+ <div class="swiper-slide">
271
+ <div class="swiper-slide_inner">
272
+ <div class="swiper-slide_image-wrap is-square"><img src="../assets/images/1x1_1.svg" alt="" class="cover" loading="eager"></div>
273
+ </div>
274
+ </div>
275
+
276
+ <div class="swiper-slide">
277
+ <div class="swiper-slide_inner">
278
+ <div class="swiper-slide_image-wrap is-square"><img src="../assets/images/1x1_1.svg" alt="" class="cover" loading="eager"></div>
279
+ </div>
280
+ </div>
281
+
282
+ <div class="swiper-slide">
283
+ <div class="swiper-slide_inner">
284
+ <div class="swiper-slide_image-wrap is-square"><img src="../assets/images/1x1_1.svg" alt="" class="cover" loading="eager"></div>
285
+ </div>
286
+ </div>
287
+
288
+ <div class="swiper-slide">
289
+ <div class="swiper-slide_inner">
290
+ <div class="swiper-slide_image-wrap is-square"><img src="../assets/images/1x1_1.svg" alt="" class="cover" loading="eager"></div>
291
+ </div>
292
+ </div>
293
+
294
+ </div>
295
+ </div>
296
+ <div class="swiper-thumbs-arrow">
297
+ <div swiper="prev-button" class="swiper__button-static">
298
+ <div class="swiper__button-icon"><svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.91316 12.9545L0 12.0028L0.91316 11.0511L9.16383 2.45175L10.077 1.5L11.8979 3.39789L10.9848 4.34964L4.93644 10.6592H22.7108H24V13.3464H22.7108H4.93644L10.9902 19.6504L11.9033 20.6021L10.0824 22.5L9.1692 21.5483L0.91316 12.9545Z" fill="currentColor"></path></svg></div>
299
+ </div>
300
+ <div class="slider_component__thumbs-wrap">
301
+ <div thumbsslider="" swiper="slider-thumbs" class="swiper">
302
+ <div class="swiper-wrapper">
303
+
304
+ <div class="swiper-slide is-thumb swiper-slide-thumb-active">
305
+ <div class="swiper-slide_inner">
306
+ <div class="swiper-slide_image-wrap"><img src="../assets/images/1x1_2.svg" alt="" class="cover" loading="eager"></div>
307
+ </div>
308
+ </div>
309
+
310
+ <div class="swiper-slide is-thumb">
311
+ <div class="swiper-slide_inner">
312
+ <div class="swiper-slide_image-wrap"><img src="../assets/images/1x1_2.svg" alt="" class="cover" loading="eager"></div>
313
+ </div>
314
+ </div>
315
+
316
+ <div class="swiper-slide is-thumb">
317
+ <div class="swiper-slide_inner">
318
+ <div class="swiper-slide_image-wrap"><img src="../assets/images/1x1_2.svg" alt="" class="cover" loading="eager"></div>
319
+ </div>
320
+ </div>
321
+
322
+ <div class="swiper-slide is-thumb">
323
+ <div class="swiper-slide_inner">
324
+ <div class="swiper-slide_image-wrap"><img src="../assets/images/1x1_2.svg" alt="" class="cover" loading="eager"></div>
325
+ </div>
326
+ </div>
327
+
328
+ <div class="swiper-slide is-thumb">
329
+ <div class="swiper-slide_inner">
330
+ <div class="swiper-slide_image-wrap"><img src="../assets/images/1x1_2.svg" alt="" class="cover" loading="eager"></div>
331
+ </div>
332
+ </div>
333
+
334
+ <div class="swiper-slide is-thumb">
335
+ <div class="swiper-slide_inner">
336
+ <div class="swiper-slide_image-wrap"><img src="../assets/images/1x1_2.svg" alt="" class="cover" loading="eager"></div>
337
+ </div>
338
+ </div>
339
+
340
+ </div>
341
+ </div>
342
+ </div>
343
+ <div swiper="next-button" class="swiper__button-static">
344
+ <div class="swiper__button-icon"><svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M23.0868 12.9545L24 12.0028L23.0868 11.0511L14.8362 2.45175L13.923 1.5L12.1021 3.39789L13.0152 4.34964L19.0636 10.6592H1.28917H0V13.3464H1.28917H19.0582L13.0098 19.6504L12.0967 20.6021L13.9176 22.5L14.8308 21.5483L23.0868 12.9545Z" fill="currentColor"></path></svg></div>
345
+ </div>
346
+ </div>
347
+ </div>
348
+ </div>
349
+ </div>
350
+
351
+ </div>
352
+ <div class="payment-img-wrapper hide-tablet-down">
353
+ <div class="trust-badge invert"><img src="../assets/images/icons8-lock-24_1icons8-lock-24.png" alt="" class="trust-badge__icon" loading="eager">
354
+ <div class="badge-text-black">100% Encrypted &amp; Secure Checkout</div>
355
+ </div><img src="../assets/images/upsell-payment-logos.svg" alt="" class="credit-card__flags" loading="eager">
356
+ </div>
357
+
358
+ </div>
359
+ </div>
360
+ </div>
361
+
362
+ <div class="cc-decline-wrapper">
363
+ <a aria-disabled="true" class="upsell-link cc-decline cc-upsell4 demo-inert">
364
+ <div class="next-icon cc-1-25em"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--carbon" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path fill="currentColor" d="M16 2C8.2 2 2 8.2 2 16s6.2 14 14 14s14-6.2 14-14S23.8 2 16 2m0 26C9.4 28 4 22.6 4 16S9.4 4 16 4s12 5.4 12 12s-5.4 12-12 12"></path><path fill="currentColor" d="M21.4 23L16 17.6L10.6 23L9 21.4l5.4-5.4L9 10.6L10.6 9l5.4 5.4L21.4 9l1.6 1.6l-5.4 5.4l5.4 5.4z"></path></svg></div>
365
+ <div class="text-sm tw-600 cc-upsell4">No thank you, I don't want this one-time offer</div>
366
+ </a>
367
+ </div>
368
+ </div>
369
+ </div>
370
+ </section>
371
+ </div>
372
+
373
+ <footer class="footer_section">
374
+ <div class="container">
375
+ <div class="footer_layout">
376
+ <div class="footer_copy-info">
377
+ <div class="footer_link-wrapper">
378
+ <a target="_blank" aria-disabled="true" class="footer_legal-link demo-inert">Shipping Policy</a>
379
+ <a target="_blank" aria-disabled="true" class="footer_legal-link demo-inert">Refund Policy</a>
380
+ <a target="_blank" aria-disabled="true" class="footer_legal-link demo-inert">Privacy Policy</a>
381
+ <a target="_blank" aria-disabled="true" class="footer_legal-link demo-inert">Terms of Service</a>
382
+ </div>
383
+ <div class="text-xs">Copyright © <span class="copyright-year"></span> Next Commerce</div>
384
+
385
+ </div>
386
+ </div>
387
+ </div>
388
+ </footer>
389
+
390
+ </div>
391
+ </div>
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+ </body></html>
@@ -0,0 +1,37 @@
1
+ # Activation, access, and evidence
2
+
3
+ Start a real campaign with a Campaigns App configuration, a saved Campaign Map
4
+ or local CampaignSpec export, a Page Kit project, and prepared source pages.
5
+ Run `start`, then follow `next` and its named owner, inputs, and gates. These
6
+ commands use the existing Build Packet and Assembly Report lifecycle; the
7
+ milestones below describe evidence, not a second state machine.
8
+
9
+ | Milestone | What it establishes | What is still needed |
10
+ |---|---|---|
11
+ | Toolkit installed | The selected package can run and its agent skills can be checked with `tooling status`. | Campaign inputs and workflow evidence. Installation needs npm access; it does not grant store, Map, deploy, or QA access. |
12
+ | Demo preview | Pinned sample pages can be opened locally for a visual walkthrough; candidate 1.37.0 provides `demo --target <new-directory>`. | A separate real campaign folder, configuration, replaced demo values, and the ordinary build and proof gates. Demo behavior is not live commerce proof. |
13
+ | Map saved | Campaign Map Builder has retained the authored campaign plan. A local export is an alternative build input. | Export/revision agreement and resolution of live campaign data. Saving a Map does not establish Campaigns App or store access. |
14
+ | Campaign resolved | The package-owned resolver has read the campaign's live configuration and produced resolution evidence. | Build, preview, and runtime proof. Confirm Campaigns App keys and allowed domains; store Admin API reads need their own read token. |
15
+ | Preview observed | A browser has inspected the served current build at the tested URL. | Retained package-owned Polish capture and QA evidence tied to that build. A deployed URL alone is not an observation. |
16
+ | QA recorded | The package-owned verdict records the tested URL, build, checks, and exercised order-path depth. | Any recorded blockers, waived exceptions, publication recovery, and run closeout. A verdict's presence does not imply a pass or launch approval. |
17
+
18
+ Access is supplied by the operator or the named workflow owner. When an input
19
+ is missing, keep the stage blocked and collect that input; do not substitute a
20
+ demo value or infer access from an earlier milestone. `doctor` inspects local
21
+ evidence without writing by default. `tooling diagnose --packet <packet>`
22
+ exports only a small, redacted support summary; normal `doctor` and `next`
23
+ remain the detailed local recovery instructions.
24
+
25
+ Trust, freshness, and revision agreement are independent of these milestones.
26
+ Orient on declarative Git objects at one reviewed commit before executing the
27
+ toolkit. An exact installed version and lockfile identify the runtime; they do
28
+ not establish that it is the newest release or trusted. A saved Map, exported
29
+ spec, assembled build, and retained verdict can each refer to a different
30
+ revision. Reconcile them through the existing producer and freshness gates,
31
+ never by treating a later milestone as proof that earlier evidence is current.
32
+
33
+ If QA has finished testing but verdict publication failed, use `qa publish`
34
+ on the existing verdict as the local recovery instructions direct. Publication
35
+ recovery sends retained evidence; it must not rerun checkout or create another
36
+ test order. A diagnostic inspection performs no installation, write, publish,
37
+ deploy, browser run, or order placement.
@@ -220,6 +220,113 @@ action. A configured campaign whose pin is newer than the spec's is the
220
220
  advisory case above: no required action, and sync never moves that pin
221
221
  backwards; `spec derive` is the command that closes it from the spec side.
222
222
 
223
+ ### Changing a campaign after handoff
224
+
225
+ For page-kit campaigns, the reviewed repository spec determines the next build.
226
+ New handoffs use `.campaigns-os/campaign.spec.json`; existing packets keep their
227
+ `spec.local_path` until a separate, reviewed migration. Static campaigns do not
228
+ need a spec or packet for an SDK upgrade. This procedure implements the operating
229
+ agreement in [#432](https://github.com/NextCommerceCo/campaigns-os/issues/432)
230
+ and [#447](https://github.com/NextCommerceCo/campaigns-os/issues/447). It is a
231
+ review procedure, not an automatic Map import or a portal editing lock.
232
+
233
+ A PM can keep using Map Builder to propose a change. Saving the Map does not
234
+ change the campaign repository or approve that change for the next build.
235
+
236
+ | Responsibility | Owner |
237
+ |---|---|
238
+ | Propose offers, copy, page sequence and other authored intent; confirm the intended result | Campaign PM or named campaign owner |
239
+ | Compare the proposal with the current repository, prepare the spec/code change and run checks | Developer, assisted by an agent where useful |
240
+ | Resolve competing edits to the same authored field | PM confirms intent; developer checks the resulting implementation |
241
+ | Review and merge the repository change | The campaign's existing authorized reviewer, under its normal PR rules |
242
+ | Refresh store-derived data requiring an Admin token | Authorized operator or PM; never a routine developer SDK-bump prerequisite |
243
+
244
+ Record the actual PM and developer/reviewer in the campaign change request. An
245
+ agent can prepare a diff and evidence, but cannot supply a missing human decision.
246
+ This procedure does not grant new merge, store-write or deployment authority.
247
+
248
+ #### Propose and reconcile a change
249
+
250
+ 1. **Identify the starting revision.** Record the campaign repo, Git commit and
251
+ packet's spec path that the PM reviewed. Keep that spec as the baseline. A Map
252
+ ID identifies lineage, not the revision: also retain the proposed Map export
253
+ and its save/hash evidence. Do not overwrite the repository spec with it.
254
+ 2. **Compare three versions.** Compare the baseline with the PM's proposal, then
255
+ with the current repository spec. Match pages and packages by their stable
256
+ identifiers, not array position. Explain additions, removals and routing
257
+ changes as well as changed values. The
258
+ [field-class contract](https://github.com/NextCommerceCo/campaigns-os/issues/432#issuecomment-5707550439)
259
+ identifies what a PM can author and what the repo, API or editor owns.
260
+ 3. **Apply the intended change to the current spec on a branch.** Transfer only
261
+ the PM's authored changes. Keep current repo-derived SDK pins, page URLs and
262
+ analytics IDs; preserve API/store records and editor metadata under their own
263
+ authority. An offer selection may change, but a proposed price does not
264
+ rewrite an API-owned price: route that commercial setup change to its owner
265
+ and obtain refreshed readback before building it.
266
+ 4. **Resolve conflicts before accepting the change.** If PM and developer changed
267
+ the same authored field differently, neither value wins automatically. Record
268
+ the chosen value and PM confirmation in the PR. If the baseline is missing,
269
+ pause the import: ask the PM to restate the change against the current spec.
270
+ Do not infer intent from every difference in a stale export. If the repository
271
+ advances during review, repeat the comparison against the new revision.
272
+ 5. **Refresh and validate the result.** Preview `spec derive --dry-run`, inspect
273
+ every refused or unresolved field, then apply the accepted derivation. Plain
274
+ derive is local; it does not merge authored intent. Follow the packet's normal
275
+ `page-kit sync`, build, doctor and relevant QA steps. Resolve stale routing
276
+ hints and rebuild affected pages. A successful derive exit alone is not build
277
+ or QA approval. After an authored-only edit, derive may return `unchanged`
278
+ and leave the Assembly Report's spec hash at the previous build. Record fresh
279
+ build evidence and verify its spec fingerprint before accepting it. A changed
280
+ spec must not reuse evidence for the older build.
281
+ 6. **Review the intended result and record the revision.** The PM confirms the
282
+ commercial change and the developer supplies the checked diff and preview
283
+ evidence. Record the reviewed spec's exact-byte SHA-256, the tested repository
284
+ revision, and the doctor/QA evidence in the PR. Build or deploy from that
285
+ reviewed revision under the campaign's existing rules; rerun affected checks
286
+ if the spec or code changes afterwards. Tell the PM which proposal was accepted
287
+ and identify any remaining Map differences, so the saved Map is not mistaken
288
+ for a synchronized copy.
289
+
290
+ A change request needs only: baseline commit/spec path, the proposal or requested
291
+ field changes, current repository revision, conflict decisions, named reviewers,
292
+ and the final spec hash with build/QA evidence. Use existing PRs and campaign
293
+ records for this; there is no additional sidecar schema or new CLI command.
294
+
295
+ #### Example: the PM changes an upsell while the developer upgrades the SDK
296
+
297
+ The PM starts from reviewed revision A and replaces the first upsell's selected
298
+ package with package B, already present in the campaign API. Meanwhile the
299
+ repository reaches revision R with a newer SDK pin and a changed page permalink.
300
+ The PM's export still contains A's SDK pin and generated page URL.
301
+
302
+ | Value | PM proposal | Current repo R | Reviewed result |
303
+ |---|---|---|---|
304
+ | Selected upsell package (authored) | B | Original package | B, after PM confirmation |
305
+ | SDK pin (repo-derived) | Old pin from A | Newer pin | Newer pin |
306
+ | Page URL (repo-derived) | Old URL from A | New permalink | URL derived from the new permalink |
307
+ | Package price (API-owned) | Copied API value | Current API value | Current API value; selection does not change the price |
308
+
309
+ Start from R, change the selected package, and derive the repo-owned fields. Review
310
+ routing references and rebuild the affected upsell page. If the developer also
311
+ changed the selected package to C, record a conflict and obtain a choice before
312
+ merging. Do not apply B merely because the Map was saved later.
313
+
314
+ #### Map write-back and future portal saves
315
+
316
+ `spec derive --write-map` remains an explicit, pin-only action. A developer or
317
+ operator may request it when updating the Map's SDK hint is part of their task;
318
+ it is not a default SDK-bump or reconciliation step. It retains the existing
319
+ hash precondition and refusal to overwrite a newer Map pin. It does not mark a
320
+ PM proposal accepted or synchronize offers, routes or other authored content.
321
+ Store refresh through `--from-store` remains a separate authorized operator step.
322
+
323
+ A future Git-backed portal save can replace the manual transfer only when it
324
+ identifies the repository/spec and base revision, shows the authored diff,
325
+ preserves each field's authority, detects concurrent changes, and submits the
326
+ change through the same review process. It must show whether a change is merely
327
+ proposed, reviewed or used by a build. That is separate portal work; this
328
+ agreement does not enable portal writes.
329
+
223
330
  ### Deriving the spec from the repo (`spec derive`)
224
331
 
225
332
  Every CampaignSpec field has a class: **authored** (a human writes it: offers,
@@ -0,0 +1,63 @@
1
+ # Offline sample preview
2
+
3
+ Candidate 1.37.0 adds `campaigns-os demo`. The published 1.34.1 installation
4
+ example does not contain this command; install a reviewed full-SHA candidate
5
+ or an exact release at least 1.37.0 after publication.
6
+
7
+ From the folder containing your exact project-local toolkit installation:
8
+
9
+ ```bash
10
+ npx campaigns-os demo --target ./apollo-sample
11
+ ```
12
+
13
+ Open the printed `landing/index.html` file directly. No server or browser
14
+ installer is required. The command creates only a new directory whose parent
15
+ already exists; existing directories, files and symlinks are refused. Only
16
+ `--target` and `--help` are accepted. `--no-write`, `--dry-run`, force, merge
17
+ and overwrite flags are rejected before creation.
18
+
19
+ The banner links landing, checkout, upsell and receipt pages. Sample commerce
20
+ controls are disabled. This is a static visual projection: no SDK, JavaScript,
21
+ forms, live orders, campaign configuration, telemetry, sessions or evidence.
22
+ It remains sample-only even when invoked inside an active or stale campaign.
23
+ The command copies the reviewed bundled files without downloading a template
24
+ or running Page Kit or a CSS compiler. The bundle uses early restrictive CSP
25
+ and only local relative assets. No external resources are fetched.
26
+
27
+ To begin a real campaign, keep any sample edits and create a separate new Page
28
+ Kit folder. Follow [quickstart](quickstart.md) with a real saved Map or spec,
29
+ credentials and source pages. There is no automatic demo conversion. The demo
30
+ milestone grants neither saved-Map status nor build, preview or QA proof; see
31
+ [activation and evidence](activation-and-evidence.md).
32
+
33
+ ## Provenance and regeneration
34
+
35
+ The projection uses NEXT's Apollo template at
36
+ `11352c30c596db258679fd3a552b906086b11bb9`, built by the published
37
+ `next-campaign-page-kit@0.2.0` CLI (source commit
38
+ `eed0679b1d02ef5cbe7f21964165c4202724d91d`) and `tailwindcss@3.4.17`.
39
+ Template design tokens are retained, with a deterministic `system-ui,
40
+ sans-serif` typography fallback. Swiper is projected to its first static slide.
41
+ Two obsolete stock CSS backgrounds with no files at the pinned commit are
42
+ removed. The receipt's runtime skeleton overlay is removed.
43
+
44
+ `demo/apollo-v0/provenance.json` records input hashes, exact pins, the toolchain
45
+ lock hash and every output file hash. `NOTICE.txt` retains factual template
46
+ attribution and Page Kit/Tailwind MIT notices; it grants no additional template
47
+ licence. The provenance manifest is a hashed supported artifact. Other static
48
+ files are internal to this fixed projection and validated against that manifest.
49
+
50
+ Maintainers regenerate from a disposable workspace using the pinned toolchain:
51
+
52
+ ```bash
53
+ npm ci --ignore-scripts --prefix scripts/demo-toolchain
54
+ node scripts/regenerate-demo.mjs --write
55
+ ```
56
+
57
+ The script invokes published `campaign-init` against the full Git ref, builds
58
+ only the four selected pages with `campaign-build`, transcribes the fixed
59
+ Tailwind theme without executing source configuration, and validates the inert
60
+ output before replacing the repository's bundle. Raw source, configuration,
61
+ data, JavaScript, Maps, QA/run files and source maps are excluded. Review changed
62
+ bytes, update the supported provenance hash and release ledger, then run the
63
+ required checks and file-based browser proof before accepting regeneration.