@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,47 @@
1
+ {
2
+ "schema_version": "template-slot-manifest/v0",
3
+ "family": "shop-single-step",
4
+ "extends": "template-slot-manifest.shared-content-core.v0.json",
5
+ "description": "Content-slot manifest for the shop-single-step starter-template family. Shared slots come from the content-slot core; this overlay declares family-specific keys and commerce-owned pages.",
6
+ "overlay": {
7
+ "pages": {
8
+ "landing": {
9
+ "sections": [
10
+ {
11
+ "section": "family_overlay",
12
+ "slots": [
13
+ {
14
+ "key": "cta_params",
15
+ "kind": "commerce",
16
+ "role": "commerce_structure",
17
+ "owner": "commerce",
18
+ "description": "Structured commerce configuration \u2014 owned by the commerce-surface catalog and the family brand contract, not the content-slot layer.",
19
+ "reference": "integrated_commerce_surface_ref"
20
+ }
21
+ ]
22
+ }
23
+ ]
24
+ },
25
+ "receipt": {
26
+ "sections": [
27
+ {
28
+ "section": "family_overlay",
29
+ "slots": [
30
+ {
31
+ "key": "receipt_summary",
32
+ "kind": "commerce",
33
+ "role": "commerce_structure",
34
+ "owner": "commerce",
35
+ "description": "Structured commerce configuration \u2014 owned by the commerce-surface catalog and the family brand contract, not the content-slot layer.",
36
+ "reference": "integrated_commerce_surface_ref"
37
+ }
38
+ ]
39
+ }
40
+ ]
41
+ }
42
+ }
43
+ },
44
+ "commerce_owned_pages": [
45
+ "checkout"
46
+ ]
47
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schema_version": "template-slot-manifest/v0",
3
+ "family": "shop-three-step",
4
+ "extends": "template-slot-manifest.shared-content-core.v0.json",
5
+ "description": "Content-slot manifest for the shop-three-step starter-template family. Shared slots come from the content-slot core; this overlay declares family-specific keys and commerce-owned pages.",
6
+ "overlay": {
7
+ "pages": {
8
+ "landing": {
9
+ "sections": [
10
+ {
11
+ "section": "family_overlay",
12
+ "slots": [
13
+ {
14
+ "key": "cta_params",
15
+ "kind": "commerce",
16
+ "role": "commerce_structure",
17
+ "owner": "commerce",
18
+ "description": "Structured commerce configuration \u2014 owned by the commerce-surface catalog and the family brand contract, not the content-slot layer.",
19
+ "reference": "integrated_commerce_surface_ref"
20
+ }
21
+ ]
22
+ }
23
+ ]
24
+ }
25
+ }
26
+ },
27
+ "commerce_owned_pages": [
28
+ "checkout",
29
+ "information",
30
+ "shipping",
31
+ "billing"
32
+ ]
33
+ }
@@ -0,0 +1,159 @@
1
+ # Brand Theme Bridge
2
+
3
+ Campaigns OS often receives campaigns midstream. A source design may come from
4
+ Figma, a hand-authored page, an AI export, a partially assembled page-kit repo,
5
+ or a developer who already cloned checkout/upsell templates and started editing.
6
+ The brand theme bridge is intentionally workflow-order neutral: it reads durable
7
+ source artifacts that exist now and records what can safely flow into commerce
8
+ pages.
9
+
10
+ ## What v0 Does
11
+
12
+ `campaigns-os theme inspect` reads a Build Packet and looks for source-side
13
+ `:root` custom properties from:
14
+
15
+ - mapped HTML page inline `:root` blocks
16
+ - CSS files referenced by mapped HTML/frontmatter
17
+ - source-html manifest linked CSS assets
18
+ - conventional token paths such as `assets/css/tokens.css`,
19
+ `assets/css/landing/tokens.css`, and `assets/css/presell/tokens.css`
20
+
21
+ It compares source tokens against known `figma-sections-export` scaffold
22
+ defaults, maps real brand values onto a local versioned next-core target-token
23
+ contract, and writes evidence into a theme report.
24
+
25
+ `campaigns-os theme generate` writes:
26
+
27
+ ```text
28
+ .campaign-runtime/theme/theme-report.json
29
+ .campaign-runtime/theme/brand-theme.css
30
+ ```
31
+
32
+ The generated CSS is v0 root-variable-only. It can override next-core custom
33
+ properties such as `--brand--color--primary` and
34
+ `--brand--color--cta-primary`, but it must not emit selectors, `data-next`
35
+ selectors, payment/package/cart selectors, JavaScript, or remote URL fetches.
36
+
37
+ ### Foreground tokens are derived from background luminance
38
+
39
+ Foreground / on-color tokens — `--brand--color--text-inverse`,
40
+ `--brand--color--cta-foreground`, `--brand--color--primary-foreground`, and
41
+ `--brand--color--accent-foreground` — are **not** copied from a source
42
+ `--text-inverse` token (which scaffolds default to white). They are derived
43
+ from the WCAG relative luminance of the background each sits on, picking the
44
+ more legible of the configured dark/light choices. A light brand (yellow,
45
+ white, pastel) therefore gets dark foregrounds; a dark/saturated brand gets
46
+ white ones. This prevents the white-on-light-CTA bug — next-core's
47
+ `.button` / `.submit-button` render their label with
48
+ `color: var(--brand--color--text-inverse)`, so `text-inverse` pairs with the
49
+ CTA background first, then the primary background. Pairings live in the
50
+ `foreground_derivations` block of
51
+ `contracts/brand-theme-target-tokens.next-core.v0.json`; a derived foreground
52
+ that still falls below the contract's `min_contrast_ratio` is emitted with a
53
+ `theme.foreground.low_contrast` warning so the brand background can be
54
+ confirmed. Derived-foreground confidence scales with the achieved contrast
55
+ (`>= 7:1` high, `>= 4.5:1` medium, otherwise low).
56
+
57
+ > **Contract change (PR #117):** `--text-inverse` and the three `*-foreground`
58
+ > targets are no longer entries under `source_mappings` — they moved to
59
+ > `foreground_derivations`. A source `--text-inverse` token (or anything that
60
+ > name-infers to one) is therefore no longer mapped directly; the foreground is
61
+ > always derived from the paired background's luminance. No fixtures or
62
+ > consumers keyed off the old mapping.
63
+
64
+ ## Prepare-Build Behavior
65
+
66
+ `start` and `prepare-build` run theme discovery in `inspect_only` mode by
67
+ default. They write `context.theme` and
68
+ `.campaign-runtime/theme/theme-report.json`, but they do not write
69
+ `brand-theme.css` unless `--theme-policy auto` is explicitly set and the source
70
+ evidence is high-confidence and safe.
71
+
72
+ Policies:
73
+
74
+ | Policy | Behavior |
75
+ | --- | --- |
76
+ | `inspect_only` | Default. Discover/report only; no generated CSS. |
77
+ | `auto` | May write `brand-theme.css` only when confidence is high and no stale artifact risk exists. |
78
+ | `off` | Skip theme discovery. |
79
+
80
+ Existing `brand-theme.css` is not overwritten without `--force`. If the source
81
+ hash changes, source tokens disappear, or current confidence drops, Campaigns OS
82
+ marks the existing artifact stale and tells the operator to regenerate or skip.
83
+
84
+ ## Theme Gate
85
+
86
+ Theme discovery used to be advisory: `theme inspect` could prove a brand layer
87
+ was generatable, doctor could surface `needs_review`, and an agent could still
88
+ carry the starter palette through polish, deploy, and a green QA verdict. The
89
+ theme gate makes the decision deterministic.
90
+
91
+ When `theme inspect` reports `can_generate: true` and the campaign ships
92
+ commerce pages (checkout/upsell/downsell/receipt), the gate **blocks**
93
+ `next polish`, `next deploy`, `next qa`, and `qa run` until one of:
94
+
95
+ - the brand layer is generated and recorded as applied
96
+ (`report.theme.status: applied`, `load_order: after-next-core`), or
97
+ - an explicit waiver is recorded:
98
+ `campaigns-os theme waive --packet <p> --reason "<why>" --waived-by "<named human>"`
99
+ (optionally `--expires-at <ISO>`; placeholders such as "operator" are refused), or
100
+ `qa run --theme-waive "<reason>"` for a one-off run, or
101
+ - theme policy is `off` for the run.
102
+
103
+ "Ships commerce pages" is a question about the campaign, not about one build's
104
+ output. The gate reads the pages this build produced **and** the commerce pages
105
+ the campaign declares but this build left out of scope, so a partial build
106
+ cannot retire the gate on a funnel it simply did not assemble; `commerce_pages`
107
+ carries the union and `commerce_pages_out_of_scope` names the half this build
108
+ did not produce. On the QA path the declared funnel is unioned in the same way,
109
+ so a thin or stale `doctor-output.json` cannot self-retire a gate on a funnel
110
+ whose routes `qa resolve` lists in the same output. `theme_gate.scope_source`
111
+ records which sources contributed: `doctor_derived_scope`, `spec_topologies`,
112
+ or `doctor_derived_scope+spec_topologies`.
113
+
114
+ The gate result lives at `doctor.derived.theme_gate` and in every `next`
115
+ response's `gates` array, with `required_actions` carrying the exact commands.
116
+ A waiver does not silence QA: the palette-residue checks (`:style:*`, `:logo`,
117
+ `:payment-chrome:*`) still run and report residue as `warn` rows so the shipped
118
+ palette stays visible in the verdict; placeholder-text residue stays a blocker
119
+ regardless of the waiver.
120
+
121
+ Per-family expectations (required token overrides, starter defaults that count
122
+ as residue, CSS load order, QA selectors, pricing-surface modes, exit-pop
123
+ residue, and the family inventory matrix) live in
124
+ `contracts/template-brand-contract.<family>.v0.json`. Promoted families in the
125
+ commerce surface catalog must have one; doctor and QA treat a missing contract
126
+ as a blocker instead of silently skipping residue checks.
127
+ See `docs/template-family-contracts.md` for the current family inventory matrix.
128
+
129
+ ## Build And Polish Handoff
130
+
131
+ Build agents should read `context.theme` before styling checkout, upsell,
132
+ downsell, or receipt pages.
133
+
134
+ If a fresh `brand-theme.css` exists:
135
+
136
+ 1. Copy it into the campaign asset tree.
137
+ 2. Add it to commerce page frontmatter styles after `next-core.css`.
138
+ 3. Preserve SDK-owned runtime surfaces: `data-next-*`, package selectors,
139
+ payment fields, totals, submit controls, receipt templates, route meta tags,
140
+ and SDK JavaScript.
141
+ 4. Record `report.theme.status`, `css_path`, `commerce_pages`, `load_order`,
142
+ and evidence.
143
+
144
+ Polish should verify token parity, load order after next-core, starter-logo
145
+ replacement when source assets expose a real brand mark, and SDK safety. If the
146
+ brand layer is repairable, record the first repair-loop defect.
147
+
148
+ ## Future Designer-Source Contract
149
+
150
+ Mario's proposed direction belongs upstream of this v0 bridge: generate a
151
+ campaign design-system package before design work begins, with durable assets
152
+ such as `colors.css`, `typography.css`, fonts, logos, and candidate
153
+ `lp-tokens.json`, `checkout-tokens.json`, and `upsell-tokens.json` page-family
154
+ variables.
155
+
156
+ That is likely the right long-term source of truth, but v0 should not require
157
+ that package. The bridge must also work when Campaigns OS is invoked after Figma
158
+ export, after partial developer edits, or after checkout/upsell templates have
159
+ already been cloned.