@nextcommerce/campaigns-os 1.37.1 → 1.37.3

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.
package/AGENTS.md CHANGED
@@ -97,7 +97,7 @@ The portable `./progress` contract preserves separate saved Map, semantic spec
97
97
  and output identities, and grants no orientation or deployment trust. See
98
98
  [progress snapshots](docs/progress-snapshots.md).
99
99
 
100
- Candidate 1.37.0 adds `demo --target <new-directory>`, an offline visual sample
100
+ 1.37.0 adds `demo --target <new-directory>`, an offline visual sample
101
101
  that copies a pinned inert Apollo bundle and prints its landing/index.html path.
102
102
  It bypasses session recovery and creates no campaign evidence or telemetry.
103
103
  Unsupported flags, including no-write and dry-run, are rejected before writes.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,62 @@
2
2
 
3
3
  Notable supported-surface changes are recorded here.
4
4
 
5
+ ## [1.37.3] - 2026-09-19
6
+
7
+ ### Changed
8
+
9
+ - Publish the corrected install documentation. The README and quick start in
10
+ the 1.37.2 tarball still pinned `@nextcommerce/campaigns-os@1.34.1` and called
11
+ `demo` a candidate feature; this release carries the 1.37.2+agent.1 wording
12
+ (install examples at the current release, `demo` documented as shipped in
13
+ 1.37.0 and later) so the npm package page matches the portal. No command,
14
+ schema, skill or export changes.
15
+
16
+ ## [1.37.2+agent.1] - 2026-09-19
17
+
18
+ ### Changed
19
+
20
+ - Point the install examples at the published 1.37.2 release. `README.md` and
21
+ `docs/quickstart.md` still pinned `@nextcommerce/campaigns-os@1.34.1`, three
22
+ releases behind the tag they ship in, so a reader following the GitHub or npm
23
+ README installed a toolkit without `demo` or `tooling diagnose`. The
24
+ minimum-version notes for those commands stay; the
25
+ "not published yet" caveats and their full-SHA workarounds are gone.
26
+ - Stop calling 1.37.0 a candidate. `AGENTS.md`, `docs/supported-surface.md`,
27
+ `docs/activation-and-evidence.md`, `docs/demo-preview.md` and the quick starts
28
+ described `demo` as a "candidate 1.37.0" feature; 1.37.0 through 1.37.2 are
29
+ published releases and the wording now says so.
30
+
31
+ ## [1.37.2] - 2026-09-18
32
+
33
+ ### Fixed
34
+
35
+ - Refresh the public starter catalog, per-family SDK verification and CampaignSpec
36
+ examples from template commit `11352c30`. The vendored SDK policy now records
37
+ released SDK 0.4.38, so freshness compares older certification against that
38
+ release instead of reporting SDK 0.4.37 as current.
39
+ - Carry forward private families and local QA structure. Refresh Apollo Template
40
+ Reference provenance and upsell shipping-copy guidance from the same source.
41
+ Reconcile certified fixture and payment-chrome provenance with the catalog;
42
+ rendered pages, config files and payment asset hashes remain unchanged.
43
+ - Preserve the toolkit's established pre-checkout select role and authored
44
+ forward routes when refreshing the known public examples. Narrow adapters
45
+ retain unrelated source updates and leave distinct future contracts unchanged.
46
+
47
+ ## [1.37.1+agent.1] - 2026-09-18
48
+
49
+ ### Changed
50
+
51
+ - Document the page-kit change procedure after handoff: PM proposals are
52
+ reconciled against a known baseline and the current reviewed repository spec.
53
+ Conflicting authored edits require a recorded decision; generated and API-owned
54
+ fields retain their own authority. The worked example preserves a developer's
55
+ SDK upgrade and new page URL while accepting an authored upsell change.
56
+ - Keep Map pin write-back explicit and store refresh with the authorized operator.
57
+ The procedure names the review and evidence requirements for the next build,
58
+ including fresh fingerprints after authored-only changes. It adds no automatic
59
+ synchronization, portal writes or spec prerequisite for static SDK upgrades.
60
+
5
61
  ## [1.37.1] - 2026-09-18
6
62
 
7
63
  ### Fixed
package/README.md CHANGED
@@ -43,7 +43,7 @@ order:
43
43
  mkdir "<route>" && cd "<route>"
44
44
  npm init -y && npm i next-campaign-page-kit
45
45
  npx campaign-init --non-interactive --template <family> --slug "<route>" --name "<campaign name>"
46
- npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.34.1
46
+ npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.37.3
47
47
  npx campaigns-os tooling status --platform claude
48
48
  npx campaigns-os install-skills --platform claude
49
49
  mkdir -p source
@@ -53,7 +53,7 @@ The toolkit is also published to npm as `@nextcommerce/campaigns-os`, so the
53
53
  CLI can be installed once, globally, instead of pinned per campaign:
54
54
 
55
55
  ```bash
56
- npm install -g @nextcommerce/campaigns-os@1.34.1
56
+ npm install -g @nextcommerce/campaigns-os@1.37.3
57
57
  campaigns-os tooling status --platform claude
58
58
  campaigns-os install-skills --platform claude
59
59
  ```
@@ -69,20 +69,16 @@ runs the full check in an unprivileged job and publishes the verified tarball
69
69
  with provenance from a second, environment-gated job.
70
70
 
71
71
  For an existing page-kit campaign, skip the first three lines and `cd` into it
72
- (its `package.json` already declares `next-campaign-page-kit`). `1.34.1` is
72
+ (its `package.json` already declares `next-campaign-page-kit`). `1.37.3` is
73
73
  an exact published example; choose the release you reviewed, never a floating
74
74
  dist-tag for a reproducible build. Commit `package.json` and `package-lock.json`.
75
- The new `tooling diagnose` command requires 1.35.0 or later. When that release
76
- is not published yet, use the reviewed full-SHA source pin below; the 1.34.1
77
- example does not include diagnostics or the global invocation rendering fix.
75
+ `tooling diagnose` requires 1.35.0 or later and `demo` requires 1.37.0 or later.
78
76
  A Git source pin remains supported when using an unreleased reviewed commit:
79
77
  `npm install --save-dev --save-exact "github:NextCommerceCo/campaigns-os#<full-sha>"`.
80
78
 
81
- For a visual sample, candidate 1.37.0 adds
82
- `npx campaigns-os demo --target ./apollo-sample`. Open the printed
83
- `landing/index.html` directly to explore four inert Apollo pages. This command
84
- requires a reviewed candidate or a published release at least 1.37.0; the 1.34.1
85
- example above does not include it. It downloads nothing and creates no campaign
79
+ For a visual sample, `npx campaigns-os demo --target ./apollo-sample`
80
+ (1.37.0 or later) copies four inert Apollo pages; open the printed
81
+ `landing/index.html` directly. It downloads nothing and creates no campaign
86
82
  evidence. Keep sample edits and start a real campaign in a separate new Page Kit
87
83
  folder. See [offline sample preview](docs/demo-preview.md).
88
84
  The lockfile records the resolved source and integrity; `tooling status` reports
@@ -139,7 +135,15 @@ states (the SDK pin, page routes, analytics ids) into the local CampaignSpec,
139
135
  and with `--write-map` records the pin in the saved Map's Build hints too, so
140
136
  a bump in the repo is one edit followed by a derive rather than a hand edit
141
137
  in two tools; with `--from-store <subdomain>` and the store's Admin API read
142
- token in the environment it derives the store profile from the store as well. Everything after `start` is agent-driven: after `start`
138
+ token in the environment it derives the store profile from the store as well.
139
+ Map write-back stays explicit and pin-only.
140
+
141
+ For changes after handoff, follow the
142
+ [spec review procedure](docs/build-packet.md#changing-a-campaign-after-handoff):
143
+ apply the PM's authored changes to the current repository spec, preserve derived
144
+ fields, and resolve competing edits before the next build.
145
+
146
+ Everything after `start` is agent-driven: after `start`
143
147
  and after every stage, run `next` and do what it prints — it names the skill
144
148
  and the exact commands for the next stage, already spelled `npx campaigns-os
145
149
  …` for this install, which is why `install-skills` comes first. The browser
@@ -2,8 +2,8 @@
2
2
  "schema_version": "campaign-cart-sdk-support-policy/v0",
3
3
  "provenance": {
4
4
  "source": "NextCommerceCo/campaign-cart release tags",
5
- "latest_known_release": "0.4.36",
6
- "captured_at": "2026-08-18"
5
+ "latest_known_release": "0.4.38",
6
+ "captured_at": "2026-09-18"
7
7
  },
8
8
  "source": "contracts/campaign-cart-sdk-support-policy.v0.json",
9
9
  "minimum_supported": "0.4.20",
@@ -166,13 +166,15 @@
166
166
  "items_json",
167
167
  "vouchers_json",
168
168
  "accept_text",
169
- "decline_text"
169
+ "decline_text",
170
+ "retail_shipping",
171
+ "offer_shipping"
170
172
  ],
171
173
  "sourceOfTruth": [
172
174
  "CampaignSpec upsell/downsell pages",
173
175
  "Campaigns API package refs and vouchers/offers"
174
176
  ],
175
- "agentRule": "Post-purchase upsells do not use shipping_methods. Package refs and vouchers must come from the upsell page contract."
177
+ "agentRule": "Post-purchase upsells do not use shipping_methods. Package refs and vouchers must come from the upsell page contract. `retail_shipping` and `offer_shipping` are display copy for the offer price block (the struck retail shipping line and the offer shipping line), not shipping method refs. The starter defaults claim `+$4.95 SHIPPING` and `+ FREE SHIPPING`; set both from the target campaign's real shipping figures whenever they differ."
176
178
  },
177
179
  "upsell_bundle_tiers": {
178
180
  "purpose": "Tiered post-purchase bundle upsell rows.",
@@ -493,9 +495,9 @@
493
495
  }
494
496
  },
495
497
  "verification": {
496
- "sdk_version": "0.4.37",
497
- "verified_at": "2026-08-21T15:26:00Z",
498
- "evidence": "sdk-0.4.37-2026-08-21",
498
+ "sdk_version": "0.4.38",
499
+ "verified_at": "2026-09-15T16:51:10Z",
500
+ "evidence": "sdk-0.4.38-2026-09-15",
499
501
  "status": "certified",
500
502
  "source": "template-verification.json"
501
503
  }
@@ -505,8 +507,8 @@
505
507
  "templateReference": {
506
508
  "id": "template-reference-apollo",
507
509
  "family": "apollo",
508
- "version": "sdk-0.4.37-2026-08-21",
509
- "source_commit": "e9a2fc17beefe572b8ddc0c4f9b1b8e2f97f9a59",
510
+ "version": "sdk-0.4.38-revalidated-2026-09-03",
511
+ "source_commit": "84a63fe7af8cf49cd8cfdaaa66eb00ef6dd9bc4a",
510
512
  "provenance_url": "https://raw.githubusercontent.com/NextCommerceCo/campaign-cart-starter-templates/main/docs/template-references/apollo/README.md",
511
513
  "contract_path": "contracts/commerce-surface-catalog.json",
512
514
  "standard_viewport_refs": [
@@ -832,9 +834,9 @@
832
834
  }
833
835
  },
834
836
  "verification": {
835
- "sdk_version": "0.4.37",
836
- "verified_at": "2026-08-21T15:26:00Z",
837
- "evidence": "sdk-0.4.37-2026-08-21",
837
+ "sdk_version": "0.4.38",
838
+ "verified_at": "2026-09-15T16:51:10Z",
839
+ "evidence": "sdk-0.4.38-2026-09-15",
838
840
  "status": "certified",
839
841
  "source": "template-verification.json"
840
842
  }
@@ -1038,9 +1040,9 @@
1038
1040
  }
1039
1041
  },
1040
1042
  "verification": {
1041
- "sdk_version": "0.4.37",
1042
- "verified_at": "2026-08-21T15:26:00Z",
1043
- "evidence": "sdk-0.4.37-2026-08-21",
1043
+ "sdk_version": "0.4.38",
1044
+ "verified_at": "2026-09-15T16:51:10Z",
1045
+ "evidence": "sdk-0.4.38-2026-09-15",
1044
1046
  "status": "certified",
1045
1047
  "source": "template-verification.json"
1046
1048
  }
@@ -1235,9 +1237,9 @@
1235
1237
  }
1236
1238
  },
1237
1239
  "verification": {
1238
- "sdk_version": "0.4.37",
1239
- "verified_at": "2026-08-21T15:26:00Z",
1240
- "evidence": "sdk-0.4.37-2026-08-21",
1240
+ "sdk_version": "0.4.38",
1241
+ "verified_at": "2026-09-15T16:51:10Z",
1242
+ "evidence": "sdk-0.4.38-2026-09-15",
1241
1243
  "status": "certified",
1242
1244
  "source": "template-verification.json"
1243
1245
  }
@@ -1469,9 +1471,9 @@
1469
1471
  }
1470
1472
  },
1471
1473
  "verification": {
1472
- "sdk_version": "0.4.37",
1473
- "verified_at": "2026-08-21T15:26:00Z",
1474
- "evidence": "sdk-0.4.37-2026-08-21",
1474
+ "sdk_version": "0.4.38",
1475
+ "verified_at": "2026-09-15T16:51:10Z",
1476
+ "evidence": "sdk-0.4.38-2026-09-15",
1475
1477
  "status": "certified",
1476
1478
  "source": "template-verification.json"
1477
1479
  }
@@ -1802,9 +1804,9 @@
1802
1804
  }
1803
1805
  },
1804
1806
  "verification": {
1805
- "sdk_version": "0.4.37",
1806
- "verified_at": "2026-08-21T15:26:00Z",
1807
- "evidence": "sdk-0.4.37-2026-08-21",
1807
+ "sdk_version": "0.4.38",
1808
+ "verified_at": "2026-09-15T16:51:10Z",
1809
+ "evidence": "sdk-0.4.38-2026-09-15",
1808
1810
  "status": "certified",
1809
1811
  "source": "template-verification.json"
1810
1812
  }
@@ -2052,9 +2054,9 @@
2052
2054
  }
2053
2055
  },
2054
2056
  "verification": {
2055
- "sdk_version": "0.4.37",
2056
- "verified_at": "2026-08-21T15:26:00Z",
2057
- "evidence": "sdk-0.4.37-2026-08-21",
2057
+ "sdk_version": "0.4.38",
2058
+ "verified_at": "2026-09-15T16:51:10Z",
2059
+ "evidence": "sdk-0.4.38-2026-09-15",
2058
2060
  "status": "certified",
2059
2061
  "source": "template-verification.json"
2060
2062
  }
@@ -2236,9 +2238,9 @@
2236
2238
  }
2237
2239
  },
2238
2240
  "verification": {
2239
- "sdk_version": "0.4.37",
2240
- "verified_at": "2026-08-21T15:26:00Z",
2241
- "evidence": "sdk-0.4.37-2026-08-21",
2241
+ "sdk_version": "0.4.38",
2242
+ "verified_at": "2026-09-15T16:51:10Z",
2243
+ "evidence": "sdk-0.4.38-2026-09-15",
2242
2244
  "status": "certified",
2243
2245
  "source": "template-verification.json"
2244
2246
  }
@@ -2448,5 +2450,5 @@
2448
2450
  },
2449
2451
  "_synced_from_repo": "NextCommerceCo/campaign-cart-starter-templates",
2450
2452
  "_synced_from_ref": "main",
2451
- "_synced_from_sha": "a7cc8beaf9d332c5d8e501d36fb9d4d7e3667468"
2453
+ "_synced_from_sha": "11352c30c596db258679fd3a552b906086b11bb9"
2452
2454
  }
@@ -5207,6 +5207,156 @@
5207
5207
  }
5208
5208
  ],
5209
5209
  "entry_sha256": "76423be9a8624b8a3b398f4a4bfd47ff17b48f45d6a3bc44a22e122172684c6a"
5210
+ },
5211
+ {
5212
+ "id": "RL-0127",
5213
+ "sequence": 127,
5214
+ "date": "2026-09-18",
5215
+ "kind": "release",
5216
+ "surface_version": null,
5217
+ "changelog_section": "1.37.1+agent.1",
5218
+ "changelog_sha256": "4eef81fac283eb699daff04ea5de96a4ad768099f8b9e0556f57e671435479ca",
5219
+ "agent_impact": "For page-kit campaigns after handoff, reconcile PM proposals against their baseline and the current reviewed repository spec. Record authored conflicts and regenerate build evidence for the accepted revision. Map pin write-back remains explicit; static SDK upgrades do not gain a spec requirement.",
5220
+ "compatibility": "compatible",
5221
+ "migration": "none",
5222
+ "changes": [
5223
+ {
5224
+ "class": "named_surface",
5225
+ "path": "docs/build-packet.md",
5226
+ "surface_entry": "docs/build-packet.md",
5227
+ "summary": "Document PM/developer ownership, authored reconciliation, reviewed build evidence and the boundary for future Git-backed portal saves."
5228
+ }
5229
+ ],
5230
+ "entry_sha256": "7a643454252eff345d8015246440a037f69dab2041aee2f8fbafe1367caef087"
5231
+ },
5232
+ {
5233
+ "id": "RL-0128",
5234
+ "sequence": 128,
5235
+ "date": "2026-09-18",
5236
+ "kind": "release",
5237
+ "surface_version": "1.37.2",
5238
+ "changelog_section": "1.37.2",
5239
+ "changelog_sha256": "96345150e314126c0b639cedebd4359085cb841af80cbf6e4ba0fb4554ce6d4c",
5240
+ "agent_impact": "Use released SDK 0.4.38 for freshness comparisons. Public family verification, Apollo reference and upsell shipping-copy guidance now follow the pinned September 15 template source; older SDK evidence remains stale. Private overlays and rendered fixture bytes are preserved. Catalog refresh preserves the established select role and authored forward routes in exact known examples without overriding distinct future source contracts.",
5241
+ "compatibility": "compatible",
5242
+ "migration": "none",
5243
+ "changes": [
5244
+ {
5245
+ "class": "compatibility_policy",
5246
+ "path": "contracts/supported-surface.json",
5247
+ "surface_entry": "contracts/supported-surface.json",
5248
+ "summary": "Advance the compatible package patch to 1.37.2."
5249
+ },
5250
+ {
5251
+ "class": "package_export",
5252
+ "path": "package.json",
5253
+ "surface_entry": null,
5254
+ "summary": "Ship refreshed template evidence, SDK release policy and controlled refresh adapters that preserve established example roles and routes as package 1.37.2."
5255
+ },
5256
+ {
5257
+ "class": "generated_runtime",
5258
+ "path": "package-lock.json",
5259
+ "surface_entry": null,
5260
+ "summary": "Keep the exact lockfile package identity at 1.37.2."
5261
+ },
5262
+ {
5263
+ "class": "documentation",
5264
+ "path": "docs/orientation-contract-reference.md",
5265
+ "surface_entry": "docs/orientation-contract-reference.md",
5266
+ "summary": "Regenerate the orientation reference for surface version 1.37.2."
5267
+ },
5268
+ {
5269
+ "class": "named_surface",
5270
+ "path": "docs/runtime-readiness.md",
5271
+ "surface_entry": "docs/runtime-readiness.md",
5272
+ "summary": "Regenerate the runtime reference for package version 1.37.2."
5273
+ }
5274
+ ],
5275
+ "entry_sha256": "174e0bac2ba34b94fbb7b30257d0baf4e417440cdbcfdc5685b9f48fa565ce26"
5276
+ },
5277
+ {
5278
+ "id": "RL-0129",
5279
+ "sequence": 129,
5280
+ "date": "2026-09-19",
5281
+ "kind": "release",
5282
+ "surface_version": null,
5283
+ "changelog_section": "1.37.2+agent.1",
5284
+ "changelog_sha256": "602403245b293dc362ed28275ecfc1bc7d08e49f83be43cabdc5a91559ccd1f5",
5285
+ "agent_impact": "Install examples in README.md and docs/quickstart.md now name the published 1.37.2 release instead of 1.34.1; demo is documented as shipped in 1.37.0 and later rather than as a candidate. No command, schema, skill or export changed.",
5286
+ "compatibility": "compatible",
5287
+ "migration": "none",
5288
+ "changes": [
5289
+ {
5290
+ "class": "documentation",
5291
+ "path": "AGENTS.md",
5292
+ "surface_entry": "AGENTS.md",
5293
+ "summary": "Describe demo as shipped in 1.37.0, not a candidate."
5294
+ },
5295
+ {
5296
+ "class": "compatibility_policy",
5297
+ "path": "docs/supported-surface.md",
5298
+ "surface_entry": "docs/supported-surface.md",
5299
+ "summary": "Describe the demo CLI command as shipped in 1.37.0, not a candidate."
5300
+ },
5301
+ {
5302
+ "class": "named_surface",
5303
+ "path": "docs/activation-and-evidence.md",
5304
+ "surface_entry": "docs/activation-and-evidence.md",
5305
+ "summary": "Describe demo --target as available in 1.37.0 and later."
5306
+ },
5307
+ {
5308
+ "class": "named_surface",
5309
+ "path": "docs/demo-preview.md",
5310
+ "surface_entry": "docs/demo-preview.md",
5311
+ "summary": "Drop the 1.34.1 caveat; demo ships in 1.37.0 and later."
5312
+ }
5313
+ ],
5314
+ "entry_sha256": "7d7c4900e75bcb51f771416ce8c87e2e88111e184a5485fc6b7ac6634152241c"
5315
+ },
5316
+ {
5317
+ "id": "RL-0130",
5318
+ "sequence": 130,
5319
+ "date": "2026-09-19",
5320
+ "kind": "release",
5321
+ "surface_version": "1.37.3",
5322
+ "changelog_section": "1.37.3",
5323
+ "changelog_sha256": "4fa53214f29b66d2dfff6011aaa373455e0d44d3cb1c5021cd867b473737fd08",
5324
+ "agent_impact": "Install from 1.37.3 to get README and quick-start install examples that name the current release; demo is documented as shipped in 1.37.0 and later. Commands, schemas, skills and exports are unchanged from 1.37.2.",
5325
+ "compatibility": "compatible",
5326
+ "migration": "none",
5327
+ "changes": [
5328
+ {
5329
+ "class": "compatibility_policy",
5330
+ "path": "contracts/supported-surface.json",
5331
+ "surface_entry": "contracts/supported-surface.json",
5332
+ "summary": "Advance the compatible package patch to 1.37.3."
5333
+ },
5334
+ {
5335
+ "class": "package_export",
5336
+ "path": "package.json",
5337
+ "surface_entry": null,
5338
+ "summary": "Ship the corrected install documentation as package 1.37.3."
5339
+ },
5340
+ {
5341
+ "class": "generated_runtime",
5342
+ "path": "package-lock.json",
5343
+ "surface_entry": null,
5344
+ "summary": "Keep the exact lockfile package identity at 1.37.3."
5345
+ },
5346
+ {
5347
+ "class": "documentation",
5348
+ "path": "docs/orientation-contract-reference.md",
5349
+ "surface_entry": "docs/orientation-contract-reference.md",
5350
+ "summary": "Regenerate the orientation reference for surface version 1.37.3."
5351
+ },
5352
+ {
5353
+ "class": "named_surface",
5354
+ "path": "docs/runtime-readiness.md",
5355
+ "surface_entry": "docs/runtime-readiness.md",
5356
+ "summary": "Regenerate the runtime reference for package version 1.37.3."
5357
+ }
5358
+ ],
5359
+ "entry_sha256": "fb317fe901bbab34f0c909b523a9e4e07040285a5f6883ee572c6f927681c0b1"
5210
5360
  }
5211
5361
  ]
5212
5362
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_note": "The downstream contract manifest. Everything listed here is SUPPORTED SURFACE: consumers (campaigns-agent, campaign-builder, the private ops repo, page-kit campaign repos) may depend on it, and changing it is a deliberate act \u2014 hashed entries require a surface_version bump in the same change (check-supported-surface.mjs --base, mirroring the skills.json bump gate), named entries must keep existing at their path, cli_commands must keep resolving in the CLI dispatch, package_exports must stay exported, and every entry must ship in the npm pack (files[] coverage). Anything NOT listed here \u2014 src/** internals, scripts/** checkers, examples/**, prompts/**, contracts/** other than this file and the entries named[] below (the orientation contract, the release ledger, and the consumer-facing orientation fixtures) \u2014 is implementation: consumers may read it for context but must not build on it, and it can change without notice. Rationale and the compatibility promise: docs/supported-surface.md.",
3
- "surface_version": "1.37.1",
3
+ "surface_version": "1.37.3",
4
4
  "package_exports": [
5
5
  "./commercial-journey",
6
6
  "./commercial-parity",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "asset_pin": {
57
57
  "repo": "NextCommerceCo/campaign-cart-starter-templates",
58
- "sha": "a7cc8beaf9d332c5d8e501d36fb9d4d7e3667468",
58
+ "sha": "11352c30c596db258679fd3a552b906086b11bb9",
59
59
  "path": "src/<family>/assets/<asset>",
60
60
  "note": "asset_sha256 is the sha256 of each shipped starter asset at this commit (the commerce-surface-catalog _synced_from_sha pin; the bytes are identical across every family). A served asset whose bytes hash to the shipped value is the untouched starter asset and counts as residue even though its markup names no method; different bytes mean it was edited in place. check-template-doctrine verifies these hashes against the pinned checkout."
61
61
  },
@@ -9,7 +9,7 @@ milestones below describe evidence, not a second state machine.
9
9
  | Milestone | What it establishes | What is still needed |
10
10
  |---|---|---|
11
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. |
12
+ | Demo preview | Pinned sample pages can be opened locally for a visual walkthrough; 1.37.0 and later provide `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
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
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
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. |
@@ -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,
@@ -1,8 +1,7 @@
1
1
  # Offline sample preview
2
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.
3
+ `campaigns-os demo` ships in 1.37.0 and later; install an exact published
4
+ release at least 1.37.0 (or a reviewed full-SHA source pin).
6
5
 
7
6
  From the folder containing your exact project-local toolkit installation:
8
7
 
@@ -25,7 +25,7 @@ Ledger schema id: `campaigns-os-release-ledger/v1`
25
25
  Change policy version: `1.0.0`
26
26
  Reason-code vocabulary version: `1.0.0`
27
27
  Limits version: `1.0.0`
28
- Supported surface at generation time: `1.37.1`
28
+ Supported surface at generation time: `1.37.3`
29
29
 
30
30
  ## Forward compatibility
31
31
 
@@ -8,7 +8,7 @@
8
8
 
9
9
  How a checkout of this repository at one commit becomes a usable installed runtime, and how a consumer decides whether a prepared one is still trustworthy. Everything below is generated from `contracts/runtime-recipe.campaigns-os-node-v1.json`, which is the only authority for these values.
10
10
 
11
- Recipe kind `campaigns-os-node-v1`, revision `1.0.2`, validated by `schemas/campaigns-os-runtime-recipe.v1.schema.json` (`Campaigns OS Runtime Recipe v1`). Supported surface at generation time: `1.37.1`.
11
+ Recipe kind `campaigns-os-node-v1`, revision `1.0.2`, validated by `schemas/campaigns-os-runtime-recipe.v1.schema.json` (`Campaigns OS Runtime Recipe v1`). Supported surface at generation time: `1.37.3`.
12
12
 
13
13
  ## What this is
14
14
 
@@ -89,7 +89,7 @@ fixture. Observations preserve canonical continuation and separate Map/spec/buil
89
89
  identities; consumers must not treat history presence or scope-key matching as
90
90
  readiness or trust.
91
91
 
92
- Candidate 1.37.0 adds the `demo` CLI command, [offline sample reference](demo-preview.md),
92
+ 1.37.0 adds the `demo` CLI command, [offline sample reference](demo-preview.md),
93
93
  a hashed `demo/apollo-v0/provenance.json` and named attribution notice. The command
94
94
  exclusively creates a new target with validated inert pages. Its internal static
95
95
  files are covered by the provenance output hashes; they are not independent
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextcommerce/campaigns-os",
3
- "version": "1.37.1",
3
+ "version": "1.37.3",
4
4
  "description": "Toolkit for agent-assisted NEXT campaign builds.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {