@nextcommerce/campaigns-os 1.46.0 → 1.47.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 (35) hide show
  1. package/CHANGELOG.md +153 -3
  2. package/README.md +1 -1
  3. package/compatibility.json +1 -1
  4. package/contracts/commerce-surface-catalog.json +1204 -129
  5. package/contracts/effects.v1.json +3 -3
  6. package/contracts/release-ledger.json +338 -0
  7. package/contracts/supported-surface.json +2 -2
  8. package/contracts/template-brand-contract.shared-commerce.v0.json +3 -3
  9. package/docs/build-packet.md +22 -2
  10. package/docs/local-setup.md +7 -4
  11. package/docs/orientation-contract-reference.md +1 -1
  12. package/docs/qa-and-test-orders.md +19 -1
  13. package/docs/runtime-readiness.md +1 -1
  14. package/docs/sdk-storage-compatibility.md +1 -1
  15. package/docs/skills-revision.md +10 -10
  16. package/package.json +1 -1
  17. package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
  18. package/skills/campaign-readback-classification/SKILL.md +3 -3
  19. package/skills/campaign-run-evidence/SKILL.md +3 -3
  20. package/skills/contribution-intake/SKILL.md +3 -3
  21. package/skills/next-campaigns-build/SKILL.md +4 -4
  22. package/skills/next-campaigns-os/SKILL.md +3 -3
  23. package/skills/next-campaigns-os-setup/SKILL.md +3 -3
  24. package/skills/next-campaigns-polish/SKILL.md +3 -3
  25. package/skills/next-campaigns-qa/SKILL.md +4 -4
  26. package/skills.json +10 -10
  27. package/src/built-script-syntax.mjs +116 -15
  28. package/src/diagnostic.mjs +2 -1
  29. package/src/doctor/checks.mjs +0 -1
  30. package/src/qa-analytics-parity.mjs +37 -2
  31. package/src/qa-binding-evidence.mjs +4 -2
  32. package/src/qa-browser.mjs +74 -12
  33. package/src/sdk-markup.mjs +6 -45
  34. package/src/sdk-storage-compatibility.mjs +3 -2
  35. package/src/tooling-setup.mjs +9 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,154 @@
2
2
 
3
3
  Notable supported-surface changes are recorded here.
4
4
 
5
+ ## [1.47.0] - 2026-10-01
6
+
7
+ ### Changed
8
+
9
+ - `contracts/effects.v1.json`: the `--force` notes on `start`,
10
+ `prepare-build` and `build` now say that `--force` also regenerates a stale
11
+ Design Source Package that the intake synthesized itself (#506). That holds
12
+ when the previous Assembly Report records origin `"synthesized"` and the
13
+ package bytes still match it. An adopted or hand-edited package is never
14
+ replaced. The declared writes already covered this path, so behaviour is
15
+ unchanged; only the notes were incomplete.
16
+ - `compatibility.json` names the package version again. It still said 1.34.0
17
+ (#486). A unit test now fails when it differs from `package.json`.
18
+ - Bundled skills carry revision `1.47.0+skills.1`, with each skill version
19
+ advanced one patch, and the local setup install command pins the 1.47.0
20
+ package. The skill text is unchanged.
21
+
22
+ ## [1.46.0+agent.11] - 2026-10-01
23
+
24
+ ### Changed
25
+
26
+ - `doctor`'s `built_output.script_syntax` gate groups missing-script warnings
27
+ by the URL the browser resolves, not the raw src. Two spellings of one URL,
28
+ such as `check	out.js` and `checkout.js`, now give one
29
+ `built_output.script_syntax.missing_script` warning instead of two. One src
30
+ that names different files on pages in different folders still gives one
31
+ warning per file.
32
+ - A `<script>` the page ends inside, with no `</script>`, is no longer parsed
33
+ by doctor or QA: the browser never runs a script element whose end tag never
34
+ arrives, so it can no longer block either. Doctor warns about it under the
35
+ new `built_output.script_syntax.unclosed_script` code, one warning per page,
36
+ because the page output is probably truncated.
37
+ - A script symlink under `_site` is read by following the link only while its
38
+ real path stays inside the site root. A link whose target is outside the
39
+ site root is not read. Doctor warns under the new
40
+ `built_output.script_syntax.symlink_outside_site` code, naming the link, and
41
+ does not block. The gate lists such links in `scripts_outside_site[]`. The
42
+ rule is recorded in `docs/build-packet.md`.
43
+
44
+ ## [1.46.0+agent.10] - 2026-10-01
45
+
46
+ ### Fixed
47
+
48
+ - `qa run --test-order` now follows a redirected order upsell mutation. When
49
+ the accept's POST to the order-upsells URL answered 307 or 308, the step
50
+ took the redirect hop as the mutation's response and judged the upsell
51
+ without the order body. It now waits for the redirect chain's final
52
+ response and judges from that body. A late body is matched to the step by
53
+ the request that started its redirect chain, so every hop of one redirected
54
+ POST counts as the step's request and a body from another request still
55
+ never does. A redirect whose chain has no final response is reported as no
56
+ mutation response, not as answered.
57
+
58
+ ## [1.46.0+agent.9] - 2026-10-01
59
+
60
+ ### Fixed
61
+
62
+ - `qa run` analytics parity no longer blocks on `purchase-present` when the
63
+ operator did not pass `--analytics-candidate`. The automatic candidate (the
64
+ campaign root, or the first built entry) is not a receipt page, so a Purchase
65
+ cannot fire there. When that candidate fires no Purchase, `purchase-present`
66
+ is now `MANUAL_REVIEW`/`WARN`, and `evidence.page_mismatch` gives the reason
67
+ (`receipt_baseline_non_receipt_candidate` or `candidate_not_receipt`), the
68
+ candidate's source and its page type. An explicit `--analytics-candidate`,
69
+ or a built entry whose topology page type is a receipt, still blocks on a
70
+ missing Purchase. To compare Purchase, pass the candidate receipt with
71
+ `--analytics-candidate`.
72
+
73
+ ## [1.46.0+agent.8] - 2026-10-01
74
+
75
+ ### Fixed
76
+
77
+ - The local setup command in `docs/local-setup.md` installed both the toolkit
78
+ and `next-campaign-page-kit` with `--save-dev`. In an existing page-kit
79
+ project that moved page-kit from `dependencies` to `devDependencies`, so
80
+ builds that run `npm ci --omit=dev` or set `NODE_ENV=production` no longer
81
+ installed it. The command now installs page-kit with `--save-exact` only and
82
+ the toolkit with `--save-dev --save-exact`, so a project that declares
83
+ page-kit under `dependencies` keeps it there. The README and quickstart
84
+ page-kit installs also pin exactly.
85
+ - `tooling setup` now warns when the project declares page-kit only in
86
+ `devDependencies`, and prints the command that moves it back. The warning
87
+ appears in the text output and in a new `warnings` array in the `--json`
88
+ result; setup still proceeds.
89
+
90
+ ## [1.46.0+agent.7] - 2026-10-01
91
+
92
+ ### Changed
93
+
94
+ - The vendored starter-template catalog is re-synced to
95
+ campaign-cart-starter-templates `3793b1d` (was `11352c3`). That brings in the
96
+ runtime-gated payment logos, the composable upsell pages, the `is_upsell`
97
+ opt-out on every bump include, and template verification evidence for
98
+ Campaign Cart SDK 0.4.40. Family certification freshness now reads 0.4.40 as
99
+ the verified SDK. The SDK support policy (minimum and preferred versions) is
100
+ unchanged.
101
+ - `fixtures/certified-families` is regenerated at the new pin, and the shared
102
+ commerce brand contract's payment-chrome `asset_pin` moves with it. The
103
+ shipped asset bytes are unchanged. The payment-chrome repair text now says
104
+ to set `payment_flags.show_<method>: false` in the page frontmatter when a
105
+ logo from the starter `payment-logos.html` row is flagged, instead of
106
+ deleting markup. `upsell-payment-logos.svg` stays listed because the
107
+ starter still renders it ungated under `payment_flags.style: flat` and on
108
+ one select page.
109
+
110
+ ## [1.46.0+agent.6] - 2026-10-01
111
+
112
+ ### Fixed
113
+
114
+ - `sdk storage-check` accepts a Campaign Cart release manifest whose SDK
115
+ version is above its supported range. Released manifests stamp their own
116
+ release version but declare an earlier supported range (v0.4.40 declares
117
+ 0.4.38 only), and the check refused every one of them with "Manifest
118
+ source SDK version must equal supported maximum". The target SDK is still
119
+ judged against the declared range, so a target outside it reports unknown
120
+ (`target-outside-manifest-range`). A manifest whose SDK version is below its
121
+ supported maximum is still refused, because it cannot vouch for later
122
+ releases. The report keeps recording the manifest's SDK version and range
123
+ separately.
124
+
125
+ ## [1.46.0+agent.5] - 2026-10-01
126
+
127
+ ### Removed
128
+
129
+ - `doctor` no longer warns with `built_output.sdk_markup.checkout_bump_is_upsell`
130
+ (added in `1.45.0+agent.5`). When a shopper selects an order bump on a
131
+ checkout page, it is added as a line item on the checkout order. With
132
+ `data-next-is-upsell="true"` that line is tagged as an upsell, so platform
133
+ order reports show upsell items apart from the core items. That tagging is
134
+ the intended default. The warning fired on every canonical starter checkout
135
+ with a bump and told the user to remove the attribute, which would report
136
+ the bump as a core item. Leave the attribute in place. A campaign that
137
+ should not tag a bump as an upsell opts out by passing `is_upsell: false` to
138
+ the bump include. Doctor reports no finding for the attribute either way.
139
+
140
+ ## [1.46.0+agent.4] - 2026-10-01
141
+
142
+ ### Changed
143
+
144
+ - The `next-campaigns-qa` and `next-campaigns-build` skills now say which
145
+ checkout controls count as bound for `browser-commerce-structure`: a
146
+ required field bound only on a `type="hidden"` input, a disabled control, a
147
+ read-only input or read-only textarea, or a control with
148
+ `aria-disabled="true"` does not count, and QA reports it in `fields_bound.missing`. This is the rule QA
149
+ has applied since #540; the skills had not stated it. Bundled skills carry
150
+ revision `1.46.0+skills.2`, with each skill version advanced one patch. No
151
+ change to the CLI.
152
+
5
153
  ## [1.46.0+agent.3] - 2026-09-30
6
154
 
7
155
  ### Changed
@@ -135,9 +283,11 @@ Notable supported-surface changes are recorded here.
135
283
  downsell and receipt pages, and bumps without the flag, get no warning. The
136
284
  flag comes from the bump include's markup, and several starter bump includes
137
285
  write it unconditionally, so a canonical starter checkout with a bump shows
138
- this warning. To clear it, remove `data-next-is-upsell="true"` from the bump
139
- include in the campaign, unless the line really should be billed as an
140
- upsell. It is a warning, not a blocker.
286
+ this warning. It was a warning, not a blocker. Its advice to remove
287
+ `data-next-is-upsell="true"` was wrong: tagging a checkout bump line as an
288
+ upsell is the intended default, so order reports show upsell items apart
289
+ from core items, and removing the attribute would report the bump as a core
290
+ item. The warning is retired in `1.46.0+agent.5`.
141
291
 
142
292
  ### Fixed
143
293
 
package/README.md CHANGED
@@ -45,7 +45,7 @@ steps, in this order:
45
45
 
46
46
  ```bash
47
47
  mkdir "<route>" && cd "<route>"
48
- npm init -y && npm i next-campaign-page-kit
48
+ npm init -y && npm i --save-exact next-campaign-page-kit
49
49
  npx campaign-init --non-interactive --template <family> --slug "<route>" --name "<campaign name>"
50
50
  npm install --save-dev --save-exact @nextcommerce/campaigns-os@<version>
51
51
  npx --no-install campaigns-os tooling status --platform claude
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@nextcommerce/campaigns-os",
3
- "version": "1.34.0",
3
+ "version": "1.47.0",
4
4
  "status": "developer-preview",
5
5
  "contracts": {
6
6
  "campaign_spec": "4.2-4.3",