@nextcommerce/campaigns-os 1.47.0 → 1.48.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 (44) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +30 -3
  3. package/agents/claude/CLAUDE.md +2 -0
  4. package/agents/codex/AGENTS.md +1 -0
  5. package/agents/copilot/copilot-instructions.md +1 -0
  6. package/agents/cursor/campaigns-os.mdc +1 -1
  7. package/compatibility.json +1 -1
  8. package/contracts/commerce-surface-catalog.json +17 -17
  9. package/contracts/release-ledger.json +465 -0
  10. package/contracts/supported-surface.json +1 -1
  11. package/contracts/template-brand-contract.shared-commerce.v0.json +1 -1
  12. package/docs/build-packet.md +1 -1
  13. package/docs/campaign-build-brief.md +25 -28
  14. package/docs/local-setup.md +7 -2
  15. package/docs/orientation-contract-reference.md +1 -1
  16. package/docs/qa-and-test-orders.md +49 -2
  17. package/docs/runtime-readiness.md +1 -1
  18. package/docs/skills-revision.md +10 -10
  19. package/package.json +1 -1
  20. package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
  21. package/skills/campaign-readback-classification/SKILL.md +3 -3
  22. package/skills/campaign-run-evidence/SKILL.md +9 -4
  23. package/skills/contribution-intake/SKILL.md +3 -3
  24. package/skills/next-campaigns-build/SKILL.md +4 -3
  25. package/skills/next-campaigns-os/SKILL.md +3 -3
  26. package/skills/next-campaigns-os-setup/SKILL.md +3 -3
  27. package/skills/next-campaigns-polish/SKILL.md +4 -4
  28. package/skills/next-campaigns-qa/SKILL.md +3 -3
  29. package/skills.json +10 -10
  30. package/src/cli.mjs +6 -3
  31. package/src/content-residue.mjs +18 -90
  32. package/src/doctor/checks.mjs +21 -29
  33. package/src/doctor/inspect.mjs +13 -3
  34. package/src/doctor/next-step.mjs +4 -0
  35. package/src/gate-actions.mjs +8 -0
  36. package/src/local-preview-policy.mjs +92 -0
  37. package/src/page-kit-sdk-version.mjs +8 -1
  38. package/src/polish-node.mjs +26 -2
  39. package/src/progress-node.mjs +5 -1
  40. package/src/qa-binding-evidence.mjs +1 -1
  41. package/src/qa-browser.mjs +62 -13
  42. package/src/qa-node.mjs +33 -4
  43. package/src/readback.mjs +19 -10
  44. package/src/source-prep.mjs +1 -1
@@ -4166,6 +4166,471 @@
4166
4166
  }
4167
4167
  ],
4168
4168
  "entry_sha256": "cc03e502869034a55209958ac02cce0c2b637b12e3e678646c93cfc7aa3a4eeb"
4169
+ },
4170
+ {
4171
+ "id": "RL-0199",
4172
+ "sequence": 191,
4173
+ "date": "2026-10-01",
4174
+ "kind": "release",
4175
+ "surface_version": null,
4176
+ "changelog_section": "1.47.0+agent.1",
4177
+ "changelog_sha256": "f0ba2dff1852537f82cac078ccc8b74d78c433476ed72be8814ff3aa4271cc1f",
4178
+ "agent_impact": "Start a new campaign folder with npm init -y: the documented one-line setup command now creates the folder's own package.json first, so npm cannot install page-kit and the toolkit into a parent project.",
4179
+ "compatibility": "compatible",
4180
+ "migration": "none",
4181
+ "changes": [
4182
+ {
4183
+ "class": "named_surface",
4184
+ "path": "docs/local-setup.md",
4185
+ "surface_entry": "docs/local-setup.md",
4186
+ "summary": "Prefix the copy-paste setup command with npm init -y and say why: without a package.json npm installs into the nearest parent folder that has one or a node_modules."
4187
+ }
4188
+ ],
4189
+ "entry_sha256": "d2b022241969d22dbe4e5865f24f34d1a7883e000b62218bbe3f82c0d958b24d"
4190
+ },
4191
+ {
4192
+ "id": "RL-0204",
4193
+ "sequence": 192,
4194
+ "date": "2026-10-01",
4195
+ "kind": "release",
4196
+ "surface_version": null,
4197
+ "changelog_section": "1.47.0+agent.6",
4198
+ "changelog_sha256": "ce5b04b70f31282319d2974ffaeb6352ecb96e89c136e72c7f6f8a32332afab4",
4199
+ "agent_impact": "Help for start, prepare-build and build now lists --deploy-target, --preview-url and --production-url, which intake already accepted; a Start page or docs command using them matches --help.",
4200
+ "compatibility": "compatible",
4201
+ "migration": "none",
4202
+ "changes": [
4203
+ {
4204
+ "class": "cli_surface",
4205
+ "path": "src/cli.mjs",
4206
+ "surface_entry": "start",
4207
+ "summary": "List --deploy-target, --preview-url and --production-url on the start, prepare-build and build usage lines; intake already writes them to the Build Packet deploy block."
4208
+ }
4209
+ ],
4210
+ "entry_sha256": "bbf5c759e5518a3025a0e5f6db6b732e8960721ce45bb4be3821cb58096319e8"
4211
+ },
4212
+ {
4213
+ "id": "RL-0200",
4214
+ "sequence": 193,
4215
+ "date": "2026-10-01",
4216
+ "kind": "release",
4217
+ "surface_version": null,
4218
+ "changelog_section": "1.47.0+agent.7",
4219
+ "changelog_sha256": "b97164cb0efb6b87ee04d95e28679d731173b0998b2f92ddf308e333127ff8e3",
4220
+ "agent_impact": "doctor no longer emits content_residue.anti_pattern or content_residue.urgency_unattested: do not wait for, or act on, a review of the merchant's proof and urgency copy. Reproduce the source design's own reviews, labels, popups, stock counters and countdowns as designed. Bundled skills carry revision 1.47.0+skills.2: an agent that loaded 1.47.0+skills.1 should start a fresh session.",
4221
+ "compatibility": "compatible",
4222
+ "migration": "none",
4223
+ "changes": [
4224
+ {
4225
+ "class": "named_surface",
4226
+ "path": "docs/campaign-build-brief.md",
4227
+ "surface_entry": "docs/campaign-build-brief.md",
4228
+ "summary": "Replace the content-claims section: the merchant's own proof and urgency content is not reviewed and is reproduced as designed; list the content checks that remain."
4229
+ },
4230
+ {
4231
+ "class": "named_surface",
4232
+ "path": "docs/skills-revision.md",
4233
+ "surface_entry": "docs/skills-revision.md",
4234
+ "summary": "Use the current 1.47.0+skills.2 bundle in executable examples."
4235
+ },
4236
+ {
4237
+ "class": "skill",
4238
+ "path": "skills.json",
4239
+ "surface_entry": "skills.json",
4240
+ "summary": "Advance the bundled skill revision to 1.47.0+skills.2 and each skill version one patch."
4241
+ },
4242
+ {
4243
+ "class": "skill",
4244
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
4245
+ "surface_entry": null,
4246
+ "summary": "Publish the 1.47.0+skills.2 bundle revision."
4247
+ },
4248
+ {
4249
+ "class": "skill",
4250
+ "path": "skills/campaign-readback-classification/SKILL.md",
4251
+ "surface_entry": null,
4252
+ "summary": "Publish the 1.47.0+skills.2 bundle revision."
4253
+ },
4254
+ {
4255
+ "class": "skill",
4256
+ "path": "skills/campaign-run-evidence/SKILL.md",
4257
+ "surface_entry": null,
4258
+ "summary": "Publish the 1.47.0+skills.2 bundle revision."
4259
+ },
4260
+ {
4261
+ "class": "skill",
4262
+ "path": "skills/contribution-intake/SKILL.md",
4263
+ "surface_entry": null,
4264
+ "summary": "Publish the 1.47.0+skills.2 bundle revision."
4265
+ },
4266
+ {
4267
+ "class": "skill",
4268
+ "path": "skills/next-campaigns-build/SKILL.md",
4269
+ "surface_entry": null,
4270
+ "summary": "Say to reproduce the source design's own proof and urgency elements as designed; publish the 1.47.0+skills.2 bundle revision."
4271
+ },
4272
+ {
4273
+ "class": "skill",
4274
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
4275
+ "surface_entry": null,
4276
+ "summary": "Publish the 1.47.0+skills.2 bundle revision."
4277
+ },
4278
+ {
4279
+ "class": "skill",
4280
+ "path": "skills/next-campaigns-os/SKILL.md",
4281
+ "surface_entry": null,
4282
+ "summary": "Publish the 1.47.0+skills.2 bundle revision."
4283
+ },
4284
+ {
4285
+ "class": "skill",
4286
+ "path": "skills/next-campaigns-polish/SKILL.md",
4287
+ "surface_entry": null,
4288
+ "summary": "Say that proof and urgency copy the source supplies is not residue and is not recorded as an issue; publish the 1.47.0+skills.2 bundle revision."
4289
+ },
4290
+ {
4291
+ "class": "skill",
4292
+ "path": "skills/next-campaigns-qa/SKILL.md",
4293
+ "surface_entry": null,
4294
+ "summary": "Publish the 1.47.0+skills.2 bundle revision."
4295
+ },
4296
+ {
4297
+ "class": "cli_surface",
4298
+ "path": "src/doctor/checks.mjs",
4299
+ "surface_entry": "doctor",
4300
+ "summary": "Stop emitting content_residue.anti_pattern and content_residue.urgency_unattested; the merchant's proof and urgency copy is no longer scanned."
4301
+ }
4302
+ ],
4303
+ "entry_sha256": "396746eab5577268a1eef6e76fa3cffeb989da503c7bb898bf3c80d56d31164b"
4304
+ },
4305
+ {
4306
+ "id": "RL-0201",
4307
+ "sequence": 194,
4308
+ "date": "2026-10-01",
4309
+ "kind": "release",
4310
+ "surface_version": null,
4311
+ "changelog_section": "1.47.0+agent.8",
4312
+ "changelog_sha256": "5dca52cee13425480a82fc46b88aead96c6eb8a293519d11a502a247455538aa",
4313
+ "agent_impact": "A skipped pricing.checkout_price_visible row whose actual names an empty cart and no package selection is expected on a checkout filled from the landing page; do not remove forcePackageId links or add a selector to make it pass. Page-binding evidence on starter-template pages now reads dynamic_unresolved instead of script_unavailable_or_limit.",
4314
+ "compatibility": "compatible",
4315
+ "migration": "none",
4316
+ "changes": [
4317
+ {
4318
+ "class": "named_surface",
4319
+ "path": "docs/qa-and-test-orders.md",
4320
+ "surface_entry": "docs/qa-and-test-orders.md",
4321
+ "summary": "Say when pricing.checkout_price_visible is skipped (empty cart, no package selection on the checkout) and name the Campaign Cart loader paths the page-binding reader skips, including dist/loader.js."
4322
+ }
4323
+ ],
4324
+ "entry_sha256": "4352e041bcffb1cc329abba198d11523a45b94d37572831a1679c20618d2e78c"
4325
+ },
4326
+ {
4327
+ "id": "RL-0202",
4328
+ "sequence": 195,
4329
+ "date": "2026-10-01",
4330
+ "kind": "release",
4331
+ "surface_version": null,
4332
+ "changelog_section": "1.47.0+agent.9",
4333
+ "changelog_sha256": "5d93e171ffd6b8ffeb1ffc8973cc9b23d1e38042c8223ed5f1c5d650f5fe2ffc",
4334
+ "agent_impact": "When resuming a campaign, run readback and next before reading artifacts by hand. Read typed-card proof from the committed sidecar's browser-test-order:<path> assertions; its test_orders array is always empty. readback now prints warn and manual_review rows as such. Bundled skills carry revision 1.47.0+skills.3: an agent that loaded an earlier 1.47.0 revision should start a fresh session.",
4335
+ "compatibility": "compatible",
4336
+ "migration": "none",
4337
+ "changes": [
4338
+ {
4339
+ "class": "documentation",
4340
+ "path": "agents/claude/CLAUDE.md",
4341
+ "surface_entry": "agents/claude/CLAUDE.md",
4342
+ "summary": "Tell a resuming session to run readback and next first, and that the committed QA sidecar's browser-test-order assertions are the typed-card proof."
4343
+ },
4344
+ {
4345
+ "class": "documentation",
4346
+ "path": "agents/codex/AGENTS.md",
4347
+ "surface_entry": "agents/codex/AGENTS.md",
4348
+ "summary": "Tell a resuming session to run readback and next first, and that the committed QA sidecar's browser-test-order assertions are the typed-card proof."
4349
+ },
4350
+ {
4351
+ "class": "documentation",
4352
+ "path": "agents/copilot/copilot-instructions.md",
4353
+ "surface_entry": "agents/copilot/copilot-instructions.md",
4354
+ "summary": "Tell a resuming session to run readback and next first, and that the committed QA sidecar's browser-test-order assertions are the typed-card proof."
4355
+ },
4356
+ {
4357
+ "class": "documentation",
4358
+ "path": "agents/cursor/campaigns-os.mdc",
4359
+ "surface_entry": "agents/cursor/campaigns-os.mdc",
4360
+ "summary": "Tell a resuming session to run readback and next first, and that the committed QA sidecar's browser-test-order assertions are the typed-card proof."
4361
+ },
4362
+ {
4363
+ "class": "named_surface",
4364
+ "path": "docs/skills-revision.md",
4365
+ "surface_entry": "docs/skills-revision.md",
4366
+ "summary": "Use the current 1.47.0+skills.3 bundle in executable examples."
4367
+ },
4368
+ {
4369
+ "class": "skill",
4370
+ "path": "skills.json",
4371
+ "surface_entry": "skills.json",
4372
+ "summary": "Advance the bundled skill revision to 1.47.0+skills.3 and each skill version two patches."
4373
+ },
4374
+ {
4375
+ "class": "skill",
4376
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
4377
+ "surface_entry": null,
4378
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4379
+ },
4380
+ {
4381
+ "class": "skill",
4382
+ "path": "skills/campaign-readback-classification/SKILL.md",
4383
+ "surface_entry": null,
4384
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4385
+ },
4386
+ {
4387
+ "class": "skill",
4388
+ "path": "skills/campaign-run-evidence/SKILL.md",
4389
+ "surface_entry": null,
4390
+ "summary": "Say the committed QA sidecar always empties test_orders and URL fields, and that its browser-test-order assertions carry the typed-card proof; publish the 1.47.0+skills.3 bundle revision."
4391
+ },
4392
+ {
4393
+ "class": "skill",
4394
+ "path": "skills/contribution-intake/SKILL.md",
4395
+ "surface_entry": null,
4396
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4397
+ },
4398
+ {
4399
+ "class": "skill",
4400
+ "path": "skills/next-campaigns-build/SKILL.md",
4401
+ "surface_entry": null,
4402
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4403
+ },
4404
+ {
4405
+ "class": "skill",
4406
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
4407
+ "surface_entry": null,
4408
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4409
+ },
4410
+ {
4411
+ "class": "skill",
4412
+ "path": "skills/next-campaigns-os/SKILL.md",
4413
+ "surface_entry": null,
4414
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4415
+ },
4416
+ {
4417
+ "class": "skill",
4418
+ "path": "skills/next-campaigns-polish/SKILL.md",
4419
+ "surface_entry": null,
4420
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4421
+ },
4422
+ {
4423
+ "class": "skill",
4424
+ "path": "skills/next-campaigns-qa/SKILL.md",
4425
+ "surface_entry": null,
4426
+ "summary": "Publish the 1.47.0+skills.3 bundle revision."
4427
+ }
4428
+ ],
4429
+ "entry_sha256": "4780bf77ca1a5ec8bc8728318237eeeff1e88c81a31fcaece6e1a6b4fc6b6d7b"
4430
+ },
4431
+ {
4432
+ "id": "RL-0203",
4433
+ "sequence": 196,
4434
+ "date": "2026-10-01",
4435
+ "kind": "release",
4436
+ "surface_version": null,
4437
+ "changelog_section": "1.47.0+agent.10",
4438
+ "changelog_sha256": "b4bbba3f0ec3aacfe704b5f4690b867ea62d50aa9e41eb911c997bec20872d89",
4439
+ "agent_impact": "A browser-test-order row that says order create rejected: HTTP 400: Duplicate order detected … (duplicate_order …) means the platform refused a repeat order from the same test customer: re-run with a different --test-email-prefix or wait, and do not change the address or the funnel to get past it.",
4440
+ "compatibility": "compatible",
4441
+ "migration": "none",
4442
+ "changes": [
4443
+ {
4444
+ "class": "named_surface",
4445
+ "path": "docs/qa-and-test-orders.md",
4446
+ "surface_entry": "docs/qa-and-test-orders.md",
4447
+ "summary": "Explain the platform's duplicate-order refusal for a reused test customer, how QA names it, and the remedy."
4448
+ }
4449
+ ],
4450
+ "entry_sha256": "22e451d62b473dab8907cfd897028f5add642614c10476fc2138b81657ac23d9"
4451
+ },
4452
+ {
4453
+ "id": "RL-0206",
4454
+ "sequence": 197,
4455
+ "date": "2026-10-01",
4456
+ "kind": "release",
4457
+ "surface_version": null,
4458
+ "changelog_section": "1.47.0+agent.11",
4459
+ "changelog_sha256": "f7a8e2aa340f1dbffcaffe18db69556b5fb1b42a1834fa2749231b99497431ac",
4460
+ "agent_impact": "Pin global_config.sdk_version to the SDK doctor names for the selected template family when the spec has none. To record a standalone page whole, use --wrapper-policy preserve_document_wrappers. A source_hash drift warning is cleared only by re-running intake with --force, not by editing the manifest; make post-build revisions under src/<route>/.",
4461
+ "compatibility": "compatible",
4462
+ "migration": "none",
4463
+ "changes": [
4464
+ {
4465
+ "class": "named_surface",
4466
+ "path": "docs/build-packet.md",
4467
+ "surface_entry": "docs/build-packet.md",
4468
+ "summary": "Say the source_hash drift warning compares the packet's recorded hash, that intake with --force refreshes it, and where post-build revisions belong."
4469
+ },
4470
+ {
4471
+ "class": "cli_surface",
4472
+ "path": "src/doctor/checks.mjs",
4473
+ "surface_entry": "doctor",
4474
+ "summary": "Name the selected family's verified SDK in page_kit.sdk_version.spec_missing, and name the packet hash and intake refresh in source_html.pages.source_hash."
4475
+ }
4476
+ ],
4477
+ "entry_sha256": "9eafe4976eaef63b7b684dcfed146deb010a92482da4f4e83cf04c1322b87073"
4478
+ },
4479
+ {
4480
+ "id": "RL-0205",
4481
+ "sequence": 198,
4482
+ "date": "2026-10-01",
4483
+ "kind": "release",
4484
+ "surface_version": null,
4485
+ "changelog_section": "1.47.0+agent.12",
4486
+ "changelog_sha256": "2569d0ed5531ce2fbc5732e64038f4e6fd793eecdf136455c61f21f00331b164",
4487
+ "agent_impact": "On a local-serve packet served from loopback, a gate with status carried_forward is missing evidence that does not block: follow next past polish to deploy and QA, and expect warn rows and at best ready_with_exceptions. Do not waive or hand-author polish evidence to get there. Hosted and production packets keep the strict gates. polish.hidden_eager_media.no_capturable_routes replaces capture_malformed for an all-template-stock packet.",
4488
+ "compatibility": "compatible",
4489
+ "migration": "none",
4490
+ "changes": [
4491
+ {
4492
+ "class": "named_surface",
4493
+ "path": "docs/qa-and-test-orders.md",
4494
+ "surface_entry": "docs/qa-and-test-orders.md",
4495
+ "summary": "Document the local preview policy: which checks are carried forward, how doctor, next and QA report them, and what stays strict."
4496
+ },
4497
+ {
4498
+ "class": "cli_surface",
4499
+ "path": "src/doctor/inspect.mjs",
4500
+ "surface_entry": "doctor",
4501
+ "summary": "Apply the local preview policy to the polish gate and page-load checkpoint and report carried-forward gates as warnings."
4502
+ },
4503
+ {
4504
+ "class": "cli_surface",
4505
+ "path": "src/doctor/next-step.mjs",
4506
+ "surface_entry": "next",
4507
+ "summary": "Move past the polish stage when its gate is carried forward on the local preview."
4508
+ }
4509
+ ],
4510
+ "entry_sha256": "d29250e168a1a4270672d9426c1fda0670bd29eccefe7fe70c9a1a0f445c0bfe"
4511
+ },
4512
+ {
4513
+ "id": "RL-0207",
4514
+ "sequence": 199,
4515
+ "date": "2026-10-02",
4516
+ "kind": "release",
4517
+ "surface_version": "1.48.0",
4518
+ "changelog_section": "1.48.0",
4519
+ "changelog_sha256": "4ec8df27478899217d11f925983fc17e558aa7c91e0ed9d13c88fb0a26315c39",
4520
+ "agent_impact": "Surface 1.48.0. Ships the same-surface changes 1.47.0+agent.1 through +agent.13 (setup command starts with npm init -y, intake usage lines list the deploy flags, local-preview evidence carried forward as warnings, QA and readback fixes, starter catalog pinned to 37a8d94). The bundled SDK support policy's latest_known_release returns to 0.4.38; freshness results are unchanged because the catalog's verification records name 0.4.40. Bundled skills carry revision 1.48.0+skills.1 with unchanged text: an agent that loaded 1.47.0+skills.3 should start a fresh session. Install the 1.48.0 package with the documented local setup command.",
4521
+ "compatibility": "compatible",
4522
+ "migration": "none",
4523
+ "changes": [
4524
+ {
4525
+ "class": "compatibility_policy",
4526
+ "path": "compatibility.json",
4527
+ "surface_entry": null,
4528
+ "summary": "Name the package version (1.48.0)."
4529
+ },
4530
+ {
4531
+ "class": "compatibility_policy",
4532
+ "path": "contracts/supported-surface.json",
4533
+ "surface_entry": "contracts/supported-surface.json",
4534
+ "summary": "Advance the supported surface to 1.48.0."
4535
+ },
4536
+ {
4537
+ "class": "named_surface",
4538
+ "path": "docs/local-setup.md",
4539
+ "surface_entry": "docs/local-setup.md",
4540
+ "summary": "Pin the local setup install command to the 1.48.0 package."
4541
+ },
4542
+ {
4543
+ "class": "documentation",
4544
+ "path": "docs/orientation-contract-reference.md",
4545
+ "surface_entry": "docs/orientation-contract-reference.md",
4546
+ "summary": "Regenerate the orientation reference for surface 1.48.0."
4547
+ },
4548
+ {
4549
+ "class": "named_surface",
4550
+ "path": "docs/runtime-readiness.md",
4551
+ "surface_entry": "docs/runtime-readiness.md",
4552
+ "summary": "Regenerate the runtime readiness reference for surface 1.48.0."
4553
+ },
4554
+ {
4555
+ "class": "named_surface",
4556
+ "path": "docs/skills-revision.md",
4557
+ "surface_entry": "docs/skills-revision.md",
4558
+ "summary": "Use the current 1.48.0+skills.1 bundle in executable examples."
4559
+ },
4560
+ {
4561
+ "class": "generated_runtime",
4562
+ "path": "package-lock.json",
4563
+ "surface_entry": null,
4564
+ "summary": "Update release metadata for 1.48.0."
4565
+ },
4566
+ {
4567
+ "class": "package_export",
4568
+ "path": "package.json",
4569
+ "surface_entry": null,
4570
+ "summary": "Release 1.48.0."
4571
+ },
4572
+ {
4573
+ "class": "skill",
4574
+ "path": "skills.json",
4575
+ "surface_entry": "skills.json",
4576
+ "summary": "Advance the bundled skill revision to 1.48.0+skills.1 and each skill version one patch."
4577
+ },
4578
+ {
4579
+ "class": "skill",
4580
+ "path": "skills/campaign-lifecycle-orientation/SKILL.md",
4581
+ "surface_entry": null,
4582
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4583
+ },
4584
+ {
4585
+ "class": "skill",
4586
+ "path": "skills/campaign-readback-classification/SKILL.md",
4587
+ "surface_entry": null,
4588
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4589
+ },
4590
+ {
4591
+ "class": "skill",
4592
+ "path": "skills/campaign-run-evidence/SKILL.md",
4593
+ "surface_entry": null,
4594
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4595
+ },
4596
+ {
4597
+ "class": "skill",
4598
+ "path": "skills/contribution-intake/SKILL.md",
4599
+ "surface_entry": null,
4600
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4601
+ },
4602
+ {
4603
+ "class": "skill",
4604
+ "path": "skills/next-campaigns-build/SKILL.md",
4605
+ "surface_entry": null,
4606
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4607
+ },
4608
+ {
4609
+ "class": "skill",
4610
+ "path": "skills/next-campaigns-os-setup/SKILL.md",
4611
+ "surface_entry": null,
4612
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4613
+ },
4614
+ {
4615
+ "class": "skill",
4616
+ "path": "skills/next-campaigns-os/SKILL.md",
4617
+ "surface_entry": null,
4618
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4619
+ },
4620
+ {
4621
+ "class": "skill",
4622
+ "path": "skills/next-campaigns-polish/SKILL.md",
4623
+ "surface_entry": null,
4624
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4625
+ },
4626
+ {
4627
+ "class": "skill",
4628
+ "path": "skills/next-campaigns-qa/SKILL.md",
4629
+ "surface_entry": null,
4630
+ "summary": "Publish the 1.48.0+skills.1 bundle revision."
4631
+ }
4632
+ ],
4633
+ "entry_sha256": "abc8749936f439d33b92b3bfdc1c954d0b38df24e5a80a2e3862123494b47f07"
4169
4634
  }
4170
4635
  ]
4171
4636
  }
@@ -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 — 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 — 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) — 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.47.0",
3
+ "surface_version": "1.48.0",
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": "3793b1de3b77cc31dffe9176f47e8e99ea6134aa",
58
+ "sha": "37a8d945db4c360739ded98348814cfd632da94f",
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
  },
@@ -1453,7 +1453,7 @@ Each `manifest.pages[]` entry MAY carry a `source_hash` field — the sha256 hex
1453
1453
  Behavior:
1454
1454
 
1455
1455
  - Optional on the producer side. Producers that don't emit `source_hash` (pre-Slice-6 manifests, template-stock, hand-authored) keep working; doctor's drift check is silent without a hash to compare.
1456
- - Warning severity only. A drift never blocks a build — the operator decides whether to re-run the producer to refresh the manifest or accept the local edits.
1456
+ - Warning severity only. A drift never blocks a build. The hash doctor compares is the one intake recorded in the packet, so editing the manifest alone does not clear the warning: re-running `start` or `prepare-build` with `--force` records the current file, and also clears recorded stage evidence. A revision made after build belongs in the page-kit source under `src/<route>/`; the source HTML stays the design provenance.
1457
1457
  - The warning names the file path and includes both hashes (truncated to 12 chars) so the operator can confirm which file diverged without re-running the producer.
1458
1458
 
1459
1459
  ### Reference AI-generated producer
@@ -62,34 +62,31 @@ Doctor warns when generated guided drafts still need answers, a brief allows pay
62
62
 
63
63
  Existing template residue, theme, pricing, and built-output checks continue to run. The brief gives those checks business intent instead of replacing them.
64
64
 
65
- ## Content Claims Are Reviewed, Not Enforced
66
-
67
- The doctor scans built output for content residue and raises some of it as
68
- warnings: every content anti-pattern under the warning code
69
- `content_residue.anti_pattern` (the finding ids include `invented_counts`
70
- for invented counts and ratings, `verified_buyer_chrome` for "Verified
71
- Buyer" and similar review chrome, `byline_persona`, `borrowed_authority`,
72
- `press_marquee`, and `science_theater`; all of them are warning-only), and
73
- promo copy claiming a discount above the CampaignSpec maximum (`template_contract.discount_claim_residue`, or
74
- `template_contract.discount_claim_unverified` when the spec sets no maximum).
75
-
76
- These stay warnings on purpose, and nothing downstream reads them. There is no
77
- blocker, no `blocked_stages` entry, no QA assertion, and no test-order gate
78
- keyed on any of them. A build carrying all of them can pass doctor, pass QA,
79
- and deploy.
80
-
81
- The toolkit flags the copy; it does not adjudicate it. **Responsibility for
82
- every claim on the page — proof counts, review chrome, discount percentages,
83
- and the rest — sits with the operator and the client, not with Campaigns OS.**
84
- Use the brief to record which claims are approved and which language is
85
- forbidden (see the high-impact questions above), and treat a content warning as
86
- a prompt to check the brief, not as a gate that will stop the build if you
87
- ignore it.
88
-
89
- The hard content checks are separate and do block: the needs-merchant-input
90
- marker (`content_residue.needs_merchant_input`) and countdown chrome rendered
91
- without verified offer urgency on a brief-backed build
92
- (`content_residue.unverified_urgency`).
65
+ ## The Merchant's Own Claims Are Not Reviewed
66
+
67
+ Proof and urgency content the merchant supplies is the merchant's
68
+ responsibility, not Campaigns OS's: reviews and testimonials, ratings and
69
+ counts, "Verified Purchase" labels, recent-purchase popups, stock counters,
70
+ countdowns, guarantees and press mentions. The doctor does not scan for it and
71
+ QA does not assert on it. When the prepared source design carries these
72
+ elements, the build reproduces them as designed. The starter templates ship
73
+ without some of them; that is not a reason to drop the source's.
74
+
75
+ What the doctor does scan built output for is template residue: the starter
76
+ templates' own demo strings and bracket-style stubs
77
+ (`content_residue.demo_residue`, a warning). It also warns on promo copy
78
+ claiming a discount above the CampaignSpec maximum
79
+ (`template_contract.discount_claim_residue`, or
80
+ `template_contract.discount_claim_unverified` when the spec sets no maximum),
81
+ because that copy disagrees with the campaign's own pricing. Nothing downstream
82
+ blocks on either.
83
+
84
+ Two content checks do block: the needs-merchant-input marker
85
+ (`content_residue.needs_merchant_input`), and, on a brief-backed build only,
86
+ starter countdown chrome the brief payload does not verify
87
+ (`content_residue.unverified_urgency`). Use the brief to record which claims
88
+ are approved and which language is forbidden (see the high-impact questions
89
+ above).
93
90
 
94
91
  ## QA Policy Scope
95
92
 
@@ -1,11 +1,16 @@
1
1
  # Local campaign setup
2
2
 
3
- For a new campaign, choose its working folder and run this from that folder:
3
+ For a new campaign, create an empty working folder and run this from it:
4
4
 
5
5
  ```sh
6
- npm install --save-exact next-campaign-page-kit@0.2.0 && npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.47.0 && npx --no-install campaigns-os tooling setup --target . --platform claude
6
+ npm init -y && npm install --save-exact next-campaign-page-kit@0.2.0 && npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.48.0 && npx --no-install campaigns-os tooling setup --target . --platform claude
7
7
  ```
8
8
 
9
+ `npm init -y` gives the folder its own `package.json`. Without one, npm
10
+ installs into the nearest parent folder that has a `package.json` or
11
+ `node_modules`, so a campaign folder created inside another project would add
12
+ page-kit and the toolkit to that project instead.
13
+
9
14
  Review the release source/provenance before installation as described in
10
15
  `AGENTS.md`. npm installs the dependencies first; `--no-install` then runs only
11
16
  the project's installed CLI. Page-kit stays a runtime dependency and the
@@ -26,7 +26,7 @@ Ledger schema id: `campaigns-os-release-ledger/v1`
26
26
  Change policy version: `1.0.0`
27
27
  Reason-code vocabulary version: `1.0.0`
28
28
  Limits version: `1.0.0`
29
- Supported surface at generation time: `1.47.0`
29
+ Supported surface at generation time: `1.48.0`
30
30
 
31
31
  ## Forward compatibility
32
32