@nextcommerce/campaigns-os 1.33.0 → 1.34.1

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 (30) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +3 -0
  3. package/compatibility.json +1 -1
  4. package/contracts/fixtures/runtime-recipe/accept/current.json +3 -5
  5. package/contracts/fixtures/runtime-recipe/accept/minimal.json +3 -5
  6. package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +3 -5
  7. package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +3 -5
  8. package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +3 -5
  9. package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +3 -5
  10. package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +3 -5
  11. package/contracts/fixtures/runtime-recipe/reject/missing-required-field.json +3 -5
  12. package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +3 -5
  13. package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +3 -5
  14. package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +3 -5
  15. package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +2 -4
  16. package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +3 -5
  17. package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +3 -5
  18. package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +3 -5
  19. package/contracts/release-ledger.json +255 -0
  20. package/contracts/runtime-recipe.campaigns-os-node-v1.json +3 -5
  21. package/contracts/supported-surface.json +5 -3
  22. package/docs/orientation-contract-reference.md +2 -1
  23. package/docs/qa-and-test-orders.md +26 -0
  24. package/docs/runtime-readiness.md +3 -3
  25. package/docs/sdk-storage-compatibility.md +19 -0
  26. package/docs/supported-surface.md +2 -1
  27. package/docs/versioning.md +1 -1
  28. package/package.json +11 -7
  29. package/src/cli.mjs +22 -2
  30. package/src/sdk-storage-compatibility.mjs +359 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,48 @@
2
2
 
3
3
  Notable supported-surface changes are recorded here.
4
4
 
5
+ ## [1.34.1+agent.1] - 2026-09-18
6
+
7
+ ### Changed
8
+
9
+ - Upgrade HTML parsing to parse5 8.0.1 and entities 8.1.0. Existing ESM
10
+ imports and the Node 20.19 minimum remain compatible; no consumer migration
11
+ or supported API change is required.
12
+
13
+ ## [1.34.1] - 2026-09-18
14
+
15
+ ### Fixed
16
+
17
+ - Playwright 1.63.0 and YAML 2.9.1 are validated with runtime recipe 1.0.2,
18
+ whose install-script expectation reflects removal of fsevents. The v1
19
+ contract retains exact agreement for additions and removals.
20
+ - CI runs independent TypeScript, unit, contract and required Chromium checks
21
+ behind the existing `check` status. Missing Chromium fails browser proof.
22
+ Installed-package checks exercise shared, conflicting and latest consumer
23
+ Playwright versions using the package-owned browser installer and launcher.
24
+ - Unit tests are discovered automatically as the codebase grows. Dependabot
25
+ groups minor/patch updates and leaves major API upgrades separate.
26
+
27
+ ## [1.34.0] - 2026-09-17
28
+
29
+ ### Added
30
+
31
+ - `campaigns-os sdk storage-check --target <git-root> --target-sdk <x.y.z>
32
+ --manifest <SDK-manifest.json> --scope <dir,file> [--exclude <dir,file>]
33
+ [--json]` checks Git-tracked campaign HTML and JavaScript before an SDK
34
+ upgrade. The SDK-owned migration manifest supplies storage keys, verified
35
+ release boundaries, and public replacements; the scanner carries no second
36
+ registry. Explicit source scope and exclusions are recorded with file hashes.
37
+ Inline scripts and local shared scripts are checked, with findings at their
38
+ original source locations. Known incompatible accesses fail the check;
39
+ unresolved code, unreadable sources, and unsupported target versions cannot
40
+ produce a clean result. No merchant source, SDK pin, or lifecycle journal is
41
+ written. The report identifies manifest bytes and available Git provenance.
42
+ - The new `sdk` CLI command and its reference are supported surface. This is
43
+ source compatibility evidence only: order, browser, and analytics behavior
44
+ still need their own proof. Supply the SDK manifest explicitly; the pending
45
+ SDK contract change does not imply an existing released tag contains it.
46
+
5
47
  ## [1.33.0+agent.5] - 2026-09-17
6
48
 
7
49
  ### Changed
package/README.md CHANGED
@@ -211,6 +211,8 @@ design markup separate from SDK-owned commerce controls.
211
211
 
212
212
  ## Important Commands
213
213
 
214
+ Before an SDK bump, scan explicitly scoped tracked merchant HTML/JS with [SDK storage compatibility](docs/sdk-storage-compatibility.md). The SDK-generated manifest is supplied separately; a clean result covers static source compatibility only.
215
+
214
216
  ```bash
215
217
  npm run campaigns-os -- tooling status
216
218
  npm run campaigns-os -- install-skills --dry-run
@@ -219,6 +221,7 @@ npm run campaigns-os -- qa install-browser
219
221
  npm run skills -- status
220
222
  npm run campaigns-os -- prepare-build --spec <spec.json> --source <html-dir> --target <page-kit-repo> --template-family <family> --brief <campaign-build-brief.yaml>
221
223
  npm run campaigns-os -- doctor --packet <page-kit-repo>/campaign-runtime.build.json
224
+ npm run campaigns-os -- sdk storage-check --target <campaign-git-root> --target-sdk 0.4.38 --manifest <sdk-storage-manifest.json> --scope <campaign,shared> --json
222
225
  npm run campaigns-os -- standardize --target <page-kit-repo-or-cpk-repo> --json
223
226
  npm run campaigns-os -- theme inspect --packet <page-kit-repo>/campaign-runtime.build.json --json
224
227
  npm run campaigns-os -- theme generate --packet <page-kit-repo>/campaign-runtime.build.json --json
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@nextcommerce/campaigns-os",
3
- "version": "1.33.0",
3
+ "version": "1.34.0",
4
4
  "status": "developer-preview",
5
5
  "contracts": {
6
6
  "campaign_spec": "4.2-4.3",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": "campaigns-os-runtime-recipe/v1",
3
3
  "recipe_kind": "campaigns-os-node-v1",
4
- "recipe_revision": "1.0.1",
4
+ "recipe_revision": "1.0.2",
5
5
  "refusal_reason_code": "runtime_recipe_refused",
6
6
  "fail_closed": true,
7
7
  "unperformable_check_disposition": "failed",
@@ -79,7 +79,7 @@
79
79
  "stdin": "closed",
80
80
  "lifecycle_scripts": "disabled",
81
81
  "timeout_bound": "install_seconds",
82
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
82
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
83
83
  },
84
84
  {
85
85
  "id": "build",
@@ -281,9 +281,7 @@
281
281
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
282
282
  "prepare": "npm run build:spec"
283
283
  },
284
- "install_script_dependencies": [
285
- "fsevents"
286
- ]
284
+ "install_script_dependencies": []
287
285
  },
288
286
  "capabilities": {
289
287
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": false,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -82,7 +82,7 @@
82
82
  "stdin": "closed",
83
83
  "lifecycle_scripts": "disabled",
84
84
  "timeout_bound": "install_seconds",
85
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
85
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
86
86
  },
87
87
  {
88
88
  "id": "build",
@@ -284,9 +284,7 @@
284
284
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
285
285
  "prepare": "npm run build:spec"
286
286
  },
287
- "install_script_dependencies": [
288
- "fsevents"
289
- ]
287
+ "install_script_dependencies": []
290
288
  },
291
289
  "capabilities": {
292
290
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -238,9 +238,7 @@
238
238
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
239
239
  "prepare": "npm run build:spec"
240
240
  },
241
- "install_script_dependencies": [
242
- "fsevents"
243
- ]
241
+ "install_script_dependencies": []
244
242
  },
245
243
  "capabilities": {
246
244
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v2",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -297,9 +297,7 @@
297
297
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
298
298
  "prepare": "npm run build:spec"
299
299
  },
300
- "install_script_dependencies": [
301
- "fsevents"
302
- ]
300
+ "install_script_dependencies": []
303
301
  },
304
302
  "capabilities": {
305
303
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "skipped",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",
@@ -3,7 +3,7 @@
3
3
  "_growth_note": "When a bound below is genuinely reached, the answer is to find out why before raising it. A dependency install that exceeds its bound on a warm machine is a supply-chain change, not a slow morning; an output inventory that exceeds its file or byte bound is a build that went wrong, not a package that grew 50x overnight. Raising a bound is the fallback, it advances recipe_revision, and it owes a release-ledger entry. Widening the accepted npm range follows the same path, and its trigger is external and checkable: widen when a Node release line ships that npm major by default, not when a particular machine happens to have it installed.",
4
4
  "schema": "campaigns-os-runtime-recipe/v1",
5
5
  "recipe_kind": "campaigns-os-node-v1",
6
- "recipe_revision": "1.0.1",
6
+ "recipe_revision": "1.0.2",
7
7
  "refusal_reason_code": "runtime_recipe_refused",
8
8
  "fail_closed": true,
9
9
  "unperformable_check_disposition": "failed",
@@ -84,7 +84,7 @@
84
84
  "stdin": "closed",
85
85
  "lifecycle_scripts": "disabled",
86
86
  "timeout_bound": "install_seconds",
87
- "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. Exactly one dependency in the resolved tree declares an install script, and it ships a prebuilt binary in its published tarball, so nothing in the tree needs its scripts to function. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
87
+ "rationale": "ci rather than install, so the lockfile is authoritative and the tree is reproducible. --ignore-scripts is the load-bearing flag: it suppresses every dependency lifecycle script and the target's own prepare. No dependency in the resolved tree declares an install script. The exact list in target_expectations remains a reviewed expectation: additions and removals require a recipe revision, so existing v1 consumers retain the same agreement semantics. --no-audit and --fund=false remove two network- and output-side effects that are not part of preparing a runtime."
88
88
  },
89
89
  {
90
90
  "id": "build",
@@ -286,9 +286,7 @@
286
286
  "build:spec": "tsc -p campaign-spec/tsconfig.build.json",
287
287
  "prepare": "npm run build:spec"
288
288
  },
289
- "install_script_dependencies": [
290
- "fsevents"
291
- ]
289
+ "install_script_dependencies": []
292
290
  },
293
291
  "capabilities": {
294
292
  "_note": "What a generation prepared by this recipe can and cannot do. Stated explicitly because 'runtime ready' invites the wrong reading: the same flag that makes the install safe also means the prepared generation has no browser to drive. Preparing a runtime and being able to run browser QA are different readiness questions, and this recipe answers only the first.",